如果你希望缩小 SSH 暴露面,最直接的办法是用 iptables 设置白名单,但操作前务必确认当前会话不会中断,否则可能把自己锁在门外。
先说结论:iptables 可以做 SSH IP 白名单,适合固定办公 IP 或堡垒机场景,动态 IP 环境慎用。
- 先判断:确认当前登录 IP 是否在白名单内,且是否有备用控制台权限。
- 优先做:先放行已建立连接和特定 IP,最后再丢弃其他 SSH 流量。
- 再验证:在新终端测试连接,确认无误后再保存规则防止重启失效。
命令速用版
# 1. 允许已建立的连接(防止当前会话断开)
iptables -A INPUT -m state `--state` ESTABLISHED,RELATED -j ACCEPT
# 2. 允许特定 IP 访问 22 端口(替换为你的 IP)
iptables -A INPUT -p tcp -s 192.168.1.100 `--dport` 22 -j ACCEPT
# 3. 丢弃其他所有访问 22 端口的请求
iptables -A INPUT -p tcp `--dport` 22 -j DROP
# 4. 查看规则
iptables -L INPUT -n `--line-numbers`注意:以上命令仅针对 IPv4,IPv6 需使用 ip6tables 单独配置。
分步处理
1. 备份现有规则
在执行任何更改前,先导出当前规则,以便出错时恢复。
iptables-save > /root/iptables.backup.$(date +%F)2. 确认当前登录 IP
查看当前 SSH 连接的源地址,确保它会被加入白名单。
echo $SSH_CONNECTION | awk '{print $1}'
# 或者查看当前所有 SSH 连接来源
netstat -nt | grep :22 | awk '{print $5}' | cut -d: -f13. 插入允许规则
建议使用 -I 参数将允许规则插在前面,避免被默认策略误伤。先放行已建立连接,再放行特定 IP。
iptables -I INPUT 1 -m state `--state` ESTABLISHED,RELATED -j ACCEPT
iptables -I INPUT 2 -p tcp -s 你的 IP 地址 `--dport` 22 -j ACCEPT4. 设置丢弃规则
确认上述规则生效且当前会话未断开后,再添加丢弃规则。
iptables -A INPUT -p tcp `--dport` 22 -j DROP5. 保存规则
不同发行版保存方式不同,重启后规则默认会清空。
- CentOS 7+:
iptables-save > /etc/sysconfig/iptables(需确保 iptables-services 已安装) - Ubuntu/Debian: 需安装持久化包
apt-get update && apt-get install iptables-persistent -y,然后netfilter-persistent save
怎么验证是否生效
1. 本地查看规则
使用 -L -n 查看规则列表,确认 DROP 规则在 ACCEPT 规则之后,且计数器是否有变化。
iptables -L INPUT -n -v2. 外部连接测试
找一台不在白名单内的机器尝试 SSH 连接,应该显示超时或被拒绝。同时在服务器端观察日志。
# 查看被拦截的记录(需开启日志记录)
dmesg | grep DROP
# 或查看安全日志
tail -f /var/log/secure3. 保持会话测试
不要关闭当前的 SSH 窗口,新开一个终端尝试连接,确认新连接能通,旧连接不断。
IPv6 配置注意
如果服务器启用了 IPv6,仅配置 iptables 是不够的,攻击者可能通过 IPv6 绕过限制。需同步配置 ip6tables:
ip6tables -A INPUT -m state `--state` ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -p tcp -s 2400:xxxx:xxxx::1 `--dport` 22 -j ACCEPT
ip6tables -A INPUT -p tcp `--dport` 22 -j DROP同样需要使用 ip6tables-save 或 ip6tables-persistent 保存规则。
紧急救援:被锁门外如何恢复
如果配置失误导致无法 SSH 连接,请按以下顺序尝试恢复:
- 保持当前会话:如果当前 SSH 窗口未关闭,切勿关闭,立即在此窗口内执行
iptables -F清空规则恢复访问。 - 云控制台 VNC:登录阿里云、AWS 等云厂商的管理控制台,使用远程连接(VNC/Workbench)功能登录服务器,然后清空或修正 iptables 规则。
- 单用户模式:如果是物理机或支持重启引导编辑的环境,可进入单用户模式修改规则文件。
常见坑
- 云厂商安全组:阿里云、AWS 等云平台外层还有安全组防火墙,如果安全组没放行 22 端口,iptables 配对了也没用;反之如果安全组全开,只配 iptables 即可。
- 规则顺序:iptables 从上到下匹配,一旦匹配成功就停止。如果 DROP 规则写在 ACCEPT 前面,白名单会失效。
- IPv6 遗漏:配置了 iptables 却忘了 ip6tables,攻击者可能通过 IPv6 绕过限制。
- 重启失效:很多新手配完重启服务器,发现规则没了,导致服务器重新暴露,务必确认持久化配置。
- 动态 IP 环境:如果你的办公 IP 经常变,这种方案会导致频繁失联,建议配合堡垒机或固定出口网关。