首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >源策略路由中断第二层域路由

源策略路由中断第二层域路由
EN

Server Fault用户
提问于 2013-04-22 02:53:38
回答 2查看 424关注 0票数 0

我有一个Linux (Ubuntu12.04)机器(c220-1),它有多个接口。这里值得注意的两个问题是:

  • eth2: 10.10.0.131/24
  • eth3: 10.20.0.2/24

默认路由设置为10.20.0.2。但是,我希望能够通过从一个单独的网络连接到10.20.0.2或10.10.0.131 (192.168.3.0/24)进入这台机器。

为了能够将ssh转换为10.10.0.131并避免对称路由问题,我使用了源路由策略:

代码语言:javascript
复制
root@c220-1:~# ip route list table eth2
default via 10.10.0.1 dev eth2

我通过将以下行添加到/etc/iucte2/rt_table中添加了此规则

代码语言:javascript
复制
12 eth2

然后我做了

代码语言:javascript
复制
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请求并发送回复:

代码语言:javascript
复制
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上:

代码语言:javascript
复制
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)匹配:

代码语言:javascript
复制
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,而这些数据包应该转到本地网络上的另一台计算机上?

EN

回答 2

Server Fault用户

回答已采纳

发布于 2014-11-18 12:41:21

我刚刚遇到了同样的问题,发现问题是按照应用路由表的操作顺序进行的。

如果在应用策略路线之前发出以下命令:

代码语言:javascript
复制
[root@c220-1 ~]# ip rule show
0:      from all lookup 255
32766:  from all lookup main
32767:  from all lookup default

然后之后:

代码语言:javascript
复制
[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 default

IMHO我希望任何新的路由表都会应用在“主”路由表(其中包括所有的第2层转发语句)和“默认”路由表之间。

我可以看到解决这个问题的两个选择。

  • 重新排序路由规则,以便在任何自定义路由表之前应用“主”表,或
  • 将layer-2转发语句添加到指定路由表中。

我们采用了第二种方法,首先手动将路由添加到指定的路由表中,并验证连接性如预期的那样工作:

代码语言:javascript
复制
ip route add 10.10.0.0/24 dev eth2 src 10.10.0.131 table eth2

接下来,使上述更改在重新引导过程中保持不变。

创建一个路由文件:

代码语言:javascript
复制
[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

创建路由规则文件:

代码语言:javascript
复制
[root@c220-1 ~]# vi /etc/sysconfig/network-scripts/rule.eth2

from 10.10.0.131 table eth2

重新启动主机并验证路由策略是否持久化

代码语言:javascript
复制
[root@c220-1 ~]# ip rule show
[root@c220-1 ~]# ip route show table eth2

我通常不会推荐一些静态路由,但是由于基础设施的限制,我们的场景扩展到上面,还需要一个额外的子网通过辅助接口路由,在本例中是eth2。

假设我们需要通过eth2获得10.10.1.0/24,我们对上面的配置做了以下更改。

更新的路由文件:

代码语言:javascript
复制
[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

更新的策略路由规则:

代码语言:javascript
复制
[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

重新启动网络&验证路由策略:

代码语言:javascript
复制
[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

然后重新启动主机,以验证所有路由策略都是持久的。

票数 0
EN

Server Fault用户

发布于 2013-04-23 03:47:31

我没有任何linux盒需要测试,但我认为您应该这样做:

代码语言:javascript
复制
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中更改了表名,以避免与接口名称混淆。

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/501436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档