Shorewall防火墙配置
安装
sudo apt-get install shorewall shorewall6
启用Universal配置:
sudo cp /usr/share/doc/shorewall/examples/Universal/* /etc/shorewall/
包介绍
在 Shorewall 版本 4.5.* 中,常用 Shell 库被分离到单独的 Shorewall-core 包中。从 Shorewall 4.5 开始,共有六个包:
- Shorewall-core — 安装 Shorewall、Shorewall6、Shorewall-lite 或 Shorewall6-lite 所需。
- Shorewall — 与 Shorewall-core 一起,包含创建 IPv4 防火墙所需的一切。
- Shorewall6 — 需要 Shorewall 软件包并添加创建 IPv6 防火墙的功能。
- Shorewall-lite — 轻量级 Shorewall 版本,将运行在安装了 Shorewall 的系统上生成的编译防火墙脚本。
- Shorewall6-lite — 轻量级 Shorewall6 版本,将运行在安装了 Shorewall6 的系统上生成的编译防火墙脚本。
- Shorewall-init — 上述任何软件包的附加组件,允许根据接口的启动和关闭更改防火墙状态。在未使用 Upstart 的情况下,还可以将此软件包配置为在启动网络接口之前将防火墙置于安全状态。
如果你正在安装 Shorewall 4.4 或更高版本:
- 在网络中的至少一台系统上,你必须安装 Shorewall 软件包。如果你需要 IPv6 防火墙,那么还必须安装 Shorewall6 软件包。
- 如果你只有一个防火墙,那么那台系统应当是你的防火墙系统。
- 如果你有多个防火墙,你可能希望在一个单独的管理系统上安装 Shorewall(可能还包括 Shorewall6),并在各防火墙上安装 Shorewall-lite 和/或 Shorewall6-lite。这样做可以实现防火墙的集中管理和配置。
手动下载:https://shorewall.org/pub/shorewall/
须知
警告:
不要尝试在远程系统上安装 Shorewall。你肯定会将自己锁在外面。
快速入门指南:
如果你只是想保护一个系统:(需要 Shorewall 4.4.12-Beta3 或更高版本)
- 通用配置 — 无需配置即可保护单个系统。
- 警告:这种配置将所有接口置于网络区域。如果你添加了另一个接口或 VPN,你将需要选择不同的快速入门指南。
如果你只有一个公共 IP 地址:
- 带单个网络接口的独立 Linux 系统(如果你运行的是 Shorewall 4.4.12 Beta 3 或更高版本,请改用通用配置)。
- 带两个接口的 Linux 系统,作为小型本地网络的防火墙/路由器。有关 Redhat 特定的安装/配置信息,请参阅 Digimer 提供的这篇文章。
- 带三个接口的 Linux 系统,作为小型本地网络和 DMZ 的防火墙/路由器。
如果你有多个公共 IP 地址:
- Shorewall 设置指南概述了在涉及多个公共 IP 地址时设置防火墙的必要步骤,或如果你想了解比单地址指南中更多的 Shorewall 信息,请参阅该指南。
以下文章也推荐给新手阅读:
- 配置文件基础
- 操作 Shorewall 和 Shorewall Lite 包含许多有用的操作提示。
- PPPPPPPS(即 Paul’s Principles for Practical Provision of Packet Processing with Shorewall)
基础配置
Universal
通用配置的功能
通用 Shorewall 配置要求您只需将配置文件复制到 /etc/shorewall
并启动 Shorewall。这种示例配置:
- 允许所有出站流量。
- 阻止所有入站连接,除非是:
- 安全外壳协议(Secure Shell)
- Ping
- 允许转发流量,前提是系统具有多个接口或被设置为在单个接口上进行网络之间的路由。
示例配置文件的位置取决于您的发行版和 Shorewall 的安装方式。
如果您使用 RPM 安装,示例文件将在 Shorewall 文档目录的
Samples/Universal
子目录中。如果您不知道 Shorewall 文档目录的位置,可以使用以下命令找到示例文件:1
2
3
4
5
6
7~# rpm -ql shorewall-common | fgrep Universal
/usr/share/doc/packages/shorewall/Samples/Universal
/usr/share/doc/packages/shorewall/Samples/Universal/interfaces
/usr/share/doc/packages/shorewall/Samples/Universal/policy
/usr/share/doc/packages/shorewall/Samples/Universal/rules
/usr/share/doc/packages/shorewall/Samples/Universal/zones
~#如果您使用 tarball 安装,示例文件位于 tarball 的
Samples/Universal
目录中。如果您使用 Shorewall 4.x 的 .deb 包安装,示例文件位于
/usr/share/doc/shorewall-common/examples/Universal
。您不需要 shorewall-doc 包来访问这些示例文件。
只需将 Universal 目录中的文件复制到 /etc/shorewall
即可。
启用Shorewall
如何启动防火墙
在首次启动 Shorewall 之前,建议先停止现有的防火墙。对于 Redhat/CentOS/Fedora 系统,在根提示符下输入:
1 | service iptables stop |
如果您使用的是 SuSE,使用 Yast 或 Yast2 来停止 SuSEFirewall。
一旦 Shorewall 按您的满意运行后,您应完全禁用现有的防火墙。在 Redhat/CentOS/Fedora 系统上:
1 | chkconfig --del iptables |
然后在根提示符下输入:
1 | /sbin/shorewall start |
这样,Shorewall 将会在重启时自动再次启动。
如何停止防火墙?
在根提示符下输入:
1 | /sbin/shorewall clear |
此时系统将变为“完全开放”。
如何阻止防火墙响应 Ping?
编辑 /etc/shorewall/rules
文件,并删除以下行:
1 | Ping(ACCEPT) net $FW |
然后在根提示符下输入:
1 | /sbin/shorewall restart |
如何允许其他类型的传入连接?
Shorewall 包含一组宏,可以用来快速允许或拒绝服务。你可以使用以下命令找到你版本的 Shorewall 包含的宏列表:
1 | ls /usr/share/shorewall/macro.* |
或者在 shell 提示符下输入:
1 | /sbin/shorewall show macros |
如果你希望允许从互联网到防火墙的连接,并且在 /etc/shorewall/macro.*
中找到合适的宏,则在 /etc/shorewall/rules
中添加规则的一般格式是:
1 | #ACTION SOURCE DESTINATION PROTO DPORT |
重要提示 确保在添加规则时放在 SECTION NEW
行之后。
示例 1:你希望在防火墙系统上运行 Web 服务器和 IMAP 服务器
1 | #ACTION SOURCE DESTINATION PROTO DPORT |
你也可以选择直接编写规则,而不使用预定义的宏。如果没有适合你需求的预定义宏,这种方法是必要的。在这种情况下,/etc/shorewall/rules
中规则的一般格式是:
1 | #ACTION SOURCE DESTINATION PROTO DPORT |
示例 2:你希望在防火墙系统上运行 Web 服务器和 IMAP 服务器
1 | #ACTION SOURCE DESTINATION PROTO DPORT |
如果你不知道特定应用程序使用哪个端口和协议,请参阅相关文档(https://shorewall.org/ports.htm)。
如何让防火墙在拒绝传入连接时记录消息?
Shorewall 本身不维护日志,而是依赖于系统的日志配置。以下命令依赖于知道 Netfilter 消息的日志位置:
shorewall show log
(显示最后 20 条 Netfilter 日志消息)shorewall logwatch
(以可设置的间隔轮询日志)shorewall dump
(生成详细报告以供 Shorewall 问题报告使用)
确保这些命令正常工作,因为当 Shorewall 运行时遇到连接问题时,第一步是查看 Netfilter 日志。通过参考 Shorewall FAQ 17,通常可以快速解决问题。
Netfilter 日志位置因发行版而异:
- Debian 及其衍生版将 Netfilter 消息记录到
/var/log/kern.log
。 - 最近的 SuSE/OpenSuSE™ 版本预配置了 syslog-ng,并将 Netfilter 消息记录到
/var/log/firewall
。 - 对于其他发行版,Netfilter 消息最常记录到
/var/log/messages
。
修改 /etc/shorewall/shorewall.conf
中的 LOGFILE
设置以指定你的日志名称。
重要提示
LOGFILE
设置不控制 Netfilter 日志的位置——它只是告诉 /sbin/shorewall
实用程序在哪里找到日志。
现在,编辑 /etc/shorewall/policy
并修改以下行:
1 | net all DROP |
改为:
1 | net all DROP info |
然后在 root 提示符下输入:
1 | /sbin/shorewall reload |
如何防止防火墙转发连接请求?
编辑 /etc/shorewall/interfaces
,并从接口中移除 routeback
选项。例如,将以下行更改为:
1 | net all - dhcp,physical=+,optional |
然后在 root 提示符下输入:
1 | /sbin/shorewall reload |
one-interface(TODO)
two-interfaces(TODO)
three-interfaces(TODO)
Manpages
MAN:https://shorewall.org/Manpages.html
第5节 — 文件和概念
accounting
定义 IP 计费规则。actions
声明用户定义的操作。addresses
描述在 Shorewall 配置中如何指定 IP 地址和端口。arprules
(在 Shorewall 4.5.12 中新增) 定义 ARP 过滤规则。blrules
Shorewall 黑名单文件。conntrack
指定连接帮助程序或豁免某些流量的 netfilter 连接跟踪。ecn
禁用显式拥塞通知。exclusion
从网络或区域中排除主机。files
描述 Shorewall 配置文件及其用途。hosts
定义通过单个接口访问的多个区域。interfaces
定义系统接口,并可选择将其与区域关联。ipsets
描述如何在 Shorewall 配置文件中指定集合名称。logging
提供 Shorewall 数据包日志记录设施的概述。maclist
定义 MAC 地址验证。mangle
替代 tcrules,描述数据包和连接标记。masq
定义伪装/SNAT(已被 snat 替代)。modules
指定要加载的内核模块(在 Shorewall 5.2.3 中删除)。names
描述 Shorewall 配置中的对象命名规则。nat
定义一对一 NAT。nesting
解释如何定义嵌套区域。netmap
描述如何将地址从一个网络映射到另一个网络。params
为其他 Shorewall 文件中使用的 shell 变量分配值。policy
定义区域之间连接的高级策略。providers
定义路由表,通常用于多个互联网链接。proxyarp
定义 IPv4 的代理 ARP。proxyndp
定义 IPv6 的代理 NDP。rtrules
定义路由规则。routes
(在 Shorewall 4.4.15 中新增) 向提供者路由表添加额外的路由。rules
指定对策略的例外,包括 DNAT 和 REDIRECT。secmarks
将 SELinux 上下文附加到数据包。snat
定义伪装/SNAT。tcclasses
定义用于流量整形的 HTB 类别。tcdevices
指定用于流量整形的设备速度。tcfilters
对流量进行分类以便整形,通常与 IFB 一起使用来整形流入流量。tcinterfaces
指定用于简化流量整形的设备。tcpri
对简化流量整形的流量进行分类。tunnels
定义具有防火墙端点的 VPN 连接。shorewall.conf
指定 Shorewall 的全局选项。shorewall6.conf
指定 Shorewall6 的全局选项。shorewall-lite.conf
指定 Shorewall Lite 的全局选项。shorewall6-lite.conf
指定 Shorewall6 Lite 的全局选项。vardir
重新定义 Shorewall 保存其状态信息的目录。vardir-lite
重新定义 Shorewall Lite 保存其状态信息的目录。zones
声明 Shorewall 区域。
第8节 — 管理命令
- shorewall
/sbin/shorewall
、/sbin/shorewall6/
、/sbin/shorewall-lite
和/sbin/shorewall6-lite
命令的语法和语义。
配置文件
/etc/shorewall/zones
在配置 Shorewall 时,你需要先定义网络区域(zones),然后将实际的网络接口(interfaces)分配给这些区域。这样,Shorewall 就能基于区域之间的规则来处理流量,并通过接口来实际管理数据流动。
区域(Zones): 是逻辑上的分组,定义网络的分类和访问策略。它们并不直接对应物理接口,而是描述网络的不同部分。
定义: zones
文件定义了网络区域,每个区域代表一个网络或网络的一部分。区域是 Shorewall 用于组织和分类网络接口的一种方式。
作用: 区域帮助 Shorewall 理解不同网络之间的关系,例如内部网络、外部网络、DMZ 等。它们用于指定网络流量的处理策略。
配置: 在 /etc/shorewall/zones
文件中定义。每个区域都需要一个唯一的名称,并且指定其类型(如 ipv4
、ipv6
、firewall
)。
1 | #ZONE TYPE |
解释: 上述示例中定义了两个区域:net
(外部网络)和 loc
(本地网络)。这两个区域都使用 IPv4 地址。
参数:
类型(TYPE)
ip
:这是标准的 Shorewall 区域类型,也是默认类型。如果这一列留空或输入“-”,则默认为 ip
。与某些区域主机的通信可能是加密的。加密主机在 shorewall-hosts(5)
文件中使用 ipsec
选项指定。为了清晰起见,在 IPv4 配置中可以将此区域类型指定为 ipv4
,在 IPv6 配置中可以指定为 ipv6
。
ipsec
:与所有区域主机的通信都是加密的。你的内核和 iptables 必须包含策略匹配支持。为了清晰起见,在 IPv4 配置中可以将此区域类型指定为 ipsec4
,在 IPv6 配置中可以指定为 ipsec6
。
firewall
:指定防火墙本身。你必须有一个 firewall
区域。防火墙区域不允许任何选项。你在 ZONE 列中输入的名称将存储在 shell 变量 $FW
中,你可以在其他配置文件中使用它来指定防火墙区域。
bport
:该区域与单个桥接上的一个或多个端口相关联。为了清晰起见,在 IPv4 配置中可以将此区域类型指定为 bport4
,在 IPv6 配置中可以指定为 bport6
。
vserver
:在 Shorewall 4.4.11 Beta 2 中新增 - 一个由 Linux-vserver 客户机组成的区域。区域内容必须在 shorewall-hosts(5)
文件中定义。Vserver 区域隐式地作为防火墙区域的子区域处理。
loopback
:在 Shorewall 4.5.17 中新增。通常,Shorewall 以下列方式处理回环接口(lo):
- 默认情况下,所有通过该接口的流量都被接受(ACCEPT)。
- 如果定义了 $FW -> $FW 策略或 $FW -> $FW 规则,它们会被放置在名为
${FW}2${F2}
或${FW}-${FW}
的链中(例如,fw2fw
或fw-fw
),具体取决于shorewall.conf(5)
中的 ZONE2ZONE 设置。 - $FW -> $FW 流量仅在 OUTPUT 链中被过滤。
通过定义一个 loopback 区域并在 shorewall-interfaces(5)
中将其与回环接口关联,可以实现稍微不同的模型。假设回环区域名称是 local
,那么:
- 将创建 $FW -> local 和 local -> $FW 链。
- $FW -> local 和 local -> $FW 策略可以不同。
- 可以指定 $FW -> local 和 local -> $FW 规则。
- 对回环区域和除防火墙区域以外的任何区域的规则将被忽略,并发出警告。
- 回环区域可以嵌套在其他回环区域内。
local
:在 Shorewall 4.5.17 中新增。local
与 ipv4
相同,唯一的区别是该区域只能从防火墙和 vserver 区域访问。
选项 (OPTIONS)
这些选项是逗号分隔的列表。除 mss
和 blacklist
选项外,这些选项仅适用于 TYPE ipsec
区域。
- dynamic_shared
在 Shorewall 4.5.9 中新增。只能在 OPTIONS 列中指定,表示如果此区域在shorewall-hosts(5)
中有多个动态条目,则只应创建一个 ipset。没有此选项时,会为每个接口创建单独的 ipset。 - reqid=number
使用setkey(8)
指定,其中number
使用 SPD 级别的unique:number
选项指定。 - spi=
其中number
是用于加密/解密数据包的 SA 的 SPI。 - proto=ah|esp|ipcomp
IPSEC 封装协议。 - mss=number
设置 TCP 数据包中的 MSS 字段。如果提供此选项,还应在shorewall.conf(5)
中设置FASTACCEPT=No
,以确保 SYN 和 SYN,ACK 数据包的 MSS 字段都得到调整。 - mode=transport|tunnel
IPSEC 模式。 - tunnel-src=address[/mask]
仅在mode=tunnel
时可用。 - tunnel-dst=address[/mask]
仅在mode=tunnel
时可用。 - strict
意味着数据包必须匹配所有规则。 - next
分隔规则,仅可与strict
一起使用。
IN OPTIONS 和 OUT OPTIONS
这些选项分别应用于传入和传出流量(除了 OPTIONS 中的选项外)。如果你希望留空某列,但需要在后续列中输入内容,请使用 “-” 作为占位符。
Universal示例
1 | # |
三接口示例
1 | # |
/etc/shorewall/interfaces
定义: interfaces
文件定义了网络接口及其与区域的关联。接口是实际的网络设备或虚拟接口,Shorewall 使用它们来确定数据流动的物理路径。
作用: 接口将实际的网络硬件(如网卡)与 Shorewall 的区域模型连接起来。它们告诉 Shorewall 哪些接口属于哪些区域,以及这些接口的附加选项(如是否启用路由回传)。
配置: 在 /etc/shorewall/interfaces
文件中定义。每个接口都需要指定所属区域及其他选项。
1 | #ZONE INTERFACE OPTIONS |
解释: 上述示例中,eth0
接口被分配到 net
区域,并启用了 DHCP 和路由回传功能。eth1
接口被分配到 loc
区域,并启用了 DHCP。
接口(Interfaces): 是物理或虚拟的网络接口,实际连接到网络。它们与区域相关联,告诉 Shorewall 哪些接口属于哪些区域,以及如何处理这些接口的流量。
区域 (Zone)
- Zone for this interface:必须匹配
/etc/shorewall/zones
文件中声明的区域名称。在这个列中不能列出防火墙区域。 - 多个区域:如果接口服务于多个将在
shorewall-hosts(5)
文件中定义的区域,应在此列中放置“-”。(通常,一个接口只能属于一个区域,除非使用更高级的 Shorewall 配置(如multi-ZONE
配置),否则这种配置会导致冲突和不明确的区域划分。) - 多个接口同一区域:如果有多个接口指向同一区域,必须在单独的条目中列出它们。
1 | If the interface serves multiple zones that will be defined in the shorewall-hosts[1](5) file, you should place "-" in this column. |
1 | # Shorewall interfaces file |
解释
- net 区域与
eth0
接口相关联,启用 DHCP 和 routeback 选项。 - loc 区域与
eth1
接口相关联,并设置为可选。 - dmz 区域与
eth2
接口相关联,没有额外选项。 - eth3 接口服务于多个区域,因此在区域列中使用“-”。
接口(INTERFACE)
- 逻辑名称和端口
- 接口名称:指定接口的逻辑名称。每个接口在文件中只能列出一次。例如,您可以使用
eth0
、eth1
等。 - 端口:如果指定了端口,则接口必须之前定义为桥接接口(使用
bridge
选项)。在这种情况下,OPTIONS
列中不能包含一些特定的选项(见下文)。
- 虚拟接口
- 虚拟接口:您不能在此列中指定虚拟接口(例如,
eth0:0
)。虚拟接口的配置有特殊要求,请参考 Shorewall FAQ 了解更多信息。
- 通配符
- 通配符:可以使用通配符指定接口。例如,使用
ppp+
可以匹配所有 PPP 接口,如ppp0
、ppp1
、ppp2
等。 - 旧版本警告:在 Shorewall 版本 4.1.4 之前使用通配符时,如果还有其他区域使用了匹配的具体接口,可能会引发问题。有关此问题的讨论,请参见
shorewall-nesting(5)
。
+
作为接口名
- 废弃用法:Shorewall 允许使用
+
作为接口名称,但这种用法已被废弃。建议使用physical=+
选项代替(在OPTIONS
列中指定)。
- Loopback 接口
- Loopback 接口:无需在此文件中定义 loopback 接口(
lo
)。在 Shorewall 4.5.17 及之后的版本中,如果为lo
接口指定了区域,则该区域必须在shorewall6-zones(5)
中定义为local
类型。
- 不允许的选项(当指定了端口时)
如果在 INTERFACE
列中指定了端口,则以下选项不能出现在 OPTIONS
列中:
arp_filter
arp_ignore
bridge
log_martians
mss
optional
proxyarp
required
routefilter
sourceroute
upnp
wait
广播(BROADCAST)
- 值的选择
-
:表示不为BROADCAST
列提供值。如果在OPTIONS
列中需要配置值,可以在BROADCAST
列中使用-
。detect
:Shorewall 会自动检测广播地址(适用于 FORMAT 1)。这要求您的 iptables 和内核支持地址类型匹配(Address Type Match)。如果您选择这个选项,Shorewall 将尝试自动识别和配置广播地址。address[,address]...
:指定一个或多个广播地址。您可以使用逗号分隔的地址列表来列出多个广播地址。如果接口有多个子网和地址,则应列出这些地址。如果接口是点对点(P-T-P),则此列应留空。
- 使用场景
- FORMAT 1(已弃用):在此格式下,您需要提供广播地址。FORMAT 1 中的
BROADCAST
列允许指定广播地址或使用detect
选项。 - FORMAT 2(当前推荐):此格式省略了
BROADCAST
列,广播地址的配置不再需要明确列出。
选项(OPTIONS)
- 常见选项
accept_ra[={0|1|2}]
IPv6 专用。控制是否接受路由器通告(Router Advertisements)。如果未指定值,默认为1
。(0:不接受,1:如果转发被禁用,则接受路由通告。2:否决转发行为。 即使启用了转发,也接受路由通告)注意:此选项不适用于通配符物理名称(例如,eth0.+)。 从 Shorewall 5.1.10 开始,如果指定此选项,则会发出警告并忽略该选项。arp_filter[={0|1}]
IPv4 专用。指定是否只响应 ARP 请求的目标 IP 地址配置在接口上。arp_ignore[=number]
IPv4 专用。指定如何响应 ARP 请求。number
取值范围从1
到8
,控制对 ARP 请求的响应策略。1
2
3
4
5
6
7
8
9
10
11
121 - 仅在目标 IP 地址是本地地址且配置在传入接口上时才回复
2 - 仅在目标 IP 地址是本地地址且配置在传入接口上,并且发送者的 IP 地址来自相同子网时才回复
3 - 不回复具有主机作用域的本地地址,仅对全局和链路的解析进行回复
4-7 - 保留
8 - 不对所有本地地址进行回复
警告:
不要为涉及代理 ARP 的任何接口指定 arp_ignore。blacklist
检查到达此接口的包是否在shorewall-blacklist
文件中。对于多区域接口,该选项会被忽略并发出警告。WARNING: The 'blacklist' option is ignored on multi-zone interfaces
bridge
指定接口作为桥接接口。设置bridge
选项同时也会设置routeback
。dbl={none|src|dst|src-dst}
定义是否应用动态黑名单,及其比较的 IP 地址。动态黑名单适用于进出防火墙的包。1
2
3
4
5
6
7
8
9
10自 Shorewall 5.0.10 起。此选项定义是否对通过该接口进入防火墙的数据包应用动态黑名单,以及是否要将源地址和/或目的地址与基于 ipset 的动态黑名单(DYNAMIC_BLACKLIST=ipset... 在 shorewall.conf(5) 中)进行比较。默认值由 DYNAMIC_BLACKLIST 的设置确定:
DYNAMIC_BLACKLIST=No
默认值为 none(例如,不进行动态黑名单检查)。
DYNAMIC_BLACKLIST=Yes
默认值为 src(例如,源 IP 地址进行检查)。
DYNAMIC_BLACKLIST=ipset[-only]
默认值为 src。
DYNAMIC_BLACKLIST=ipset[-only],src-dst...
默认值为 src-dst(例如,输入的数据包中的源 IP 地址与 ipset 进行检查,而离开防火墙并通过该接口的数据包中的目的 IP 地址与 ipset 进行检查)。
对于内部接口,正常设置为 dst 或 none,对于面向互联网的接口,正常设置为 src 或 src-dst。destonly
指示编译器忽略处理来自此接口的流量的规则。dhcp
允许 DHCP 数据包通过接口。适用于通过 DHCP 获取 IP 地址的接口或运行 DHCP 服务器的接口。1
2
3
4
5
6
7当以下任何情况成立时,指定此选项:
接口通过 DHCP 获取其 IP 地址
接口用于运行在防火墙上的 DHCP 服务器
接口具有静态 IP,但在具有大量 DHCP 客户端的 LAN 段上。
接口是一个简单的桥接,其中一个端口有一个 DHCP 服务器,另一个端口有 DHCP 客户端。
注意
如果您使用 Shorewall-perl 进行防火墙/桥接,则需要在 shorewall-rules(5) 中包含 DHCP 特定规则。DHCP 使用 UDP 端口 67 和 68。此选项允许 DHCP 数据报进出接口。
forward[={0|1}]
IPv6 专用。设置接口的 IPv6 转发选项。未指定值时默认为1
。ignore[=1]
忽略来自 Shorewall-init 的上/下事件,免除 hairpin 过滤。当指定时,会使生成的脚本忽略来自 Shorewall-init 的此设备的 up/down 事件。此外,该选项使接口免于环回过滤。省略 ‘=1’ 时,ZONE 列必须包含 ‘-‘,并且 ignore 必须是唯一的选项。loopback
指定接口为回环接口(lo
)。只有一个接口可以指定为回环接口。logmartians[={0|1}]
IPv4 专用。启用内核的 Martian 日志记录,记录不可能的源地址的包。1
2
3仅适用于 IPv4。启用内核 martian 日志记录(记录具有不可能源地址的数据包)。强烈建议如果您在接口上设置了 routefilter,也设置 logmartians。即使您不指定 routefilter 选项,指定 logmartians 也是个好主意,因为您的发行版可能在您不知道的情况下启用了路由过滤。
只有那些具有 logmartians 选项的接口将更改其设置;指定的值(如果有)将被应用,或者如果没有指定值,则默认为 1。maclist
将来自此接口的连接请求与shorewall-maclist
文件进行比较。接口必须是以太网 NIC,并在 Shorewall 启动之前处于启用状态。来自该接口的连接请求与 shorewall-maclist(5) 文件中的内容进行比较。如果指定了这个选项,接口必须是以太网 NIC,并且必须在 Shorewall 启动之前处于启用状态。mss=number
设置 TCP SYN 包的 MSS 字段为指定值。nets=(net[,...])
限制区域仅限于列出的网络。可以支持多播流量。将 ZONE 列中指定的区域限制为仅列出的网络。如果只有一个网络,则可以省略括号(例如,nets=192.168.1.0/24)。区域支持有限广播。自 Shorewall 4.4.1 起,也支持对区域的多播流量。nets=dynamic
将区域定义为动态。需要 ipset 匹配支持在您的 iptables 和内核中。有关更多信息,请参见 Dynamic。
nodbl
禁用动态黑名单。与dbl=none
等效。nosmurfs
IPv4 专用。过滤源地址为广播地址的 smurf 包。1
仅适用于 IPv4。过滤 smurf 数据包(源地址为广播地址的数据包)。Smurf 数据包将根据源地址的子网和目标地址的广播地址进行过滤。
omitanycast
IPv6 专用。抑制对 IPv6 anycast 地址的规则生成和处理。optional
指示即使接口不可用,防火墙也应启动。允许使用启用和禁用命令。自 Shorewall 4.5.0 起。当接口不可用时,防火墙应该启动。如果使用这个选项,您必须确保接口可以启动并且在防火墙启动之前处于可用状态。optional
不能与required
一起使用。physical=name
指定接口或端口名称的实际物理名称。这对于在多个桥接中使用相同的通配符端口名称时很有用。proxyarp[={0|1}]
IPv4 专用。设置接口的 Proxy ARP 选项。proxyndp[={0|1}]
IPv6 专用。设置接口的 Proxy NDP 选项。required
如果设置,则防火墙将在接口不可用时启动失败。不能与optional
一起使用。routeback[={0|1}]
指示 Shorewall 包括允许通过该接口返回流量的规则。routefilter[={0|1|2}]
IPv4 专用。启用内核路由过滤(防伪造措施)。1
2
3自 Shorewall 4.4.0 起。仅适用于 IPv4。启用内核路由过滤。默认为 1。如果设置为 2,进一步指定 rpfilter 选项。
1 - 仅对接口上配置的 IP 地址和路由表中的条目进行检查。
2 - 与 1 相同,但包括其他所有检查,包括来自相同接口的流量。rpfilter
更高效的防伪造措施,适用于多 ISP 配置。sfilter=(net[,...])
作为routefilter
的替代,提供反欺骗保护。自 Shorewall 5.0.5 起。仅适用于 IPv4。作为routefilter
选项的替代。提供对防伪造保护的增强设置。如果指定的网络匹配,流量将被允许。否则,它会被丢弃。可以指定多个网络。sourceroute[={0|1}]
控制是否接受源路由包。通常不建议启用,因为可能存在安全风险。tcpflags[={0|1}]
检查包中的 TCP 标志组合是否合法。1
为默认设置,表示启用检查。unmanaged
使所有流量在防火墙和接口之间被接受。只允许与unmanaged
配合使用的选项。自 Shorewall 4.4.0 起。如果指定,所有流量都将被接受,无论是进入还是离开防火墙。此选项仅与unmanaged
配合使用的选项一起使用。upnp
允许来自接口的请求通过 UPNP 进行映射。upnpclient
允许 Shorewall 通过 UPNP 客户端应用程序检测默认网关并接受 UDP 数据包。wait=seconds
设置脚本在接口变为可用之前的等待时间(秒)。
案例解析:
IPv4 示例 1
假设你有如下网络配置:
eth0
连接到 DSL 调制解调器。eth1
连接到你的本地网络,本地子网为192.168.1.0/24
。eth2
用于 DMZ,DMZ 子网为192.168.2.0/24
。- 接口通过 DHCP 从
206.191.149.192/27
子网获取 IP 地址。 - 你的
iptables
和/或内核不支持 “地址类型匹配”,你更愿意显式指定广播地址,而不是让 Shorewall 自动检测。
配置:
FORMAT 1:
1 | #ZONE INTERFACE BROADCAST OPTIONS |
示例 2
相同配置,但不指定广播地址:
FORMAT 2:
1 | #ZONE INTERFACE OPTIONS |
示例 3
你有一个简单的拨号系统,没有以太网连接。
FORMAT 2:
1 | #ZONE INTERFACE OPTIONS |
示例 4 (Shorewall 4.4.9 及以后版本)
你有一个没有 IP 地址的桥接设备,并且你想允许流量通过桥接设备。
FORMAT 2:
1 | #ZONE INTERFACE OPTIONS |
解释
FORMAT 1: 这种格式需要显式指定广播地址。适用于需要手动设置广播地址的环境,通常在老旧系统或不支持自动检测的环境中使用。
FORMAT 2: 这种格式省略了广播地址的指定,适用于较新版本的 Shorewall,能够自动处理广播地址的环境。
拨号系统: 对于拨号连接(如 PPP 接口),可以用
-
代替广播地址。桥接设备: 在配置没有 IP 地址的桥接设备时,使用
bridge
选项来指定该接口为桥接设备。
Universal示例
1 | # |
三接口示例
1 | # |
/etc/shorewall/policy
功能: policy
文件用于定义默认的策略。它确定了默认情况下防火墙如何处理流量,通常是那些没有被 rules
文件中的具体规则所处理的流量。换句话说,policy
文件定义了“默认行为”,即当没有匹配到特定规则时,防火墙应采取的行动。
内容: 策略通常包括源区域、目的区域以及默认行为(如 ACCEPT、DROP、REJECT)。你可以设置不同区域之间的默认流量处理方式。
描述
这个文件定义了在 shorewall-zones(5)
中定义的区域之间的高层次连接策略。
重要
文件中的条目顺序很重要
这个文件决定了如果在 shorewall-blrules(5)
或 shorewall-rules(5)
文件中没有匹配到新连接请求时该如何处理。对于每一对源/目的地,文件按顺序处理,直到找到匹配项(”all” 将匹配任何源或目的地)。
重要
区域间的策略是预定义的
对于 $FW
和 shorewall-zones(5)
中定义的所有区域,从一个区域到自身的连接策略默认为 ACCEPT(没有日志记录或 TCP 连接速率限制),但可以被此文件中的条目覆盖。覆盖条目必须是明确的(在 SOURCE 和 DEST 中指定区域名称)或使用 “all+”(Shorewall 4.5.17 或更高版本)。
类似地,如果 shorewall.conf(5)
中的 IMPLICIT_CONTINUE=Yes
,那么对任何子区域的隐式策略是 CONTINUE。这些隐式的 CONTINUE 策略也可以被此文件中的显式条目覆盖。
文件中的列说明
SOURCE - zone[,…[+]]|$FW|all[+][!ezone[,…]]
源区域。必须是
shorewall-zones(5)
中定义的区域名称、$FW
、”all” 或 “all+”。Shorewall 4.5.17 版本增加了对 “all+” 的支持。”all” 不会覆盖隐式的区域内 ACCEPT 策略,而 “all+” 会。
从 Shorewall 5.0.12 开始,可以列出多个区域,以逗号分隔。如上所述,如果在两个或更多区域名称后指定了 ‘+’,那么如果相同的区域出现在 SOURCE 和 DEST 列中,则该策略会覆盖隐式的区域内 ACCEPT 策略。
从 Shorewall 5.2.3 开始,”all” 或 “all+” 后可以跟随以 “!” 开头的排除区域的逗号分隔列表。
DEST - zone[,…[+]]|$FW|all[+][!ezone[,…]]
目标区域。必须是
shorewall-zones(5)
中定义的区域名称、$FW
、”all” 或 “all+”。如果 DEST 是 bport 区域,则 SOURCE 必须是 “all”、”all+”、另一个与相同桥相关联的 bport 区域,或者是仅与同一桥相关联的 ipv4 区域。Shorewall 4.5.17 版本增加了对 “all+” 的支持。”all” 不会覆盖隐式的区域内 ACCEPT 策略,而 “all+” 会。
从 Shorewall 5.0.12 开始,可以列出多个区域,以逗号分隔。如上所述,如果在两个或更多区域名称后指定了 ‘+’,那么如果相同的区域出现在 SOURCE 和 DEST 列中,则该策略会覆盖隐式的区域内 ACCEPT 策略。
从 Shorewall 5.2.3 开始,”all” 或 “all+” 后可以跟随以 “!” 开头的排除区域的逗号分隔列表。
政策 (POLICY) - {ACCEPT|DROP|REJECT|BLACKLIST|CONTINUE|QUEUE|NFQUEUE[([queuenumber1[:queuenumber2[c]][,bypass]]|bypass)]|NONE}[:{[+]policy-action[:level][,...]|None}]
没有从规则文件中找到匹配项时的处理策略。
如果策略既不是
CONTINUE
也不是NONE
,则可以跟随 “:” 和以下其中之一:“None” 或 “none”。这会导致此策略省略在
shorewall.conf(5)
中定义的任何默认操作。一个操作名称,可以带有可选的参数括在括号中。操作将在策略执行之前被调用。
操作可以指定参数。
从 Shorewall 4.5.10 开始,操作名称可以后跟可选的冒号和日志级别。级别将应用于操作或规则体中没有日志级别的每条规则。
从 Shorewall 5.1.2 开始,可以列出多个
action[:level]
规范,用逗号分隔。操作按列出的顺序调用。从 Shorewall 5.1.2 开始,policy-action
列表可以用加号 (“+”) 前缀,表示列出的操作是附加于shorewall.conf(5)
中相关的_DEFAULT
设置的。
可能的策略包括:
ACCEPT:接受连接。
DROP:忽略连接请求。
REJECT:对于 TCP,发送 RST;对于其他协议,发送 “不可达” ICMP。
BLACKLIST:从 Shorewall 5.1.1 开始,要求
shorewall.conf(5)
中的DYNAMIC_BLACKLIST
设置指定基于 ipset 的动态黑名单。源 IP 地址将添加到黑名单 ipset 中,连接请求被忽略。QUEUE:将请求排队以供用户空间应用程序(如 Snort-inline)处理。
NFQUEUE:将请求排队以供用户空间应用程序使用 nfnetlink_queue 机制处理。如果没有给定
queuenumber1
,则默认使用队列零 (0)。从 Shorewall 4.6.10 开始,可以给定第二个队列号 (queuenumber2
)。这指定了一系列要使用的队列。数据包在这些队列之间进行负载均衡。这对多核系统很有用:在队列 x、x+1、.. x+n 上启动多个用户空间程序,并使用 “x:x+n”。属于同一连接的数据包被放入相同的 nfqueue。从 Shorewall 5.1.0 开始,queuenumber2
后可以跟随字母 ‘c’,表示将使用 CPU ID 作为索引来将数据包映射到队列。这可以改善性能,如果每个 CPU 有一个队列。需要在内核和 iptables 中启用 NFQUEUE CPU Fanout 功能。- 从 Shorewall 4.6.10 开始,可以给定关键字
bypass
。默认情况下,如果没有用户空间程序监听 NFQUEUE,则所有要排队的数据包都会被丢弃。当使用此选项时,NFQUEUE 规则表现得像 ACCEPT。
- 从 Shorewall 4.6.10 开始,可以给定关键字
CONTINUE:将连接请求传递过任何其他可能匹配的规则(这些规则中的源或目标区域是此策略中的 SOURCE 或 DEST 的超集)。有关更多信息,请参阅
shorewall-nesting(5)
。NONE:假设 SOURCE 到 DEST 永远不会有数据包。Shorewall 将不会创建处理这些数据包的基础设施,你在
/etc/shorewall/rules
文件中可能没有任何使用此 SOURCE 和 DEST 的规则。如果收到这样的数据包,结果是未定义的。如果 SOURCE 或 DEST 列中包含防火墙区域($FW
)或 “all”,则不能使用 NONE。
日志级别 (LOGLEVEL) - [log-level|ULOG|NFLOG]
可选的 - 如果提供,则每个在默认 POLICY 下处理的连接将记录在该级别。如果未提供,则不会生成日志消息。有关日志级别的描述,请参阅
syslog.conf(5)
。你还可以指定 ULOG 或 NFLOG(必须大写)。这将记录到 ULOG 或 NFLOG 目标,并通过使用 ulogd 发送到单独的日志 (http://www.netfilter.org/projects/ulogd/index.html)。
有关日志记录的描述,请参阅
shorewall-logging(5)
。如果不想记录但需要指定以下列,请在此处填写 “-“。
速率 (RATE) - [-|limit]
limit
是以下之一:[-|[{s|d}[/vlsm]:[[name][(ht-buckets,ht-max)]:]]]rate/{sec|min|hour|day}[:burst]
[name1:]rate1/{sec|min|hour|day}[:burst1],[name2:]rate2/{sec|min|hour|day}[:burst2]
如果传递,指定每秒的最大 TCP 连接速率和可接受的突发大小。如果未指定,则不限制 TCP 连接。如果省略了突发参数,则假设值为 5。
当指定
s:
或d:
时,速率适用于每个源 IP 地址或每个目标 IP 地址。名称可以由用户选择,并指定一个哈希表,用于计算匹配连接。如果未给出,则假设名称为 shorewall。对于指定相同名称的多个 POLICY 或规则,策略的连接计数将汇总,并且各自的速率适用于汇总计数。从 Shorewall 5.2.1 开始,s
或d
可以后跟一个斜杠 (“/) 和一个整数 vlsm。当指定了 vlsm 时,所有遇到的源或目标地址将根据给定的前缀长度进行分组,所创建的子网将受到速率限制。从 Shorewall 4.6.5 开始,可以指定两个限制,用逗号分隔。在这种情况下,第一个限制 (name1, rate1, burst1) 指定每个源 IP 限制,第二个限制指定每个目标 IP 限制。
- 示例:
client:10/sec:20,:60/sec:100
- 示例:
从 Shorewall 5.2.1 开始,如果有表名,则表名后可以跟随两个整数,用逗号分隔并括在括号中。第一个整数 (ht-buckets) 指定生成的哈希表中的桶数。第二个整数 (ht-max) 指定哈希表中的最大条目数。
- 示例:
s:client(1024,65536):10/sec
- 示例:
连接限制 (CONNLIMIT) - limit[:mask]
- 可以用来限制每个主机的同时连接数,以限制连接数。虽然该限制仅检查可能适用此策略的连接,但当前连接的数量是计算所有来自 SOURCE 主机的连接数。默认情况下,限制适用于每个主机,但可以通过指定掩码来使其适用于主机网络。掩码指定要应用于源地址的 VLSM 掩码宽度;然后当前连接数将在子网
source-address/mask
中的所有主机上进行计算。
示例
允许从本地网络到互联网的所有连接
忽略来自互联网的所有连接,但在 syslog 级别 KERNEL.INFO 记录这些连接
拒绝所有其他连接请求,并在级别 KERNEL.INFO 记录这些请求
1 | #SOURCE DEST POLICY LOG BURST:LIMIT |
解释:
loc
到net
的连接被接受 (ACCEPT
)。即所有来自本地网络 (loc
) 的连接可以访问互联网 (net
)。net
到all
的连接被丢弃 (DROP
),并在日志中记录为info
级别。这表示来自互联网 (net
) 的连接请求将被忽略,但会以info
级别记录到 syslog。最后的规则处理所有其他连接请求:
all
到all
的连接请求将被拒绝 (REJECT
),并以info
级别记录。这确保了任何不符合前面规则的连接请求将被拒绝,并记录到日志中。
Universal示例
1 | # |
三接口示例
1 | # |
/etc/shorewall/rules
功能: rules
文件用于定义具体的流量规则。这些规则决定了如何处理进入和离开防火墙的流量。你可以在这个文件中指定哪些流量允许通过,哪些流量被阻止或拒绝。
内容: 规则通常包括源地址、目的地址、协议、端口号等信息。例如,你可以设置规则来允许从特定 IP 地址访问特定端口,或者阻止来自某个子网的所有流量。
描述
此文件中的条目通过定义对 shorewall-policy(5)
中规定的策略的例外来管理连接的建立。默认情况下,使用连接跟踪会自动允许后续的请求和响应。对于特定的(源,目的地)区域对,规则按它们在文件中的出现顺序进行评估,第一个终止匹配的规则决定请求的处理方式。所有规则都是终止规则,除了 LOG
和 COUNT
规则。
警告
如果你从本地系统到互联网使用了伪装或源地址转换(SNAT),你不能使用 ACCEPT
规则来允许来自互联网的流量进入该系统。你必须使用 DNAT
规则。
文件结构
规则文件被分成多个部分。每个部分由“部分头”引入,部分头是一行以 ?SECTION
开头,后面跟着部分名称。
部分列表(按照列出的顺序出现):
- 默认策略
- 例外规则
- 日志规则
- 计数规则
每个部分的具体内容如下:
- 默认策略:定义基本的处理策略,适用于所有未被其他规则覆盖的连接。
- 例外规则:定义对默认策略的例外情况。
- 日志规则:定义用于记录连接尝试的规则。
- 计数规则:定义用于计数和限制连接的规则。
规则文件的结构
?SECTION
规则文件被分成多个部分,每个部分由“部分头”引入,部分头是一行以 ?SECTION
开头,后面跟着部分名称。部分的顺序非常重要,必须按照以下列出的顺序出现:
ALL
- 此部分在 Shorewall 4.4.23 中添加。该部分中的规则将被应用于所有连接请求,无论数据包的连接跟踪状态如何,并且在其他部分的规则之前应用。
ESTABLISHED
- 处理处于 ESTABLISHED 状态的数据包的规则。
- 该部分中允许的操作(ACTION)包括 ACCEPT、DROP、REJECT、LOG、NFLOG、NFQUEUE 和 QUEUE。
- 此部分的末尾会隐式添加一个 ACCEPT 规则。
RELATED
- 处理处于 RELATED 状态的数据包的规则。
- 该部分中允许的操作(ACTION)包括 ACCEPT、DROP、REJECT、LOG、NFLOG、NFQUEUE 和 QUEUE。
- 此部分的末尾会隐式添加一个规则,该规则调用
RELATED_DISPOSITION
(参见shorewall.conf(5)
)。
INVALID
- 在 Shorewall 4.5.13 中添加。处理处于 INVALID 状态的数据包的规则。
- 该部分中允许的操作(ACTION)包括 ACCEPT、DROP、REJECT、LOG、NFLOG、NFQUEUE 和 QUEUE。
- 此部分的末尾会隐式添加一个规则,该规则调用
INVALID_DISPOSITION
(参见shorewall.conf(5)
)。
UNTRACKED
- 在 Shorewall 4.5.13 中添加。处理处于 UNTRACKED 状态的数据包的规则。
- 该部分中允许的操作(ACTION)包括 ACCEPT、DROP、REJECT、LOG、NFLOG、NFQUEUE 和 QUEUE。
- 此部分的末尾会隐式添加一个规则,该规则调用
UNTRACKED_DISPOSITION
(参见shorewall.conf(5)
)。
NEW
- 处理处于 NEW 状态的数据包的规则。如果 INVALID 和/或 UNTRACKED 部分为空或未包含,则对应状态的数据包也会在此部分中处理。
- 注意:如果你对 Netfilter 的各种连接跟踪状态不够熟悉,建议将所有规则放在 NEW 部分(即在
?SECTION NEW
行之后)。
注意事项
如果你在
shorewall.conf(5)
中指定了FASTACCEPT=Yes
,则 ALL、ESTABLISHED 和 RELATED 部分必须为空。例外情况是,如果你运行的是 Shorewall 4.4.27 或更高版本,并且你为
RELATED_DISPOSITION
或RELATED_LOG_LEVEL
指定了非默认值,则可以在 RELATED 部分中包含规则。你可以省略任何不需要的部分。如果文件中没有出现任何部分头,则所有规则将被视为在 NEW 部分中。
规则定义注意事项
在定义重写目标 IP 地址和/或端口号的规则(即 DNAT 和 REDIRECT 规则)时,重要的是要区分文件中哪些列指定了重写前的数据包特征,哪些列指定了重写后的数据包特征:
- DEST 列 指定了重写后数据包的最终目标,可以包括最终的 IP 地址和/或端口号。
- 其余列指定了重写前数据包的特征。特别是,ORIGDEST 列 给出了数据包的原始目标 IP 地址,DPORT 列 给出了原始目标端口。
这是文件中的列说明(其中列名后跟一个不同的名称,括号中的不同名称用于备用规格语法):
ACTION - target[:{log-level|none}[!][:tag]]
以下是对匹配规则的连接请求采取的操作。target 必须是以下之一。
ACCEPT:允许连接请求。
ACCEPT+:类似于 ACCEPT,但还排除了该连接在后续匹配的任何 DNAT[-] 或 REDIRECT[-] 规则。使用 IPv6 需要 Shorewall 4.5.14 或更高版本。
ACCEPT!:类似于 ACCEPT,但规则在 shorewall.conf(5) 中通过 OPTIMIZE=1 设置时,不会被抑制。
action
在[ shorewall-actions(5) ](https://shorewall.org/manpages/shorewall-actions.html或 /usr/share/shorewall[6]/actions.std 中声明的操作名称。
ADD(*
ipset
*:*flags
*[:*timeout
*])在 Shorewall 4.4.12 中添加。使地址和/或端口号添加到指定的 ipset 中。标志指定要添加到集合中的地址或元组,必须与所涉及的 ipset 类型匹配。例如,对于 iphash ipset,可以使用 src 或 dst 标志分别添加源地址或目标地址(请参见 ipset (8) 中的 -A 命令)。
从 Shorewall 5.0.3 开始,可以指定一个可选的超时。这是 ipset 中新条目保持有效的秒数,覆盖创建 ipset 时指定的任何超时。
ADD 是非终止的。即使数据包匹配规则,也会传递到下一个规则。AUDIT[(accept|drop|reject)]:在 Shorewall 4.5.10 中添加。按指定类型审核数据包;如果省略类型,则假定为 drop。需要内核和 iptables 中的 AUDIT_TARGET 支持。
A_ACCEPT, A_ACCEPT**+ and A_ACCEPT**!:在 Shorewall 4.4.20 中添加。分别是 ACCEPT、ACCEPT+ 和 ACCEPT! 的审计版本。需要内核和 iptables 中的 AUDIT_TARGET 支持。A_ACCEPT+ 使用 IPv6 需要 Shorewall 4.5.14 或更高版本。
A_DROP and A_DROP!:在 Shorewall 4.4.20 中添加。分别是 DROP 和 DROP! 的审计版本。需要内核和 iptables 中的 AUDIT_TARGET 支持。
A_REJECT AND A_REJECT!:在 Shorewall 4.4.20 中添加。分别是 REJECT 和 REJECT! 的审计版本。需要内核和 iptables 中的 AUDIT_TARGET 支持。
?COMMENT:该行的其余部分将作为注释附加到由以下条目生成的 Netfilter 规则中。在 “shorewall show
” 的输出中,注释将用 “/ … /“ 分隔。要阻止注释附加到后续规则,只需在单独一行中包含 ?COMMENT。 CONMARK({*
mark
*}):在 Shorewall 5.0.7 中添加,CONNMARK 与 MARK 相同,只不过标记的是连接而不是数据包。CONTINUE:仅适用于专家。不要处理此(源区域,目标区域)的任何后续规则。如果源和/或目标 IP 地址落入 shorewall-zones(5) 中稍后定义的区域或源或目标区域的父区域中,则该连接请求将传递给为该(些)区域定义的规则。有关更多信息,请参见 shorewall-nesting(5)。
CONTINUE!:类似于 CONTINUE,但该规则不会被 shorewall.conf(5) 中的 OPTIMIZE=1 抑制。
COUNT:仅增加规则的数据包和字节计数,然后将数据包传递到下一条规则。
DEL(*
ipset
*:*flags
*):在 Shorewall 4.4.12 中添加。从指定的 ipset 中删除一个条目。标志指定要从集合中删除的地址或元组,并且必须匹配涉及的 ipset 类型。例如,对于 iphash ipset,可以分别使用 src 或 dst 标志删除源或目标地址(参见 ipset(8) 中的 -D 命令)。DEL 是非终止的。即使数据包匹配规则,它也会传递到下一条规则。DNAT:将请求转发到另一系统(可选地到另一个端口)。使用 IPv6 需要 Shorewall 4.5.14 或更高版本。
DNAT-:仅限高级用户。类似于 DNAT,但只生成 DNAT iptables 规则,而不生成伴随的 ACCEPT 规则。使用 IPv6 需要 Shorewall 4.5.14 或更高版本。
DROP:忽略请求。
DROP!:类似于 DROP,但该规则不会被 shorewall.conf(5) 中的 OPTIMIZE=1 抑制。
HELPER:在 Shorewall 4.5.7 中添加。该操作要求 HELPER 列包含要与匹配此连接的连接关联的 Netfilter 帮助程序的名称。只能在 NEW 部分中指定,并且在适用的策略为 ACCEPT 时非常有用。在 HELPER 规则中不应指定目标区域。
INLINE[(
action
)]:在 Shorewall 4.5.16 中添加。此操作允许您使用 iptables 语法自行构建大部分规则。您指定的部分必须跟随两个分号(’;;’),并且完全是自由格式的。如果规则的目标(即 ‘j’ 后面的部分)是 Shorewall 在 ACTION 列中支持的内容,则可以将其括在括号中(例如,INLINE(ACCEPT))。否则,您可以在分号后包含它。在这种情况下,您必须将目标声明为 shorewall-actions(5) 中的内置操作。
使用 INLINE 时需要注意的一些事项:
- p、s、d、i、o、policy 和 state 匹配(state 或 conntrack —ctstate)匹配将始终出现在规则的前面,顺序如上所述。
- 当指定多个匹配项时,编译器将按出现的顺序保留它们(不包括上述列出的匹配项),但它们不一定会出现在生成规则的末尾。例如,如果在 SOURCE 和/或 DEST 列中指定了地址,它们生成的匹配项将出现在使用 ‘;;’ 或 ‘;’ 指定的匹配项之后。
IPTABLES({
iptables-target
[option
…]):仅限 IPv4。此操作允许您指定一个带选项的 iptables 目标(例如,’IPTABLES(MARK —set-xmark 0x01/0xff)’)。如果 iptables-target 不是 Shorewall 识别的目标,将会出现以下错误消息:
ERROR: Unknown target (iptables-target)
如果您将 iptables-target 添加为 shorewall-actions(5) 中的内置操作,则可以消除此错误消息。
重要
如果您将 REJECT 作为 iptables-target,则规则的目标将是 iptables 的 REJECT 目标,而不是 Shorewall 内置的 ‘reject’ 链,后者在 ACTION 列中指定 REJECT 时使用。
IP6TABLES({
ip6tables-target
[option
…]):仅限 IPv4。此操作允许您指定一个带选项的 iptables 目标(例如,’IPTABLES(MARK —set-xmark 0x01/0xff)’)。如果 iptables-target 不是 Shorewall 识别的目标,将会出现以下错误消息:
ERROR: Unknown target (iptables-target)
如果您将 iptables-target 添加为 shorewall-actions(5) 中的内置操作,则可以消除此错误消息。
重要
如果您将 REJECT 作为 iptables-target,则规则的目标将是 iptables 的 REJECT 目标,而不是 Shorewall 内置的 ‘reject’ 链,后者在 ACTION 列中指定 REJECT 时使用。
LOG:*
level
*:仅记录数据包并继续处理下一个规则。macro**[(*
macrotarget
*)]**指定在名为
macro.macro
的文件中定义的宏。如果宏接受一个操作参数(查看宏源代码以确定其 TARGET 列中是否有 PARAM),则宏名称后跟带括号的 macrotarget(ACCEPT、DROP、REJECT 等),作为参数的替代。示例:FTP(ACCEPT)。
以前的语法,其中宏名称和目标通过斜杠分隔(例如,FTP/ACCEPT),仍然允许使用,但已被弃用。
MARK({*
mark
*}):指定一个数据包标记值。
在 Shorewall 5.0.7 中添加,MARK 需要内核和 iptables 中的 “Mark in filter table” 支持。
通常会设置当前数据包的标记值。如果前面有一个竖线 (“|”),则标记值将与当前标记值进行逻辑 OR 运算以产生新的标记值。如果前面有一个&符号 (“&”),则将与当前标记值进行逻辑 AND 运算以产生新的标记值。
“|” 和 “&” 都需要内核和 iptables 中的 Extended MARK Target 支持。
标记值后面可以选择性地跟一个 “/“ 和一个掩码值(用于确定实际设置的连接标记位)。当指定掩码时,将标记值与掩码进行逻辑 AND 运算的结果必须与标记值相同。
NFLOG[(
nflog-parameters
)]:在 Shorewall 4.5.9.3 中添加。通过 netlink 套接字将匹配的数据包队列到后台日志守护进程,然后继续处理下一个规则。有关更多信息,请参见 Shorewall Logging。
nflog-parameters 是一个由最多 3 个数字组成的逗号分隔列表:
- 第一个数字指定 netlink 组(0-65535)。如果省略(例如,NFLOG(,0,10)),则假设为 0。
- 第二个数字指定要复制的最大字节数。如果省略,则假设为 0(没有限制)。
- 第三个数字指定应在内核中缓冲的日志消息数量,然后再发送到用户空间。默认值为 1。
NFLOG 类似于 LOG:NFLOG[(nflog-parameters)],但当在动作或宏体中使用此 ACTION 时,日志级别不会改变,而调用该动作或宏时指定了日志级别。
NFQUEUE[([queuenumber1[:queuenumber2[c]][,bypass]]|bypass)]:
使用 nfnetlink_queue 机制将数据包排队到用户空间应用程序。如果未指定 queuenumber1,则默认为队列零(0)。从 Shorewall 4.6.10 开始,可以使用关键字 bypass。如果没有用户空间程序监听 NFQUEUE,默认情况下所有要排队的数据包都会被丢弃。当使用此选项时,NFQUEUE 规则的行为类似于 ACCEPT。还可以从 Shorewall 4.6.10 开始指定第二个队列号(queuenumber2)。这指定了要使用的队列范围。数据包将在指定的队列中进行负载均衡。这对于多核系统非常有用:在队列 x、x+1、… x+n 上启动多个用户空间程序实例,并使用 “x:x+n”。属于同一连接的数据包将放入同一 nfqueue 中。
从 Shorewall 5.1.0 开始,queuenumber2 后面可以跟随字母 ‘c’,表示将使用 CPU ID 作为索引来将数据包映射到队列中。这样可以提高性能,如果每个 CPU 都有一个队列。需要内核和 iptables 中的 NFQUEUE CPU Fanout 功能。
NFQUEUE![([queuenumber1[:queuenumber2[c]][,bypass]]|bypass)]:与 NFQUEUE 类似,但排除了规则被
shorewall.conf
中的OPTIMIZE=1
配置抑制的情况。NONAT:将连接排除在任何后续的 DNAT[-] 或 REDIRECT[-] 规则之外,但不生成接收流量的规则。使用 IPv6 时需要 Shorewall 4.5.14 或更高版本。
QUEUE:将数据包排队到用户空间应用程序(例如 ftwall)。应用程序可以重新插入数据包以进行进一步处理。
QUEUE!:类似于 QUEUE,但免于被 shorewall.conf(5) 中的 OPTIMIZE=1 设置抑制。
REJECT[(*
option
*)]:拒绝请求并返回一个 icmp-unreachable 或 RST 数据包。如果没有传递选项,Shorewall 将根据数据包的协议选择适当的选项。
从 Shorewall 5.0.8 开始,可以在选项参数中指定拒绝的类型。有效的 IPv4 选项值包括:
- icmp-net-unreachable
- icmp-host-unreachable
- icmp-port-unreachable
- icmp-proto-unreachable
- icmp-net-prohibited
- icmp-host-prohibited
- icmp-admin-prohibited
- icmp-tcp-reset(PROTO 列必须指定 TCP)。从 Shorewall 5.1.3 开始,也可以指定为 tcp-reset。
有效的 IPv6 选项值包括:
- icmp6-no-route
- no-route
- icmp6-adm-prohibited
- adm-prohibited
- icmp6-addr-unreachable
- addr-unreach
- icmp6-port-unreachable
- tcp-reset(PROTO 列必须指定 TCP)
REJECT!:类似于 REJECT,但免于被 shorewall.conf(5) 中的 OPTIMIZE=1 设置抑制。
REDIRECT:将请求重定向到运行在防火墙上的服务器。使用 IPv6 时需要 Shorewall 4.5.14 或更高版本。
REDIRECT-:高级用户专用。类似于 REDIRECT,但仅生成 REDIRECT iptables 规则,而不生成伴随的 ACCEPT 规则。使用 IPv6 时需要 Shorewall 4.5.14 或更高版本。
TARPIT [(tarpit | honeypot | reset)]:
从 Shorewall 4.6.6 开始添加。
TARPIT 捕获并保持传入的 TCP 连接而不使用本地每连接资源。
TARPIT 仅在 PROTO 列设置为 TCP (6) 时有效,并且对应用程序是完全无关的。此模块会响应 TCP 请求并像监听服务器一样进行交互,但除了发送 ACK 或 RST 之外,不会发送数据。传入的数据包会被忽略和丢弃。攻击者最终会终止会话。此模块允许将攻击的初始数据包捕获供其他软件检查。在大多数情况下,这足以确定攻击的性质。
这提供了类似 LaBrea 的功能,但不需要专用的硬件或 IP。任何通常会 DROP 或 REJECT 的 TCP 端口都可以转而成为 tarpit。
目标接受一个可选参数:
tarpit
这是默认模式,完成与攻击者的连接,但将窗口大小限制为 0,从而使攻击者等待很长时间。虽然他在保持连接状态并尝试继续每 60-240 秒时,我们保持状态轻量。尝试关闭连接会被忽略,迫使远程方在 12-24 分钟内超时连接。
honeypot
这种模式与攻击者完成连接,但信号正常的窗口大小,以便远程方尝试发送数据,通常带有一些非常恶意的攻击尝试。我们可以捕获这些数据包以进行解码和进一步分析。该模块不发送任何数据,因此,如果远程方期望应用程序级别的响应,则游戏结束。
reset
这种模式很方便,因为我们可以发送内联的 RST(重置)。没有其他功能。
ULOG[(
ulog-parameters
)]:仅支持 IPv4。从 Shorewall 4.5.10 开始添加。将匹配的数据包排队到后端日志记录守护程序,通过 netlink 套接字,然后继续执行下一个规则。请参见 shorewall-logging(5)。
类似于 LOG:ULOG[(ulog-parameters)],只是当此 ACTION 用于动作或宏体时,日志级别不会更改,并且该动作或宏的调用指定了一个日志级别。
日志记录相关的动作说明:
目标可以选择性地跟随 “:” 和 syslog 日志级别(例如,REJECT:info 或 Web(ACCEPT):debug)。这会将数据包记录到指定的级别。请注意,如果 ACTION 涉及目的网络地址转换(如 DNAT、REDIRECT 等),则数据包会在目标地址被重写之前进行记录。
如果 ACTION 指定了在
shorewall-actions(5)
或/usr/share/shorewall/actions.std
中声明的动作:- 如果日志级别后跟 “!”,则动作中的所有规则都以该日志级别记录。
- 如果日志级别后未跟 “!”,则仅记录那些未指定日志的动作规则。
特殊日志级别
none!
可以抑制动作的日志记录。你也可以指定 ULOG(仅限 IPv4)或 NFLOG(必须是大写)作为日志级别。这将把日志记录到 ULOG 或 NFLOG 目标,以通过 ulogd 进行路由(见
shorewall-logging(5)
)。指定日志记录的动作可以跟随一个日志标签(一个字母数字字符串),该标签会附加到由 LOGPREFIX(在
shorewall.conf(5)
中)生成的字符串的末尾。例如:
ACCEPT:info:ftp
将在由 LOGPREFIX 设置生成的日志前缀末尾添加 ‘ftp ‘。
SOURCE - source-spec[,…]
源主机的规则适用说明:
source-spec
是以下之一:
zone[,…[+]]
区域名称,定义在
shorewall-zones(5)
中。当仅指定区域名称时,数据包源可以是该区域中的任何主机。区域名称还可以是以下之一:
all[+]
“all” 表示“所有区域,包括防火墙区域”。通常,“all” 忽略区域内的流量,但可以通过指定“+”来包括区域内流量。
any[+]
“any” 在没有嵌套区域的情况下等同于“all”。当有嵌套区域时,“any” 仅指顶级区域(没有父区域的区域)。注意,“any” 排除了所有 vserver 区域,因为这些区域嵌套在防火墙区域内。
none
当在
SOURCE
或DEST
列中使用“none”时,规则将被忽略。类似于
all
和any
,在列出多个区域时,区域内流量通常会被排除。通过在列表末尾添加加号(“+”),可以包括区域内流量。all
和any
可以跟随感叹号(“!”)和逗号分隔的区域名称列表,以排除指定的区域。
zone:[!]interface
当使用这种形式时,
interface
必须是与命名区域相关联的接口名称,定义在shorewall-interfaces(5)
或shorewall-hosts(5)
中。仅从通过指定接口到达的区域内主机的包将匹配规则。从 Shorewall 5.2.1 开始,接口前可以加上“!”以匹配与区域相关联的所有接口,但排除指定的接口。
zone:address[,…]
其中
address
可以是:主机或网络 IP 地址。网络地址后可以跟随排除(见
shorewall-exclusion(5)
)。地址范围,使用低地址-高地址的语法指定。
+ipset,其中
ipset
是 ipset 的名称,前面必须加上加号(“+”)。Shorewall 格式的 MAC 地址(前面加上波浪号(“~”),并用短横线分隔十六进制字节值,例如“~00-0a-f6-04-9c-7d”)。
^country-code,其中
country-code
是两个字符的 ISO-3661 国家代码,前面加上插入符(“^”)。^country-code-list,其中
country-code-list
是最多 15 个 ISO-3661 国家代码的逗号分隔列表,括在方括号中(“[…]”)。防火墙接口的主要 IP 地址可以通过使用与
shorewall-interfaces(5)
中的 INTERFACE 列中的逻辑名称相同的接口名称,并在前面加上“&”符号来指定。
zone:interface:address[,…]
这种形式结合了前面的两个规则,要求数据包的来源接口和地址都必须匹配。
zone:exclusion
这种形式匹配源主机 IP 地址不匹配排除列表中的任何条目的数据包(见
shorewall-exclusion(5)
)。zone:interface:exclusion
这种形式匹配从指定接口进入的,源主机地址不匹配排除列表中的任何条目的数据包。
从 Shorewall 5.1.0 开始,可以列出多个 source-spec
,只要使用扩展形式的 source-spec
:
zone:(interface)
zone:(address[,…])
zone:(interface:address[,…])
zone:(exclusion)
zone:(interface:exclusion)
示例:
dmz:192.168.2.2
DMZ 区域中的主机 192.168.2.2
net:155.186.235.0/24
互联网中的子网 155.186.235.0/24
loc:192.168.1.1,192.168.1.2
本地区域中的主机 192.168.1.1 和 192.168.1.2
loc:~00-A0-C9-15-39-78
本地区域中 MAC 地址为 00:A0:C9:15:39:78 的主机
net:192.0.2.11-192.0.2.17
net 区域中的主机 192.0.2.11-192.0.2.17
net:!192.0.2.11-192.0.2.17
net 区域中除 192.0.2.11-192.0.2.17 外的所有主机
net:155.186.235.0/24!155.186.235.16/28
互联网中的子网 155.186.235.0/24 除了 155.186.235.16/28
$FW:ð0
防火墙区域中 eth0 的主要 IP 地址
loc,dmz
loc 和 dmz 区域中的主机
all!dmz
除了 dmz 区域的所有区域
all+!$FW
除了防火墙区域,并适用于区域内流量
net:^CN
中国
loc:(eth1:1.2.3.4,2.3.4.5),dmz:(eth2:5.6.7.8,9.10.11.12),net
当数据包通过 eth1 到达时,loc 区域中的主机 1.2.3.4 和 2.3.4.5;当数据包通过 eth2 到达时,dmz 区域中的主机 5.6.7.8 和 9.10.11.12;以及所有 net 区域中的主机。
dmz:[2002:ce7c:2b4:1::2]
DMZ 区域中的主机 2002:ce7c:2b4:1::2
net:2001:4d48:ad51:24::/64
互联网中的子网 2001:4d48:ad51:24::/64
loc:[2002:cec792b4:1::2],[2002:cec792b4:1::44]
本地区域中的主机 2002:cec792b4:1::2 和 2002:cec792b4:1::44
net:[2001:4d48:ad51:24::]/64![2001:4d48:ad51:24:6::]/80
互联网中的子网 2001:4d48:ad51:24::/64 除了 2001:4d48:ad51:24:6::/80
DEST - dest-spec[,…]
目标主机规则的详细说明:
zone[,…[+]]
匹配目标为指定区域中的任何主机。区域名称可以是:
all[+]
匹配所有区域,包括防火墙区域。通常情况下,
all
排除区域内流量,但通过添加+
可以包含区域内流量。any[+]
当没有嵌套区域时,
any
等同于all
。如果有嵌套区域,则any
仅指顶层区域(没有父区域)。any
不包括所有虚拟服务器区域,因为这些区域嵌套在防火墙区域内。none
使用
none
作为 SOURCE 或 DEST 列时,规则被忽略。all 和 any 可以用感叹号 (
!
) 和逗号分隔的区域名称列表来排除某些区域。
zone:[!]interface
目标必须是通过指定接口发送到的区域中的主机。接口名称必须与
shorewall-interfaces(5)
或shorewall-hosts(5)
中指定的区域关联。自 Shorewall 5.2.1 起,可以使用!
前缀来匹配所有与区域关联的接口,除了指定的那个。zone:address[,…]
地址可以是:
主机或网络 IP 地址。网络地址可以附加排除条件(见
shorewall-exclusion(5)
)。使用低地址-高地址语法指定的地址范围。
+ipset,
ipset
是一个 ipset 的名称,必须以加号(+
)前缀。^country-code,其中
country-code
是一个两位的 ISO-3661 国家代码,前面有一个插入符号(^
)。^country-code-list,其中
country-code-list
是一个最多包含 15 个 ISO-3661 国家代码的逗号分隔列表,放在方括号([...]
)中。防火墙接口的主要 IP 地址可以通过
&
后跟接口的逻辑名称来指定,该名称在shorewall-interfaces(5)
的 INTERFACE 列中找到。
zone:[!]interface:address[,…]
这种形式结合了前面的两种形式,要求目标接口和地址都匹配。自 Shorewall 5.2.1 起,可以使用
!
前缀来匹配所有与区域关联的接口,除了指定的那个。zone:exclusion
匹配目标 IP 地址不匹配排除列表中的任何条目的数据包(见
shorewall-exclusion(5)
)。zone:[!]interface:exclusion
匹配目标为指定区域,通过指定接口离开的数据包,其中目标地址不匹配排除列表中的任何条目。自 Shorewall 5.2.1 起,可以使用
!
前缀来匹配所有与区域关联的接口,除了指定的那个。[zone]:[server-IP][:port-or-port-range[:random]]
适用于 DNAT[-] 或 REDIRECT[-] 操作。如果是 REDIRECT 规则,区域可以省略(假设为
$FW
),而在 DNAT-、REDIRECT- 和 NONAT 规则中必须省略区域。server-IP
不是 REDIRECT 规则允许的,并且在 DNAT[-] 规则中可以省略,只要包含port-or-port-range
。server-IP
:要发送数据包的服务器 IP 地址。可以是一个 IP 地址范围,低地址和高地址用破折号(-
)分隔,连接在范围内的 IP 地址之间分配。
port-or-port-range
:整数端口号,范围为 1 - 65535。
/etc/services 中的服务名称。
端口范围,低整数端口号和高整数端口号用破折号(
-
)分隔。连接在范围内的端口之间分配。
如果指定了
random
,端口映射将被随机化。
如果 DEST 区域是一个 bport 区域,则:
SOURCE 必须是
all[+]
,或SOURCE 区域必须是与相同桥接器关联的另一个 bport 区域,或
SOURCE 区域必须是与仅相同桥接器关联的 ipv4 区域。
目标主机(DEST)规则的详细说明:
从 Shorewall 5.1.0 开始,可以列出多个 dest-spec
,前提是使用扩展形式的 source-spec
:
zone:(interface)
匹配目标为指定区域中的主机,并且数据包通过指定接口发送。
zone:(address[,…])
匹配目标为指定区域中的主机,并且数据包的目标地址与给定地址匹配。
zone:(interface:address[,…])
匹配目标为指定区域中的主机,并且数据包的目标地址与给定地址匹配,且数据包通过指定接口发送。
zone:(exclusion)
匹配目标为指定区域中的主机,但目标地址不在排除列表中(见
shorewall-exclusion(5)
)。zone:(interface:exclusion)
匹配目标为指定区域中的主机,数据包通过指定接口发送,且目标地址不在排除列表中。
多个 dest-spec
在 DNAT[-] 和 REDIRECT[-] 规则中不被允许。
示例:
dmz:192.168.2.2
匹配 DMZ 区域中的主机 192.168.2.2。
net:155.186.235.0/24
匹配 Internet 上的子网 155.186.235.0/24。
loc:192.168.1.1,192.168.1.2
匹配本地区域中的主机 192.168.1.1 和 192.168.1.2。
net:192.0.2.11-192.0.2.17
匹配 net 区域中的主机 192.0.2.11 到 192.0.2.17。
net:!192.0.2.11-192.0.2.17
匹配 net 区域中的所有主机,但排除 192.0.2.11 到 192.0.2.17。
net:155.186.235.0/24!155.186.235.16/28
匹配 Internet 上的子网 155.186.235.0/24,但排除 155.186.235.16/28。
$FW:ð0
匹配防火墙区域中 eth0 接口的主要 IP 地址。
loc,dmz
匹配本地和 DMZ 区域中的主机。
all!dmz
匹配除 DMZ 区域外的所有区域中的主机。
net:^CN
匹配来自中国的主机。
dmz:192.168.10.4:25
在 DMZ 区域中,匹配目标 IP 为 192.168.10.4 的服务器上的端口 25(适用于 DNAT 规则)。
loc:(eth1:1.2.3.4,2.3.4.5),dmz:(eth2:5.6.7.8,9.10.11.12),net
匹配:
- 在 loc 区域中,通过 eth1 接口到达的主机 1.2.3.4 和 2.3.4.5。
- 在 DMZ 区域中,通过 eth2 接口到达的主机 5.6.7.8 和 9.10.11.12。
- 以及 net 区域中的所有主机。
PROTO- {-|tcp:[!]syn|ipp2p|ipp2p:udp|ipp2p:all|protocol-number|protocol-name|all}
可选协议 - ipp2p* 需要内核和 iptables 支持 ipp2p 匹配模块。
tcp:syn 表示匹配 TCP 数据包,要求 SYN 标志被设置,同时 RST、ACK 和 FIN 标志必须被重置。
从 Shorewall 5.1.3 开始,你还可以指定 tcp:!syn,这表示匹配 SYN 标志未设置,或者 RST、ACK 或 FIN 标志被设置的 TCP 数据包。
从 Shorewall 4.4.19 开始,此字段可以包含以逗号分隔的协议号和/或协议名称的列表。
DPORT - {-|port-name-number-or-range[,port-name-number-or-range]…|+ipset}
可选目标端口。
这是一个用逗号分隔的端口名称列表(来自 services(5))、端口号或端口范围;如果协议是 ICMP,这一列被解释为目标 ICMP 类型。ICMP 类型可以指定为数字类型、带有斜杠分隔的数字类型和代码(例如,3/4),或者类型名称。有关更多信息,请参见 ICMP 参考。请注意,在 Shorewall 4.4.19 之前,只能列出一个 ICMP 类型。
如果协议是 ipp2p,则此列被解释为一个 ipp2p 选项,不包括前导的 “—“(例如 bit-torrent)。如果未给出端口,则默认使用 ipp2p。
端口范围的表示方式为低端口:高端口。
如果协议为 all,则此列被忽略,但如果提供了其他任何列,则必须填写此列。在这种情况下,建议将此字段设置为破折号(-)。
如果你的内核支持多端口匹配,那么在下列条件下,仅会生成一个 Netfilter 规则:
- 列表中列出了 15 个或更少的端口。
- 不包含端口范围,或你的内核和 iptables 支持扩展的多端口匹配。
从 Shorewall 4.6.0 开始,可以在此列中指定一个 ipset 名称。这用于与 bitmap:port ipsets 配合使用。
此列之前标记为 DEST PORT(S)。
SPORT - {-|port-name-number-or-range[,port-name-number-or-range]…|+ipset}
客户端使用的可选端口。 如果省略此项,则接受任何源端口。指定方式为用逗号分隔的端口名称、端口号或端口范围。
- 从 Shorewall 4.5.15 开始,如果 DPORT 列不为空,你可以在此列中使用 “=”。这将使规则在数据包的源端口或目标端口与 DEST PORTS(S) 中指定的端口之一匹配时生效。使用 “=” 需要你的 iptables 和内核支持多端口匹配。
警告
除非你真正理解 IP,否则应将此列留空或填入破折号(-)。大多数尝试使用此列的人会出错。
如果你不想限制客户端端口,但需要在下一列指定 ORIGDEST,则请在此列中填入 “-“。
如果你的内核支持多端口匹配,则在以下条件下,仅会生成一个 Netfilter 规则:
- 列表中列出了 15 个或更少的端口。
- 不包含端口范围,或你的内核和 iptables 支持扩展的多端口匹配。
从 Shorewall 4.6.0 开始,可以在此列中指定一个 ipset 名称。这用于与 bitmap:port ipsets 配合使用。
此列之前标记为 SOURCE PORT(S)。
ORIGDEST - [-|address[,address]…[exclusion]|exclusion]
可选项。 如果 ACTION 是 DNAT[-] 或 REDIRECT[-],则如果此列包含的地址与 DEST 列中给定的 IP 地址不同,则目标为该地址的连接将被转发到 DEST 列中指定的 IP 和端口。
还可以使用逗号分隔的地址列表。这在使用 REDIRECT 目标时特别有用,你可以将流量重定向到特定主机集合。最后,如果地址列表以 “!”(排除)开头,则规则仅在连接请求中的原始目标地址与列出的任何地址不匹配时才会生效。
从 Shorewall 4.4.17 开始,可以通过在接口逻辑名称前加上与号(’&’)来指定防火墙接口的主要 IP 地址,接口逻辑名称可在 shorewall-interfaces (5) 的 INTERFACE 列中找到。
对于其他操作,此列可以包含一个或多个用逗号分隔的地址(主机或网络)。不允许地址范围。如果提供此列,则生成的规则要求原始目标地址匹配列出的地址之一。此功能在你想生成与 DNAT- 或 REDIRECT- 规则相对应的过滤规则时最有用。在这种用法中,地址列表不应以 “!” 开头。
还可以指定一组地址然后排除其中的一部分。例如,192.168.1.0/24!192.168.1.16/28 指定了地址 192.168.1.0-182.168.1.15 和 192.168.1.32-192.168.1.255。见 shorewall-exclusion(5)。
参见 https://shorewall.org/PortKnocking.html 以获取有关如何使用此列中的条目与用户定义的操作规则的示例。
此列之前标记为 ORIGINAL DEST。
RATE - limit
可选。 如果要对规则进行速率限制,可以在此列中指定一个值:
rate 是每个时间间隔(秒或分钟)内的连接数,burst 是允许的最大突发流量。如果没有指定突发流量,则假定值为 5。说明中不能包含空格。
示例:
10/sec:20
当指定
s:
或d:
时,速率分别适用于每个源 IP 地址或目标 IP 地址。名称可以由用户选择,指定一个哈希表,用于计算匹配连接的数量。如果未指定,则假定名称为shorewallN
(其中 N 是唯一整数)。当多个规则或策略指定相同名称时,这些规则的连接计数会汇总在一起,个别速率适用于汇总计数。从 Shorewall 5.2.1 开始,s
或d
后可以跟斜杠(”/“)和一个整数 VLSM。当指定了 VLSM 时,所有遇到的源或目标地址将根据给定的前缀长度进行分组,创建的子网将受到速率限制。示例:
s/24::10/sec
从 Shorewall 4.6.5 开始,可以指定两个限制,用逗号分隔。在这种情况下,第一个限制(
name1
,rate1
,burst1
)指定每个源 IP 的限制,第二个限制指定每个目标 IP 的限制。示例:
client:10/sec:20,:60/sec:100
在这个例子中,
client
哈希表将用于强制执行每个源的限制,而编译器将为每个目标的限制选择一个唯一的哈希表名称。从 Shorewall 5.2.1 开始,表名(如果有的话)后可以跟两个整数,用逗号分隔并括在圆括号中。第一个整数(
ht-buckets
)指定生成哈希表中的桶数。第二个整数(ht-max
)指定哈希表中的最大条目数。示例:
s:netfw(1024,65536):10/sec
此列以前标记为 RATE LIMIT。
USER - [!][user-name-or-number][:group-name-or-number][,…]
可选。 仅当 SOURCE 为防火墙本身时,此列才能非空。
当此列非空时,规则仅适用于生成输出的程序在指定的有效用户和/或组下运行(如果给出“!”则表示程序不在该用户或组下运行)。
从 Shorewall 4.5.8 开始,可以用逗号分隔指定多个用户或组名称/ID。
示例:
joe
程序必须由joe
运行:kids
程序必须由kids
组的成员运行!:kids
程序必须不由kids
组的成员运行2001-2099
UID 从 2001 到 2099(Shorewall 4.5.6 及更高版本)此列以前标记为 USER/GROUP。
MARK - [!]value[/mask][:C]
定义对现有数据包或连接标记的测试。规则仅在测试返回真时匹配。
如果不想定义测试但需要在以下列中指定任何内容,请在此字段中放置一个“-”。
!
反转测试(不等于)value
数据包或连接标记的值。mask
在测试之前应用于标记的掩码。:C
指定连接标记。如果省略,则测试数据包标记的值。
CONNLIMIT - [d:][!]limit[:mask]
可以用于限制每个单独主机或网络的同时连接数,以限制连接数量。需要在内核和 iptables 中支持 connlimit 匹配。
虽然限制仅在指定 CONNLIMIT 的规则中检查,但当前连接的数量是计算所有来自 SOURCE 或 DESTINATION 主机的连接。默认情况下,限制是按 SOURCE 主机或网络进行的,但如果规范以
d:
开头,则限制将按目的主机或网络进行。默认情况下,限制适用于每个主机,但可以通过指定掩码使其适用于主机的网络。掩码指定要应用于源地址的 VLSM 掩码的宽度;然后计算子网
source-address/mask
中所有主机的当前连接数。当指定!
时,规则在连接数量超过限制时匹配。
TIME - timeelement[&timeelement…]
可以用于限制规则在特定时间段、特定星期几或月份中的特定天数,或者在由日期和时间定义的范围内生效。需要内核和 iptables 支持时间匹配。
timestart=hh:mm[:ss]
定义一天的开始时间。timestop=hh:mm[:ss]
定义一天的结束时间。contiguous
从 Shorewall 5.0.12 开始。当timestop
小于timestart
的值时,将其匹配为单一时间段,而不是不同的时间段。utc
时间以格林威治标准时间表示。localtz
被 Netfilter 团队弃用,推荐使用kerneltz
。时间以本地标准时间表示(默认值)。kerneltz
从 Shorewall 4.5.2 开始。时间以本地内核时间表示(需要 iptables 1.4.12 或更高版本)。weekdays=ddd[,ddd]...
其中ddd
是其中一个:Mon、Tue、Wed、Thu、Fri、Sat 或 Sun。monthdays=dd[,dd],...
其中dd
是月份中的顺序日。datestart=yyyy[-mm[-dd[Thh[:mm[:ss]]]]]
定义开始日期和时间。datestop=yyyy[-mm[-dd[Thh[:mm[:ss]]]]]
定义结束日期和时间。
HEADERS - [!][any:|exactly:]header-list (Optional - Added in Shorewall 4.4.15)
此列仅在 IPv6 中使用。在 IPv4 中,如果您希望在以下列中填写值,请在此列中提供 “-“。
header-list 由以下列表中的标头组成,使用逗号分隔:
auth
、ah
或51
认证头扩展标头。esp
或50
加密安全负载扩展标头。hop
、hop-by-hop
或0
按跳选项扩展标头。route
、ipv6-route
或43
IPv6 路由扩展标头。frag
、ipv6-frag
或44
IPv6 分片扩展标头。none
、ipv6-nonxt
或59
无下一个标头。proto
、protocol
或255
任何协议标头。
如果指定了 any:
,则规则将在列出的任何标头存在时匹配。如果指定了 exactly:
,则规则将匹配恰好包括所有指定标头的数据包。如果两者都未给出,则默认为 any:
。
如果输入 !
,则规则将匹配那些在省略 !
时不匹配的数据包。
SWITCH - [!]switch-name[={0|1}]
在 Shorewall 4.4.24 中添加,允许在不需要重新加载 Shorewall 的情况下启用和禁用规则。
如果
/proc/net/nf_condition/switch-name
中存储的值为 1,则规则被启用。如果该文件包含 0(默认值),则规则被禁用。如果提供了!
,则测试结果将被取反,即如果文件包含 0,则规则被启用。在
switch-name
中,@0
和@{0}
将被替换为规则所在链的名称。switch-name
(在@...
扩展后)必须以字母开头,并由字母、数字、下划线或连字符组成。开关名称长度不得超过 30 个字符。开关默认是关闭的。要启用开关,可以执行:
1
echo 1 > /proc/net/nf_condition/switch-name
要再次关闭开关,可以执行:
1
echo 0 > /proc/net/nf_condition/switch-name
开关设置在 Shorewall 重新加载后会保留。
从 Shorewall 4.5.10 开始,当
switch-name
后跟=0
或=1
时,开关会在启动命令时初始化为关闭或开启状态。其他命令不会影响开关设置。
HELPER - [helper]
在 Shorewall 4.5.7 中添加。
在
NEW
部分,指定的 conntrack helper 将与此连接关联;除非 ACTION 是 ACCEPT、DNAT 或 REDIRECT*,否则此列的内容将被忽略。在
RELATED
部分,只有当相关连接具有指定的 helper 时才会匹配。可以使用以下 helper 之一:
- amanda
- ftp
- irc
- netbios-ns
- pptp
- Q.931
- RAS
- sane
- sip
- snmp
- tftp
如果在
shorewall.conf(5)
中指定了 HELPERS 选项,则此列中指定的任何模块必须在 HELPERS 设置中列出。
示例
示例 1:
允许从 DMZ 到互联网的 SMTP 请求
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
ACCEPT dmz net tcp smtp
示例 2:
将所有从互联网发出的 SSH 和 HTTP 连接请求转发到本地系统 192.168.1.3
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
DNAT net loc:192.168.1.3 tcp ssh,http
示例 3:
将所有从互联网发出的 HTTP 连接请求转发到本地系统 192.168.1.3,每秒限制为 3 个连接,最大突发为 10 个
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST RATE
DNAT net loc:192.168.1.3 tcp http - - 3/sec:10
示例 4:
将所有本地发起的 WWW 连接请求重定向到防火墙的 3128 端口(防火墙系统上运行的 Squid),但当目标地址为 192.168.2.2 时除外
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
REDIRECT loc 3128 tcp www - !192.168.2.2
示例 5:
将所有来自互联网的 HTTP 请求转发到地址 130.252.100.69 的 80 端口,转发到 192.168.1.3
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
DNAT net loc:192.168.1.3 tcp 80 - 130.252.100.69
示例 6:
只接受来自互联网 IP 地址 130.252.100.69 和 130.252.100.70 的 SSH 连接
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
ACCEPT net:130.252.100.69,130.252.100.70 $FW tcp 22
示例 7:
你希望接受到防火墙的 2222 端口的连接,并将它们转发到本地系统 192.168.1.3 的 22 端口
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
DNAT net loc:192.168.1.3:22 tcp 2222
示例 8:
你希望将连接请求到端口 80 随机重定向到端口范围 81-90
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
REDIRECT net $FW::81-90:random tcp www
示例 9:
Shorewall 对 ‘nat’ 表中的 Netfilter 规则不像对过滤表中的规则那样施加结构限制。因此,在使用 Shorewall 4.1.4 版本之前,使用带有通配符接口(以 '+' 结尾的接口)定义的区域时,必须小心使用 DNAT 和 REDIRECT 规则。示例如下:
shorewall-zones(5):
#ZONE TYPE OPTIONS
fw firewall
net ipv4
dmz ipv4
loc ipv4
shorewall-interfaces(5):
#ZONE INTERFACE BROADCAST OPTIONS
net ppp0
loc eth1 detect
dmz eth2 detect
- ppp+ # 地址从 192.168.3.0/24 分配
shorewall-host(5):
#ZONE HOST(S) OPTIONS
loc ppp+:192.168.3.0/24
规则:
#ACTION SOURCE DEST PROTO DPORT
REDIRECT loc 3128 tcp 80
注意,可能会有人倾向于在 shorewall-interfaces(8) 中完全定义 loc 区域:
#******************* 错误 *****************
#ZONE INTERFACE BROADCAST OPTIONS
net ppp0
loc eth1 detect
loc ppp+
dmz eth2
这将使在 DMZ 中运行的可以被访问的 Web 服务器变得不可能,因为所有进入 ppp+ 接口的流量都将被重定向到防火墙上的 3128 端口,而没有适用于这些流量的 net->fw ACCEPT 规则。
示例 10:
将传入的 SSH 连接的元组(源 IP、目标端口、目标 IP)添加到 ipset S:
#ACTION SOURCE DEST PROTO DPORT
ADD(+S:dst,src,dst) net fw tcp 22
示例 11:
你希望将远程系统的 SSH 连接限制为每分钟 1 个连接,允许最多 3 次突发(以便有限的重试):
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST RATE
SSH(ACCEPT) net all - - - - s:1/min:3
示例 12:
如果开关 'primary_down' 打开,将端口 80 转发到 DMZ 主机 $BACKUP
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST RATE USER MARK CONNLIMIT TIME HEADERS SWITCH
DNAT net dmz:$BACKUP tcp 80 - - - - - - primary_down
示例 13:
丢弃来自匿名代理和卫星提供商地址范围的所有电子邮件:
#ACTION SOURCE DEST PROTO DPORT
DROP net:^A1,A2 fw tcp 25
示例 14:
你希望生成涉及不受 Shorewall 支持的 iptables 目标和匹配的规则。
#ACTION SOURCE DEST PROTO DPORT
INLINE $FW net ; -p 6 -m mickey-mouse --name test -m set --match-set set1 src -m mickey-mouse --name test2 -j SECCTX --name test3
上述将生成以下 iptables-restore 输入:
-A fw2net -p 6 -m mickey-mouse --name test -m set --match-set set1 src -m mickey-mouse --name test2 -j SECCTX --name test3
注意,SECCTX 必须在 shorewall-actions(5) 中定义为内置操作:
#ACTION OPTIONS
SECCTX builtin
示例 15:
你希望只接受来自互联网 IP 地址 2002:ce7c::92b4:1::2 和 2002:ce7c::92b4:1::22 的 SSH 连接
#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
ACCEPT net:<2002:ce7c::92b4:1::2,2002:ce7c::92b4:1::22> $FW tcp 22
Universal示例
1 | # |
三接口示例
1 | # |
See ALSO
https://shorewall.org/ipsets.html
https://shorewall.org/configuration_file_basics.htm#Pairsee ALSO
https://shorewall.org/ipsets.html
https://shorewall.org/configuration_file_basics.htm#Pairs
/etc/shorewall/routes
主要功能
- 定义静态路由
通过该文件,您可以指定静态路由,将流量从一个网络传递到另一个网络或设备。您可以为每个目标地址或网络指定路由。 - 指定网关和设备
文件允许您指定到目标的网关地址,或指定设备(网络接口)用于路由。 - 路由选项
您可以设置一些选项,例如persistent
,使得路由即使在提供者被禁用时仍然存在于路由表中。
描述
此文件在 Shorewall 4.4.15 中新增,用于定义要添加到提供者路由表的路由。
文件中的列如下:
PROVIDER
提供者的名称或编号,在shorewall-providers (5)
中定义。从 Shorewall 4.5.14 开始,您还可以在此列中输入main
以将路由添加到主路由表。DEST
目标主机地址或网络地址。GATEWAY (可选)
如果指定,提供目标地址的网关 IP 地址。从 Shorewall 4.5.14 开始,您可以在此列中指定
blackhole
以创建黑洞路由。从 Shorewall 4.5.15 开始,您可以在此列中指定
prohibit
或unreachable
以分别创建禁止路由或不可达路由。DEVICE (可选)
指定设备路由。如果未指定 DEVICE 或 GATEWAY,则使用在shorewall-providers (5)
中为 PROVIDER 指定的 INTERFACE。如果在 GATEWAY 列中指定了blackhole
、prohibit
或unreachable
,则此列必须省略。OPTIONS (可选)
从 Shorewall 5.0.2 开始增加。允许的选项包括:
- persistent
如果指定,则即使提供者被禁用,该路由仍保留在提供者的路由表中。
- persistent
1 | # PROVIDER DESTINATION GATEWAY DEVICE OPTIONS |
/etc/shorewall/hosts
在 Shorewall 的配置中,shorewall-zones
文件用于定义区域 (zones) 以及这些区域的子网和/或单独的 IP 地址。这个文件对大多数简单设置不是必需的,但当你有多个区域通过一个接口连接时,它就变得非常重要。
文件描述
这个文件的主要作用是将网络区域与其相应的子网或 IP 地址关联起来。通常情况下,简单的网络设置不需要在这个文件中放置任何内容。然而,当涉及到通过单一接口连接多个区域时,这个文件变得重要。
文件的结构和使用
- 文件的顺序: 文件中条目的顺序对区域的组成没有影响。实际上,
shorewall-zones
文件中的区域声明顺序决定了记录在文件中的解释顺序。 - 警告:
- 如果在
shorewall-interfaces
文件中有针对特定区域和接口的条目,则不应在这个文件中为相同的区域和接口对添加任何条目。 - 只有在多个区域通过单一接口连接时,才需要这个文件。
- 如果在
列的说明
以下是 shorewall-zones
文件中各列的说明:
- ZONE: 该列指定了区域的名称。区域名称应与
shorewall-zones
文件中的区域定义相匹配。 - NETS: 该列列出了与区域相关联的子网或 IP 地址。多个子网或 IP 地址用逗号分隔。例如,可以指定一个子网
192.168.1.0/24
,或者多个子网192.168.1.0/24,192.168.2.0/24
。 - OPTIONS: 可选的列,用于指定与区域相关的额外选项,如访问控制规则、黑名单、动态黑名单等。
ZONE - zone-name——不再解释
HOST(S) - interface:{[{address-or-range[,address-or-range]...|+ipset|dynamic}[exclusion]
解释:
interface
:shorewall-interfaces(5)
文件中定义的接口名称,后跟冒号(”:”)。{...}
: 逗号分隔的列表,其中的元素可以是:- 主机的 IP 地址。
- 以 CIDR 格式表示的网络。
- IP 地址范围,例如
low.address-high.address
。你的内核和 iptables 必须支持 iprange 匹配。 - ipset 的名称。
- 关键字
dynamic
,使区域动态,这样你可以使用shorewall add
和shorewall delete
命令来更改区域的组成。 - 你也可以通过使用排除(
exclusion
,见shorewall-exclusion(5)
)来排除某些主机。
OPTIONS(可选) - [option[,option]...]
一个用逗号分隔的选项列表。选项的顺序没有特定要求,但列表中不能有嵌入的空白字符。
blacklist
检查到达此端口的报文是否符合
shorewall-blacklist(5)
文件中的规则。broadcast
当你想要包含来自防火墙到这个区域的有限广播(目标 IP 地址为 255.255.255.255)时使用。仅在以下情况下需要:
HOST(S)
列中指定的网络不包括 255.255.255.255。- 此区域在
shorewall-interfaces(5)
中没有该接口的条目。
destonly
通常与多播 IP 地址范围(224.0.0.0/4)一起使用。指定流量将发送到指定的网络,但不会从这些网络接收流量。
ipsec
该区域通过内核 2.6 IPsec SA 访问。请注意,如果在
shorewall-zones(5)
文件中将ZONE
列中命名的区域指定为 IPSEC 区域,则在此处不需要指定ipsec
选项。maclist
来自这些主机的连接请求会与
shorewall-maclist(5)
文件的内容进行比较。如果指定了此选项,则接口必须是以太网 NIC 或等效设备,并且必须在 Shorewall 启动之前处于启用状态。mss=mss
Shorewall 4.5.2 中添加的选项。当存在时,会将
HOST(S)
列中指定的主机的新连接的 TCP MSS 限制为指定的 MSS。nosmurfs
这个选项仅对桥上的端口有意义。过滤源地址为广播地址的 smurf 报文。Smurf 报文会根据
shorewall.conf(5)
中的SMURF_LOG_LEVEL
设置进行选择性记录,记录后报文会被丢弃。routeback
Shorewall 应设置基础设施以将来自这些地址的报文传回到它们自己。如果这些主机组使用了一个透明代理,该代理是该组的成员,或者如果使用 DNAT 将来自该组的请求发送到组内的服务器,这个选项是必要的。
tcpflags
检查来自这些主机的报文是否包含某些非法的 TCP 标志组合。找到这样的标志组合的报文会根据
TCP_FLAGS_DISPOSITION
设置进行处理,并根据TCP_FLAGS_LOG_LEVEL
设置进行记录。
Examples
防火墙运行一个 PPTP 服务器,该服务器为每个远程客户端创建一个 ppp 接口。 为客户端分配了网络 192.168.3.0/24 和名为“vpn”的区域中的 IP 地址。
1 | #ZONE HOST(S) OPTIONS |
1 | # ZONE HOST(S) OPTIONS |
Debian:已知问题
/usr/share/doc/shorewall/known_problems.txt
1 | 1) 在运行 Upstart 的系统上,shorewall-init 不能在接口启动之前可靠地保护防火墙。 |
FAQs
Installing Shorewall——安装 Shorewall
(FAQ 92)有很多 Shorewall 软件包;我应该安装哪一个?
回答:首次安装 Shorewall 4.4.0 或更高版本时,你必须安装 shorewall 软件包。如果你想配置 IPv6 防火墙,还必须安装 shorewall6。从 Shorewall 4.5 开始,你必须首先安装 shorewall-core 软件包。
(FAQ 92a)有人曾告诉我安装 shorewall-perl;这有用吗?
回答:在 Shorewall 4.2 及更早版本中,这是一个很好的建议。在那些版本中,有两个提供基本防火墙功能的软件包:shorewall-shell 和 shorewall-perl。从 Shorewall 4.4.0 开始,shorewall-shell 被停用,shorewall-perl 被重命名为 shorewall。
(FAQ 37)我刚在 Debian 上安装了 Shorewall,但 /etc/shorewall 目录几乎是空的!!!
回答:重要:在你安装 .deb 包并在尝试配置 Shorewall 之前,请遵循前 Shorewall Debian 维护者 Lorenzo Martignoni 的建议:
“关于在 Debian 系统上使用 Shorewall 的更多信息,请查看由 shorewall-common Debian 包提供的 /usr/share/doc/shorewall-common/README.Debian。”
如果你使用 .deb 包进行安装,你会发现 /etc/shorewall 目录几乎是空的。这是故意的。发布的配置文件骨架可以在你的系统上的 /usr/share/doc/shorewall-common/default-config 目录中找到。只需将所需文件从该目录复制到 /etc/shorewall 并修改这些副本。
(FAQ 37a)我刚在 Debian 上安装了 Shorewall,但找不到示例配置文件。
回答:从 Shorewall 4.4 开始,示例文件在 shorewall 软件包中,安装在 /usr/share/doc/shorewall/examples/ 目录下。
(FAQ 14)我找不到 Shorewall 4.4 的 shorewall-common、shorewall-shell 和 shorewall-perl 软件包?它们在哪里?
回答:在 Shorewall 4.4 中,shorewall-shell 软件包被停用了。shorewall-common 和 shorewall-perl 软件包合并为一个单一的 shorewall 软件包。在 Shorewall 4.5 中,添加了 shorewall-core 软件包,所有其他软件包都依赖于 shorewall-core。
(FAQ 1.5)在安装了最新版本(> 5.1.10.1)的 Shorewall 后,当我更改配置并执行 ‘shorewall reload’ 或 ‘shorewall restart’ 时,我的更改没有应用到正在运行的规则集中。为什么会这样?
回答:这种情况发生在以下情况下:
- 你使用了 INCLUDE (?INCLUDE)。
- 包含的文件位于 /etc/shorewall[6] 的子目录中或单独的目录中。
- 你在 shorewall[6].conf(5) 中设置了 AUTOMAKE=Yes。(https://shorewall.org/manpages/shorewall.conf.html)
当 AUTOMAKE=Yes 时,编译器会在 CONFIG_PATH 中的每个目录中查找比最后生成的防火墙脚本更新的文件。如果没有找到更新的文件,则使用旧的脚本。在 5.1.10.2 版本之前,这个搜索是递归的,所以 /etc/shorewall[6] 的子目录中的更改会自动被搜索到。这在 CONFIG_PATH 中的目录深度嵌套时会影响性能。因此,从 5.1.10.2 版本开始,只搜索目录本身。你可以通过设置 AUTOMAKE=recursive 或 AUTOMAKE=integer 来恢复 5.1.10.2 之前的行为,其中 integer 指定搜索深度。如果你的包含文件在单独的目录中,那么该目录必须添加到 CONFIG_PATH 以使 AUTOMAKE 正常工作。
Upgrading Shorewall——升级 Shorewall
(FAQ 66)我正在尝试升级到 Shorewall 4.x 或更高版本;我需要安装哪些软件包?
回答:请参阅升级问题(https://shorewall.org/upgrade_issues.htm)。
(FAQ 34)我正在尝试升级到 Shorewall 4.4 或更高版本,但找不到 shorewall-common、shorewall-shell 和 shorewall-perl 软件包?它们在哪里?
回答:在 Shorewall 4.4 中,shorewall-shell 软件包被停用。shorewall-common 和 shorewall-perl 软件包合并为一个单一的 shorewall 软件包。更多信息请参阅升级问题(https://shorewall.org/upgrade_issues.htm)。
(FAQ 34a)我正在尝试升级到 Shorewall 4.4,但在尝试启动 Shorewall 时遇到错误。我在哪里可以找到这些问题的信息?
回答:请参阅升级问题(https://shorewall.org/upgrade_issues.htm)。
(FAQ 34b)我正在尝试升级到 Shorewall 4.4,但在尝试启动 Shorewall 时看到警告信息。我在哪里可以找到这些问题的信息?
回答:请参阅升级问题(https://shorewall.org/upgrade_issues.htm)。
(FAQ 76)我刚升级了系统,现在伪装(masquerading)不工作了?发生了什么?
回答:这是因为一些人忽略了我们的建议(https://shorewall.org/Install.htm#Upgrade_Deb),让安装程序用默认设置替换了他们正在使用的 /etc/shorewall/shorewall.conf。不能转发流量(例如,本地网络访问互联网时的伪装问题)通常是因为 /etc/shorewall/shorewall.conf (https://shorewall.org/manpages/shorewall.conf.html)包含默认设置 IP_FORWARDING=Keep;它应该是 IP_FORWARDING=On。
更新:从 Shorewall 4.4.21 开始,有一个 shorewall update 命令,可以智能地合并现有的 shorewall.conf 和新的配置文件。
(FAQ 2.6)在升级到最新版本(> 5.1.10.1)的 Shorewall 后,当我更改配置并执行 ‘shorewall reload’ 或 ‘shorewall restart’ 时,我的更改没有应用到正在运行的规则集中。为什么会这样?
回答:请参阅 FAQ 1.5(https://shorewall.org/FAQ.htm#faq1.5)。
Port Forwarding (Port Redirection)——端口转发(端口重定向)
(FAQ 1)我想将 UDP 端口 7777 转发到我的个人电脑,其 IP 地址是 192.168.1.5。我找遍了所有地方,但找不到如何操作的方法。
回答:从外网到本地系统的端口转发规则格式如下:
1 | #ACTION SOURCE DEST PROTO DPORT |
所以,要将 UDP 端口 7777 转发到内部系统 192.168.1.5,规则是:
1 | #ACTION SOURCE DEST PROTO DPORT |
如果要将请求定向到防火墙上的特定地址(external-IP)并转发到内部系统:
1 | #ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST |
如果要将来自特定互联网地址(address)的请求转发:
1 | #ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST |
最后,如果需要转发一段端口,在 DEST PORT 列中指定范围为 low-port。
重要: 上述方法不适用于从本地网络转发。如果需要这样做,请参阅 FAQ 2(https://shorewall.org/FAQ.htm#faq2)。
(FAQ 1a)好的,我按照说明操作,但它不起作用。
回答:这通常是以下五个原因之一造成的:
您尝试重定向一个 UDP 端口,并且已经存在通过 ACCEPT 规则创建的 conntrack 表条目。
例子:1
DNAT loc:192.168.0.2 dmz:192.168.1.3 udp 53
假设您已经安装了 conntrack 软件包,可以使用以下命令删除所有此类 conntrack 表条目:
1
conntrack -D -s 192.168.0.2 -p udp --dport 53
您尝试从防火墙内部进行测试(不,这不行,请参阅“(FAQ 2)我将 www.mydomain.com(IP 130.151.100.69)的 www 请求端口转发到我本地网络中的系统 192.168.1.5。外部客户端可以浏览 http://www.mydomain.com,但内部客户端不行。”)。(https://shorewall.org/FAQ.htm#faq2)
您的本地系统(您尝试转发到的系统)存在更基本的问题,例如默认网关错误(必须设置为防火墙内部接口的 IP 地址;如果由于某种原因不可能,请参阅 FAQ 1f)。
您的 ISP 正在阻止该特定端口的入站流量,或者,对于 TCP,您的 ISP 正在丢弃出站的 SYN,ACK 响应。
您运行的是 Mandriva Linux 10.0 之前的版本,并且已配置了互联网连接共享。在这种情况下,本地区域的名称是 ‘masq’ 而不是 ‘loc’(在规则中将所有 ‘loc’ 替换为 ‘masq’)。您可能需要重新安装符合 Shorewall 文档的配置的 Shorewall。有关详细信息,请参阅双接口快速入门指南。
(FAQ 1b)我仍然在端口转发方面遇到问题。
回答:要进一步诊断此问题:
- 以 root 用户身份输入 “shorewall reset”(如果您运行的是 Shorewall Lite,则输入 “shorewall-lite reset”)。这会清除所有 Netfilter 计数器。
- 尝试从外部主机连接到重定向的端口。
- 以 root 用户身份输入 “shorewall show nat”(如果您运行的是 Shorewall Lite,则输入 “shorewall-lite show nat”)。
找到相应的 DNAT 规则。它会在名为_dnat 的链中(在上述示例中为“net_dnat”)。
第一列中的数据包计数是否非零?如果是这样,则连接请求已到达防火墙并被重定向到服务器。在这种情况下,问题通常是本地系统(您尝试转发到的系统)缺少或错误的默认网关设置(该系统的默认网关必须是防火墙接口的 IP 地址,除非您使用 FAQ 1f 中描述的 hack)。 - 如果数据包计数为零:
- 连接请求未到达服务器(可能被您的 ISP 阻止);或
- 您尝试连接到防火墙上的次要 IP 地址,而您的规则仅重定向主要 IP 地址(您需要在 DNAT 规则的“ORIG. DEST.”列中指定次要 IP 地址);或
- 您的 DNAT 规则与连接请求不匹配。在这种情况下,您可能需要使用数据包嗅探器(如 tcpdump 或 Wireshark)进一步诊断问题。
- 流量通过不同的接口进入防火墙(在 /etc/shorewall/interfaces 中接口顺序是否反了?)。
- 如果数据包计数非零,请检查日志以查看连接是否被丢弃或拒绝。如果是,则您可能有区域定义问题,即服务器所在的区域与 DEST 列中指定的区域不同。在 root 提示符下输入 “shorewall show zones”(如果运行的是 Shorewall Lite,则输入 “shorewall-lite show zones”),然后确保在 DEST 列中指定的区域匹配 REJECT/DROP 日志消息中的 OUT=
和 DEST= 。 - 如果一切似乎都正确但连接仍然不起作用,可能是您的 ISP 正在阻止 SYN,ACK 响应。这种技术允许您的 ISP 检测您是否在运行服务器(通常违反您的服务协议),并阻止与该服务器的连接建立。
(FAQ 1c)从互联网,我想连接到我的防火墙上的端口 1022,并让防火墙将连接转发到本地系统 192.168.1.3 的端口 22。我该怎么做?
回答:在 /etc/shorewall/rules 中:
1 | #ACTION SOURCE DEST PROTO DPORT |
(FAQ 1d)我在 DMZ 中有一个 Web 服务器,并使用端口转发使该服务器可以从互联网访问。这工作正常,但当我的本地用户尝试使用防火墙的外部 IP 地址连接到服务器时,它不起作用。
回答:请参阅 FAQ 2b(https://shorewall.org/FAQ.htm#faq2b)。
(FAQ 1e)为了防止暴力攻击,我希望将所有在非标准端口(4104)上的连接重定向到路由器/防火墙上的端口 22。我注意到设置一个 REDIRECT 规则会导致防火墙同时打开来自 net 的端口 4104 和 22 的连接。是否有可能只将 4104 重定向到本地主机的端口 22,并丢弃来自 net 的端口 22 的连接尝试?
重要: 在具有“扩展 conntrack 匹配”(NEW_CONNTRACK_MATCH)功能的系统上(参见 shorewall show capabilities 的输出),端口 22 仅对原始目标端口为 4104 的连接打开,本常见问题不适用。
Ryan 提供的答案:假设本地防火墙接口的 IP 地址是 192.168.1.1。如果您将 SSHD 配置为仅监听该地址,并添加以下规则,则您将能够从 net 在端口 4104 上访问,并从 LAN 在端口 22 上访问。
1 | #ACTION SOURCE DEST PROTO DPORT |
(FAQ 1f)为什么我端口转发的服务器的默认网关必须设置为我的 Shorewall 系统的 IP 地址?
回答:让我们举个例子。假设:
您的 Shorewall 防火墙的外部 IP 地址是 206.124.146.176(eth0),内部 IP 地址是 192.168.1.1(eth1)。
您有另一个网关路由器,外部 IP 地址为 130.252.100.109,内部 IP 地址为 192.168.1.254。
您在两个路由器后面有一个 FTP 服务器,IP 地址为 192.168.1.4。
FTP 服务器的默认网关通过第二个路由器(192.168.1.254)。
您在 Shorewall 系统上有以下规则:
1
2#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
DNAT net loc:192.168.1.4 tcp 21 - 206.124.146.176互联网主机 16.105.221.4 发出命令 ftp 206.124.146.176。
这导致以下事件序列:
16.105.221.4 向 206.124.146.176 发送一个目标端口为 21 的 TCP SYN 数据包。
Shorewall 防火墙将目标 IP 地址重写为 192.168.1.4 并转发数据包。
FTP 服务器接收到数据包并接受连接,生成一个 SYN,ACK 数据包返回给 16.105.221.4。由于服务器的默认网关是通过第二台路由器,它将数据包发送到该路由器。
此时,可能会发生以下两种情况之一:第二台路由器要么丢弃或拒绝数据包,要么将源 IP 地址重写为 130.252.100.109 并将数据包返回给 16.105.221.4。不论发生哪种情况,连接都注定失败。显然,如果数据包被拒绝或丢弃,连接将不会成功。但即使数据包到达 16.105.221.4,该主机也会拒绝它,因为源 IP 地址(130.252.100.109)与原始 SYN 数据包的目标 IP 地址(206.124.146.176)不匹配。
解决此问题的最佳方法是将 FTP 服务器的默认网关更改为 Shorewall 系统的内部 IP 地址(192.168.1.1)。但如果不可能,可以使用以下“黑客”方法来解决问题,修改 /etc/shorewall/masq
文件:
1 | #INTERFACE SOURCE ADDRESS PROTO PORT |
在 Shorewall 5.0.14 或更高版本中,等效的 /etc/shorewall/snat
文件规则是:
1 | #ACTION SOURCE DEST PROTO PORT |
这个规则有一个不良副作用,即所有来自网络的 FTP 连接在 FTP 服务器上看起来像是源自 Shorewall 系统。但它将强制 FTP 服务器通过 Shorewall 系统回复,从而使 Shorewall 系统能够正确地重写响应中的源 IP 地址。
(FAQ 1g) 我想将我的公共 IP 地址 (206.124.146.176) 上的端口 80 重定向到互联网主机 66.249.93.111 上的端口 993
答:这需要一个类似于 FAQ 2(https://shorewall.org/FAQ.htm#faq2) 中的黑客方法。假设你的互联网区域名为 net,并连接在接口 eth0 上:
在 /etc/shorewall/rules 中:
1 | #ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST |
在 /etc/shorewall/interfaces 中,指定 eth0 上的 routeback 选项:
1 | ?FORMAT 2 |
在 /etc/shorewall/masq 中:
1 | #INTERFACE SOURCE ADDRESS PROTO PORT |
当运行 Shorewall 5.0.14 或更高版本时,等效的 /etc/shorewall/snat 文件是:
1 | #ACTION SOURCE DEST PROTO PORT |
并在 /etc/shorewall/shorewall.conf 中:
1 | IP_FORWARDING=On |
如 FAQ 2 中的黑客方法,这种方法会导致所有转发的连接在服务器 (66.249.93.111) 上看起来像是源自你的防火墙 (206.124.146.176)。
(FAQ 1h) 如何设置 shorewall 允许从 net 访问端口 9022 的 ssh?SSHD 监听的是端口 22。
答:使用以下规则。
1 | #ACTION SOURCE DEST PROTO DPORT |
请注意,上述规则也将允许来自 net 的连接访问 TCP 端口 22。如果你不希望这样,请参见 FAQ 1e。
(FAQ 1j) 为什么这个 DNAT 规则不起作用?
我添加了这个规则,但仍然看到以下日志消息:
规则:
1 | DNAT scnet:172.19.41.2 dmz0:10.199.198.145 udp 2055 |
日志:
1 | Sep 21 12:55:37 fw001 kernel: [10357687.114928] Shorewall:scnet2fw:DROP:IN=eth2 OUT= |
答:在你添加规则之前,已经存在一个 conntrack 条目导致连接失败。安装 conntrack 工具程序并使用它删除该条目。
1 | conntrack -D -s 172.19.41.2 -d 172.19.1.1 -p udp -sport 6367 -dport 2055 |
(FAQ 30) 我对何时使用 DNAT 规则和何时使用 ACCEPT 规则感到困惑。
答:查看适合你设置的 QuickStart Guide (https://shorewall.org/shorewall_quickstart_guide.htm) 是一个好主意;这些指南以教程的形式涵盖了这个主题。DNAT 规则应在需要与 SNAT/MASQUERADE 方向相反的连接时使用。因此,如果你从本地网络到互联网使用伪装或 SNAT,则需要使用 DNAT 规则以允许从互联网到你的本地网络的连接。
注意
如果你同时使用 1:1 NAT 和 SNAT/MASQUERADE,那么那些涉及 1:1 NAT 的连接应使用 ACCEPT 而不是 DNAT。注意,DNAT 可以用来覆盖 1:1 NAT,从而将连接重定向到不同的内部系统或端口,而不是使用 1:1 NAT 的情况。
你还需要在有意重写目标 IP 地址或端口号时使用 DNAT 规则。在所有其他情况下,你使用 ACCEPT,除非你需要劫持连接并在防火墙本身上处理它们;在这种情况下,你使用 REDIRECT 规则。
注意
前面的答案不应被解读为 DNAT 只能与 SNAT 一起使用。但在常见的使用私有本地地址的配置中,这种使用是最常见的。
(FAQ 8) 我有多个外部 IP 地址,并使用 /etc/shorewall/nat 将它们与 DMZ 中的系统关联。当我添加 DNAT 规则,例如针对端口 80 和 443 时,Shorewall 会将这些端口的连接重定向到我所有的地址。我如何将 DNAT 限制为仅单个地址?
答:在 ORIGDEST 列中指定你想要重定向的外部地址。
示例:
1 | #ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST |
(FAQ 38) 哪里可以找到更多关于 DNAT 的信息?
答:Ian Allen 写了一篇关于 DNAT 和 Linux 的论文(http://idallen.com/dnat.txt)。
(FAQ 48) 如何使用 Shorewall 设置透明 HTTP 代理?
答:请参见 Shorewall_Squid_Usage.html (https://shorewall.org/Shorewall_Squid_Usage.html)。
- DNS and Port Forwarding/NAT——DNS 和端口转发/NAT
- Blacklisting——黑名单
- Netmeeting/MSN——Netmeeting/MSN
- Open Ports——开放端口
- Connection Problems——连接问题
- Logging——日志记录
- Routing——路由
- Starting and Stopping——启动和停止
- Multiple ISPs——多 ISP
- Using DNS Names——使用 DNS 名称
- Traffic Shaping——流量整形
- About Shorewall——关于 Shorewall
- Alias IP Addresses/Virtual Interfaces——别名 IP 地址/虚拟接口
- Shorewall Lite——Shorewall Lite
- VOIP——VOIP
- IPv6——IPv6
- Wifidog——Wifidog
- Miscellaneous——其他事项
谷歌机械翻译FAQs
1 | Shorewall 常见问题解答 |
If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !