如何默默地丢弃一些传出数据包?

如何默默地丢弃一些传出数据包?

我正在对我正在开发的应用程序进行一些测试,并且我需要能够默默短时间内丢弃传出的 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。

相关内容