高级路由问题

高级路由问题

我有 2 个使用 2 个 ADSL 路由器的互联网链接,并且我需要为 192.168.0.0/24 网络提供互联网访问权限。

我必须使用 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 都可以访问互联网。

但我对基于数据包标记的路由感兴趣。

答案1

经过一番努力后我终于找到了问题所在。

其实不是路由问题,脚本是正确的,但是缺少了一些东西。

此命令不足以禁用 rp_filter:

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

因此从互联网返回的流量在 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教程和文档并不总是完整的。

答案2

如果流量回到路由器但不再出去,那么问题就出在你的路由表、某些 iptables 规则上,或者你没有正确读取 wireshark。没有太多方法可以阻止数据包离开系统。

答案3

相关内容