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 小时),但这将使其更难以与仍然能够启动与外部通信的系统集成。