我有2个互联网链接使用2个ADSL路由器,我需要访问互联网的192.168.0.0/24networking。
我必须根据端口号,协议,使用iproute2和iptables在linux路由器上路由出站stream量。
这是我的networking:
(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路由器上的networkingconfiguration:
#!/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/24networking连接到互联网。
当我从这个networkingping到远程服务器时,我可以看到(使用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
我可以通过input以下命令部分解决这个问题:
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
所以我得到所有来自本地networking的stream量通过ISP1链路正确路由,所有的PC都可以访问Internet。
但是我对基于包标记的路由感兴趣。
经过很多努力,我终于find了问题所在。
事实上,这不是一个路由问题,脚本是正确的,但缺less一些东西。
这个命令不足以禁用rp_filter:
echo 0 >| /proc/sys/net/ipv4/conf/all/rp_filter
所以从互联网返回的stream量在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教程和文档并不总是完成的certificate。
如果stream量返回到路由器,但不能再出去,那么问题在你的路由表,一些iptables规则,或者你没有正确地阅读wireshark。 什么会阻止数据包退出系统没有太多的select。