我有一台运行 Ubuntu 15.10 的笔记本电脑。这里有一个集成网络适配器,我通过 USB 向其添加了另一个。我现在有两个网络接口,当我输入 ifconfig 时都会显示它们。接下来我为它们配置了一个静态 IP:eno0 -> 192.168.0.21(板载网卡)eno1 -> 192.168.0.22(USB 网卡)
两个适配器都通过以太网电缆直接连接到不同的目标 PC:192.168.0.21 -> 192.168.0.1(目标 PC 1)192.168.0.22 -> 192.168.0.2(目标 PC 2)
接下来我有一个 Python 脚本,用于将 UDP 数据包从笔记本电脑发送到目标 PC:
import socket
import time
#create socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind("192.168.0.21", 2000)
sock.sendto("test", ("192.168.0.1", 2000))
如果只连接了一个适配器,此方法有效。当两个适配器都连接时,此方法仅适用于先连接的接口。然后我尝试通过不工作的接口发送 ping。假设接口 eno0 正在工作并且可以通过 Python 脚本成功发送 UDP 数据包,那么此方法将不起作用:
ping -I eno1 192.168.0.2
它显示数据包离开 PC,通过 Wireshark 我可以看到它们离开网卡,我甚至可以看到目标 PC 发送回复,但在终端中它没有显示,当使用 ctrl+c 中止时,我看到已发送了 5 个数据包,并且它们全部丢失了。通过 eno0 向目标 PC 执行 ping 操作非常顺利。
我该如何解决?
答案1
我认为它按预期工作。我认为您的路由表存在问题。
当您连接第一个适配器时,默认路由是通过此适配器设置的。当您连接另一个适配器时,第一个适配器的默认路由已经设置好了。第二个适配器无法工作,因为没有路由会使用它。尝试输入/sbin/route
。/sbin/route -n
您将看到数据包是如何路由的。
我会为您的两个连接添加路由,因为如果我理解正确的话,您只想通过这些连接发送 UDP 数据包。其他流量呢?请尝试以下方法:
/sbin/route add -net 192.168.0.1 netmask 255.255.255.255 dev eno0
/sbin/route add -net 192.168.0.2 netmask 255.255.255.255 dev eno1
这样,您就指定 192.168.0.1 的流量应通过 eno0,而 192.168.0.2 的流量应通过 eno2。如果您只需要这两个连接,它应该可以正常工作。但是,如果您有其他连接并且希望它们也能正常工作。您需要确保其他路由也正确。
我建议对两个连接使用不同的地址范围。这样您就不需要手动更改路由表:
eno0: 192.168.0.21, PC1: 192.168.0.1
eno1: 192.168.1.22, PC2: 192.168.1.2
netmask: 255.255.255.0 for all connections
default gateway is not important in this case, because pairs are on the same network range