从同一主机的另一个接口 ping 一个接口

从同一主机的另一个接口 ping 一个接口

我有一台计算机(运行 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 …每次我们需要在非默认网络命名空间中运行某些内容时,都会使用此答案。

像这样继续:

  1. 定义有用的变量。这里ns1是命名空间的任意名称;eth1eth2是您要使用的设备。

    netns=ns1
    dev1=eth1
    dev2=eth2
    
  2. 创建一个新的网络命名空间。

    ip netns add "$netns"
    
  3. 将设备置于默认命名空间内。

    ip link set dev "$dev1" down
    ip link set dev "$dev2" down
    
  4. 将其中一个设备添加到新的命名空间(它将从默认命名空间中消失)。这里我选择移动$dev2到新的命名空间。

    ip link set dev "$dev2" netns "$netns"
    
  5. 分配 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"
    
  6. 确认两个设备都位于其应在的位置并具有正确的 IP 地址。

                           ip address show
    ip netns exec "$netns" ip address show
    # examine output
    
  7. 如果尚未完成,请使用电缆物理连接两个接口。

  8. 启动接口。命名空间包含自己的环回设备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
    
  9. 检查路线。在我的 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
    
  10. 以某种方式 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"

这会将第二台设备移回默认网络命名空间。

我们使用的任何命令都无法实现永久性的改变,因此如果出现任何问题,只需重新启动即可。

相关内容