![使用 iptables 将多台 PC 的流量映射并转发到多个路由器](https://linux22.com/image/778010/%E4%BD%BF%E7%94%A8%20iptables%20%E5%B0%86%E5%A4%9A%E5%8F%B0%20PC%20%E7%9A%84%E6%B5%81%E9%87%8F%E6%98%A0%E5%B0%84%E5%B9%B6%E8%BD%AC%E5%8F%91%E5%88%B0%E5%A4%9A%E4%B8%AA%E8%B7%AF%E7%94%B1%E5%99%A8.png)
是否可以使用 iptables 配置 Linux 服务器来执行此操作?
PC (192.168.1.11) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router1 (192.168.0.1)
PC (192.168.1.12) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router1 (192.168.0.1)
PC (192.168.1.13) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router1 (192.168.0.1)
...
PC (192.168.1.21) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router2 (192.168.0.2)
PC (192.168.1.22) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router2 (192.168.0.2)
PC (192.168.1.23) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router2 (192.168.0.2)
...
PC (192.168.1.31) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router3 (192.168.0.3)
PC (192.168.1.32) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router3 (192.168.0.3)
PC (192.168.1.33) ===> (192.168.1.1) Linux Server (192.168.0.100) ===> Router3 (192.168.0.3)
...
答案1
iptables不是路由工具。虽然有时可以通过标记数据包来补充路由配置,但这里甚至不需要这样做。
需要的是基于策略的路由:使用除了目标地址之外的其他地址来选择路由:源地址。
假设或陈述:
- Linux 服务器将被称为服务器
- 全部 9 台 PC,服务器并且 3 个路由器已经按照 OP 的示意图进行了配置
- 尤其是电脑不需要任何特殊设置。它们只需要有服务器作为默认网关。
- OP 示意图中的所有地址均使用 /24CIDR/网络掩码。
- 服务器用途:
- eth0地址为 192.168.1.1/24
- eth1地址为 192.168.0.100/24
- 服务器可能有或没有默认网关,这无所谓。策略路由将使用其自己的单独设置来转发流量,因此不依赖于主路由表的默认网关(如果有)。
如果尚未完成,这 3 个路由器将需要额外的路由才能到达 192.168.1.0/24服务器作为网关。在 LAN 192.168.0.0/24 中,系统也需要这样做。如果它们运行的是 Linux,则可在 3 个路由器或任何其他系统上使用以下方法完成此操作:
ip route add 192.168.1.0/24 via 192.168.0.100
编辑: 作为稍后询问如果不允许在 192.168.0.0/24 LAN 中重新配置其他系统,服务器可以在服务器上使用 NAT 来向这些系统(包括 3 个路由器)隐藏 192.168.1.0/24 的存在。由于这是在路由阶段之外完成的,因此这将独立于下面其余的路由配置。
因此,除了在路由器(或任何其他系统)上执行上述操作外,还可以使用iptables MASQUERADE
瞄准服务器:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
从今起服务器,创建了 3 组备用规则,以到达另外三个路由表:每个选定路由器一个,并以此路由器为默认网关。默认网关只能有一个,这是正确的,但每个路由表都有一个。
由于 PC 的 IP 地址不是按块排序的,因此使用 3x3 规则(使用正确对齐的 IP 块,如果有足够的 CIDR/网络掩码,3 条规则就足够了)。
描述于ip rule(8)
:
在某些情况下,我们希望不仅根据目标地址,还根据其他数据包字段(源地址、IP 协议、传输协议端口甚至数据包有效负载)以不同的方式路由数据包。此任务称为“策略路由”。
[...]
每个策略路由规则由一个选择器和一个动作谓词组成。
在这种情况下,选择器将选择 PC 的源地址,并且操作将是查找其他路由表,从而覆盖通常的查找主要的表来选择专用网关。
路由规则(如果 PC 的 IP 地址按足够多的块排列,则可以简化为仅 3 条规则):
ip rule add from 192.168.1.11 lookup 10
ip rule add from 192.168.1.12 lookup 10
ip rule add from 192.168.1.13 lookup 10
ip rule add from 192.168.1.21 lookup 20
ip rule add from 192.168.1.22 lookup 20
ip rule add from 192.168.1.23 lookup 20
ip rule add from 192.168.1.31 lookup 30
ip rule add from 192.168.1.32 lookup 30
ip rule add from 192.168.1.33 lookup 30
描述于ip route(8)
:
路由表:Linux-2.x 可以将路由打包到几个路由表中,这些路由表由 1 到 2^32-1 范围内的数字或文件 /etc/iproute2/rt_tables 中的名称标识。默认情况下,所有常规路由都插入到主表 (ID 254) 中,内核仅在计算路由时使用此表。[...]
用任意值 10、20 和 30 填充附加路由表。每个路由表将处理适合要解决的问题的路由的一个部分视图。这里是关于选择不同的网关。
ip route add default via 192.168.0.1 dev eth1 table 10
ip route add default via 192.168.0.2 dev eth1 table 20
ip route add default via 192.168.0.3 dev eth1 table 30
如果 PC 需要访问 192.168.0.0/24 中的其他系统,则应添加这些 LAN 路由(以避免通过路由器的部分发夹弯,这绝不是一个好主意):
ip route add 192.168.0.0/24 dev eth1 table 10
ip route add 192.168.0.0/24 dev eth1 table 20
ip route add 192.168.0.0/24 dev eth1 table 30
结果可进行检查服务器和ip route get
:
root@server:~# ip route get from 192.168.1.11 iif eth0 to 8.8.8.8
8.8.8.8 from 192.168.1.11 via 192.168.0.1 dev eth1 table 10
cache iif eth0
root@server:~# ip route get from 192.168.1.21 iif eth0 to 8.8.8.8
8.8.8.8 from 192.168.1.21 via 192.168.0.2 dev eth1 table 20
cache iif eth0
root@server:~# ip route get from 192.168.1.31 iif eth0 to 8.8.8.8
8.8.8.8 from 192.168.1.31 via 192.168.0.3 dev eth1 table 30
cache iif eth0
192.168.1.0/24 LAN 中的其他系统遵循主要的路由表没有基于策略的路由。例如,如果服务器没有默认路由主要的表但只有它的两个 LAN 路由,那么除了 192.168.0.0/24 LAN 之外的其他任何路由都不会被路由:
root@server:~# ip route get from 192.168.1.41 iif eth0 to 8.8.8.8
RTNETLINK answers: Network is unreachable
笔记
这 3 个路由器可以是 Internet 网关,它们执行 NAT 并以廉价的设置访问 Internet,每个路由器使用单独的不同公共 IP 地址(可能使用不同的 ISP),从而使 Internet 上看到的 3 组 PC 具有 3 个不同的公共 IP 地址。
上述设置必须与配置网络的工具集成服务器。根据发行版的不同,有许多这样的工具,例如下拉,网络管理器,systemd-networkd,网络计划可能还有很多其他方法,每种方法都有其特定的配置方法。当然也可以使用上面给出的命令的脚本。