规则概念

以下是 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),如 ACCEPTDROP

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

# 允许SSH(TCP 22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许Ping(ICMP)
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

2. NAT 和端口转发

1
2
3
4
5
6
7
8
9
10
11
12
# 启用IP转发(需编辑 /etc/sysctl.conf)
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-ipv4-forward.conf
sysctl -p

# 将外部8080端口转发到内部服务器的80端口(DNAT)
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

# 启用源地址伪装(SNAT)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

3. 流量限速

1
2
3
# 限制SSH连接速率为每分钟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

# Debian/Ubuntu 持久化
apt install iptables-persistent
netfilter-persistent save

2. 查看规则编号

1
iptables -L INPUT --line-numbers

3. 删除规则

1
2
3
4
5
# 按编号删除(例如删除INPUT链的第2条规则)
iptables -D INPUT 2

# 按条件删除(例如删除允许SSH的规则)
iptables -D INPUT -p tcp --dport 22 -j ACCEPT

五、高级模块示例

1. 多端口匹配

1
2
# 允许HTTP(80)和HTTPS(443)
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

2. 连接状态跟踪

1
2
# 仅允许新建的SSH连接
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

3. IP范围匹配

1
2
# 允许来自192.168.1.100到192.168.1.200的流量
iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT

六、注意事项

  1. 顺序敏感:规则按顺序匹配,第一条匹配的规则生效。
  2. 远程风险:配置防火墙前确保留有管理端口(如SSH),避免被锁。
  3. IPv6兼容:如需支持IPv6,需同步配置 ip6tables
  4. 测试验证:使用 telnetnc 测试端口是否生效。

掌握这些用法后,即可灵活定制防火墙策略,保护您的网络环境!

场景案例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,请求类型为 SSHFPA 记录。


2. 规则目的

  • 阻断特定 DNS 响应:当 DNS 响应中包含对域名 ns.fhepg.comSSHFP/A 记录查询结果时,丢弃该响应包。
  • 应用场景
    • 阻止设备解析恶意域名(如 C&C 服务器)。
    • 屏蔽广告或追踪域名。
    • 防御 DNS 重绑定攻击。

3. 性能影响

  • string 模块:逐包检测内容,可能在高流量环境下增加 CPU 负载。
  • 优化建议
    • 结合 -m conntrack 限制仅检测新连接。
    • 使用 ipset 管理域名黑名单(需内核支持)。

完整注释

1
2
3
4
5
6
7
# 在 INPUT 链的头部插入规则,丢弃满足以下条件的 UDP 数据包:
# 1. 协议为 UDP,来源端口 53(DNS 响应);
# 2. 数据包内容包含十六进制字符串 "026e7305666865706703636f6d00001c0001";
# 该字符串对应 DNS 查询中的域名 "ns.fhepg.com",请求类型为 SSHFP/A 记录;
# 3. 使用 Boyer-Moore 算法进行字符串匹配;
# 最终动作:直接丢弃数据包,阻止域名解析。
iptables -I INPUT -p udp --sport 53 -m string --hex-string "|026e7305666865706703636f6d00001c0001|" --algo bm -j DROP

验证规则效果

  1. 查看规则

    1
    iptables -L INPUT -n -v --line-numbers
  2. 测试 DNS 查询

    1
    dig ns.fhepg.com @8.8.8.8  # 应无响应或超时
  3. 监控日志(如需调试):

    1
    iptables -A INPUT -j LOG --log-prefix "BLOCKED_DNS: "

通过此规则,可精准阻断特定 DNS 响应,常用于安全防护或网络管理场景。

v4v6禁用与放通

iptablesip6tables 中,-j--jump 的缩写,表示规则匹配后要执行的 动作(Action)或跳转的目标链(Target Chain) 。它的核心作用是定义“当数据包满足当前规则的条件时,如何处理这个数据包”。


-j 的作用详解

  1. 基本功能

    • -j 指定一个 目标(Target) ,表示数据包匹配规则后要执行的操作。
    • 可以是内置动作(如 ACCEPTDROP),也可以是用户自定义的链(如 MY_CHAIN)。
  2. 常见用法
    | 类型 | 示例命令 | 作用 |
    |———————————-|————————————————————|—————————————————-|
    | 内置动作 | -j ACCEPT | 允许数据包通过 |
    | | -j DROP | 丢弃数据包(无响应) |
    | | -j REJECT | 拒绝数据包(返回错误响应) |
    | | -j LOG | 记录日志(不会中断数据包流程) |
    | 跳转到其他链 | -j MY_CUSTOM_CHAIN | 将数据包交给自定义链 MY_CUSTOM_CHAIN 处理 |

  3. 关键特性

    • 顺序敏感:规则从上到下依次匹配,-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

# 将 HTTP 流量交给自定义链处理
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/syslogjournalctl)。
RETURN 从自定义链返回到调用链,继续后续规则匹配。
自定义链名称 将数据包交给自定义链处理(需提前用 ip6tables -N 创建链)。

注意事项

  1. 规则顺序

    • 如果一条规则使用 -j DROP,后续规则将不再处理该数据包。
    • 若需记录日志后再拒绝,应先放 LOG 规则,再放 DROP 规则:
      1
      2
      ip6tables -A INPUT -p tcp --dport 22 -j LOG
      ip6tables -A INPUT -p tcp --dport 22 -j DROP
  2. 默认策略

    • 使用 -j DROP 的规则会覆盖链的默认策略(-P)。例如,即使默认策略是 ACCEPT,匹配到 -j DROP 的规则仍会丢弃数据包。
  3. 调试工具

    • 查看规则是否生效:ip6tables -L -v -n --line-numbers
    • 查看日志:tail -f /var/log/syslog | grep "SSH Attempt:"(根据 --log-prefix 过滤)。

总结

-jiptables/ip6tables 中定义规则行为的核心参数,它决定了数据包的最终命运(允许、拒绝、记录等)。理解它的用法是配置防火墙规则的基础。