防火墙iptables完整安全规则拦截扫描
为什么需要iptables拦截扫描
服务器暴露在公网,每天都会收到大量扫描请求。
端口扫描、SYN洪水、ICMP探测都是常见手法。
如果放任不管,CPU和带宽会被浪费,严重时可能导致服务拒绝。
通过iptables设置几组规则,就能自动丢弃这些恶意流量,让服务器更安心运行。
本文按零基础也能照做的方式,讲清楚从准备到验证的完整流程。
准备工作:检查当前iptables状态
首先确认系统是否已安装iptables。
大部分Linux发行版默认自带,但可能未启动或规则为空。
# 查看当前规则(默认表filter)
sudo iptables -L -n --line-numbers
如果输出显示Chain INPUT (policy ACCEPT)之类的信息,说明iptables已启用。
如果未安装,基于Debian/Ubuntu的系统执行sudo apt install iptables,基于CentOS/RHEL执行sudo yum install iptables-services。
注意:云服务器厂商(如阿里云、腾讯云)的控制台安全组和系统内iptables是两层防线,建议两者都配置。
核心规则:拦截端口扫描与SYN洪水
以下规则按执行顺序添加。规则顺序敏感:要先把放行规则(如SSH)加在前面,再写拒绝规则,否则自己会被踢出服务器。
# 1. 清空现有规则(谨慎!先备份)
sudo iptables -F
sudo iptables -X
# 2. 设置默认策略:丢弃所有入站,放行出站和转发(默认安全)
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# 3. 放行已建立的连接和本地回环(必须!否则SSH断连)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
# 4. 放行SSH(请改用你的端口)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 5. 放行常用服务HTTP/HTTPS(如有)
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 6. 拦截常见扫描特征:
# 6.1 丢弃所有状态为INVALID的包(碎片、异常包)
sudo iptables -A INPUT -m state --state INVALID -j DROP
# 6.2 限制SYN包速率(防SYN Flood)
sudo iptables -A INPUT -p tcp --syn -m limit --limit 10/s --limit-burst 20 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP
# 6.3 阻止端口扫描:记录并丢弃未使用的TCP标志组合
sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
sudo iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
sudo iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN -j DROP
sudo iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
# 6.4 限制ICMP(ping)频率
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 2/s --limit-burst 5 -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
解释:第6.2条中--limit 10/s表示每秒最多10个SYN包,超过则丢弃,能有效压制SYN洪水。
第6.3条丢弃了不合法的TCP标志组合,让常见扫描工具如nmap的-sS、-sT等模式失效。
避坑指南:规则顺序与持久化
规则顺序最重要:iptables按顺序匹配,一旦匹配就执行动作。
如果先把“拒绝所有”放在前面,后面的放行规则就不会生效。
因此务必先放行SSH等重要服务。
小心把自己锁在外面:如果配置错误,SSH会断掉。
建议先在本地终端或VNC控制台测试,或者写一个定时任务脚本在5分钟后恢复规则(iptables -F)。
持久化规则:重启后iptables规则会丢失。
常见方法:
- Debian/Ubuntu:
sudo apt install iptables-persistent,然后sudo netfilter-persistent save - CentOS/RHEL:
sudo service iptables save或sudo /sbin/iptables-save > /etc/sysconfig/iptables
验证保存是否成功:重启后执行sudo iptables -L -n看规则是否还在。
效果验证:用nmap探测你的服务器
在另一台机器上安装nmap:
# CentOS
sudo yum install nmap -y
# Ubuntu
sudo apt install nmap -y
使用nmap扫描你的服务器公网IP:
# 常见端口扫描
nmap -sS your_server_ip
# 不常见的标志组合探测
nmap -sF your_server_ip
nmap -sX your_server_ip
如果规则生效,你会看到类似“filtered”的状态,甚至超时无响应。
而正常端口(如80)应该显示open(前提是已放行)。
高频问题解答
Q:规则是否影响正常用户访问?
A:只限制了异常包速率和非法标志,正常TCP三次握手不受影响。耐心测试正常访问即可。
Q:为什么放行了某个端口,但nmap显示filtered?
A:检查规则顺序,确保放行规则写在拒绝规则之前。再检查云服务商安全组是否阻挡了端口。
Q:如何临时关闭所有规则?
A:sudo iptables -P INPUT ACCEPT && sudo iptables -F,但请确认无重要服务再执行。
总结
通过上述规则,你的服务器可以有效拦截绝大多数端口扫描和SYN洪水。
建议定期使用nmap自测,并结合fail2ban等工具协同防御。
如果你正在配置新服务器,先按本文步骤执行,再根据实际服务微调端口放行。
遇到异常时优先回看规则顺序和持久化部分。