Iptables 和条件语句。可能吗?

Iptables 和条件语句。可能吗?

我尝试搜索,但没有成功,对此我深感抱歉,并将非常感谢您的重定向。

我想到了一个问题:一台具有 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扩展可能会起作用。将模式设置为nthevery并将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. 

相关内容