贝博恩创新科技网

OpenWrt iptables教程,如何快速入门配置?

OpenWrt iptables 完全指南:从入门到精通

目录

  1. 前言:为什么是 OpenWrt 和 iptables?
  2. 核心概念:理解 OpenWrt 的防火墙架构
    • 1. 表
    • 2. 链
    • 3. 规则
    • 4. 包的流程
  3. 实战演练:基本 iptables 命令
    • 1. 查看规则
    • 2. 添加规则
    • 3. 删除规则
    • 4. 链接规则
    • 5. 设置默认策略
    • 6. 保存规则
  4. OpenWrt 的 iptablesfirewall 命令
    • 1. iptables:直接操作内核防火墙
    • 2. uci firewall:推荐的管理方式
  5. 常见应用场景与实例
    • 1. 场景一:端口转发
    • 2. 场景二:禁止特定设备访问互联网
    • 3. 场景三:阻止特定 IP 访问路由器
    • 4. 场景四:限制特定设备的上网速度(使用 TC)
  6. 重要提示:备份与恢复

前言:为什么是 OpenWrt 和 iptables?

OpenWrt 是一个强大的、高度可定制的嵌入式 Linux 操作系统,专为路由器设计,它的核心防火墙功能由 Linux 内核自带的 iptables 提供。

OpenWrt iptables教程,如何快速入门配置?-图1
(图片来源网络,侵删)

iptables 是 Linux 系统中功能最强大、最灵活的防火墙工具,虽然它的语法初看有些复杂,但一旦理解了其工作原理,你就能实现对网络流量的精确控制,打造出完全符合你需求的网络环境。


核心概念:理解 OpenWrt 的防火墙架构

iptables 的工作方式可以理解为一个“多层关卡检查系统”,数据包(网络数据)必须通过这些关卡,每个关卡都有一系列规则来决定数据包的命运。

1. 表

是规则集的容器,不同类型的规则放在不同的表中。iptables 主要有五个表,但最常用的是三个:

  • filter默认表,用于数据包的过滤,是防火墙最核心的功能,我们通常所说的“防火墙规则”主要都在这个表里。
  • nat网络地址转换表,用于修改数据包的源/目标 IP 地址和端口,实现端口转发端口触发NAT(共享上网)等功能都依赖它。
  • mangle修改数据包表,用于修改数据包的 TOS(Type of Service)、TTL(Time to Live)等特殊字段,用于高级路由和 QoS(服务质量)控制。
  • raw:用于决定数据包是否被连接跟踪机制处理。
  • security:用于实现数据包的 SELinux 安全上下文标记。

工作流程:当一个数据包进入时,它会依次经过 raw -> mangle -> nat -> filter 表。

OpenWrt iptables教程,如何快速入门配置?-图2
(图片来源网络,侵删)

2. 链

是规则的有序列表,数据包必须经过这些链,链决定了规则的检查点。iptables 默认在 filter 表中定义了五种链:

  • PREROUTING路由前,数据包进入路由器后,在进行路由决策(决定去往哪里)之前经过此链,通常用于 nat 表,修改目标 IP/端口(如端口转发)。
  • INPUT输入,目标 IP 是本机(路由器自身)的数据包,在进入内核进程前经过此链,用于控制访问路由器本身的流量。
  • FORWARD转发,目标 IP 不是本机,需要被路由器转发到其他网络的数据包,在此链中处理,这是控制局域网设备访问互联网流量的关键链。
  • OUTPUT输出,由本机(路由器)产生,即将离开路由器的数据包,在此链中处理。
  • POSTROUTING路由后,数据包在离开路由器之前,在此链中处理,通常用于 nat 表,修改源 IP/端口(如 MASQUERADE,即共享上网)。

3. 规则

规则 是防火墙策略的具体体现,每条规则都包含一个或多个匹配条件和一个目标动作

  • 匹配条件-p tcp --dport 22(匹配目标端口为 22 的 TCP 数据包)。
  • 目标动作:决定匹配后的操作,ACCEPT(放行)、DROP(丢弃,不返回任何信息)、REJECT(拒绝,返回一个错误信息)。

4. 包的流程

理解数据包的完整路径至关重要:

  1. 数据包进入 -> PREROUTING -> 路由决策 (是给本机还是转发?)
    • 如果是给本机 -> INPUT -> 数据包被路由器进程接收
    • 如果是转发 -> FORWARD -> POSTROUTING -> 数据包离开路由器
  2. 路由器进程产生数据包 -> OUTPUT -> 路由决策 -> POSTROUTING -> 数据包离开路由器

实战演练:基本 iptables 命令

所有命令都需要 root 权限执行,在 OpenWrt 中通常前面加上 sudo

OpenWrt iptables教程,如何快速入门配置?-图3
(图片来源网络,侵删)

1. 查看规则

  • 查看 filter 表的所有规则(默认表):

    sudo iptables -L -n -v
    • -L:List,列出规则。
    • -n:Numeric,以数字形式显示 IP 和端口,不进行 DNS 解析,速度更快。
    • -v:Verbose,显示详细信息,如数据包和字节数。
  • 查看特定表的规则:

    sudo iptables -t nat -L -n -v
  • 查看特定链的规则:

    sudo iptables -L FORWARD -n -v

2. 添加规则

语法:iptables -t [表名] -I/A [链名] [规则编号] -i [入接口] -o [出接口] -p [协议] --dport [目标端口] -j [动作]

  • -I:Insert,插入规则到指定位置(默认是链的顶部)。
  • -A:Append,追加规则到链的末尾。

示例:禁止 168.1.100 这个设备访问外网

# -t filter: 默认表,可省略
# -I FORWARD: 在转发链中插入规则
# -s 192.168.1.100: 匹配源地址
# -j DROP: 动作为丢弃
sudo iptables -I FORWARD -s 192.168.1.100 -j DROP

示例:允许内网设备访问路由器的 SSH 端口 (22)

# -A INPUT: 在输入链末尾追加规则
# -p tcp: 协议为 TCP
# --dport 22: 目标端口为 22
# -d 192.168.1.1: 目标地址为路由器LAN口IP
sudo iptables -A INPUT -p tcp --dport 22 -d 192.168.1.1 -j ACCEPT

3. 删除规则

删除规则最可靠的方法是先精确地复制要删除的规则命令,然后将 -I-A 换成 -D

# 假设我们要删除上面添加的禁止规则
sudo iptables -D FORWARD -s 192.168.1.100 -j DROP
# 也可以通过规则编号删除,但编号会变,不推荐
sudo iptables -L FORWARD --line-numbers
sudo iptables -D FORWARD 3 # 删除 FORWARD 链的第 3 条规则

4. 链接规则

规则是按顺序匹配的,匹配到一条后就不再继续匹配后面的规则。顺序至关重要!

错误示范:

# 先允许所有,再禁止某个IP,这个禁止规则永远不会生效
sudo iptables -A FORWARD -j ACCEPT
sudo iptables -A FORWARD -s 192.168.1.100 -j DROP

正确示范:

# 先禁止,再允许
sudo iptables -I FORWARD -s 192.168.1.100 -j DROP
sudo iptables -A FORWARD -j ACCEPT

注意:上面的正确示范在逻辑上仍有问题,因为第二条 ACCEPT 会放行所有流量,包括 168.1.100,正确的做法是更精细的控制,或者使用 (非) 操作符。

5. 设置默认策略

默认策略是当数据包与链中所有规则都不匹配时采取的动作。

# 设置 INPUT 链默认策略为 DROP,表示所有访问路由器的流量默认禁止
sudo iptables -P INPUT DROP
# 设置 FORWARD 链默认策略为 DROP,表示所有转发的流量默认禁止
sudo iptables -P FORWARD DROP

重要:在设置 DROP 默认策略前,请确保你已经添加了允许你自己管理的规则(如 SSH、DHCP 等),否则你可能被锁在路由器外面!

6. 保存规则

非常重要!:在 OpenWrt 中,直接使用 iptables 命令添加的规则是临时的,重启后就会丢失。

要永久保存规则,你需要将它们写入 /etc/config/firewall 文件,或者使用 iptables-saveiptables-restore 命令。

# 查看当前规则并以可读格式输出
sudo iptables-save > /etc/iptables/iptables.rules
# 从文件恢复规则
sudo iptables-restore < /etc/iptables/iptables.rules

OpenWrt 推荐使用 uci firewall 来管理,它会自动帮你处理这些事情。


OpenWrt 的 iptablesuci firewall 命令

1. iptables:直接操作内核防火墙

如上所述,这是直接与 Linux 内核交互的方式,优点是灵活、强大;缺点是配置复杂,容易出错,且需要手动保存。

2. uci firewall:推荐的管理方式

OpenWrt 提供了一个名为 firewall 的统一配置接口,它通过修改 /etc/config/firewall 文件来生成和管理 iptables 规则,这是强烈推荐的方式,因为它更安全、更易于管理,并且能与其他 OpenWrt 服务(如 DHCP、UPnP)良好集成。

基本命令:

  • 编辑配置文件:

    sudo vi /etc/config/firewall
  • 加载/重启防火墙:

    # 重启防火墙服务,使配置生效
    sudo /etc/init.d/firewall restart
    # 或者使用新的 service 命令
    sudo service firewall restart
  • 查看当前配置对应的规则:

    sudo iptables-save

/etc/config/firewall 文件结构解析:

config defaults
    option syn_flood '1'
    option input 'ACCEPT'
    option output 'ACCEPT'
    option forward 'REJECT'
config zone
    option name 'lan'
    option input 'ACCEPT'
    option output 'ACCEPT'
    option forward 'ACCEPT'
    list network 'lan'
config zone
    option name 'wan'
    option input 'REJECT'
    option output 'ACCEPT'
    option forward 'REJECT'
    option masq '1'
    option mtu_fix '1'
    list network 'wan'
config forwarding
    option src 'lan'
    option dest 'wan'
config rule
    option name 'Allow-DHCP-Renew'
    option src 'wan'
    option proto 'udp'
    option dest_port '68'
    option target 'ACCEPT'
    option family 'ipv4'
config rule
    option name 'Allow-Ping'
    option src 'wan'
    option proto 'icmp'
    option icmp_type 'echo-request'
    option family 'ipv4'
    option target 'ACCEPT'
config include
    option path '/etc/firewall.user'
  • config defaults:默认策略,上面的配置表示默认允许输入输出,但默认拒绝转发。
  • config zone:定义网络区域。lanwan 是最常见的区域。masq '1' 表示开启源地址伪装(NAT),让内网设备能通过路由器上网。
  • config forwarding:定义区域间的转发策略。lan 可以转发到 wan
  • config rule:定义具体规则,允许来自 wan 的 ICMP ping 请求。
  • config include:包含一个额外的脚本文件,可以在这里写自定义的 iptables 命令。

常见应用场景与实例

1. 场景一:端口转发

目标:将来自外网的对 路由器WAN口IP:12345 端口的访问,转发到内网 168.1.100:22 (SSH)。

使用 uci firewall (推荐)

  1. 编辑 /etc/config/firewall
    config redirect
        option name 'SSH-Redirect'
        option src 'wan'
        option proto 'tcp'
        option src_dport '12345'
        option dest 'lan'
        option dest_ip '192.168.1.100'
        option dest_port '22'
        option target 'DNAT'
  2. 保存文件并重启防火墙:
    sudo service firewall restart

使用 iptables

  1. 添加 PREROUTING 规则:
    sudo iptables -t nat -A PREROUTING -p tcp -i $(uci get network.wan.ifname) --dport 12345 -j DNAT --to-destination 192.168.1.100:22
  2. 允许转发流量:
    sudo iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 22 -j ACCEPT
  3. 保存规则:
    sudo iptables-save > /etc/iptables/iptables.rules

2. 场景二:禁止特定设备访问互联网

目标:禁止 MAC 地址为 AA:BB:CC:DD:EE:FF 的设备上网。

使用 uci firewall

  1. /etc/config/firewall 中添加一个 zone 和一个 rule

    # 先创建一个隔离区域
    config zone
        option name 'isolated'
        option input 'ACCEPT'
        option output 'ACCEPT'
        option forward 'REJECT' # 关键:不允许转发出去
        list network 'isolated_net' # 需要在 /etc/config/network 中定义
    # 在 isolated_net 中禁用 DHCP 和 RA
    config dhcp 'isolated'
        option interface 'isolated_net'
        list ignore '1'
    # 创建一个防火墙规则,将设备划入隔离区
    config rule
        option name 'Block-Device-XX'
        option src 'lan'
        option dest 'isolated'
        option proto 'all'
        option src_mac 'AA:BB:CC:DD:EE:FF'
        option target 'ACCEPT'

    注意:这种方法比较复杂,需要创建新的网络接口。

使用 iptables (更简单)

  1. 获取设备的 IP 地址(假设为 168.1.100)。
  2. FORWARD 链中添加丢弃规则:
    sudo iptables -I FORWARD -s 192.168.1.100 -j DROP
  3. 保存规则:
    sudo iptables-save > /etc/iptables/iptables.rules

3. 场景三:阻止特定 IP 访问路由器

目标:阻止 IP 2.3.4 访问路由器的 Web 界面 (80443 端口)。

使用 uci firewall

  1. 编辑 /etc/config/firewall
    config rule
        option name 'Block-Web-Access-1.2.3.4'
        option src '1.2.3.4/32'
        option proto 'tcp'
        option dest_port '80 443'
        option target 'DROP'
  2. 重启防火墙。

使用 iptables

sudo iptables -I INPUT -s 1.2.3.4 -p tcp --dport 80 -j DROP
sudo iptables -I INPUT -s 1.2.3.4 -p tcp --dport 443 -j DROP
sudo iptables-save > /etc/iptables/iptables.rules

4. 场景四:限制特定设备的上网速度

目标:限制 168.1.100 的下载速度为 1Mbps。

方法:使用 TC (Traffic Control)

TC 是 Linux 内核的流量控制工具,通常与 iptables 结合使用,这里只给出基本命令。

  1. 创建一个名为 1mbit 的类:
    tc qdisc add dev br-lan root handle 1: htb default 20
    tc class add dev br-lan parent 1: classid 1:1 htb rate 1mbit
  2. 使用 iptablesMARK target 将数据包打上标记:
    sudo iptables -t mangle -A FORWARD -s 192.168.1.100 -j MARK --set-mark 1
  3. 将标记为 1 的数据包放入 1:1 这个类中:
    tc filter add dev br-lan parent 1: protocol ip prio 1 handle 1 fw flowid 1:1

    注意:TC 配置非常复杂,重启后失效,需要配合开机脚本或 firewall.include 使用,对于普通用户,OpenWrt 的 QoS 功能(如 SQM)是更好的选择。


重要提示:备份与恢复

在进行任何可能导致网络中断的配置前,请务必备份!

  • 备份防火墙配置:
    sudo cp /etc/config/firewall /etc/config/firewall.bak
  • 备份网络配置:
    sudo cp /etc/config/network /etc/config/network.bak
  • 如果配置出错导致无法连接路由器:
    1. 通过串口连接路由器。
    2. 或者,如果还能访问路由器的文件系统(如通过 SSH),恢复备份:
      sudo cp /etc/config/firewall.bak /etc/config/firewall
      sudo service firewall restart

方法 优点 缺点 适用场景
iptables 命令 灵活、直接、功能最全 语法复杂,易出错,配置不持久,不集成 快速测试、临时规则、高级定制
uci firewall 简单、安全、配置持久、与系统集成度高 不如 iptables 命令灵活,无法实现所有高级功能 绝大多数日常使用场景,如端口转发、访问控制等

给新手的建议:

  1. uci firewall 开始,编辑 /etc/config/firewall 文件是最安全、最符合 OpenWrt 设计理念的方式。
  2. 先理解 filter 表和 FORWARD,这是控制内网设备上网的核心。
  3. 理解 nat 表和 PREROUTING/POSTROUTING,这是实现端口转发和共享上网的关键。
  4. 备份!备份!备份! 永远不要在没有备份的情况下进行重大更改。
  5. 善用 iptables-save,在配置 uci firewall 后,使用 iptables-save 查看最终生成的 iptables 规则,有助于你理解其工作原理。

通过这份教程,你应该已经掌握了 OpenWrt iptables 的基本用法和核心思想,随着实践的深入,你将能够更自信地驾驭你的 OpenWrt 路由器。

分享:
扫描分享到社交APP
上一篇
下一篇