我有一个Linux (Ubuntu12.04)机器(c220-1),它有多个接口。这里值得注意的两个问题是:
默认路由设置为10.20.0.2。但是,我希望能够通过从一个单独的网络连接到10.20.0.2或10.10.0.131 (192.168.3.0/24)进入这台机器。
为了能够将ssh转换为10.10.0.131并避免对称路由问题,我使用了源路由策略:
root@c220-1:~# ip route list table eth2
default via 10.10.0.1 dev eth2我通过将以下行添加到/etc/iucte2/rt_table中添加了此规则
12 eth2然后我做了
root@c220-1:~# ip route add default via 10.10.0.1 table eth2
root@c220-1:~# ip rule add from 10.10.0.131 lookup eth2这是可行的,我可以选择10.10.0.131或10.20.0.2。但我不能再从10.10.0.0/24网络上的其他机器连接10.10.0.131。我可以从c220-1 (10.10.0.131/24)到c220-2 (10.0.132/24)。但我不能从c220-2到c220-1。
如果我做了tcpdump,我可以确认c220-1正在接收ICMP请求并发送回复:
root@c220-1:~# tcpdump -i eth2 icmp -vvv -n -e
tcpdump: listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes
23:15:11.455818 d4:8c:b5:4d:a5:3a > 60:73:5c:68:b4:b6, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
10.10.0.132 > 10.10.0.131: ICMP echo request, id 8805, seq 1, length 64
23:15:11.455877 60:73:5c:68:b4:b6 > 30:f7:0d:bc:bb:52, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 16273, offset 0, flags [none], proto ICMP (1), length 84)
10.10.0.131 > 10.10.0.132: ICMP echo reply, id 8805, seq 1, length 64
23:15:12.463394 d4:8c:b5:4d:a5:3a > 60:73:5c:68:b4:b6, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
10.10.0.132 > 10.10.0.131: ICMP echo request, id 8805, seq 2, length 64
23:15:12.463451 60:73:5c:68:b4:b6 > 30:f7:0d:bc:bb:52, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 16274, offset 0, flags [none], proto ICMP (1), length 84)
10.10.0.131 > 10.10.0.132: ICMP echo reply, id 8805, seq 2, length 64您可以看到请求来自d4:8c:b5:4d:a5:3a,但答复将发送给30:f7:0d:bc:bb:52。
正如预期的那样,ICMP的答复不会出现在C220-2上:
root@c220-2:~# tcpdump -i eth2 icmp -vvv -n -e
tcpdump: listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes
23:16:19.944225 d4:8c:b5:4d:a5:3a > 60:73:5c:68:b4:b6, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
10.10.0.132 > 10.10.0.131: ICMP echo request, id 9380, seq 1, length 64
23:16:20.952497 d4:8c:b5:4d:a5:3a > 60:73:5c:68:b4:b6, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
10.10.0.132 > 10.10.0.131: ICMP echo request, id 9380, seq 2, length 64
23:16:21.960458 d4:8c:b5:4d:a5:3a > 60:73:5c:68:b4:b6, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
10.10.0.132 > 10.10.0.131: ICMP echo request, id 9380, seq 3, length 64答复的目标MAC地址与网关的MAC地址(10.10.0.1)匹配:
root@c220-2:~# arping -i eth2 10.10.0.1
ARPING 10.10.0.1
60 bytes from 30:f7:0d:bc:bb:52 (10.10.0.1): index=0 time=214.100 usec如果完全删除源策略路由规则,则可以从c220-2连接,但无法从192.168.3.1/24连接到10.10.0.131。
如何指定规则,使源策略路由不会将数据包发送到10.10.0.1,而这些数据包应该转到本地网络上的另一台计算机上?
发布于 2014-11-18 12:41:21
我刚刚遇到了同样的问题,发现问题是按照应用路由表的操作顺序进行的。
如果在应用策略路线之前发出以下命令:
[root@c220-1 ~]# ip rule show
0: from all lookup 255
32766: from all lookup main
32767: from all lookup default然后之后:
[root@c220-1 ~]# ip rule show
0: from all lookup 255
32765: from 10.10.0.131 lookup eth2
32766: from all lookup main
32767: from all lookup defaultIMHO我希望任何新的路由表都会应用在“主”路由表(其中包括所有的第2层转发语句)和“默认”路由表之间。
我可以看到解决这个问题的两个选择。
我们采用了第二种方法,首先手动将路由添加到指定的路由表中,并验证连接性如预期的那样工作:
ip route add 10.10.0.0/24 dev eth2 src 10.10.0.131 table eth2接下来,使上述更改在重新引导过程中保持不变。
创建一个路由文件:
[root@c220-1 ~]# vi /etc/sysconfig/network-scripts/route.eth2
10.10.0.0/24 dev eth2 src 10.10.0.131 table eth2
default table eth2 via 10.10.0.1创建路由规则文件:
[root@c220-1 ~]# vi /etc/sysconfig/network-scripts/rule.eth2
from 10.10.0.131 table eth2重新启动主机并验证路由策略是否持久化
[root@c220-1 ~]# ip rule show
[root@c220-1 ~]# ip route show table eth2我通常不会推荐一些静态路由,但是由于基础设施的限制,我们的场景扩展到上面,还需要一个额外的子网通过辅助接口路由,在本例中是eth2。
假设我们需要通过eth2获得10.10.1.0/24,我们对上面的配置做了以下更改。
更新的路由文件:
[root@c220-1 ~]# vi /etc/sysconfig/network-scripts/route.eth2
10.10.0.0/24 dev eth2 src 10.10.0.131 table eth2
10.10.1.0/24 dev eth2 via 10.10.0.1 table eth2
default table eth2 via 10.10.0.1更新的策略路由规则:
[root@c220-1 ~]# vi /etc/sysconfig/network-scripts/rule.eth2
from 10.10.0.131 table eth2
to 10.10.1.0/24 table eth2重新启动网络&验证路由策略:
[root@c220-1 ~]# service networking restart
[root@c220-1 ~]# ip rule show
0: from all lookup 255
32764: from all to 10.10.1.0/24 lookup eth2
32765: from 10.10.0.131 lookup eth2
32766: from all lookup main
32767: from all lookup default
[root@c220-1 ~]# ip route show table eth2
10.10.0.0/24 dev eth2 src 10.10.0.131 scope link
10.10.1.0/24 via 10.10.0.1 dev eth2
default via 192.168.152.1 dev eth2然后重新启动主机,以验证所有路由策略都是持久的。
发布于 2013-04-23 03:47:31
我没有任何linux盒需要测试,但我认为您应该这样做:
root@c220-1:~# ip rule add from 192.168.3.0/24 table c2202
root@c220-1:~# ip route add default via 10.10.0.1 table c2202我从eth2中更改了表名,以避免与接口名称混淆。
https://serverfault.com/questions/501436
复制相似问题