Linux 路由:2 个本地接口之间的路由取决于源地址?

网络工程 路由 ipv4 linux UDP 界面
2021-07-14 23:49:53

设置是这样的:
linux 系统(debian 7 作为 VBox 来宾)具有以下接口:

$ ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 08:00:27:de:a3:54 brd ff:ff:ff:ff:ff:ff
        inet 201.1.1.1/24 brd 201.1.1.255 scope global eth0
    3: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
        link/ether 9e:7a:83:ec:5e:47 brd ff:ff:ff:ff:ff:ff
        inet 10.0.0.1/24 brd 10.0.0.255 scope global tap0

路由表由 quagga ripv2 守护进程填充,如下所示:

$ ip route
10.0.0.0/24 dev tap0  proto kernel  scope link  src 10.0.0.1 
201.1.1.0/24 dev eth0  proto kernel  scope link  src 201.1.1.1 
202.1.1.0/24 via 10.0.0.2 dev tap0  proto zebra  metric 2 

通过接口 tap0 从另一个子网接收 UDP 数据包。他们的目的地总是 201.1.1.1:30000。
但是,根据它们的源地址,netcat 侦听器会看到或不会看到其中的一些。
这是 tcpdump 输出:

$ sudo /usr/sbin/tcpdump -i tap0 port 30000
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tap0, link-type EN10MB (Ethernet), capture size 65535 bytes
17:25:36.060532 IP 10.0.0.2.38353 > 201.1.1.1.30000: UDP, length 6
17:25:52.073758 IP 202.1.1.1.30000 > 201.1.1.1.30000: UDP, length 457

和 netcat 输出:

$ netcat -vnulp 30000
listening on [any] 30000 ...
connect to [10.0.0.1] from (UNKNOWN) [10.0.0.2] 38353
hello

第一个数据包(len 6,用 netcat 发送)被正确接收。未收到第二个数据包(len 457,使用绑定到 202.1.1.1 的数据报套接字发送)。
我应该怎么做才能让 netcat 正确接收两个数据包?

注意:iptables 是空的;/proc/sys/net/ipv4/ip_forward=1

1个回答

第二个数据包来自相邻的子网,它似乎是通过 Quagga 学习的(此信息与您的 OQ 相关)。tap接口显然已经收到了包,这tcpdump正显示出你,但它并没有被递了上来栈到应用程序。

length每个包的也给出了一些线索。为什么第二个数据包比第一个大这么多?它是否包含您的应用程序未正确解析的附加信息?

此外,tap0接口处于状态这一事实UNKNOWN也是有问题的——它应该处于UP状态。您可以尝试桥接tap0eth0连接在一起(这是tap传统上使用接口的方式),然后将 201.1.1.1/24 移动到新创建的br0接口。