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

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

我有一台 Raspberry Pi(运行 Raspbian),它有三个网络接口(一个以太网和两个 USB wifi 网卡)。我想要实现的是:我有两个 WAN 连接到互联网(DSL + 电缆),我想设置 RasPi 以使其提供两个默认网关。我想让我本地网络中的特定客户端使用一个或另一个网关。以下是我想要实现的目标的概述:

在此处输入图片描述

通常,出于显而易见的原因,您不能有两个默认网关,但我发现使用 iproute2 您可以做到这一点,并使用规则应用的多个路由表(以及默认网关)。(请参阅下面我的配置详细信息)

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

接口 wlan0 (192.168.178.199) 连接到第一个 WLAN 路由器 (DSL) (192.168.178.1)。接口 wlan1 (192.168.0.199) 连接到第二个路由器 (Cable) (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"

由于某些原因,auto两个 wlan 接口的设置效果不太好,大多数情况下,至少有一个接口不会“启动”,所以我暂时将它们的 ifup 放入 rc.local。当我启动时,两个 wlan 接口都已启动,连接到各自的 wlan,并且都可以 ping 通各自的路由器(例如ping 192.168.178.1 -I wlan0)。

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

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

定义这两个表之后,我创建了这些设置,这些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

为了测试目的,我将 Google 的名称服务器 (8.8.8.8) 暂时设置为默认服务器/etc/resolv.conf

此时,我可以从 RasPi 成功 ping 通互联网上的主机,请求正通过一个或另一个网关均匀分布地发送(我用 检查过了ping -R 8.8.8.8)。

现在我的问题是:

  1. 我必须做什么才能使本地 192.168.10.0/24 网络中的客户端(具有静态 IP,不需要 DHCP)使用 RasPi 作为默认网关(192.168.10.1 - eth0 接口)来访问互联网?我认为这是通过伪装和 iptables 完成的,但我不知道如何使用此设置来做到这一点。

  2. 我该如何更改ip规则,才能让客户端不仅像 RasPi 一样连接到互联网,而且还能使用其中一个网关?例如,如果我想让主机 192.168.10.100 使用“ALICE”网关,让 192.168.10.101 使用“BOB”?

我感觉自己已经接近终点线,任何关于这个可能不太常见的问题的帮助都将不胜感激。提前致谢!

问候,Rob

更新:

我取得了一点进展:添加这些规则后......

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 需要转发它们。这是怎么做到的?

答案1

在每个客户端上添加默认网关 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

答案2

如果每个 WAN 上只有一个公共 IP,则可能必须执行 PAT(端口地址转换)而不是 NAT(网络地址转换)

就像是:

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

编辑:我假设您正在用私有 IP 替换您的广域网 IP...

答案3

假设您想通过 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读取此标记并尝试找到适当的规则。显然这里缺少一些内容,但这是主要思想。

如果要采用此解决方案,则需要删除路由权重。在处理路由表和规则时,请记住刷新缓存。

答案4

进入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 作为 LAN 接口。Eth3 地址用于 BOB,Eth4 地址用于 Alice。您不能将 WAN 网关用作 LAN 网关。

相关内容