Ubuntu

Ubuntu Iptables Dual Wan - 將 wan 1 和 2 轉發到內部伺服器

  • April 8, 2015

我在雙 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 規則:

http://nerdboys.com/2006/05/05/conning-the-mark-multiwan-connections-using-iptables-mark-connmark-and-iproute2/

這是我現在的 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

引用自:https://serverfault.com/questions/681053