Iptables

高級路由問題

  • November 5, 2015

我有 2 個使用 2 個 ADSL 路由器的 Internet 連結,我需要為 192.168.0.0/24 網路提供 Internet 訪問權限。

我必鬚根據埠號、協議……在 linux 路由器上使用 iproute2 和 iptables 來路由傳出流量。

這是我的網路:

    (ISP-1)                              (ISP-2)
Dynamic public IP                    Dynamic public IP 
       |                                    |
+---------------+                    +---------------+
|ADSL Router (1)|                    |ADSL Router (2)|
+---------------+                    +---------------+
       |                                    |
  192.168.1.1                          192.168.2.1
       |                                    |
       |                                    |
       |                                    |
       |        +------------------+        |
       |        |                  |        |
  192.168.1.2 --|eth1          eth2|-- 192.168.2.2
                |                  |
                |   Linux Router   |
                |                  |
                |       eth0       |
                +------------------+
                         |
                    192.168.0.1
                         |
                         |
                   Local Network:
                   192.168.0.0/24

我使用以下腳本在 Linux 路由器上設置網路配置:

#!/bin/bash

echo 1 >| /proc/sys/net/ipv4/ip_forward
echo 0 >| /proc/sys/net/ipv4/conf/all/rp_filter

# flush all iptables entries
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT

# marking packets
iptables -t mangle -A PREROUTING -i eth0 -p icmp -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -p udp  -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -p tcp  -j MARK --set-mark 2

# create routing tables and default routes
echo '1     ISP1' >> /etc/iproute2/rt_tables
echo '2     ISP2' >> /etc/iproute2/rt_tables
ip route add default via 192.168.1.1 dev eth1 table ISP1
ip route add default via 192.168.2.1 dev eth2 table ISP2

# routing based on previous marks
ip rule add fwmark 1 table ISP1
ip rule add fwmark 2 table ISP2

ip route flush cache

# NAT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE

問題是我無法從 192.168.0.0/24 網路連接到網際網路。

當我從這個網路 ping 到遠端伺服器時,我可以看到(使用 Wireshark)從遠端伺服器返回到 Linux 路由器的 eth1 的回复,但他們沒有到達 eth0。

請幫忙。並提前致謝。

(編輯)

我嘗試解決這個奇怪的問題一周。

故障排除命令輸出:

ip rule
0:  from all lookup local 
32764:  from all fwmark 0x1 lookup ISP1
32765:  from all fwmark 0x2 lookup ISP2 
32766:  from all lookup main 
32767:  from all lookup default 

ip route show table ISP1
default via 192.168.1.1 dev eth1

ip route show table ISP2
default via 192.168.2.1 dev eth2

ip route show table main
192.168.2.0/24 dev eth2  proto kernel  scope link  src 192.168.2.2
192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.2
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.1
169.254.0.0/16 dev eth0  scope link  metric 1000 
default via 192.168.1.1 dev eth1  metric 100

我可以通過鍵入以下命令部分解決此問題:

ip rule del fwmark 1 table ISP1
ip rule del fwmark 2 table ISP2
ip rule add from 192.168.0.0/24 table ISP1

因此,我通過 ISP1 連結正確路由了來自本地網路的所有流量,並且所有 PC 都可以訪問 Internet。

但我對基於數據包標記的路由感興趣。

經過一番努力,我終於找到了問題所在。

實際上這不是路由問題,腳本是正確的,但缺少一些東西。

此命令不足以禁用 rp_filter:

echo 0 >| /proc/sys/net/ipv4/conf/all/rp_filter

因此從 Internet 返回的流量在 eth1 和 eth2 處下降。

當我通過添加以下命令顯式禁用兩個介面的 rp_filter 時:

echo 0 >| /proc/sys/net/ipv4/conf/eth1/rp_filter
echo 0 >| /proc/sys/net/ipv4/conf/eth2/rp_filter

問題解決了,我讓一切工作正常。

Linux 教程和文件並不總是完整的證明。

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