我的问题类似于下面的问题,但有一个小警告没有被这些线程回答:
https://serverfault.com/questions/648460/load-balancing-network-traffic-using-iptables
iptables --set-mark - 通过不同的接口路由不同的端口
我有三个网络设备:eth0(路由器)、eth1(连接到互联网 gw1)和 eth2(连接到互联网 gw2)
eth0 -> eth1 (ip 通过 dhcp) -> gw1 (192.168.0.1 网络掩码 255.255.255.0) -> 互联网
eth0 -> eth2 (ip 通过 dhcp) -> gw2 (192.168.0.1 网络掩码 255.255.255.0) -> 互联网
我在路由器上运行 Polipo,并希望所有连接到 polipo 的人的流量都通过 eth2。其他人的流量将通过 eth1 路由。
问题是 eth1 和 eth2 都通过 DHCP 获取 IP 地址。 gw1 与 gw2 相同。这是我们基础设施的一部分,它们都具有相同的 IP 地址(即 gw1 和 gw2 均为 192.168.0.1,网络掩码为 255.255.255.0)。
上述线程中的所有答案都涉及不同的子网和 IP 地址来隔离/标记网关流量。就我而言,这不是一个选择。我必须在不更改 gw1/gw2 任何内容且不涉及 eth1 和 eth2 中的静态 IP 地址的情况下完成此操作。这可能吗?
答案1
很抱歉我无法提供一个工作示例,但是您需要的应该可以使用 netfilter 来实现联系轨道目标。与常规 MARK 的区别在于 CONNTRACK 标记连接中的所有流量,而 MARK 只标记数据包。所以,这个想法是:
- 使用不同的编号标记通过每个接口的传入连接(即“1”表示 gw1,“2”表示 gw2)
- 使用“ip Rule add fwmark 1 Lookup 101”和“ip Rule add fwmark 2 Lookup 102”使标记1和标记2的流量走不同的路由表
- 为每个表创建不同的默认路由:对于 gw1,“ip route add default via 192.168.0.1 dev eth1 table 101”;对于 gw2,“ip route add default via 192.168.0.1 dev eth2 table 102”
通过 eth1 的连接将使用 fwmark 1 进行 CONNMARK 标记,所有数据包(传入和传出)都会保留该标记;对于通过 eth2、使用 fwmark 2 的连接也会发生同样的情况。因此,防火墙将始终知道在回复中使用哪个接口。从防火墙或其后面的主机发起的连接将通过您选择作为主要接口/网关的任何接口/网关。
也许您可以使用一些预先打包的防火墙软件更轻松地做到这一点,例如岸墙。它具有多 ISP 支持,但我不知道它是使用 CONNTRACK 还是仅使用 MARK。