Ubuntu
Ubuntu Iptables Dual Wan - 將 wan 1 和 2 轉發到內部伺服器
我在雙 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
這是關於 mangle 表的 iptables 規則:
$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 的連接不轉發到內部伺服器?規則看起來不錯,但也許我錯過了一些東西。
我已經解決了這個問題。它與反向路徑過濾器有關。我把它放在我的腳本中:
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
目前我正在使用以下設置。假設 192.168.127.10 是我們的內部伺服器, xxx.xxx.xxx.xxx/yyy.yyy.yyy.yyy ip 地址是 wan1/wan2
# 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