需要帮助使用 IP 表规则按十六进制进行过滤

需要帮助使用 IP 表规则按十六进制进行过滤

我正在设置服务器,需要进行特定配置。我必须丢弃一个始终以 开头的特定数据包XX 01。我可以使用以下规则来执行此操作:

sudo iptables -A INPUT  -p tcp --dport XXXX -m string --hex-string '|XX 01|' --algo bm -j REJECT

但问题是它iptables从第一个十六进制字符开始读取,所以有时会产生误报。
我的意思是,它iptables会丢弃符合规则的正常数据包。例如:它会丢弃aa aa aa XX 01 aa aa aa aa

我需要iptables做的是,仅当数据包XX 01是数据字符串的前 4 个字符时才丢弃该数据包。忽略它是否在第 4 个数据之后存在。我的意思是,例如,如果我有它,6D 00 00 00 00 00 XX 01 00 AA它必须通过。

我知道还有相反的方法,我的意思是,我可以连接我的服务器并用 嗅探传入的数据包wireshark,以便将第一个十六进制列入白名单,该十六进制不是XX 01针对每个包含XX 01其数据字符串的数据包:例如6D我放在那里的字符串。但要这样做,我需要嗅探几个小时,我必须创建很多规则。我需要设置一条规则,将所有以 开头的任何内容以外的数据包列入白名单XX 01,或者设置一条规则,在第 4 个十六进制字符后停止读取数据包。

任何帮助将不胜感激。

答案1

根据手册页string的部分内容iptables-extensions,有两个选项可以控制针对数据包的哪一部分进行模式测试:

   --from offset
          Set the offset from which it starts looking for any matching. If
          not passed, default is 0.

   --to offset
          Set the offset up to which should be scanned. That is, byte off‐
          set-1 (counting from 0) is the last one that is scanned.  If not
          passed, default is the packet size.

您是否尝试过--to 2应该将匹配范围长度限制为该值的参数?

相关内容