我有一台计算机(运行 Linux),带有两个以太网接口。我想在不涉及另一台 PC 的情况下测试它们。
设置:
(192.168.1.5) eth1-------.
Linux PC/device | loopback cable
(192.168.1.6) eth2-------'
我跑
ping -I eth1 192.168.1.6
但没有回复。
我不明白问题出在哪里。为什么 Linux 会阻止此操作?我该如何解决这个问题?
答案1
为什么?
我无法完全解释。
我怎么解决这个问题?
通常Linux 在内部访问本地分配的 IP 地址并且它正常工作。似乎问题出现在真正需要数据包传输到外部(例如通过电缆)并返回时 - 就像您的情况一样。
您可以使用网络命名空间来实现这一点。我调整了我的另一个答案满足您的需求。
笔记:
- 我在 Debian 10 上进行了测试。
ip …
您可能需要在命令所在的位置sudo ip …
。为了便于阅读,我省略了sudo
。在提升的 shell 中工作或(暂时)定义alias ip='sudo ip'
以便能够方便地复制粘贴。- 我认为没有自动化干扰,即没有守护进程会尝试以自己的方式配置相关接口。
- 要在非默认网络命名空间中运行命令,我使用
ip netns exec …
。 可以通过这种方式运行 shell;然后从 shell 运行的所有内容都将使用网络命名空间。ip netns exec …
每次我们需要在非默认网络命名空间中运行某些内容时,都会使用此答案。
像这样继续:
定义有用的变量。这里
ns1
是命名空间的任意名称;eth1
和eth2
是您要使用的设备。netns=ns1 dev1=eth1 dev2=eth2
创建一个新的网络命名空间。
ip netns add "$netns"
将设备置于默认命名空间内。
ip link set dev "$dev1" down ip link set dev "$dev2" down
将其中一个设备添加到新的命名空间(它将从默认命名空间中消失)。这里我选择移动
$dev2
到新的命名空间。ip link set dev "$dev2" netns "$netns"
分配 IP 地址。
ip address add 192.168.1.5/24 dev "$dev1" ip netns exec "$netns" ip address add 192.168.1.6/24 dev "$dev2"
确认两个设备都位于其应在的位置并具有正确的 IP 地址。
ip address show ip netns exec "$netns" ip address show # examine output
如果尚未完成,请使用电缆物理连接两个接口。
启动接口。命名空间包含自己的环回设备
lo
。我启动它只是为了以防万一,因为一般程序可能需要依赖它。ip link set dev "$dev1" up ip netns exec "$netns" ip link set dev "$dev2" up ip netns exec "$netns" ip link set dev lo up
检查路线。在我的 Debian 10 中,会自动显示合理的路线。此命令
ip route show
打印(以及其他行)
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.5
和这个命令
ip netns exec "$netns" ip route show
印刷
192.168.1.0/24 dev eth2 proto kernel scope link src 192.168.1.6
以某种方式 ping。
ping 192.168.1.6 ip netns exec "$netns" ping 192.168.1.5
可以使用
-I
但不是必须的。该地址192.168.1.6
未分配给默认网络命名空间中的任何接口;并且192.168.1.5
未分配给非默认命名空间。
就是这样。它应该可以工作。我的测试表明这些ping
确实使用了电缆。我可以说是因为:
- 断开电缆会使它们停止流动;作为比较:“内部” ping(从有线接口到其自己的 IP 地址)即使没有电缆也会流动;
iptraf-ng
监控 ping 接口会显示 ICMP 回显请求和 ICMP 回显答复;作为比较:该工具不会显示有线接口的“内部” ping。
基本清理:删除网络命名空间。
ip netns del "$netns"
这会将第二台设备移回默认网络命名空间。
我们使用的任何命令都无法实现永久性的改变,因此如果出现任何问题,只需重新启动即可。