我正在对我正在开发的应用程序进行一些测试,并且我需要能够默默短时间内丢弃传出的 UDP 数据包以复制可能的故障模式。
有什么办法可以做到这一点吗?
笔记:iptables
DROP
对于发出的消息并不沉默!当send()
掉线或类似的呼叫时iptables
,它会EPERM
因某种奇怪的原因返回(请参阅这里。不幸的是,我不能使用这个答案,因为我的目的地只有一跳之遥)。
xtables-addons
用过的有一个STEAL
动词,但几年前它就被删除了,我找不到任何原因。
我现在尝试在路由表中使用虚假路由,不幸的是,这似乎破坏了两个都通信流量的方向。
对于我需要做的测试,我有允许入境UDP 流量,一旦我安装了虚假路由,流式传入数据包就会立即停止,尽管源仍在发送它们。
答案1
添加虚拟接口并设置到该接口的路由怎么样?
# ip link add dummy0 type dummy
# ip link set dev dummy0 up
# ip route add 8.8.8.8/32 dev dummy0
# ping -c3 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2015ms
它始终向 上的任何(邻居或远程)地址发送数据包dummy0
。
# tshark -i dummy0
Running as user "root" and group "root". This could be dangerous.
Capturing on 'dummy0'
1 0.000000 10.10.0.59 -> 8.8.8.8 ICMP 98 Echo (ping) request id=0x1ce0, seq=1/256, ttl=64
2 1.007348 10.10.0.59 -> 8.8.8.8 ICMP 98 Echo (ping) request id=0x1ce0, seq=2/512, ttl=64
3 2.015394 10.10.0.59 -> 8.8.8.8 ICMP 98 Echo (ping) request id=0x1ce0, seq=3/768, ttl=64
答案2
由于反向路径过滤,添加路由会破坏传入流量。简单的解决方案:在接口上禁用反向路径过滤:
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
(使用您的传入接口代替eth0
多于)。
您还可以使用REDIRECT
目标(将数据包发送到侦听它的 netcat nc -l -u -p 1234 > /dev/null
)。更复杂的版本是 NFQUEUE。