几乎工作:如何在双WAN口Linux服务器上设置iptables和iproute2规则?

我有一个Raspberry Pi(运行Raspbian)与三个networking接口(一个以太网和两个USB无线网卡)。 我想实现的是这样的:我有两个WAN连接到互联网(DSL + Cable),我想设置RasPi的方式是提供两个默认网关。 我想让我的本地networking中的特定客户端使用一个或另一个网关。 以下是我想要实现的概述:

在这里输入图像说明

通常情况下,你不可能有两个默认的网关,但是我发现,使用iproute2你可以做到这一点,并使用多个路由表(从而默认网关),这是由规则应用。 (请参阅下面的configuration的详细信息)

以太网接口(192.168.10.1)连接到连接本地networking(192.168.10.0/24)的交换机。

接口wlan0(192.168.178.199)连接到第一个WLAN路由器(DSL)(192.168.178.1)。 接口wlan1(192.168.0.199)连接到第二个路由器(电缆)(192.168.0.1)。

这是我的/etc/network/interfaces

 auto lo iface lo inet loopback iface eth0 inet static address 192.168.10.1 netmask 255.255.255.0 iface wlan0 inet static address 192.168.178.199 netmask 255.255.255.0 wpa-ssid "ALICE" wpa-psk "yyyyyyyy" iface wlan1 inet static address 192.168.0.199 netmask 255.255.255.0 wpa-ssid "BOB" wpa-psk "xxxxxxxx" 

出于某种原因,为两个wlan接口设置auto并不是很好,大多数情况下,至less其中一个不会得到“提升”,所以现在我把它们放到rc.local中。 当我启动的时候,两个wlan接口都是up的,连接到他们的wlan,都可以ping他们的路由器(例如ping 192.168.178.1 -I wlan0 )。

下一步是configurationiproute2。 这是我的/etc/iproute2/rt_tables

 # # reserved values # 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep 1 alice 2 bob 

定义这两个表之后,我创build了这些ip设置,在所有NIC启动后,在每次启动时应用这些设置:

 ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.199 table alice ip route add default via 192.168.178.1 table alice ip route add 192.168.0.0/24 dev wlan1 src 192.168.0.199 table bob ip route add default via 192.168.0.1 table bob ip rule add from 192.168.178.199 table alice ip rule add from 192.168.0.199 table bob ip route add default scope global nexthop via 192.168.178.1 dev wlan0 weight 1 nexthop via 192.168.0.1 dev wlan1 weight 1 

出于testing目的,我现在在/etc/resolv.conf中将Google的名称服务器(8.8.8.8)设置为默认值。

在这个时候,我可以从RasPi成功ping通互联网上的主机,请求通过一个或另一个网关(我使用ping -R 8.8.8.8进行检查)被均匀地发送出去。

现在我的问题:

  1. 在我的本地192.168.10.0/24networking中,如何使客户端(使用静态IP,无需DHCP),使用RasPi作为默认gw(192.168.10.1-eth0接口)来访问Internet? 我认为这是伪装和iptables的,但我不知道如何做到这一点与此设置。

  2. 我将如何改变ip规则,不仅让客户端连接到互联网,就像RasPi本身一样,而是使用其中一个或另一个网关? 例如,如果我想使主机192.168.10.100使用“ALICE”网关和192.168.10.101使用“BOB”?

我觉得非常接近终点线,任何帮助,这可能不是那么普遍的问题,非常感谢。 提前致谢!

关心,罗布

更新:

我做了一个小小的进步:在添加这些规则之后…

 ip rule add fwmark 1 table alice prio 1024 ip rule add fwmark 2 table bob prio 1025 

…我可以(从192.168.10.100)不仅可以ping通192.168.10.1处的RasPi以太网接口,还可以ping 192.168.178.199上的wlan接口。 我无法ping通该接口(192.168.178.1)后面的路由器或互联网上的任何主机。 但是我认为我们正在接近…所以数据包到达正确的wlan接口,但是现在wlan nics需要转发它们。 这是怎么做的?

路由添加默认gw 192.168.10.1在每个客户端

编辑:

iptables -t mangle -A PREROUTING -s 192.168.10.100/32 -j MARK –set-mark 1
iptables -t mangle -A PREROUTING -s 192.168.10.101/32 -j MARK –set-mark 2

也可以看看:

http://lartc.org/howto/lartc.rpdb.multiple-links.html

http://linux-ip.net/html/adv-multi-internet.html

如果在每个WAN上只有一个公共IP,则可能需要执行PAT(端口地址转换)而不是NAT(networking地址转换)

就像是:

iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE

编辑:即时通讯假设你正在取代您的私人IP地址的IP …

假设您要通过wlan0路由主机192.168.10.252:

 iptables -t mangle -N MARK1 iptables -t mangle -A MARK1 -j MARK --set-xmark 0x1/0xffffffff iptables -t mangle -A MARK1 -j CONNMARK --set-xmark 0x1/0xffffffff iptables -t mangle -A MARK1 -j ACCEPT # local traffic iptables -t mangle -A PREROUTING -s 192.168.10.0/24 -d 192.168.10.0/24 -j ACCEPT # rest iptables -t mangle -A PREROUTING -i eth0 ! -d 192.168.10.0/24 -j CONNMARK --restore-mark iptables -t mangle -A PREROUTING -s 192.168.10.252 -i eth0 -j MARK1 iptables -t nat -N SNAT1 iptables -t nat -A SNAT1 -j SNAT1 --to-source 192.168.178.199/32 iptables -t nat -A SNAT1 -j ACCEPT iptables -t nat -A POSTROUTING -o wlan0 -m mark --mark 0x1 -j SNAT1 

告诉iproute2读取这些标记:

 ip rule add pref 30000 fwmark 1 lookup alice ip rule add pref 29000 from 192.168.178.199 lookup alice ip route add 0.0.0.0 dev wlan0 scope link src 192.168.178.199 table alice ip route add default via 192.168.178.1 dev wlan0 scope global table alice ip route add 192.168.10.0/24 dev eth0 scope link src 192.168.10.1 table alice 

如果主机192.168.10.252想要访问路由器本身没有的东西,这个连接被标记为“1”, iproute读取这个标记并尝试find适当的规则。 显然这里有些东西不见了,但这是主要的想法。

如果您要遵循此解决scheme,则需要删除路线权重。 当你搞乱路由表和规则时,记得清空caching。

进入etc/sysctl.conf文件并更改

 **net.ipv4.ip_forward=0** to **net.ipv4.ip_forward=1** **sysctl -p /etc/sysctl.conf** #iptables -P FORWARD ACCEPT #service iptables save 

对于第二个问题,您需要在路由器上有两个用于LAN的接口。 比方说,你有Eth3和Eth4作为你的局域网接口。 BOB的Eth3地址和Alice的Eth4地址。 无法将WAN网关用作LAN网关。