环回接口上的 IP 路由存在奇怪问题

环回接口上的 IP 路由存在奇怪问题

这个问题是基于我尝试fragroute在我的环境中运行这个著名工具的失败而产生的。

问题描述:

我有一台 ubuntu OS 18.04 主机,带有 (Intel) 以太网接口enp1s0f1,用于发送/接收测试流量。我尝试开发一个应用程序,可以修改从此接口到目标 IP 地址 10.200.1.2 的传出数据包。我添加了以下路由,以便将传出的数据包发送到环回lo接口,我的应用程序可以使用 libpcap 嗅探该接口,然后该应用程序将修改数据包并通过测试接口将其发送出去enp1s0f1

ip route add 10.200.1.2 via 127.0.0.1 dev lo

添加此路由后,路由表就有了一条新路由(来自 的输出ip route show

10.200.1.2 via 127.0.0.1 dev lo 

问题是,如果我在服务器端口 23 上从 10.200.1.3 向 10.200.2.2 发送 tcp SYN 数据包,则 linux 会正确响应 TCP RST。如果我从 10.200.1.2 向 10.200.2.2 发送 TCP SYN 数据包,linux tcp/ip 不会响应 TCP SYN 数据包,就好像它没有看到它一样,这是接口上的 tcpdump enp1s0f1

17:23:18.393222 IP 10.200.1.3.37063 > 10.200.2.2.23: Flags [S], seq 2933924869, win 64240, options [mss 1460,sackOK,TS val 4013600474 ecr 0,nop,wscale 7], length 0
17:23:18.393236 IP 10.200.2.2.23 > 10.200.1.3.37063: Flags [R.], seq 0, ack 2933924870, win 0, length 0
17:23:22.080899 IP 10.200.1.2.40109 > 10.200.2.2.23: Flags [S], seq 1253688325, win 64240, options [mss 1460,sackOK,TS val 1468392057 ecr 0,nop,wscale 7], length 0
17:23:23.107692 IP 10.200.1.2.40109 > 10.200.2.2.23: Flags [S], seq 1253688325, win 64240, options [mss 1460,sackOK,TS val 1468393084 ecr 0,nop,wscale 7], length 0
17:23:23.395478 ARP, Request who-has 10.200.1.3 tell 10.200.2.2, length 28
17:23:23.395494 ARP, Request who-has 10.200.2.2 tell 10.200.1.2, length 46
17:23:23.395544 ARP, Reply 10.200.1.3 is-at a0:36:9f:54:25:24, length 46

这个区别显然和新增加的路由有关,但是我不知道为什么,毕竟一旦数据包到达具有匹配IP的接口,路由就不应该出现。

顺便说一句,我还使用 tcpdump 检查了环回接口上 tcp 端口 23 的数据包lo,没有这样的数据包。这进一步表明 linux TCP/IP 堆栈很可能看不到来自 10.200.1.2 的 TCP syn 数据包。

任何想法都值得赞赏!

答案1

在以下帮助下找到了这个问题的答案这个博客

运行以下命令后,来自特殊IP的tcp会话就可以得到处理。

ip netns exec pcapReplay1 sysctl -w net.ipv4.conf.all.rp_filter=0
ip netns exec pcapReplay1 sysctl -w net.ipv4.conf.default.rp_filter=0
ip netns exec pcapReplay1 sysctl -w net.ipv4.conf.enp1s0f1.rp_filter=0
ip netns exec pcapReplay1 sysctl -w net.ipv4.conf.lo.rp_filter=0

相关内容