iptables 是 Linux 系统的防火墙工具,它通过定义规则来控制网络数据包的流动。理解 iptables 需要掌握几个核心概念:
一、核心概念
-
表(Tables):
-
filter
:默认表,用于包过滤(允许/拒绝) -
nat
:网络地址转换(端口转发、IP伪装) -
mangle
:修改包内容(TTL、TOS等) -
raw
:连接跟踪前处理 -
security
:SELinux相关安全规则
-
-
链(Chains):
-
INPUT
:处理进入本机的数据包 -
OUTPUT
:处理本机发出的数据包 -
FORWARD
:处理经过本机转发的数据包 -
PREROUTING
:路由前处理(DNAT) -
POSTROUTING
:路由后处理(SNAT)
-
-
目标(Targets):
-
ACCEPT
:允许数据包通过 -
DROP
:丢弃数据包(无响应) -
REJECT
:拒绝数据包(发送拒绝响应) -
LOG
:记录日志 -
SNAT
:源地址转换 -
DNAT
:目的地址转换
-
二、规则语法格式
iptables [-t 表名] <命令> <链名> [规则号] [匹配条件] -j <目标>
三、常用命令选项
选项 | 说明 |
---|---|
-A | 在链尾添加规则 |
-I | 在指定位置插入规则 |
-D | 删除规则 |
-L | 列出规则 |
-F | 清空规则 |
-P | 设置链的默认策略 |
-N | 创建新链 |
-X | 删除自定义链 |
四、常用匹配条件
匹配条件 | 说明 | 示例 |
---|---|---|
-p | 协议 | -p tcp , -p udp , -p icmp |
-s | 源地址 | -s 192.168.1.0/24 |
-d | 目的地址 | -d 10.0.0.1 |
-i | 输入接口 | -i eth0 |
-o | 输出接口 | -o wlan0 |
--sport | 源端口 | --sport 80 |
--dport | 目的端口 | --dport 22 |
-m | 扩展模块 | -m state --state RELATED,ESTABLISHED |
五、规则编写示例
1. 基础过滤规则
# 允许SSH访问 iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 阻止特定IP iptables -A INPUT -s 192.168.1.100 -j DROP # 允许已建立连接的数据包 iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 默认策略(放在最后) iptables -P INPUT DROP
2. NAT 规则
# 源地址转换(SNAT) iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 目的地址转换(DNAT) iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080 # 端口转发 iptables -t nat -A PREROUTING -p tcp --dport 2222 -j REDIRECT --to-port 22
3. 高级规则
# 限制连接速率 iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT # 记录并丢弃非法包 iptables -A INPUT -m conntrack --ctstate INVALID -j LOG --log-prefix "INVALID: " iptables -A INPUT -m conntrack --ctstate INVALID -j DROP # 创建自定义链 iptables -N WEBSERVER iptables -A WEBSERVER -p tcp --dport 80 -j ACCEPT iptables -A WEBSERVER -p tcp --dport 443 -j ACCEPT iptables -A INPUT -j WEBSERVER
六、规则理解技巧
-
处理顺序:
数据包 -> PREROUTING -> 路由决策 -> FORWARD -> POSTROUTING ↓ INPUT -> 本地进程 -> OUTPUT
-
匹配原则:
-
规则按顺序匹配,第一条匹配的规则生效
-
没有匹配规则时,使用链的默认策略
-
-j LOG
会继续匹配后续规则 -
-j REJECT/DROP
会终止匹配
-
-
连接跟踪:
# 查看连接跟踪状态 cat /proc/net/nf_conntrack # 状态类型: # NEW:新连接 # ESTABLISHED:已建立连接 # RELATED:相关连接(如FTP数据连接) # INVALID:无效包
七、调试与维护
-
规则查看:
iptables -L -n -v # 查看所有规则(数字格式) iptables -t nat -L # 查看NAT表规则
-
规则保存与恢复:
# 保存规则 iptables-save > /etc/iptables/rules.v4 # 恢复规则 iptables-restore < /etc/iptables/rules.v4
-
日志监控:
tail -f /var/log/kern.log | grep 'IN='
八、最佳实践
-
安全策略:
# 设置默认拒绝策略 iptables -P INPUT DROP iptables -P FORWARD DROP # 允许回环接口 iptables -A INPUT -i lo -j ACCEPT # 允许已建立连接 iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 按需开放端口 iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSH
-
性能优化:
# 将常用规则放在前面 # 使用ipset管理大IP列表 # 避免复杂规则链嵌套
-
防御攻击:
# 防SYN洪水攻击 iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT # 防端口扫描 iptables -N PORTSCAN iptables -A PORTSCAN -m limit --limit 1/s -j LOG --log-prefix "Portscan: " iptables -A PORTSCAN -j DROP iptables -A INPUT -m recent --name portscan --rcheck --seconds 60 -j PORTSCAN
九、学习资源
-
可视化工具:
-
iptables-apply
:测试规则安全 -
shorewall
:高级防火墙配置工具
-
-
调试命令:
# 跟踪数据包处理路径 iptables -t raw -A PREROUTING -p tcp --dport 80 -j TRACE dmesg -w
掌握 iptables 需要实践,建议在测试环境中练习规则编写。理解网络协议和连接状态跟踪机制是成为 iptables 高手的关键。