我尝试搜索,但没有成功,对此我深感抱歉,并将非常感谢您的重定向。
我想到了一个问题:一台具有 mac 地址的计算机米正在通过 openwrt 路由器(或基于 linux 的系统)发送数据包,我想尝试一下通过来自米但紧接着的数据包必须被丢弃,然后再次被接受,然后被丢弃,依此类推。
因此,如果使用 Mac 的电脑米发送 20 个数据包,只有 10 个会通过,其他 10 个会被丢弃。详细地说,想要的结果是:接受、丢弃、接受、丢弃、接受、丢弃、接受、丢弃,等等……
伪代码解释
condition=ACCEPT
for each packet {
if ( packet_is_sent_from_adapter_with_mac_M ) {
if (condition == ACCEPT) {
accept_packet
condition=DROP
}
else {
drop_packet
condition=ACCEPT
}
}
}
有可能吗?经过一番谷歌搜索后,似乎 iptables 不支持任何条件语句或脚本。
如果可能的话,那么“连续接受 Y 个数据包后丢弃连续 X 个数据包”的一般条件怎么样?
加法1:一般来说,问题是iptables 中不允许“流量控制”?或者更好,因为条件决策基于状态(状况在伪代码中),我们如何在 iptables 中保存与某个条件相关的状态,并对该状态进行检查?
加法2:在评论中建议使用其他工具(tc)来实现流程控制(我的意思是 if 语句、循环等),请随意建议组合(可能要加一点解释)。谢谢!
答案1
满足您的需求,iptablesstatistic
扩展可能会起作用。将模式设置为nth
,every
并将2
其附加到您的DROP
规则中。因此,也许像
iptables -A INPUT -m statistic --mode nth --every 2 -m mac --mac-source xx:xx:xx:xx:xx -j DROP
应该管用。
iptables-extensions 手册页对统计模块有如下说明:
statistic
This module matches packets based on some statistic condition. It supports two distinct modes settable with the --mode option.
Supported options:
--mode mode
Set the matching mode of the matching rule, supported modes are random and nth.
[!] --probability p
Set the probability for a packet to be randomly matched. It only works with the random mode. p must be within 0.0 and 1.0. The supported granularity is in 1/2147483648th increments.
[!] --every n
Match one packet every nth packet. It works only with the nth mode (see also the --packet option).
--packet p
Set the initial counter value (0 <= p <= n-1, default 0) for the nth mode.