精通iptables:从基础到实战安全配置
一、基础命令:iptables的语法与常用操作
1.1 基本语法
iptables [参数] [表] [链] [匹配条件] -j [目标]
参数 | 说明 |
---|---|
-A | 追加规则到链尾 |
-L | 列出规则 |
-P | 设置默认策略 |
-I | 插入规则到链开头 |
-D | 删除规则 |
-F | 清空规则 |
-t | 指定表 |
1.2 常用命令示例
功能 | 命令 | 说明 |
---|---|---|
查看规则 | sudo iptables -vnL | 查看所有规则,显示详细信息 |
允许HTTP | sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT | 允许HTTP流量 |
默认拒绝 | sudo iptables -P INPUT DROP | 设置默认拒绝所有入站请求 |
允许SSH | sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT | 允许SSH访问 |
拒绝特定IP | sudo iptables -A INPUT -s 192.168.10.10 -j DROP | 拒绝特定IP访问 |
允许特定IP的SSH | sudo iptables -A INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT | 仅允许特定IP访问SSH |
通用保存规则 | sudo iptables-save > /etc/iptables/rules.v4 | 保存规则(所有系统通用) |
重要提醒:
"在修改防火墙规则时要小心,尤其是当你通过SSH连接到远程服务器时,错误的配置可能会导致你失去对服务器的访问权限。"
二、实战配置:从入门到精通的配置示例
2.1 基础安全配置(
# 1. 设置默认策略(公网服务器必须使用DROP,避免信息泄露)
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT# 2. 允许本地回环接口(INPUT和OUTPUT)
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT# 3. 允许已建立的连接(使用conntrack替代state)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT# 4. 允许SSH(仅限管理IP)
sudo iptables -A INPUT -s 192.168.1.100 -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. 保存规则(所有系统通用)
sudo iptables-save > /etc/iptables/rules.v4# 7. 加载规则(所有系统通用)
sudo iptables-restore < /etc/iptables/rules.v4
安全实践:
"在面向公网的生产环境中,拒绝策略必须使用DROP
,以最小化信息泄露;仅在内部可信网络或需要明确错误反馈的调试场景中使用REJECT
。"
2.2 防止DDoS攻击的配置
# 1. 限制单个IP的连接数(直接DROP,避免资源消耗)
sudo iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j DROP# 2. 限制新连接速率
sudo iptables -A INPUT -p tcp --dport 80 -m limit --limit 50/minute --limit-burst 200 -j ACCEPT
安全原则:
"对疑似攻击流量,优先DROP,而非REJECT。"
直接DROP可避免内核为伪造连接生成响应包,减少资源消耗。
2.3 端口转发配置(NAT)
# 1. 将80端口的流量转发到8080
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080# 2. 启用IP伪装(SNAT)
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
三、高级功能:从入门到精通的关键
3.1 状态跟踪(Stateful Filtering)
# 允许已建立的连接
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT# 状态说明
# ESTABLISHED:已建立的连接
# RELATED:与已建立连接相关的连接(如FTP数据连接)
# NEW:新的连接
# INVALID:无效连接(如TCP标志位不合法)
为什么使用conntrack:
在CentOS 8+、Ubuntu 20.04+等新系统中,-m state
模块可能被弃用,-m conntrack
是未来标准,功能更强、更可靠。
3.2 日志记录(Logging)
# 记录被拒绝的连接
sudo iptables -A INPUT -j LOG --log-prefix "IPTables-DROP: " --log-level 4# 保存日志
sudo iptables -A INPUT -j DROP
3.3 限制IP访问范围
# 允许特定网段访问SSH
sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT# 拒绝特定网段访问
sudo iptables -A INPUT -s 10.0.0.0/8 -j DROP
四、常见误区与避坑指南(2025修正版)
误区 | 错误描述 | 正确认知 |
---|---|---|
"所有表都能执行所有动作" | 试图在filter 表中使用-j DNAT | ❌ filter 表不支持NAT动作✅ NAT必须在 nat 表中配置 |
"REJECT比DROP更安全" | 认为告知拒绝更"友好" | ❌ DROP更安全,因不泄露主机信息 ✅ 公网用 DROP ,内网可用REJECT |
"规则顺序不重要" | 任意添加规则 | ❌ 规则顺序至关重要,匹配到第一个规则即停止 |
"默认策略设置后无需其他规则" | 仅设置默认策略 | ❌ 必须添加允许规则,否则所有流量被拒绝 |
阿里SRE事故案例(2025):
"某公网API网关误用REJECT
,导致攻击者通过端口扫描快速识别出所有在线服务,最终被定向爆破。事后强制切换为DROP
,扫描探测成功率下降98%。"
五、未来趋势:iptables vs nftables
2025年准确描述:
"nftables是Linux防火墙的未来,iptables命令通过兼容层继续工作,但新功能只在nftables中开发。iptables是Linux内核netfilter框架的用户空间接口,通过管理四张表(filter、nat、mangle、raw)和五条链(PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING),实现数据包过滤、NAT转换和连接跟踪。"
5.1 iptables与nftables对比
特性 | iptables | nftables |
---|---|---|
架构 | 基于规则的链 | 基于规则的表 |
语法 | 复杂,多表多链 | 简洁,统一表 |
性能 | 一般 | 更高,更高效 |
未来 | 通过兼容层继续工作 | 未来标准 |
5.2 2025年建议
- 新项目:直接使用nftables,避免iptables的兼容性问题
- 现有系统:继续使用iptables,但了解nftables的语法和功能
- 安全实践:无论使用哪种工具,都遵循"最小权限"原则
六、一句话总结
"iptables是Linux内核netfilter框架的用户空间接口,通过管理四张表(filter、nat、mangle、raw)和五条链(PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING),实现数据包过滤、NAT转换和连接跟踪。在面向公网的生产环境中,拒绝策略必须使用
DROP
以最小化信息泄露;规则顺序至关重要,匹配到第一个规则即停止;iptables是网络安全纵深防御的第一道防线,但不是唯一防线。"
安全忠告:
"安全不是'友好',而是'不可知'。让攻击者连你的主机是否存在都判断不了,才是真正的防御。"
传送门:nftables从入门到精通https://blog.csdn.net/m0_66705547/article/details/153336008