如何静默丢弃一些外发数据包?


8

我正在对正在使用的应用程序进行一些测试,并且需要能够在短时间内静默丢弃传出UDP数据包,以复制可能的故障模式。

有什么办法吗?

注意:iptables DROP 对于传出消息,保持沉默!当通过send()挂断一个或类似的呼叫时iptables,它EPERM出于某种奇怪的原因而返回(请参阅此处。不幸的是,我无法使用该应答,因为我的目的地在单个跃点之外)。

xtables-addons 曾经有一个STEAL动词,但几年前我就找不到原因将其删除。


我现在已经尝试在路由表中使用虚假路由,但不幸的是,这似乎破坏了两个方向的通信流量。
对于我需要做的测试,我必须允许入站 UDP流量,并且一旦我安装了虚假路由,流进来的数据包就会立即停止,尽管源仍在发送它们。


1
远非完整/整洁的解决方案,但过去我需要类似的测试条件。在我的情况下,向连接的服务器添加虚假的静态路由效果很好。
史蒂夫2015年

@steve-虚假路由似乎会在两个方向上破坏事物,因此我需要保持RX方向的功能。
假名称

Answers:


2

如何添加虚拟接口并设置到该接口的路由?

# 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

不幸的是,这似乎不允许与来自其他接口的路由匹配的传入数据包。因此,它实际上并不起作用(它破坏了我需要允许继续打开的UDP rx流)。
假名称

2

由于反向路径过滤,添加路由会破坏传入流量。简单的解决方案:在接口上禁用反向路径过滤:

echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter

(使用您的传入界面代替eth0上面的内容)。

您也可以使用REDIRECT目标(将数据包发送到,例如,监听它的netcat nc -l -u -p 1234 > /dev/null)。一个更复杂的版本是NFQUEUE。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.