在 iptables linux 中将 IP 添加到另一条与十六进制匹配的规则中

在 iptables linux 中将 IP 添加到另一条与十六进制匹配的规则中

iptables -t raw -A PREROUTING -p udp --dport 4578 -m 字符串 --十六进制字符串 '|feffffffffffffffffff77f12|'

如何在 Iptables 上自动将具有上述十六进制字符串的 IP 列入白名单。

我将丢弃 iptables 上的所有传入流量,仅允许包含上述十六进制字符串的数据包。每当我们收到包含上述十六进制字符串的数据包时,我都希望立即在 Iptables 上将其 IP 列入白名单。这样来自该特定 IP 的所有流量都会通过

提前致谢

答案1

OP 希望实现一个非常粗鲁的(因为只有一个敲击)港口敲门者

我的建议是使用类似的工具fwknop用于单包认证:不以明文形式发送秘密,防止重放攻击并且易于与防火墙规则集成。


无论如何,回答这个问题。OP 没有说明系统是路由器,所以我认为系统是一个简单的主机。对于路由器,出现在过滤器中的规则INPUT应该被调整以用于过滤器中FORWARD,或者作为补充。

方法是:

  • 准备一个存储库作为当前允许的 IP 的内存:ipset并定义其默认超时,以便条目无需额外的脚本即可过期

    如果你想

    • 一次性存储多个IP地址或端口号,并通过iptables进行集合匹配;

    [...]

    至少还有一个其他选择,例如recent iptables模块,但如果以后需要更改,它就不那么灵活了。

    ipset create allowedset hash:ip timeout 120
    

    启动时集成注意事项:必须在iptables引用它的规则被添加或加载或iptables将无法加载这些规则(或iptables-restore包含这些规则的整个规则集)。

  • 使用以下命令将后续客户端的 IP 添加到内存存储中-j SET(重用并修复了 OP 的规则,该规则在生的表格...原因?):

    iptables -t raw -I PREROUTING 1 -p udp --dport 4578 -m string --algo bm --hex-string '|fefffffffffffffffff77f12|' -j SET --add-set allowedset src
    
  • 为状态防火墙添加常用样板(这可以处理更多细节):

    iptables -I INPUT 1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    iptables -I INPUT 2 -m conntrack --ctstate INVALID -j DROP
    
    iptables -I INPUT 3 -i lo -j ACCEPT
    
  • 当新流的第一个数据包出现时,使用-m set检查此流是否来自之前存储的 IP,如果是,则允许数据包

    iptables -I INPUT 4 -m set --match-set allowedset src -j ACCEPT
    
  • 删除其他内容(或者将默认策略设置为删除)

    iptables -I INPUT 5 -j DROP
    

超时时间定义为 120:2 分钟。这是可以建立新流的窗口。一旦建立(例如:SSH 远程连接或基于 UDP 的隧道),只要活动使其保持建立状态,它就可以永远保持建立状态(对于 UDP,从 Netfilter 的角度来看连接跟踪,对于经历过多次交换的流,其活动时间少于 120 秒,否则少于 30 秒)。


可以使用其他选项来不允许流程继续超过超时时间(这将需要更长,例如 OP 的 2 小时),但这将使其更难以与仍然能够启动与外部通信的系统集成。

相关内容