将SSH端口(22)暴露在公网上极易招致自动化脚本和暴力破解攻击。一种简单的应对方法是修改SSH端口号,但这并非真正提升安全性——针对你IP的定向扫描仍会发现端口,不过对于大范围扫描22端口的攻击者来说,你确实会”隐身”。
然而,改端口并不总是可行。你可能有一些自动化脚本或工具依赖默认的22端口,或者你原则上反对任何形式的”隐蔽安全”,即使这种方法在一定程度上是有效的。
另一种常用方案是使用Fail2Ban,它能在客户端多次登录失败后自动封禁其IP,从而阻止暴力破解。
除此之外,还有一种更灵活的方法:端口敲门(Port Knocking)。它在允许访问SSH端口之前,要求客户端先完成一个特定”敲门”动作。触发方式多种多样,例如:
- 向服务器发送特定邮件,由系统处理后临时开放SSH端口;
- 修改某个特定网页内容,服务器定期检查并响应;
- 通过私密聊天渠道(如Telegram)发送指令,服务器监听并执行;
- 甚至是通过短信或Twilio等服务平台通知服务器开放访问。
其中最简单的实现方式,是通过预设的防火墙规则,要求客户端先访问一个”秘密端口”完成敲门,之后防火墙才临时允许该IP连接SSH。
下面我们以Debian 12为例,演示如何配置基于knockd
的端口敲门。
一、安装所需软件
假设你的客户端IP是1.2.3.4
,敲门端口为55025
(可自定义)。
**Debian/Ubuntu系统:**
apt update
apt install knockd iptables-persistent
**RedHat系系统(Alma、Rocky、RHEL等):**
yum install epel-release
yum install knock knock-server iptables-services
二、配置knockd
编辑配置文件:
vi /etc/knockd.conf
写入如下配置:
[options]
UseSyslog
[openSSH]
sequence = 55025
seq_timeout = 5
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 55025,55025
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
该配置实现:
- 单次敲门(55025)即临时开放22端口给对应IP;
- 连续两次敲门(55025,55025)则关闭该IP的SSH访问。
三、设置默认防火墙规则
清除现有规则(如有):
iptables -F
默认禁止SSH连接:
iptables -A INPUT -p tcp --dport 22 -j DROP
放行其他必要流量(根据实际调整):
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
保存规则:
**Debian/Ubuntu:**
netfilter-persistent save
**RedHat系:**
service iptables save
四、启动knockd服务
Debian/Ubuntu需额外编辑 /etc/default/knockd
,设置:
START_KNOCKD=1
然后启动服务(所有系统):
systemctl enable --now knockd
五、配置客户端敲门工具
- Debian/Ubuntu:
apt install knock
- macOS(需Homebrew):
brew install knock
- Windows:
从knock项目页下载预编译二进制文件。
六、使用流程
- 敲门开启SSH:
knock your-server-ip 55025
- 连接SSH:
ssh your-user@your-server-ip
- 使用后关门(可选):
knock your-server-ip 55025 55025
总结
通过端口敲门,你既保留了SSH默认端口,又显著减少了被自动化工具扫描和攻击的风险。该方法结合防火墙动态规则,实现了”看不见的入口”,适合需要兼顾安全与便利的场景。