防端口扫描的关键是让服务器“看不见、测不准、扫不出”,具体包括禁ping隐身(屏蔽icmp回显请求)、只开必需端口并关闭非必要服务、用iptables+recent模块识别拦截高频扫描行为、结合fail2ban监控日志自动封禁异常ip。

防端口扫描不是靠堵住所有流量,而是让服务器“看不见、测不准、扫不出”——关键在隐藏状态、收缩暴露面、识别异常行为。
禁Ping让服务器从扫描雷达里消失
攻击者常先用ping批量探测IP是否存活,再发起针对性扫描。屏蔽ICMP回显请求(类型8)是最基础的隐身操作:
- iptables命令:`iptables -A INPUT -p icmp --icmp-type echo-request -j DROP`
- 如需保留内网运维人员ping权限,可加来源限制:`-s 192.168.10.0/24`
- firewalld用户执行:`firewall-cmd --add-icmp-block=echo-request --permanent && firewall-cmd --reload`
只开必需端口,关掉一切非必要服务
开放端口越多,攻击面越大。很多高危漏洞来自长期无人维护的旧服务,比如ftp、telnet、rpcbind、smbv1等。
- 查当前监听端口:`ss -tuln` 或 `netstat -tuln`,重点关注 LISTEN 状态
- 数据库类服务(MySQL、PostgreSQL)应绑定到 127.0.0.1,避免公网直连
- 停用不用的服务:`systemctl stop vsftpd && systemctl disable vsftpd`
- 防火墙默认拒绝入站,仅放行真实需要的端口,例如:`ufw default deny incoming` + `ufw allow 443/tcp`
用iptables+recent模块识别并拦截扫描行为
静态规则挡不住动态扫描,需借助内核模块做轻量级实时识别。recent模块能记录IP访问行为,配合时间窗口和次数阈值触发拦截。
- 封禁60秒内尝试连接10个以上不同TCP端口的IP:
`iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -m recent --name portscan --set -j LOG --log-prefix "PortScan: "`
`iptables -A INPUT -m recent --name portscan --rcheck --seconds 60 --hitcount 10 -j DROP` - 对SSH端口做连接频控:60秒内新建连接超5次即丢弃
`iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH`
`iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --name SSH -j DROP`
结合fail2ban监控日志自动封禁异常IP
日志是扫描与爆破行为最真实的痕迹。fail2ban能解析auth.log、nginx日志等,把高频失败登录或异常请求转化为防火墙动作。
- 安装后启用sshd jail:修改 `/etc/fail2ban/jail.local`,设 `maxretry = 3`、`bantime = 3600`
- 支持自定义正则匹配Nmap特征(如大量404、User-Agent含nmap字样)
- 推荐搭配ipset使用,避免iptables规则膨胀影响性能
- 开启邮件通知,及时掌握扫描事件:`action = %(action_mwl)s`











