丢弃 50% 数据包的方法

丢弃 50% 数据包的方法

在我的计算机上我希望只有 50% 的数据包能够接收。

我正在使用 centOS 5.5。

为此,我在网上搜索了一下。我找到了 IPtables。我使用了 IPtables 的随机补丁。

命令

sudo iptables -A INPUT -p icmp --icmp-type echo-request -m random --average 50 -j DROP

输出

iptables v1.3.5: Couldn't load match `random':/lib64/iptables/libipt_random.so: cannot open shared object file: No such file or directory

Try `iptables -h' or 'iptables --help' for more information.

但上面显示该库丢失。

那么,我怎样才能丢弃总数的 50% 的数据包呢?请纠正我上述的方法或建议新的方法。

告诉我如何将这些库添加到 IPtables 现有包中。[我试过了,但在网上找不到这些库]

编辑 1

我还需要记录丢弃的数据包,因此我将 iptables 规则集更改如下:

iptables -L -n -v输出为 [这在系统 1 上运行]

Chain INPUT (policy ACCEPT 1875K packets, 114M bytes)
 pkts bytes target     prot opt in     out     source               destination
   23  2392 random_drops  icmp --  *      *       0.0.0.0/0            0.0.0.0/0           statistic mode random probability 0.500000

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 2121K packets, 206M bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain random_drops (1 references)
 pkts bytes target     prot opt in     out     source               destination
   23  2392 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4 prefix `dropped randomly: '
   23  2392 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0

然后我运行一个脚本(该脚本在系统 2 的两个实例上运行以创建更多流量)

while [ 1 ]; do
    rsh a.b.c.d pwd;
done

在两个系统上。但没有形成日志。

  1. /var/log/messages 权限是 -rw------- root:root。
  2. /var/log/syslog 不存在。

我错过了什么?

答案1

CentOS 5.5 没有预安装 ipt_random 和 ipt_statistic 模块。你可以恢复到CentosALT 存储库(请原谅我的俄语)并使用那里已经编译好的统计模块:

wget http://centos.alt.ru/repository/centos/5/x86_64/centalt-release-5-3.noarch.rpm
# [...]
rpm -Uvh centalt-release*rpm
# [...]
yum install ipt_statistic

并运行

sudo iptables -A INPUT -p icmp --icmp-type echo-request -m statistic --mode random --probability 0.50 -j DROP

应该产生你想要的规则。

Netem 文档中的注释:

注意事项

当本地使用丢失(而不是在桥接器或路由器上使用)时,丢失会报告给上层协议。这可能会导致 TCP 重新发送并表现得好像没有丢失一样。测试协议对丢失的响应时,最好在桥接器或路由器上使用 netem

尽管只要您只是在 INPUT 链中进行 DROP,这显然就不适用。

答案2

这是一个核心配置问题。请参阅iptables-extensions(8),它解释了statistic模块:

iptables ... -m statistic --mode random --probability 0.5 ...

(按必填项填写...)。

这是内核配置CONFIG_NETFILTER_XT_MATCH_STATISTIC,在此处设置为模块(Fedora 18、kernel-3.8.3-201.fc18.x86_64、iptables-1.4.16.2-5.fc18.x86_64)。用户空间可执行文件周围没有匹配的ipt_statistic共享对象iptables

相关内容