在 Linux 系统中,
iptables
是网络安全的“瑞士军刀”,它不仅能控制端口访问、限制 IP,还能实现流量整形、NAT 转发、防DDoS 等高级功能。本文将在基础操作上进一步拓展,结合实际场景,详细解析每个参数的含义,并补充更多应用案例,让你的服务器防护如虎添翼!
🚪 1. 开放指定端口:基础但关键
🌰 案例:开放常见服务端口
iptables -I INPUT -p tcp --dport 80 -j ACCEPT # HTTP
iptables -I INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
iptables -I INPUT -p tcp --dport 22 -j ACCEPT # SSH
📝 参数详解:
I INPUT
:将规则插入到INPUT
链的顶部(优先级最高)。若需追加到末尾,可用A INPUT
。p tcp
:指定协议类型为TCP
(也可用udp
、icmp
等)。-dport 80
:目标端口为80
(-dport
表示“destination port”)。j ACCEPT
:动作是允许流量通过(其他常见动作:DROP
丢弃、REJECT
拒绝并返回错误)。
💡 **场景:**Web 服务器、远程管理必备。
⚠️ **注意:**SSH 端口建议修改为非标准端口(如 2222
),减少暴力破解风险。
🌐 扩展:开放 UDP 端口(如 DNS、NTP)
iptables -I INPUT -p udp --dport 53 -j ACCEPT # DNS
iptables -I INPUT -p udp --dport 123 -j ACCEPT # NTP
- 用途:支持域名解析、时间同步等服务。
🔒 2. 精细控制访问:IP、网段、时间多维限制
🌰 案例 1:仅允许办公网 IP 访问管理后台
iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 8080 -j ACCEPT # 允许内网
iptables -I INPUT -p tcp --dport 8080 -j DROP # 拒绝其他
📝 参数详解:
s 192.168.1.0/24
:源 IP 为192.168.1.0/24
网段(/24
表示子网掩码255.255.255.0
,覆盖192.168.1.1
到192.168.1.254
)。p tcp --dport 8080
:目标端口为8080
的 TCP 流量。j ACCEPT/DROP
:允许或丢弃匹配的流量。
**💡 场景:**企业内网管理后台、监控系统。
🌰 案例 2:使用 IP 范围限制访问(如允许 192.168.1.100
到 192.168.1.200
)
iptables -I INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -p tcp --dport 3306 -j ACCEPT
iptables -I INPUT -p tcp --dport 3306 -j DROP
📝 参数详解:
m iprange
:加载iprange
扩展模块,支持匹配 IP 范围。-src-range 192.168.1.100-192.168.1.200
:源 IP 在192.168.1.100
到192.168.1.200
之间。-dport 3306
:目标端口为3306
(MySQL 默认端口)。
**💡 场景:**仅允许特定 IP 段访问数据库,避免敏感数据泄露。
🌰 案例 3:限制 SSH 仅在工作时段可访问
iptables -I INPUT -p tcp --dport 22 -m time --timestart 09:00 --timestop 18:00 --days Mon,Tue,Wed,Thu,Fri -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j DROP
📝 参数详解:
m time
:加载time
扩展模块,支持按时间匹配。-timestart 09:00 --timestop 18:00
:时间范围为 9:00 到 18:00。-days Mon,Tue,Wed,Thu,Fri
:仅限工作日(可用缩写Mon-Fri
或全称Monday,Tuesday
)。
**💡 场景:**防止非工作时间段的 SSH 暴力破解。
🌰 案例 4:防止单一 IP 频繁访问
iptables -I INPUT -p tcp --dport 80 -m recent --name HTTP_ABUSE --set
iptables -I INPUT -p tcp --dport 80 -m recent --name HTTP_ABUSE --rcheck --seconds 60 --hitcount 10 -j DROP
📝 参数详解:
m recent
:加载recent
扩展模块,记录最近访问的 IP。-name HTTP_ABUSE
:为规则命名(可自定义)。-set
:记录匹配的 IP 到列表。-rcheck --seconds 60 --hitcount 10
:检查 60 秒内是否访问超过 10 次,若满足则触发j DROP
。
**💡 场景:**防御 CC 攻击或爬虫滥用。
🐳 3. Docker 与 iptables:容器网络深度集成
🌰 案例 1:允许容器访问主机 MySQL,但限制端口
iptables -I INPUT -p tcp -s 172.17.0.0/16 --dport 3306 -j ACCEPT # 允许 Docker 网段
iptables -I INPUT -p tcp --dport 3306 -j DROP # 拒绝其他
📝 参数详解:
s 172.17.0.0/16
:Docker 默认使用172.17.0.0/16
网段(覆盖172.17.0.1
到172.17.255.254
)。
**💡 场景:**限制只有容器能访问主机数据库。
🌰 案例 2:容器间通信控制
iptables -I FORWARD -s 172.17.0.2 -d 172.17.0.3 -j ACCEPT # 允许容器 A 访问容器 B
iptables -I FORWARD -j DROP # 禁止其他容器通信
📝 参数详解:
FORWARD
链:处理转发流量(如容器间通信)。s 172.17.0.2
:源 IP 为容器 A 的 IP。d 172.17.0.3
:目标 IP 为容器 B 的 IP。
**💡 场景:**微服务架构中隔离敏感容器(如日志服务不暴露给外部)。
🌐 4. NAT 转发:实现端口映射与负载均衡
🌰 案例 1:将公网 80 端口转发到内网 Web 服务器
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
iptables -t nat -A POSTROUTING -j MASQUERADE
📝 参数详解:
t nat
:操作nat
表(用于地址转换)。PREROUTING
链:在数据包到达防火墙时处理(路由前)。DNAT
:目标地址转换(将公网 80 端口转发到内网192.168.1.100:80
)。POSTROUTING
链:在数据包离开防火墙时处理(路由后)。MASQUERADE
:源地址伪装(使内网服务器能回包到公网 IP)。
**💡 场景:**公网访问内网服务(如 Web、FTP)。
🌰 案例 2:简单负载均衡(轮询)
iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode random --probability 0.5 -j DNAT --to-destination 192.168.1.100:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.101:80
📝 参数详解:
m statistic
:加载statistic
扩展模块,支持概率性转发。-mode random --probability 0.5
:50% 概率选择第一条规则(转发到192.168.1.100
),剩余 50% 走第二条规则(转发到192.168.1.101
)。
**💡 场景:**低成本实现多服务器负载均衡。
🛡️ 5. 防 DDoS 攻击:限速与黑名单
🌰 案例 1:限制单个 IP 的新连接速率
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j DROP
📝 参数详解:
m connlimit
:加载connlimit
扩展模块,限制并发连接数。-connlimit-above 20
:单个 IP 的并发连接数超过 20 时触发j DROP
。
**💡 场景:**防止单个 IP 占用过多资源(如 CC 攻击)。
🌰 案例 2:动态黑名单(结合 fail2ban)
# fail2ban 检测到恶意 IP 后自动执行:
iptables -I INPUT -s 恶意IP -j DROP
📝 参数详解:
s 恶意IP
:封禁指定 IP(如1.2.3.4
)。- 工具:
fail2ban
监控日志(如/var/log/auth.log
),发现暴力破解后自动调用iptables
封禁 IP。
**💡 场景:**自动化防御 SSH 暴力破解、Web 攻击。
📊 6. 流量统计与日志记录
🌰 案例 1:记录被拒绝的流量
iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTABLES DROP: " --log-level 4
iptables -A LOGGING -j DROP
📝 参数详解:
N LOGGING
:创建自定义链LOGGING
。m limit --limit 2/min
:限制日志频率(每分钟最多 2 条)。-log-prefix "IPTABLES DROP: "
:日志前缀,便于过滤。-log-level 4
:日志级别(4
对应warning
,可选debug
/info
/error
等)。
**💡 场景:**审计被防火墙拦截的流量,排查异常访问。
🌰 案例 2:统计 HTTP 流量
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j STATS # 需额外工具(如 iptables-stats)
💡 工具推荐:
vnstat
:按小时/天统计流量。iftop
:实时查看带宽占用。
💾 7. 永久生效与高可用配置
📜 方法 1:使用 iptables-services(CentOS/RHEL)
systemctl enable iptables # 开机自启
iptables-save > /etc/sysconfig/iptables # 保存规则
📜 方法 2:手动写入配置文件(Ubuntu/Debian)
iptables-save > /etc/iptables.rules
echo "pre-up iptables-restore < /etc/iptables.rules" >> /etc/network/interfaces
🔄 高可用场景:主备服务器同步规则
工具:使用
ansible
或puppet
批量推送规则到多台服务器。脚本示例:
#!/bin/bash iptables-save | ssh root@备机 "iptables-restore"
🎯 总结:iptables 的核心逻辑与应用场景
顺序匹配:规则从上到下依次检查,第一个匹配的规则生效。
链的作用:
INPUT
:处理入站流量。OUTPUT
:处理出站流量。FORWARD
:处理转发流量。DOCKER
:Docker 专用的链。
动作:
ACCEPT
:允许。DROP
:丢弃(无响应)。REJECT
:拒绝(返回错误响应)
场景:
场景 | 关键命令/模块 |
---|---|
端口开放 | -p tcp --dport |
IP 限制 | -s IP 、-m iprange --src-range |
时间控制 | -m time --timestart |
防刷限速 | -m connlimit 、-m recent |
NAT 转发 | -t nat -j DNAT 、MASQUERADE |
日志记录 | -j LOG 、-m limit |
永久生效 | iptables-save 、systemctl enable |
通过本文的拓展,你已经掌握了 iptables
的端口管理、IP 控制、Docker 集成、NAT 转发、防 DDoS、日志统计等高级用法。无论是个人服务器还是企业环境,这些技巧都能帮你构建更安全的网络防线!🔐 记得根据实际需求调整规则,并定期审计避免冲突哦~