跳到主要内容

防火墙设置

请参阅本节信息以设置防火墙配置。

设置默认防火墙

此默认部分显示不属于特定区域的全局防火墙设置。

表 1. 设置默认防火墙
语法
  • sudo uci set firewall.@defaults[0].input=<input>
  • sudo uci set firewall.@defaults[0].output=<output>
  • sudo uci set firewall.@defaults[0].forward=<forward>
  • sudo uci set firewall.@defaults[0].syn_flood=<syn_flood>
  • sudo uci set firewall.@defaults[0].drop_invalid=<drop_invalid>
表 2. 参数
名称类型必需默认值描述

input

字符串

REJECT

为过滤器表的 INPUT 链设置策略。

output

字符串

REJECT

为过滤器表的 OUTPUT 链设置策略。

forward

字符串

REJECT

为过滤器表的 FORWARD 链设置策略。

syn_flood

布尔

0

启用 SYN 洪泛保护(已为 synflood_protect 设置废弃)。

drop_invalid

布尔

0

丢弃无效数据包(例如,与任何活动连接都不匹配的数据包)。

命令示例:

表 3. 命令示例
  • sudo uci set firewall.@defaults[0].input=ACCEPT
  • sudo uci set firewall.@defaults[0].output= ACCEPT
  • sudo uci set firewall.@defaults[0].forward= ACCEPT
  • sudo uci set firewall.@defaults[0].syn_flood=1
  • sudo uci set firewall.@defaults[0].drop_invalid=1
  • sudo uci commit firewall
  • sudo /etc/init.d/firewall restart

添加新区域

本节定义了测试的通用属性。输入和输出选项为进出此区域的流量设置默认策略,转发选项则描述区域内不同网络间已转发流量的策略。覆盖网络表示哪些可用网络是此区域的成员。

表 4. 添加新区域
语法
  • sudo uci add firewall zone
  • sudo uci set firewall.@zone[-1].name=<name>
  • sudo uci set firewall.@zone[-1].input=<input>
  • sudo uci set firewall.@zone[-1].output=<output>
  • sudo uci set firewall.@zone[-1].forward=<forward>
  • sudo uci set firewall.@zone[-1].masq=<masq>
  • sudo uci set firewall.@zone[-1].mtu_fix=<mtu_fix>
  • sudo uci set firewall.@zone[-1].network=<network>
  • sudo uci set firewall.@zone[-1].family=<family>
  • sudo uci set firewall.@zone[-1].masq_src=<masq_src>
  • sudo uci set firewall.@zone[-1].masq_dest=<masq_dest>
  • sudo uci set firewall.@zone[-1].conntrack=<conntrack>
  • sudo uci set firewall.@zone[-1].log=<log>
  • sudo uci set firewall.@zone[-1].log_limit=<log_limit>
  • udo uci commit firewall
表 5. 参数

参数

类型

必需

默认值

描述

name

区域名称

yes

唯一区域名称。工作防火墙区域名称的最大长度为 11 个字符。

input

字符串

REJECT

为过滤器表的 INPUT 链设置策略。

output

字符串

REJECT

为过滤器表的 OUTPUT 链设置策略。

forward

字符串

REJECT

为过滤器表的 FORWARD 链设置策略。

masq

布尔

0

指定是否应对传出区域的流量进行伪装 - 在 WAN 区域通常启用此功能。

mtu_fix

布尔

0

对传出区域的流量启用 MSS 钳制。

network

列表

连接到此区域的接口列表。如已省略且未提供额外*选项、子网或设备,则默认使用 name 值。网络配置中定义的别名接口不能用作有效的“独立”网络。使用 uci 中说明的列表语法。

family

字符串

0

要生成 iptables 规则的协议族(ipv4、ipv6 或其他协议族)。

masq_src

子网列表

0.0.0.0/0

限制对给定源子网的伪装。可为子网加 ! 前缀来取反;允许使用多个子网。

masq_dest

子网列表

0.0.0.0/0

限制对给定目标子网的伪装。可为子网加 ! 前缀来取反;允许使用多个子网。

conntrack

布尔

如果使用伪装,则值为 1,否则为 0

强制对此区域进行连接跟踪(请参阅有关连接跟踪的注释)。

log

布尔

0

为此区域内被拒绝和被丢弃的流量创建日志规则。

log_limit

字符串

10/分钟

限制每个时间间隔的日志消息数量。

命令示例:

表 6. 命令示例
  • sudo uci add firewall zone
  • sudo uci set firewall.@zone[-1].name=test
  • sudo uci set firewall.@zone[-1].input=ACCEPT
  • sudo uci set firewall.@zone[-1].output= ACCEPT
  • sudo uci set firewall.@zone[-1].forward= ACCEPT
  • sudo uci set firewall.@zone[-1].masq=<masq>
  • sudo uci set firewall.@zone[-1].mtu_fix=<mtu_fix>
  • sudo uci set firewall.@zone[-1].network=<network>
  • sudo uci set firewall.@zone[-1].family=<family>
  • sudo uci set firewall.@zone[-1].masq_src=<masq_src>
  • sudo uci set firewall.@zone[-1].masq_dest=<masq_dest>
  • sudo uci set firewall.@zone[-1].conntrack=<conntrack>
  • sudo uci set firewall.@zone[-1].log=<log>
  • sudo uci set firewall.@zone[-1].log_limit=<log_limit>
  • sudo uci commit firewall
  • sudo /etc/init.d/firewall restart

添加新转发

转发部分控制区域间流量的流动,并可在特定方向启用 MSS 钳制。一个转发规则仅覆盖一个方向。要在两个区域之间实现流量的双向流动,需要添加两个转发,每个转发中 src 和 dest 相反。

表 7. 添加新转发
语法
  • sudo uci set firewall.@zone[-1].src=<src>
  • sudo uci set firewall.@zone[-1].dest=<dest>
  • sudo uci commit firewall
表 8. 参数
参数类型必需默认值描述

src

区域名称

yes

指定流量来源区域。必须引用其中一个定义的区域名称。

dest

区域名称

yes

指定流量目标区域。必须引用其中一个定义的区域名称。

命令示例:

表 9. 命令示例
  • sudo uci set firewall.@zone[-1].src=test
  • sudo uci set firewall.@zone[-1].dest=lan
  • sudo uci commit firewall
  • sudo /etc/init.d/firewall restart

添加新的端口转发

端口转发(DNAT)的定义详见重定向部分。指定源区域上与给定规则匹配的所有传入流量将被定向到指定的内部主机。重定向通常也称为“端口转发”和“虚拟服务器”。端口范围表示为“start:stop”,例如“6666:6670”。类似于 iptables 语法。

表 10. 添加新的端口转发
语法
  • sudo uci add firewall redirect
  • sudo uci set firewall.@redirect[-1].enabled=<enabled>
  • sudo uci set firewall.@redirect[-1].name=<name>
  • sudo uci set firewall.@redirect[-1].proto=<proto>
  • sudo uci set firewall.@redirect[-1].src=<src>
  • sudo uci set firewall.@redirect[-1].src_mac=<src_mac>
  • sudo uci set firewall.@redirect[-1].src_ip=<src_ip>
  • sudo uci set firewall.@redirect[-1].src_port=<src_port>
  • sudo uci set firewall.@redirect[-1].src_dip=<src_dip>
  • sudo uci set firewall.@redirect[-1].src_dport=<src_dport>
  • sudo uci set firewall.@redirect[-1].dest=<dest>
  • sudo uci set firewall.@redirect[-1].dest_ip=<dest_ip>
  • sudo uci set firewall.@redirect[-1].dest_port=<dest_port>
  • sudo uci set firewall.@redirect[-1].reflection=<reflection>
  • sudo uci commit firewall
表 11. 参数
参数类型必需默认值描述

enabled

字符串

1 或 yes

启用或禁用重定向规则。

name

字符串

唯一重定向名称。

proto

协议名称或编号

yes

tcp udp

使用给定的协议匹配传入流量。

src

区域名称

yes(对于 DNAT 目标)

指定流量来源区域。必须引用其中一个定义的区域名称。在典型的端口转发中常为 wan。

src_mac

MAC 地址

匹配来自指定 MAC 地址的传入流量。

src_ip

IP 地址

匹配来自指定源 IP 地址的传入流量。

src_port

端口或范围

匹配来自客户端主机上给定源端口或端口范围(例如:“5000-5100”)的传入流量。

src_dip

IP 地址

是(对于 SNAT 目标)

对于 DNAT,匹配定向到给定目标 IP 地址上的传入流量。对于 SNAT,将源地址重写为给定的地址。

src_dport

端口或范围

对于 DNAT,匹配定向到此主机上给定目标端口或端口范围(例如:“5000-5100”)的传入流量。对于 SNAT,将源端口重写为给定值。

dest

区域名称

是(对于 SNAT 目标)

指定流量目标区域。必须引用其中一个定义的区域名称。对于 Attitude Adjustment 上的 DNAT 目标,NAT 反映仅在此值等于 lan 时生效。

dest_ip

IP 地址

yes(对于 DNAT 目标)

对于 DNAT,将已匹配的传入流量重定向到指定的内部主机。对于 SNAT,匹配定向到给定地址的流量。对于 DNAT,如果 dest_ip 值与路由器的本地 IP 地址匹配,如 ifconfig 中所示,则该规则将转换为 DNAT + input “accept”规则。否则将为 DNAT +forward 规则。

dest_port

端口或范围

对于 DNAT,将已匹配的传入流量重定向到内部主机上的给定端口。对于 SNAT,匹配定向到给定端口的流量。只能指定一个端口或范围(例如:“5000-5100”),而不能像“规则”(如下所示)中所示的那样指定多个不同端口。

reflection

布尔

1

为此重定向激活 NAT 反映 - 适用于 DNAT 目标。

命令示例:

表 12. 将 http(而非 HTTPS)流量转发到在 192.168.1.10 上运行的网络服务器:
  • sudo uci add firewall redirect
  • sudo uci set firewall.@redirect[-1].enabled=1
  • sudo uci set firewall.@redirect[-1].proto=tcp
  • sudo uci set firewall.@redirect[-1].src=wan
  • sudo uci set firewall.@redirect[-1].src_dport=80
  • sudo uci set firewall.@redirect[-1].dest=lan
  • sudo uci set firewall.@redirect[-1].dest_ip=192.168.1.10
  • sudo uci commit firewall
  • sudo /etc/init.d/firewall restart

添加新的流量规则

端口转发(DNAT)的定义详见重定向部分。指定源区域上与给定规则匹配的所有传入流量将被定向到指定的内部主机。重定向通常也称为端口转发虚拟服务器。端口范围表示为“start:stop”,例如“6666:6670”。类似于 iptables 语法。

表 13. 添加新的流量规则
语法
  • sudo uci add firewall rule
  • sudo uci set firewall.@rule[-1].enabled=<enabled>
  • sudo uci set firewall.@rule[-1].name=<name>
  • sudo uci set firewall.@rule[-1].family=<family>
  • sudo uci set firewall.@rule[-1].proto=<proto>
  • sudo uci set firewall.@rule[-1].src=<src>
  • sudo uci set firewall.@rule[-1].src_mac=<src_mac>
  • sudo uci set firewall.@rule[-1].src_ip=<src_ip>
  • sudo uci set firewall.@rule[-1].src_port=<src_port>
  • sudo uci set firewall.@rule[-1].dest=<dest>
  • sudo uci set firewall.@rule[-1].dest_ip=<dest_ip>
  • sudo uci set firewall.@rule[-1].dest_port=<dest_port>
  • sudo uci set firewall.@rule[-1].target=<target>
  • sudo uci set firewall.@rule[-1].weekdays=<weekdays>
  • sudo uci set firewall.@rule[-1].monthdays=<monthdays>
  • sudo uci set firewall.@rule[-1].start_time=<start_time>
  • sudo uci set firewall.@rule[-1].stop_time=<stop_time>
  • sudo uci set firewall.@rule[-1].start_date=<start_date>
  • sudo uci set firewall.@rule[-1].stop_date=<stop_date>
  • sudo uci set firewall.@rule[-1].utc_time=<utc_time>
  • uci commit firewall
表 14. 参数
参数类型必选默认值描述

enabled

布尔

yes

启用或禁用规则。

name

字符串

唯一规则名称。

family

字符串

任何

要生成 iptables 规则的协议族(ipv4、ipv6 或其他协议族)。

proto

协议名称或编号

tcp udp

使用给定的协议匹配传入流量。可以为 tcp、udp、tcpudp、udplite、icmp、esp、ah、sctp 中的一个或全部协议,也可为代表这些协议之一或其他不同协议的数值。允许使用来自 /etc/protocols 的协议名称。数字 0 表示全部协议。

src

区域名称

是(自 Firewall v2、版本 58 及更高版本起为可选)

指定流量来源区域。必须引用其中一个定义的区域名称。

src_mac

MAC 地址

匹配来自指定 MAC 地址的传入流量。

src_ip

IP 地址

匹配来自指定源 IP 地址的传入流量。

src_port

端口或范围

如果指定了相关协议,则匹配来自指定源端口或端口范围(例如:“5000:5100”,端口范围不适用于全部协议)的传入流量。可以指定多个端口,如“80 443 465”1。

dest

区域名称

指定流量目标区域。必须引用其中一个定义的区域名称,或以 * 表示任何区域。如已指定,则该规则适用于已转发的流量;否则,将其视为输入规则。

dest_ip

IP 地址

匹配定向到指定目标 IP 地址的传入流量。若无目标区域,则将其视为输入规则!

dest_port

端口或范围

如果指定了相关协议,则匹配定向到给定目标端口或端口范围(例如:“5000:5100”,端口范围不适用于全部协议)的传入流量。可以指定多个端口,如“80 443 465”1。

target

字符串

yes

DROP

为此重定向激活 NAT 反映 - 适用于 DNAT 目标。

weekdays

工作日列表

(always)

如已指定,则仅在给定的工作日匹配流量,例如,“sun mon thu fri”表示仅在星期日、星期一、星期四和星期五匹配。可为列表加感叹号前缀来取反,例如,“! sat sun”表示除星期六和星期日外,其他时候始终进行匹配。

monthdays

日期列表

(always)

如已指定,则仅在当月的给定日期内匹配流量,例如,“2 5 30”表示仅在当月的 2 日、5 日和 30 日匹配。可为列表加感叹号前缀来取反,例如“!31”表示除当月的 31 日外,其他日期始终进行匹配。

start_time

时间(时:分:秒)

(always)

如已指定,则仅在一天的给定时间(含)之后匹配流量。

stop_time

时间(时:分:秒)

(always)

如已指定,则仅在一天的给定时间(含)之前匹配流量。

start_date

日期(年 - 月 - 日)

(always)

如已指定,则仅在给定日期(含)之后匹配流量。

stop_date

日期(年 - 月 - 日)

(always)

如已指定,则仅在给定日期(含)之前匹配流量。

utc_time

布尔

0

将所有给定的时间值视为 UTC 时间,而非本地时间。

命令示例:

表 15. 阻止所有试图连接指定主机地址的连接
  • sudo uci add firewall rule
  • sudo uci set firewall.@rule[-1].enabled=1
  • sudo uci set firewall.@rule[-1].src=lan
  • sudo uci set firewall.@rule[-1].dest=wan
  • sudo uci set firewall.@rule[-1].dest_ip=123.45.67.89
  • sudo uci set firewall.@rule[-1].target=REJECT
  • sudo uci commit firewall
  • sudo /etc/init.d/firewall restart

添加新的源 NAT

源 NAT 可更改传出的数据包,使其看起来好像来源于嵌入式交换机系统。

命令示例:
表 16. 为 UDP 和 TCP 流量定义源 NAT

为定向到端口 123(源自 IP 地址为 10.55.34.85 的主机)的 UDP 和 TCP 流量定义源 NAT。

源地址重写为 63.240.161.99:

  • sudo uci add firewall redirect
  • sudo uci set firewall.@redirect[-1].enabled=1
  • sudo uci set firewall.@redirect[-1].src=lan
  • sudo uci set firewall.@redirect[-1].src_ip=10.55.34.85
  • sudo uci set firewall.@redirect[-1].src_dip=63.240.161.99
  • sudo uci set firewall.@redirect[-1].dest=wan
  • sudo uci set firewall.@redirect[-1].dest_port=123
  • sudo uci set firewall.@redirect[-1].target=SNAT
  • sudo uci commit firewall
  • sudo /etc/init.d/firewall restart