把22端口关小一点:CentOS7用Firewalld给SSH加一道源IP门锁
把22端口关小一点:CentOS7用Firewalld给SSH加一道源IP门锁

跳板机天天被扫,日志里全是失败尝试,看着就烦?别急着换端口,先给SSH配把“源IP钥匙”,只允许自家地址敲22,省事又安心。下面这份手记,从开服务到写规则,再到永久生效,每一步都踩过坑,照着敲,十分钟收工。
先确认:Firewalld真的在跑?
装系统时图方便把防火墙关了的人不少,先别写规则,确认它活着:
systemctl status firewalld
如果看到active (running)再往下走;没跑就systemctl start firewalld && systemctl enable firewalld,省得重启后又裸奔。
把默认zone摸清楚

CentOS7给网卡默认塞到public zone,SSH规则写错地方等于白搭。先看自己落在哪:
firewall-cmd --get-active-zones
回显里哪个zone后面跟着你的网卡名,就把规则写在哪,别手抖写到drop里,直接把自己锁外面。
写IP白名单:一条命令就放行
假设公司出口是203.0.113.0/24,家里拨号得198.51.100.18,两条都放:
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.0/24" service name="ssh" accept'

firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="198.51.100.18/32" service name="ssh" accept'
写完记得firewall-cmd --reload,别问为什么连不上,规则没重载等于没写。
把默认SSH规则踢掉
Firewalld默认给SSH开了全网,不删就形同虚设。先把服务级规则拿掉:
firewall-cmd --permanent --zone=public --remove-service=ssh
再重载,ss -tlnp | grep :22只能看到监听,看不到放行,才算干净。
防止手抖:提前开条“救命缝”
云主机用控制台VNC救场还行,物理机一锁死就得跑机房。写规则前给当前IP开临时放行:
firewall-cmd --zone=public --add-source=<你的IP>/32 --timeout=300
五分钟足够你测试,确认没把自己关外面再--permanent写死。
端口还在?别被扫描器忽悠
规则生效后,用nmap从别的IP扫一下:
nmap -p 22 <服务器IP>
看到filtered才踏实;open说明还有漏网规则,回去继续删。
批量地址太多?用ipset省行数
出口网段一堆,写rich-rule眼花,先建集合:
firewall-cmd --permanent --new-ipset=ssh-allow --type=hash:net
firewall-cmd --permanent --ipset=ssh-allow --add-entry=203.0.113.0/24
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source ipset="ssh-allow" service name="ssh" accept'
以后换地址只动ipset,规则文件不再膨胀。
日志想看就打开
被扫时想知道谁不死心,给规则加log:
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" service name="ssh" log prefix="SSH_DENIED: " level="info" reject'
重载后journalctl -f就能看到被拒绝的IP,配合fail2ban直接拉黑更酸爽。
IPv6别忘关
现在手机热点都带IPv6,服务器如果双栈,默认zone可能放行ssh的ipv6。一并拿掉:
firewall-cmd --permanent --zone=public --remove-service=ssh
再写一条针对ipv6的rich-rule,只允许自家IPv6段,套路同IPv4。
最后复查:四条命令收尾
firewall-cmd --list-all-zones | grep ssh // 确认只剩白名单
ipset list ssh-allow // 看地址有没有手误
systemctl restart sshd // 重启服务不影响已放行的连接
exit // 重新登录,确认钥匙还好用
做完这几步,22端口就像装了猫眼,只有熟脸才能进,扫描器再蹦跶也只能吃闭门羹。日常运维省下的告警噪音,足够你多喝一杯咖啡。
