如何在特定 IP 地址创建以太网接口,我可以 ping 并强制有时回复有时不回复?

如何在特定 IP 地址创建以太网接口,我可以 ping 并强制有时回复有时不回复?

我想做一些实验来测试pingfping命令(请参阅:相当于 Linux 上的“ping -o”),但我需要一个本地虚拟以太网接口来测试这一点。

我想要一个场景,我可以运行ping 10.0.0.1(或任何其他IP)并让它失败。然后,在ping仍在运行的同时,我运行一些命令来打开界面并使其通过。换句话说, 的输出ping将会改变当它运行时,随着虚拟设备“活跃”起来。我不想使用物理硬件。

我怎样才能做到这一点?

我已经尝试按照我自己的指示进行操作(如何在没有物理适配器的计算机上创建虚拟以太网接口?),但不幸的是,即使运行后sudo ip link set eth10 down,通过 ping eth10ping 10.0.0.1仍然成功。运行sudo ip link delete eth10 type dummy删除dummy虚拟设备后,ping 10.0.0.1也依然成功。


到目前为止的功能答案摘要:

(截至2021年11月22日)

收到 3 个答案(包括我自己的答案),以及所有 3 个答案都有效!:

  1. 通过斯蒂芬·哈里斯- 使用环回子接口(可能是迄今为止最好的答案)
  2. 通过豪克拉金- 使用iptables
  3. 我自己的答案- 使用虚拟接口

答案1

在 Linux 上,您可以使用 lo(环回)上的子接口来执行此操作。

例如在我运行的一个窗口中

% ping 10.200.200.1
PING 10.200.200.1 (10.200.200.1) 56(84) bytes of data.

我没有得到任何回复,因为我没有任何关于该地址的信息。

在另一个窗口中

% sudo ifconfig lo:100 10.200.200.1 netmask 255.255.255.0 up

现在 ping 开始响应

64 bytes from 10.200.200.1: icmp_seq=25 ttl=64 time=0.058 ms
64 bytes from 10.200.200.1: icmp_seq=26 ttl=64 time=0.035 ms
64 bytes from 10.200.200.1: icmp_seq=27 ttl=64 time=0.037 ms
64 bytes from 10.200.200.1: icmp_seq=28 ttl=64 time=0.040 ms

然后我可以做

% sudo ifconfig lo:100 down

并且 ping 再次停止工作。

本质上,我们所做的就是向环回接口添加一个“子接口”。在本例中,我称之为它,lo:100但您可以选择lo:1-> lo:255

子接口实际上只是为同一接口分配 2 个或更多地址的一种方式。例如,如果您分配了一个地址,eth0:1那么您的计算机在物理接口上将有 2 个地址,并且网络上的其他计算机可以在这两个地址上访问该地址。将它们放在lo(环回)意味着只有您的测试机器知道额外的地址,并且网络的其余部分不受影响。

在数据包级别,任何流量都lo:100流经lo。这不同于假的创建全新接口并隔离流量的接口。

答案2

如果您已添加10.0.0.1到您的接口之一,那么您可以使用以下命令丢弃到该地址的 ping 数据包:

iptables -I OUTPUT 1 -p icmp --icmp-type echo-request -d 10.0.0.1 -j DROP

您可以使用以下命令删除此规则

iptables -D OUTPUT -p icmp --icmp-type echo-request -d 10.0.0.1 -j DROP

通过交替执行这两个命令可以在两种状态之间切换。

以下是一些示例ping 10.0.0.1输出,显示数据包正在通过,然后被阻止,然后再次通过:

$ ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=5.04 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=4.20 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=3.33 ms
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
64 bytes from 10.0.0.1: icmp_seq=8 ttl=64 time=8.49 ms
64 bytes from 10.0.0.1: icmp_seq=9 ttl=64 time=3.33 ms
64 bytes from 10.0.0.1: icmp_seq=10 ttl=64 time=6.90 ms
64 bytes from 10.0.0.1: icmp_seq=11 ttl=64 time=6.91 ms
^C
--- 10.0.0.1 ping statistics ---
11 packets transmitted, 7 received, 36% packet loss, time 10088ms
rtt min/avg/max/mdev = 3.330/5.459/8.491/1.859 ms

答案3

@Hauke Laging 是对的在他在我的问题下的评论中

可能有不一样的10.0.0.1地方。比较ip route get 10.0.0.1两种情况下的输出。

ip route get 10.0.0.1显示这个删除虚拟接口:

local 10.0.0.1 dev lo src 10.0.0.1 uid 46153590

...表明该路线正在通过我创建的虚拟接口,并且它显示了这一点通过运行删除虚拟接口sudo ip link delete eth10 type dummy

10.0.0.1 dev wlp0s20f3 src 10.0.0.36 uid 28301632

...表明 IP 现在正在通过我的wlp0s20f3无线卡路由。我想这是有道理的,因为我的本地 WiFi 正在使用和分配10.0.0.xIP 地址。

因此,解决方案就是简单地选择一个不同的IP不是在创建虚拟接口之前可以执行 ping 操作!在我的例子中使用10.0.0.100代替10.0.0.1效果很好。但是,我们仅用于254.254.254.254本示例的情况。

完整示例:

首先,确保您想要使用的所需 IP 地址当前没有响应ping

ping -c 1 -W 1 254.254.254.254

示例输出:

PING 254.254.254.254 (254.254.254.254) 56(84) bytes of data.

--- 254.254.254.254 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

现在创建一个虚拟eth99接口(有关完整说明,请参阅我的其他答案:如何在没有物理适配器的计算机上创建虚拟以太网接口?):

sudo modprobe dummy \
&& sudo ip link add eth99 type dummy \
&& sudo ip address change dev eth10 254.254.254.254 \
&& ip address

现在可以 ping 通了。跑步ping 254.254.254.254。示例 cmd 和输出:

$ ping 254.254.254.254
PING 254.254.254.254 (254.254.254.254) 56(84) bytes of data.
64 bytes from 254.254.254.254: icmp_seq=1 ttl=64 time=0.086 ms
64 bytes from 254.254.254.254: icmp_seq=2 ttl=64 time=0.093 ms
64 bytes from 254.254.254.254: icmp_seq=3 ttl=64 time=0.086 ms
64 bytes from 254.254.254.254: icmp_seq=4 ttl=64 time=0.051 ms
^C
--- 254.254.254.254 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3050ms
rtt min/avg/max/mdev = 0.051/0.079/0.093/0.016 ms

现在,如果您ping 254.254.254.254在一个终端中运行,并sudo ip link delete eth99 type dummy在另一个终端中运行,则一旦删除该接口,ping 响应将停止递增。sudo modprobe dummy; sudo ip link add eth99 type dummy; sudo ip address change dev eth99 254.254.254.254; ip addressAgain 将重新创建接口并使 ping 再次开始响应。

相关内容