我找到了一个与我类似的问题,但它没有提供我想要的答案。
我在一所学校工作,学校有两个不同的互联网连接,连接到两个独立的 NAT 路由器。在我的网络上,我配置了一个 Linux 服务器,使用其中一个作为默认网关。但是,默认路由器没有直接连接到互联网,我无法在其上配置端口转发。另一个是,但那个仅供特定用途使用,因为连接速度要慢得多。
两个路由器都在同一个网络中,一个路由器的 IP 地址为 192.168.1.1,另一个路由器的 IP 地址为 192.168.1.20。不直接连接到互联网的默认路由器的 IP 地址为 192.168.1.1。
我的问题是,如果默认网关是 192.168.1.1,那么如何让 Linux 服务器使用 192.168.1.20 作为网关,当连接到特定端口的网络接口(进行 NAT 的接口)时,响应这些连接(如 SSH),而不设置到 192.168.1.20 的永久路由?
我提前谢谢你。
答案1
您需要使用带有连接标记的连接跟踪、多个路由表,并根据 MAC 地址识别“上游”路由器。
如果可以的话,将 2 个路由器分成不同的网络,即使它们仍然位于同一第 2 层。这将使事情变得更容易(见下文)。
基本上,你需要:
- 创建 2 个新路由表,一个具有通过 ISP1(192.168.1.1)的默认路由,另一个具有通过 ISP2(192.168.1.20)的默认路由
- 将主路由表中的默认路由更改为
throw
- 使用 iptables mangle 表根据传入路由器标记连接。在您的实例中,您需要识别每个路由器的 mac 地址,以正确标记每个连接。
iptables 规则正确标记每个连接:
iptables -t mangle -A PREROUTING -m conntrack --ctstate NEW -m mac --mac aa:aa:aa:aa:aa:aa -j CONNMARK --set-mark 100
iptables -t mangle -A PREROUTING -m conntrack --ctstate NEW -m mac --mac bb:bb:bb:bb:bb:bb -j CONNMARK --set-mark 200
这是未经测试的;我总是使用单独的接口,这样我就可以使用-i eth1
而-i eth2
不是-m mac --mac
语法。
完整的信息和所有详细的细节太多了,无法在这里回答,但一旦你理解了,这是一个很好的指南:http://www.cyber.com.au/~twb/doc/dual-uplink.txt