用端口碰撞为 SSH 加一道隐形门
SSH 是远程管理 Linux 服务器的标准工具,但仅靠默认设置并不足够安全。除了保持 SSH 最新、使用密钥登录外,端口碰撞(Port Knocking) 可以为你的服务器增加一道隐藏的防护墙。什么是端口碰撞?
端口碰撞的原理很简单:
默认情况下,服务器的 SSH 端口(如22)保持关闭,无法直接连接。
你需要按预设顺序连续“敲击”几个特定端口(如 7000,8000,9000),相当于输入一段暗号。
服务器识别暗号后,临时打开 SSH 端口,允许你登录。
操作完成后,再发送另一段顺序相反的端口序列,重新关闭 SSH 端口。
这样一来,SSH 服务对外始终“隐身”,只有知道正确碰撞序列的人才能临时打开它。
如何配置端口碰撞(以 knockd 为例)
1. 安装 knockd
在服务器与需要登录的客户端上安装:
bash
sudo apt install knockd # Ubuntu/Debian
# 或使用其他包管理器如 yum/dnf
2. 服务器端配置
修改配置文件 /etc/knockd.conf:
text
UseSyslog
sequence = 7000,8000,9000 # 自定义“开门”序列
seq_timeout = 5
command = /usr/sbin/ufw allow from %IP% to any port 22
tcpflags = syn
sequence = 9000,8000,7000 # “关门”序列(通常与开门相反)
seq_timeout = 5
command = /usr/sbin/ufw delete allow from %IP% to any port 22
tcpflags = syn
(如果使用 iptables,可对应调整 command 命令)
设置网络接口,编辑 /etc/default/knockd,指定你的网卡(如 eth0 或 ens5):
text
START_KNOCKD=1
KNOCKD_OPTS="-i eth0"
启动服务:
bash
sudo systemctl start knockd
sudo systemctl enable knockd
3. 关闭默认 SSH 端口
用防火墙(如 UFW)封锁 SSH 端口,使其仅能通过碰撞打开:
bash
sudo ufw deny 22 # 禁止直接访问 22 端口
sudo ufw reload
如何使用?
打开 SSH 访问(在客户端执行):
bash
knock -v <服务器IP> 7000 8000 9000
成功后即可通过 ssh user@服务器IP 登录。
关闭 SSH 访问(操作完成后):
bash
knock -v <服务器IP> 9000 8000 7000
SSH 端口将再次隐藏。
注意事项
作为补充安全层:端口碰撞不应替代 SSH 密钥认证,而是与之结合使用。
序列复杂度:可设置更长、更随机的端口序列(支持 UDP/TCP)。
超时机制:seq_timeout 确保端口敲击需在限定时间内完成。
日志监控:通过 syslog 查看 /var/log/syslog 或使用 journalctl 跟踪敲门记录。
总结
端口碰撞相当于为 SSH 服务添加了一道“隐形门”,让攻击者无法直接扫描到开放端口,显著减少了服务器暴露的风险。配合自动封锁工具(如 fail2ban)和密钥登录,可构建更立体的 Linux 服务器安全防护。
(配置前建议在测试环境演练,避免锁死远程访问。)
页:
[1]