我在双 WAN 设置上配置 iptables 规则时遇到问题。操作系统是 Ubuntu 12.04 LTS。
我有 2 个 Wan 连接,均使用静态 IP。Wan-1 在 eth2 上,Wan-2 在 eth4 上。我希望它们都转发到相同的内部服务器。
Wan-1 规则正在运行,我可以毫无问题地访问所有内部服务器,但使用 Wan-2 时无法访问服务器。
Wan-1: (not the real IP addresses)
IP: 17.13.12.90
CIDR: 17.13.12.90/29
Netmask: 255.255.255.248
Gateway: 17.13.12.89
Wan-2: (not the real IP addresses)
IP: 17.13.12.174
CIDR: 17.13.12.174/29
Netmask: 255.255.255.248
Gateway: 17.13.12.169
Wan-1 (eth2) 是当前默认网关,这里一切正常。我可以从互联网访问内部服务器。没有问题。我可以从外部 ping 它并通过 SSH 连接。
Wan-2 (eth4) 是我正在设置的新 WAN 连接。我可以从外部 ping 它并通过 SSH 连接到它。但我无法从此 IP 连接到内部服务器。
本地网络是eth0。
我的 /etc/iproute2/rt_tables 文件如下所示:
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
10 isp1
20 isp2
这是我设置的 IP 规则:
ip route add 17.13.12.88 dev eth2 src 17.13.12.90 table isp1
ip route add default via 177.135.127.89 table isp1
ip route add 17.22.17.168 dev eth4 src 17.22.17.174 table isp2
ip route add default via 17.22.17.169 table isp2
ip route add 17.13.12.88 dev eth2 src 17.13.12.90
ip route add 17.22.17.168 dev eth4 src 17.22.17.174
ip route add default via 17.13.12.89
ip rule add from 17.13.12.90 table isp1
ip rule add from 17.22.17.174 table isp2
ip rule add fwmark 0x1 table isp1
ip rule add fwmark 0x2 table isp2
这是 iptables 规则,涉及 mangle 表:
$IPT -t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark
# Input rules
$IPT -t mangle -A INPUT -i $IF_ETH2 -p tcp -j MARK --set-mark 0xa
$IPT -t mangle -A INPUT -i $IF_ETH4 -p tcp -j MARK --set-mark 0xb
$IPT -t mangle -A PREROUTING -i $IF_ETH0 -m mark --mark 0xa -p tcp -j MARK --set-mark 0x1
$IPT -t mangle -A PREROUTING -i $IF_ETH0 -m mark --mark 0xb -p tcp -j MARK --set-mark 0x2
# output rules
$IPT -t mangle -A OUTPUT -m mark --mark 0xa -p tcp -j MARK --set-mark 0x1
$IPT -t mangle -A OUTPUT -m mark --mark 0xb -p tcp -j MARK --set-mark 0x2
有人能指点我/帮我解释一下为什么来自 wan-2 的连接没有转发到内部服务器吗?规则似乎没问题,但也许我遗漏了什么。
答案1
目前我使用以下设置。假设 192.168.127.10 是我们的内部服务器,xxx.xxx.xxx.xxx/yyy.yyy.yyy.yyy 是 wan1/wan2 的 IP 地址
# iptables -t mangle -I PREROUTING -s 192.168.127.10 -m conntrack --ctorigdst xxx.xxx.xxx.xxx -j MARK --set-mark 0x3e8
# iptables -t mangle -I PREROUTING -s 192.168.127.10 -m conntrack --ctorigdst yyy.yyy.yyy.yyy -j MARK --set-mark 0x7d0
# ip ru add fwmark 0x3e8 lookup ISP1 prio 1000
# ip ru add fwmark 0x7d0 lookup ISP2 prio 2000
设置默认策略基础路由
# cat /root/routing/set_default_routing.sh
#!/bin/sh
IP1='xxx.xxx.xxx.xxx'
IF1='eth2'
P1='xxx.xxx.xxx.1'
P1_NET='xxx.xxx.xxx.0/29'
IP2='yyy.yyy.yyy.yyy'
IF2='eth4'
P2='yyy.yyy.yyy.25'
P2_NET='yyy.yyy.yyy.0/29'
/sbin/ip route add $P1_NET dev $IF1 src $IP1 table ISP1
/sbin/ip route add default via $P1 table ISP1
/sbin/ip route add $P2_NET dev $IF2 src $IP2 table ISP2
/sbin/ip route add default via $P2 table ISP2
/sbin/ip rule add from $IP1 table ISP1
/sbin/ip rule add from $IP2 table ISP2
/sbin/ip route add default via $P1
/sbin/ip route flush cache
PS 不要忘记禁用反向路径过滤器
# echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter
将以下行添加到 /etc/sysctl.conf
net.ipv4.conf.default.rp_filter = 0
答案2
我已经解决了这个问题。它与反向路径过滤器有关。我已将其放入脚本中:
echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter
但是当我解决问题时,我意识到这个值在所有接口中都是 1(默认接口除外):
$ cat /proc/sys/net/ipv4/conf/*/rp_filter
1
0
1
1
1
1
1
1
1
1
我已将值设置为零,并更改了 iptables 规则,根据本文:
这是我现在的 iptables 脚本(其中的一部分):
# Disabling rp_filter
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth4/rp_filter
# Mangle rules
$IPT -t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark
$IPT -t mangle -A PREROUTING -p tcp -i $IF_ETH2 -j MARK --set-mark 0x1
$IPT -t mangle -A PREROUTING -p tcp --match mark --mark 0x2 -j ACCEPT
$IPT -t mangle -A PREROUTING -p tcp -i $IF_ETH4 -j MARK --set-mark 0x2
$IPT -t mangle -A PREROUTING -p tcp -j CONNMARK --save-mark