Iptables
高級路由問題
我有 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 教程和文件並不總是完整的證明。