我正在使用像这样的命令行来高速重放一个巨大的 PCAP 文件 - 我正在对以下各个方面进行基准测试tcpreplay
:
sudo tcpreplay --mbps=1000 --intf1=docker0 linuxbig_log.pcap
由于我不想惹恼我们的系统管理员,我使用我的本地docker
安装作为一个存储桶来将所有无效数据倒入其中,但感觉有点像黑客攻击,我的随机数据实际上可能会对docker
系统造成一些恶意的影响。
我可以使用tcpreplay-edit
并将目标 IP 地址更改为某个黑洞地址,并希望最近的路由器丢弃它们,但我仍然会阻塞其他用户的本地网络,如果本地路由器没有阻止数据包,也许还会阻塞更远地方的其他用户的本地网络。
我理想情况下想要的是一个虚拟以太网适配器,它可以尝试模拟最大带宽、排队等(单向就足够了),但即使只是一个等效的适配器也/dev/null
足够了。一位同事建议使用 TAP,但我真的不知道它如何工作。
附言:我距离实际的 Ubuntu 22.04 Linux 机器有 500 公里,所以我显然无法摆弄硬件。
答案1
有多种选择:
“虚拟”接口。它实际上是 /dev/null。
ip link add dummy2 type dummy ip link set dummy2 up
(这些始终报告链接“开启”并且仍然可以分配 IP 地址,概念上类似于路由器上的“环回”接口。)
没有任何端口的桥(嗯,不包括‘主机’端口)。
ip link add br0 type bridge ip link set br0 up
(有时以与虚拟接口类似的方式使用,但如果没有任何“开启”的端口,它会报告链接“关闭”。)
隧道接口(例如 GRE 或 VXLAN),指向不存在的远程端点。如果您需要重放以太网帧,那么 VXLAN 应该可以工作。
一个真正的以太网端口。获取一个 USB 以太网接口(或者更逼真的 PCI/PCIe 接口),安装它,然后不要连接任何东西,让位从 RJ45 端口落入位桶中。
如果 tcpreplay 希望接口报告链接“up”,请连接一个未连接到其他任何地方的廉价交换机。
为了进一步隔离,你可以将接口移至不同的网络命名空间(容器使用什么),然后在该命名空间内运行 tcpreplay。
一位同事建议使用 TAP,但我真的不知道它如何工作。
TAP 接口是连接到程序(而不是物理电缆)的虚拟以太网接口;通过 TAP 接口发送的任何帧都将由程序从文件描述符中读取。这意味着,程序可以读取并丢弃这些数据包,例如:
socat -u TUN,tun-name=tap3,tun-type=tap,iff-up OPEN:/dev/null
还可以创建持久的未绑定 TUN 或 TAP 接口,该接口不与单个进程的生命周期绑定,但可以多次打开。如果没有任何程序连接,此类接口最终将丢弃任何数据包:
ip tuntap add name tap3 mode tap
(请注意,旧的 tun-specificip tuntap
而不是ip link
。)