规则概念
以下是 iptables 的详细用法及注释,涵盖常用场景、规则管理和核心概念:
一、iptables 核心概念
1. 表(Tables)
| 表名 |
用途 |
filter |
默认表,用于数据包过滤(允许/拒绝流量) |
nat |
网络地址转换(NAT),用于端口转发、IP伪装 |
mangle |
修改数据包头(如TTL、TOS标记) |
raw |
绕过连接跟踪机制,用于高性能或特殊处理 |
2. 链(Chains)
| 链名 |
用途 |
INPUT |
处理进入本机的数据包 |
OUTPUT |
处理本机发出的数据包 |
FORWARD |
处理经过本机转发的数据包(路由) |
PREROUTING (nat) |
修改目标地址(DNAT) |
POSTROUTING (nat) |
修改源地址(SNAT/MASQUERADE) |
二、常用命令选项
1. 规则管理
| 选项 |
说明 |
-A <链> |
追加规则到链尾(Append) |
-I <链> [位置] |
插入规则到链的指定位置(默认插入到第1条) |
-D <链> [规则] |
删除指定规则(按规则内容或编号) |
-F [链] |
清空指定链或所有链的规则(Flush) |
-L [链] |
列出规则(List),配合 -v 显示详细信息,-n 禁用域名解析 |
-N <链> |
创建自定义链(New) |
-X <链> |
删除空的自定义链(Delete) |
-P <链> <策略> |
设置链的默认策略(Policy),如 ACCEPT 或 DROP |
2. 匹配条件
| 选项 |
说明 |
-p <协议> |
协议类型(如 tcp, udp, icmp) |
-s <源地址> |
源IP地址或网段(如 192.168.1.0/24) |
-d <目标地址> |
目标IP地址或网段 |
--sport <源端口> |
源端口(需配合 -p tcp 或 -p udp) |
--dport <目标端口> |
目标端口(需配合 -p tcp 或 -p udp) |
-i <网卡> |
输入网卡(如 eth0) |
-o <网卡> |
输出网卡 |
-m <模块> |
扩展匹配模块(如 state, multiport, limit) |
3. 动作(Target)
| 目标 |
说明 |
ACCEPT |
允许数据包 |
DROP |
丢弃数据包(无响应) |
REJECT |
拒绝数据包(发送拒绝响应) |
SNAT |
修改源IP地址(用于NAT) |
DNAT |
修改目标IP地址(用于端口转发) |
MASQUERADE |
自动SNAT(适用于动态IP,如拨号网络) |
LOG |
记录日志到系统日志(/var/log/syslog) |
三、常见场景示例
1. 基础防火墙规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| iptables -F iptables -t nat -F iptables -t mangle -F
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
|
2. NAT 和端口转发
1 2 3 4 5 6 7 8 9 10 11 12
| echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-ipv4-forward.conf sysctl -p
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
iptables -A FORWARD -d 192.168.1.100 -p tcp --dport 80 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
|
3. 流量限速
1 2 3
| iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/minute -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP
|
4. 日志记录
1 2
| iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROPPED: " --log-level 4
|
四、规则管理技巧
1. 保存与恢复规则
1 2 3 4 5 6 7 8 9
| iptables-save > /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4
apt install iptables-persistent netfilter-persistent save
|
2. 查看规则编号
1
| iptables -L INPUT --line-numbers
|
3. 删除规则
1 2 3 4 5
| iptables -D INPUT 2
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
|
五、高级模块示例
1. 多端口匹配
1 2
| iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
|
2. 连接状态跟踪
1 2
| iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
|
3. IP范围匹配
1 2
| iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT
|
六、注意事项
- 顺序敏感:规则按顺序匹配,第一条匹配的规则生效。
- 远程风险:配置防火墙前确保留有管理端口(如SSH),避免被锁。
- IPv6兼容:如需支持IPv6,需同步配置
ip6tables。
- 测试验证:使用
telnet 或 nc 测试端口是否生效。
掌握这些用法后,即可灵活定制防火墙策略,保护您的网络环境!
场景案例dns超时
以下是对该 iptables 命令的逐段分析及注释:
命令
1
| iptables -I INPUT -p udp --sport 53 -m string --hex-string "|026e7305666865706703636f6d00001c0001|" --algo bm -j DROP
|
分段解析与注释
| 命令片段 |
作用 |
iptables -I INPUT |
在 INPUT 链的头部插入一条新规则(-I 表示插入到最前面)。 |
-p udp --sport 53 |
匹配 UDP 协议且源端口为 53(DNS 服务器的响应流量)。 |
-m string |
启用 string 模块,用于检测数据包内容中的特定字符串。 |
| **`—hex-string “ |
026e7305666865706703636f6d00001c0001 |
“`** |
匹配十六进制字符串,内容解码后为 DNS 查询中的特定域名(见下文详解)。 |
--algo bm |
使用 Boyer-Moore 字符串匹配算法(高效处理长字符串)。 |
-j DROP |
丢弃符合条件的数据包,阻止其进入本机。 |
关键细节
1. 十六进制字符串解码
将 026e7305666865706703636f6d00001c0001 解码为 DNS 查询格式:
02 6e 73 → 长度 0x02 + ASCII 字符 ns(表示域名服务器记录 NS)。
05 66 68 65 70 67 → 长度 0x05 + ASCII 字符 fhepg。
03 63 6f 6d → 长度 0x03 + ASCII 字符 com。
00 00 1c 00 01 → DNS 查询的结束符及记录类型(0x001c 表示 SSHFP 记录,0x0001 表示 A 记录)。
完整域名:ns.fhepg.com,请求类型为 SSHFP 或 A 记录。
2. 规则目的
- 阻断特定 DNS 响应:当 DNS 响应中包含对域名
ns.fhepg.com 的 SSHFP/A 记录查询结果时,丢弃该响应包。
- 应用场景:
- 阻止设备解析恶意域名(如 C&C 服务器)。
- 屏蔽广告或追踪域名。
- 防御 DNS 重绑定攻击。
3. 性能影响
string 模块:逐包检测内容,可能在高流量环境下增加 CPU 负载。
- 优化建议:
- 结合
-m conntrack 限制仅检测新连接。
- 使用
ipset 管理域名黑名单(需内核支持)。
完整注释
1 2 3 4 5 6 7
|
iptables -I INPUT -p udp --sport 53 -m string --hex-string "|026e7305666865706703636f6d00001c0001|" --algo bm -j DROP
|
验证规则效果
查看规则:
1
| iptables -L INPUT -n -v --line-numbers
|
测试 DNS 查询:
1
| dig ns.fhepg.com @8.8.8.8
|
监控日志(如需调试):
1
| iptables -A INPUT -j LOG --log-prefix "BLOCKED_DNS: "
|
通过此规则,可精准阻断特定 DNS 响应,常用于安全防护或网络管理场景。
v4v6禁用与放通
在 iptables 或 ip6tables 中,-j 是 --jump 的缩写,表示规则匹配后要执行的 动作(Action)或跳转的目标链(Target Chain) 。它的核心作用是定义“当数据包满足当前规则的条件时,如何处理这个数据包”。
-j 的作用详解
基本功能
-j 指定一个 目标(Target) ,表示数据包匹配规则后要执行的操作。
- 可以是内置动作(如
ACCEPT、DROP),也可以是用户自定义的链(如 MY_CHAIN)。
常见用法
| 类型 | 示例命令 | 作用 |
|———————————-|————————————————————|—————————————————-|
| 内置动作 | -j ACCEPT | 允许数据包通过 |
| | -j DROP | 丢弃数据包(无响应) |
| | -j REJECT | 拒绝数据包(返回错误响应) |
| | -j LOG | 记录日志(不会中断数据包流程) |
| 跳转到其他链 | -j MY_CUSTOM_CHAIN | 将数据包交给自定义链 MY_CUSTOM_CHAIN 处理 |
关键特性
- 顺序敏感:规则从上到下依次匹配,
-j 的跳转或动作会终止当前链的匹配流程(除非使用 LOG 等非终止动作)。
- 链间跳转:可以将数据包交给另一个链处理(例如自定义链),处理完后再返回到原链(类似函数调用)。
具体示例
示例 1:允许 HTTP 流量
1
| ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
|
- 含义:如果 IPv6 的 TCP 流量目标端口是 80(HTTP),则允许通过。
示例 2:拒绝 ICMPv6 请求
1
| ip6tables -A INPUT -p icmpv6 -j DROP
|
- 含义:丢弃所有 IPv6 的 ICMP 请求(如
ping6)。
示例 3:记录 SSH 连接尝试
1
| ip6tables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH Attempt: "
|
- 含义:记录所有 IPv6 的 SSH 连接尝试到系统日志(但不会阻止流量)。
示例 4:跳转到自定义链
1 2 3 4 5 6 7 8 9
| ip6tables -N MY_CHAIN
ip6tables -A INPUT -p tcp --dport 80 -j MY_CHAIN
ip6tables -A MY_CHAIN -s 2001:db8::/32 -j ACCEPT ip6tables -A MY_CHAIN -j DROP
|
- 含义:只有来自
2001:db8::/32 的 IPv6 HTTP 流量会被允许,其他来源的 HTTP 流量会被丢弃。
常见目标(Target)总结
目标(-j 参数) |
行为 |
ACCEPT |
允许数据包通过防火墙。 |
DROP |
直接丢弃数据包,不返回任何响应(对方无法感知被拦截)。 |
REJECT |
拒绝数据包,并返回错误响应(如 ICMPv6 port unreachable)。 |
LOG |
记录数据包信息到系统日志(/var/log/syslog 或 journalctl)。 |
RETURN |
从自定义链返回到调用链,继续后续规则匹配。 |
| 自定义链名称 |
将数据包交给自定义链处理(需提前用 ip6tables -N 创建链)。 |
注意事项
规则顺序:
- 如果一条规则使用
-j DROP,后续规则将不再处理该数据包。
- 若需记录日志后再拒绝,应先放
LOG 规则,再放 DROP 规则:1 2
| ip6tables -A INPUT -p tcp --dport 22 -j LOG ip6tables -A INPUT -p tcp --dport 22 -j DROP
|
默认策略:
- 使用
-j DROP 的规则会覆盖链的默认策略(-P)。例如,即使默认策略是 ACCEPT,匹配到 -j DROP 的规则仍会丢弃数据包。
调试工具:
- 查看规则是否生效:
ip6tables -L -v -n --line-numbers
- 查看日志:
tail -f /var/log/syslog | grep "SSH Attempt:"(根据 --log-prefix 过滤)。
总结
-j 是 iptables/ip6tables 中定义规则行为的核心参数,它决定了数据包的最终命运(允许、拒绝、记录等)。理解它的用法是配置防火墙规则的基础。