我需要将两个机器人设备连接到我的计算机,为此我想使用连接到这些不同硬件的两个网卡。两台设备碰巧使用相同的网络(IP 地址 10.0.0.70 和 10.0.0.21,网络掩码 255.255.255.0 在这两种情况下)。
我发现,如果我配置并建立任何单张卡的网络,它都可以正常工作:我可以 ping 机器人设备,并且我可以连接到它。然而,当我放出第二张卡时,两张卡中只有一张在工作。我尝试给主计算机提供不同的IP地址,也尝试给相同的IP地址,没有区别。我尝试指定主机的IP地址作为网关,每个卡不一样,都一样,没有任何区别。当两张卡都启动时,即使其中一张卡上的 ping 操作也不起作用,即使我在 ping 操作时指定要使用哪个接口也是如此。
我的内核是 4.15.0-39-generic #42~16.04.1-Ubuntu SMP 10 月 24 日星期三 17:09:54 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux。
如果我将两个网卡分配给不同的网络,它们就可以一起工作。然而,优选不要改变机器人设备一侧的网络设置。我不需要在这两个卡之间路由数据包。
这是我得到的工作配置:
enp3s0 Link encap:Ethernet HWaddr 18:d6:c7:00:d9:3e
inet addr:10.0.1.30 Bcast:10.0.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:16929681 errors:0 dropped:0 overruns:0 frame:0
TX packets:56504 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1219898415 (1.2 GB) TX bytes:5267812 (5.2 MB)
enp6s0 Link encap:Ethernet HWaddr 18:d6:c7:01:69:35
inet addr:10.0.0.22 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::1ad6:c7ff:fe01:6935/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:52316 errors:0 dropped:0 overruns:0 frame:0
TX packets:16935487 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4325056 (4.3 MB) TX bytes:1220948325 (1.2 GB)
一旦我将第一台设备的IP更改为10.0.0.30(并且广播地址更改为10.0.0.255),它就会停止工作。
我刚刚在 Kali Linux live distribution 下尝试过,即使在那里它也不起作用。在 Kali Linux 下
ifconfig eth0 10.0.0.21 netmask 255.255.255.0 up
ifconfig eth1 10.0.0.70 netmask 255.255.255.0 up
再说一次,我希望至少 ping -I 应该可以工作,但不行,要 ping 任何一个,另一个必须已关闭。任何简单的交换机怎么可能有多个物理端口连接到同一网络,而大型计算机却不能?
答案1
默认情况下,Linux的IP协议驱动程序使用一种技术名称为“弱端系统模型”或“弱主机模型”的优化。请参阅此问题了解更多详细信息。
归根结底,当您使用属于同一 IP 地址空间块的 IP/网络掩码组合配置两个 NIC 时,负责路由传出 IP 地址的代码将假定这意味着这两个 NIC 都连接到同一物理网段,因此它们中的任何一个都可以用来与该块中具有 IP 地址的任何主机进行通信。然后,它仅使用路由表中最先列出的接口来处理该网段的所有传出流量。它没有使用相同 IP 地址空间副本的多个不同物理网络的概念。
如果您的系统碰巧有反向路径过滤( /proc/sys/net/ipv4/conf/*/rp_filter
) 启用后,即使您指定网络接口(例如 ),它也可能会阻止您 ping 机器人之一eth1
:当答案通过 传入时eth1
,反向路径过滤器会发现到该源 IP 的正常路由将通过eth0
,因此这个传入的数据包eth1
一定是假的。如果您启用以下功能,您可以查看是否会发生这种情况火星人日志环境:
for i in /proc/sys/net/ipv4/conf/*/log_martians; do
echo 1 > $i
done
然后尝试 ping 您的机器人,然后检查输出的结尾dmesg
:您可能会看到有关丢弃数据包的消息。
您的情况需要路由在决定用于传出数据包的 NIC 时考虑源 IP 地址,从而根据所谓的“强终端系统模型”或“强主机模型”进行操作。嗯,Linux能使用“高级路由”功能可以做到这一点,但这绝对不是默认设置,而且配置起来相当棘手。如果您确实想这样做,请参阅我在上述问题中的回答,了解配置方法。
然而,由于机器人的 IP 地址不重叠,因此在软件配置方面最简单的解决方案是购买一个小型廉价网络交换机(甚至是集线器),并将两个机器人和一根网络电缆从计算机插入其中。
或者,如果您希望在最少的硬件方面实现简单性,那么只需将机器人配置为使用不同的 IP 段(如果您想将它们直接连接到同一台计算机上的多个 NIC)即可。
答案2
由于机器人设备具有不同的 IP,最简单的方法是创建一个 Linux 桥,将两个以太网接口作为端口。类似的东西
ip link add name br0 type bridge
ip link set enp3s0 master br0
ip link set enp6s0 master br0
然后设置一个单身的面向内部的接口上的 IP 地址br0
:
ip addr add 10.0.0.1/24 dev br0
您应该可以正常使用了,没有交换机挂在盒子的尾部,但一切仍然在同一个网络上。
还有请,请,不要使用 Kali Linux 来做这样的事情。读这,帮自己一个忙,切换到一些用于日常工作的发行版(基于 Debian,因为 Kali 也是基于 Debian)。你遇到的麻烦会少很多。 Kali 拥有的所有闪亮工具也可以安装。
答案3
对于 21 和 70,您可以使用两个不重叠的子网 10.0.0.0/26 和 10.0.0.64/26(/26 = 掩码 255.255.255.192)。假设没有其他接口包括 10.0.0.0/25。