我想知道在linux中是否可以在用户空间接收具有127.0.0.0/8 dst地址但来自外部接口的UDP数据包。
我用 nc 测试了它,我可以看到虽然 nc 绑定到所有地址,但它没有收到数据包。
在设备 1上,我操纵本地路由表将此数据包路由到所需的接口,然后发送测试数据包。
设备1:
frr:~# ip route show table local
...
127.1.1.1 nhid 17 encap mpls 16 via 10.10.10.5 dev eth5
...
frr:~# echo "foo" | nc -w1 -u -v -s 3.3.3.3 127.1.1.1 3503
设备2:
frr:~# nc -l -u -p 3503
在设备 2 接口上的wireshark 中生成并捕获以下数据包:
我知道根据RFC 1812这永远不应该发生。另一方面,根据RFC4379,这是一个有效的用例。这里的技巧是,我发送的数据包实际上不是 IP 路由的,而是 MPLS 交换的,并且在最后一跳,由于 PHP(倒数第二跳弹出)而丢失了 MPLS 标签,并且使用 127.0.0.0/8 地址作为 dst 的目标是确保当标签堆栈耗尽或没有有效的下一跳时,路由器不会根据 IP 地址转发,而是处理数据包。这称为 MPLS OAM 或 LSP Ping。