iptables防火墙完整安全规则拦截恶意扫描
核心答案:
iptables 是 Linux 自带的包过滤防火墙,通过配置 INPUT、FORWARD、OUTPUT 链的规则,可以精确控制进出服务器的数据包。拦截恶意扫描的核心思路是:限制同源 IP 的连接频率、丢弃非法标志数据包(如 XMAS 扫描、NULL 扫描)、屏蔽常见扫描端口和 ICMP 请求。下文会给出可直接套用的命令集,适用于 CentOS 7+ / Ubuntu 20.04+ 等主流发行版。
准备工作:检查 iptables 是否可用
在开始配置前,先确认你的服务器已安装 iptables。
使用以下命令:
sudo iptables -L -n -v
如果返回规则列表(可能为空),说明 iptables 已存在。
若提示 command not found,则需要安装:
- CentOS / RHEL:
sudo yum install iptables-services -y - Ubuntu / Debian:
sudo apt install iptables -y
安装后启动并设置开机自启:
sudo systemctl start iptables
sudo systemctl enable iptables
注意:云服务器(如阿里云、腾讯云、泽御云)通常还配有外部防火墙/安全组,建议先开放 SSH 端口(如 22),再配置 iptables,避免“把自己关在外面”。
配置完整拦截规则:按层防守
以下规则按顺序执行,直接在终端粘贴即可。
1. 清除默认规则并设置策略
sudo iptables -F
sudo iptables -X
sudo iptables -Z
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
解释:清空所有规则,将 INPUT 链默认策略改为“丢弃”,只允许明确放行的流量进入。
OUTPUT 保持允许,确保服务器能正常对外通信。
2. 放行必要流量(SSH、回环、已建立连接)
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
若你有 Web 服务,额外加:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
3. 拦截常见扫描特征
XMAS 扫描(标志位全为 1):
sudo iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
NULL 扫描(标志位全为 0):
sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
SYN Flood 防御(限制每秒新连接数):
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP
ICMP 洪水(Ping 攻击):
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
4. 限制 IP 连接频率(防端口扫描)
sudo iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 10 -j REJECT
sudo iptables -A INPUT -p tcp --syn -m recent --name portscan --set
sudo iptables -A INPUT -p tcp --syn -m recent --name portscan --rcheck --seconds 60 --hitcount 20 -j DROP
说明:第一个规则限制单个 IP 并发 TCP 连接数不超过 10;
后两个用 recent 模块跟踪新连接,60 秒内超过 20 次则丢弃后续包。
5. 允许特定可信 IP 绕过限制(可选)
sudo iptables -I INPUT 1 -s 你的可信IP -j ACCEPT
避坑指南:别踩这些雷
- 顺序至关重要:iptables 规则从上到下匹配,
-I插入到链首,-A追加到链尾。务必先放行 SSH,再执行 DROP 策略,否则自己会断开连接。 - 临时测试:建议先用
-j LOG --log-prefix "iptables: "记录被丢弃的包,而不是直接 DROP。观察日志没问题再改成 DROP。 - 保存规则:CentOS 用
service iptables save或iptables-save > /etc/sysconfig/iptables;Ubuntu 用netfilter-persistent save(需提前安装iptables-persistent)。重启后规则不会丢失。 - 不影响业务端口:若服务器运行数据库(3306)、Redis(6379)等,记得加
-A INPUT -p tcp --dport 相应端口 -j ACCEPT。
效果验证:检查是否生效
用扫描工具或命令自检:
# 查看当前规则
sudo iptables -L -n -v --line-numbers
# 模拟端口扫描(从另一台机器执行)
nmap -sS 你的服务器IP
如果规则生效,扫描结果会显示大量端口 filtered,且未放行的端口不会返回任何信息。
你也可以检查 /var/log/messages 或 /var/log/syslog 中的 iptables 日志。
常见问题解答
Q1: iptables 配置后 SSH 连不上了怎么办?
答:
立即登录云服务器控制台(VNC 或 Web Shell),
执行 sudo iptables -P INPUT ACCEPT 临时放行所有流量,
然后检查 SSH 端口规则是否写错了。
Q2: 规则太多,重启后失效了?
答:确认已按“避坑指南”第3点保存规则。
另外,某些系统(如 Ubuntu)默认不自动加载,需要安装 iptables-persistent 或编写 systemd 服务。
Q3: 如何临时关闭所有 iptables 规则?
答:sudo iptables -P INPUT ACCEPT && sudo iptables -F 将默认策略改为接受并清空规则。
恢复时重新执行配置步骤即可。
Q4: 这些规则能拦截所有恶意流量吗?
答:不能。
它们主要针对常见的端口扫描、SYN Flood、ICMP 洪水等。
更高级的攻击(如应用层 DDoS)需要结合 fail2ban、web 应用防火墙(WAF)或云高防服务。
建议将 iptables 作为第一道防线,配合专业安全工具使用。