我想做一些实验来测试ping
和fping
命令(请参阅:相当于 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
在 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.x
IP 地址。
因此,解决方案就是简单地选择一个不同的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 address
Again 将重新创建接口并使 ping 再次开始响应。