我一直在研究使用端口敲击来隐藏/保护 SSHD。我知道 knockd 和其他实现,但我想要一些可移植且简单的东西。所以我决定使用最新模块的 iptables 就足够了。
我已经禁用了基于密码的登录,并要求输入公钥/私钥。我只是希望即使对于端口扫描器来说,SSHD 看起来也不在服务器上。
我见过许多 iptables 规则示例,但我不太清楚它们应该如何工作。
我想要的是敲击一个单一的隐蔽端口以打开端口 22。同时,如果访问了该端口周围的端口,我想暂时禁用端口敲击。因此,如果我的敲击端口是 123,则敲击此端口将为敲击者打开端口 22 5 秒钟。但如果敲击端口 122 或 124,则会禁用敲击者的端口敲击 15 分钟(因此,即使他们敲击 123,在这段时间内也不会发生任何事情)。
哪些 iptables 规则可以实现这一点?
编辑:我应该补充一下,我正在使用 CentOS 5.5。可以使用 iptable 模块。
答案1
所有这些规则都摆iptables -A INPUT
在他们面前。
# if port 122 or 124 is touched add to block list
-m state --state NEW -m tcp -p tcp -–dport 122 -m recent --set --name blocked
-m state --state NEW -m tcp -p tcp -–dport 124 -m recent --set --name blocked
# if you are on the block list you cannot touch 123 for 15min
-m state --state NEW -m tcp -p tcp --dport 123 -m recent --rcheck --name blocked --seconds 900 -j DROP
# if port 123 is touched add to the knocked list
-m state --state NEW -m tcp -p tcp --dport 123 -m recent --set --name knocked
# if you are on the knock list you can initiate an ssh session for 5 seconds
-m state --state NEW -m tcp -p tcp --dport 22 -m recent --rcheck --name knocked --seconds 5 -j ACCEPT
需要注意的一点是,我不知道 ipt_recent 是否可以跟踪 15 分钟。
编辑:尝试使评论更好并添加缺失的“最近”。
答案2
我看不出除了netfilter 的 conntrack 助手专门为此目的而编写 - 您无法“编写”动态 iptables 规则集,而必须使用 conntrack 机制。这显然不适用于 vanilla iptables,而需要自定义编译的模块。