Shorewall Firewall

Shorewall防火墙配置

Posted by Ryan Yim on 2024-07-27
Estimated Reading Time 201 Minutes
Words 51.1k In Total
Viewed Times

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 信息,请参阅该指南。

以下文章也推荐给新手阅读:

基础配置

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
2
#ACTION         SOURCE    DESTINATION     PROTO       DPORT
<宏>(ACCEPT) net $FW

重要提示 确保在添加规则时放在 SECTION NEW 行之后。

示例 1:你希望在防火墙系统上运行 Web 服务器和 IMAP 服务器

1
2
3
#ACTION     SOURCE    DESTINATION     PROTO       DPORT
Web(ACCEPT) net $FW
IMAP(ACCEPT) net $FW

你也可以选择直接编写规则,而不使用预定义的宏。如果没有适合你需求的预定义宏,这种方法是必要的。在这种情况下,/etc/shorewall/rules 中规则的一般格式是:

1
2
#ACTION   SOURCE    DESTINATION     PROTO       DPORT
ACCEPT net $FW <协议> <端口>

示例 2:你希望在防火墙系统上运行 Web 服务器和 IMAP 服务器

1
2
3
#ACTION   SOURCE    DESTINATION     PROTO       DPORT
ACCEPT net $FW tcp 80
ACCEPT net $FW tcp 143

如果你不知道特定应用程序使用哪个端口和协议,请参阅相关文档(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节 — 文件和概念

  1. accounting
    定义 IP 计费规则。

  2. actions
    声明用户定义的操作。

  3. addresses
    描述在 Shorewall 配置中如何指定 IP 地址和端口。

  4. arprules
    (在 Shorewall 4.5.12 中新增) 定义 ARP 过滤规则。

  5. blrules
    Shorewall 黑名单文件。

  6. conntrack
    指定连接帮助程序或豁免某些流量的 netfilter 连接跟踪。

  7. ecn
    禁用显式拥塞通知。

  8. exclusion
    从网络或区域中排除主机。

  9. files
    描述 Shorewall 配置文件及其用途。

  10. hosts
    定义通过单个接口访问的多个区域。

  11. interfaces
    定义系统接口,并可选择将其与区域关联。

  12. ipsets
    描述如何在 Shorewall 配置文件中指定集合名称。

  13. logging
    提供 Shorewall 数据包日志记录设施的概述。

  14. maclist
    定义 MAC 地址验证。

  15. mangle
    替代 tcrules,描述数据包和连接标记。

  16. masq
    定义伪装/SNAT(已被 snat 替代)。

  17. modules
    指定要加载的内核模块(在 Shorewall 5.2.3 中删除)。

  18. names
    描述 Shorewall 配置中的对象命名规则。

  19. nat
    定义一对一 NAT。

  20. nesting
    解释如何定义嵌套区域。

  21. netmap
    描述如何将地址从一个网络映射到另一个网络。

  22. params
    为其他 Shorewall 文件中使用的 shell 变量分配值。

  23. policy
    定义区域之间连接的高级策略。

  24. providers
    定义路由表,通常用于多个互联网链接。

  25. proxyarp
    定义 IPv4 的代理 ARP。

  26. proxyndp
    定义 IPv6 的代理 NDP。

  27. rtrules
    定义路由规则。

  28. routes
    (在 Shorewall 4.4.15 中新增) 向提供者路由表添加额外的路由。

  29. rules
    指定对策略的例外,包括 DNAT 和 REDIRECT。

  30. secmarks
    将 SELinux 上下文附加到数据包。

  31. snat
    定义伪装/SNAT。

  32. tcclasses
    定义用于流量整形的 HTB 类别。

  33. tcdevices
    指定用于流量整形的设备速度。

  34. tcfilters
    对流量进行分类以便整形,通常与 IFB 一起使用来整形流入流量。

  35. tcinterfaces
    指定用于简化流量整形的设备。

  36. tcpri
    对简化流量整形的流量进行分类。

  37. tunnels
    定义具有防火墙端点的 VPN 连接。

  38. shorewall.conf
    指定 Shorewall 的全局选项。

  39. shorewall6.conf
    指定 Shorewall6 的全局选项。

  40. shorewall-lite.conf
    指定 Shorewall Lite 的全局选项。

  41. shorewall6-lite.conf
    指定 Shorewall6 Lite 的全局选项。

  42. vardir
    重新定义 Shorewall 保存其状态信息的目录。

  43. vardir-lite
    重新定义 Shorewall Lite 保存其状态信息的目录。

  44. 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 文件中定义。每个区域都需要一个唯一的名称,并且指定其类型(如 ipv4ipv6firewall)。

1
2
3
#ZONE   TYPE
net ipv4
loc ipv4

解释: 上述示例中定义了两个区域: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} 的链中(例如,fw2fwfw-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 中新增。localipv4 相同,唯一的区别是该区域只能从防火墙和 vserver 区域访问。

选项 (OPTIONS)

这些选项是逗号分隔的列表。除 mssblacklist 选项外,这些选项仅适用于 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
2
3
4
5
6
7
8
9
10
11
12
13
#
# Shorewall version 4 - Zones File
#
# For information about this file, type "man shorewall-zones"
#
# The manpage is also online at
# http://www.shorewall.net/manpages/shorewall-zones.html
#
###############################################################################
#ZONE TYPE OPTIONS IN OUT
# OPTIONS OPTIONS
fw firewall
net ip

三接口示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#
# Shorewall - Sample Zones File for three-interface configuration.
# Copyright (C) 2006-2015 by the Shorewall Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# See the file README.txt for further details.
#------------------------------------------------------------------------------
# For information about entries in this file, type "man shorewall-zones"
###############################################################################
#ZONE TYPE OPTIONS IN OUT
# OPTIONS OPTIONS
fw firewall
net ipv4
loc ipv4
dmz ipv4

/etc/shorewall/interfaces

定义: interfaces 文件定义了网络接口及其与区域的关联。接口是实际的网络设备或虚拟接口,Shorewall 使用它们来确定数据流动的物理路径。

作用: 接口将实际的网络硬件(如网卡)与 Shorewall 的区域模型连接起来。它们告诉 Shorewall 哪些接口属于哪些区域,以及这些接口的附加选项(如是否启用路由回传)。

配置: 在 /etc/shorewall/interfaces 文件中定义。每个接口都需要指定所属区域及其他选项。

1
2
3
#ZONE   INTERFACE   OPTIONS
net eth0 dhcp,routeback
loc eth1 dhcp

解释: 上述示例中,eth0 接口被分配到 net 区域,并启用了 DHCP 和路由回传功能。eth1 接口被分配到 loc 区域,并启用了 DHCP。

接口(Interfaces): 是物理或虚拟的网络接口,实际连接到网络。它们与区域相关联,告诉 Shorewall 哪些接口属于哪些区域,以及如何处理这些接口的流量。

区域 (Zone)

  • Zone for this interface:必须匹配 /etc/shorewall/zones 文件中声明的区域名称。在这个列中不能列出防火墙区域。
  • 多个区域:如果接口服务于多个将在 shorewall-hosts(5) 文件中定义的区域,应在此列中放置“-”。(通常,一个接口只能属于一个区域,除非使用更高级的 Shorewall 配置(如 multi-ZONE 配置),否则这种配置会导致冲突和不明确的区域划分。)
  • 多个接口同一区域:如果有多个接口指向同一区域,必须在单独的条目中列出它们。
1
2
3
If the interface serves multiple zones that will be defined in the shorewall-hosts[1](5) file, you should place "-" in this column.

If there are multiple interfaces to the same zone, you must list them in separate entries.
1
2
3
4
5
6
7
8
# Shorewall interfaces file
# Zone Interface Options
net eth0 dhcp,routeback
loc eth1 optional
dmz eth2 -

# Interface for multiple zones
- eth3 -

解释

  • net 区域与 eth0 接口相关联,启用 DHCP 和 routeback 选项。
  • loc 区域与 eth1 接口相关联,并设置为可选。
  • dmz 区域与 eth2 接口相关联,没有额外选项。
  • eth3 接口服务于多个区域,因此在区域列中使用“-”。

接口(INTERFACE)

  1. 逻辑名称和端口
  • 接口名称:指定接口的逻辑名称。每个接口在文件中只能列出一次。例如,您可以使用 eth0eth1 等。
  • 端口:如果指定了端口,则接口必须之前定义为桥接接口(使用 bridge 选项)。在这种情况下,OPTIONS 列中不能包含一些特定的选项(见下文)。
  1. 虚拟接口
  • 虚拟接口:您不能在此列中指定虚拟接口(例如,eth0:0)。虚拟接口的配置有特殊要求,请参考 Shorewall FAQ 了解更多信息。
  1. 通配符
  • 通配符:可以使用通配符指定接口。例如,使用 ppp+ 可以匹配所有 PPP 接口,如 ppp0ppp1ppp2 等。
  • 旧版本警告:在 Shorewall 版本 4.1.4 之前使用通配符时,如果还有其他区域使用了匹配的具体接口,可能会引发问题。有关此问题的讨论,请参见 shorewall-nesting(5)
  1. + 作为接口名
  • 废弃用法:Shorewall 允许使用 + 作为接口名称,但这种用法已被废弃。建议使用 physical=+ 选项代替(在 OPTIONS 列中指定)。
  1. Loopback 接口
  • Loopback 接口:无需在此文件中定义 loopback 接口(lo)。在 Shorewall 4.5.17 及之后的版本中,如果为 lo 接口指定了区域,则该区域必须在 shorewall6-zones(5) 中定义为 local 类型。
  1. 不允许的选项(当指定了端口时)

如果在 INTERFACE 列中指定了端口,则以下选项不能出现在 OPTIONS 列中:

  • arp_filter
  • arp_ignore
  • bridge
  • log_martians
  • mss
  • optional
  • proxyarp
  • required
  • routefilter
  • sourceroute
  • upnp
  • wait

广播(BROADCAST)

  1. 值的选择
  • -:表示不为 BROADCAST 列提供值。如果在 OPTIONS 列中需要配置值,可以在 BROADCAST 列中使用 -
  • detect:Shorewall 会自动检测广播地址(适用于 FORMAT 1)。这要求您的 iptables 和内核支持地址类型匹配(Address Type Match)。如果您选择这个选项,Shorewall 将尝试自动识别和配置广播地址。
  • address[,address]...:指定一个或多个广播地址。您可以使用逗号分隔的地址列表来列出多个广播地址。如果接口有多个子网和地址,则应列出这些地址。如果接口是点对点(P-T-P),则此列应留空。
  1. 使用场景
  • FORMAT 1(已弃用):在此格式下,您需要提供广播地址。FORMAT 1 中的 BROADCAST 列允许指定广播地址或使用 detect 选项。
  • FORMAT 2(当前推荐):此格式省略了 BROADCAST 列,广播地址的配置不再需要明确列出。

选项(OPTIONS)

  1. 常见选项
  • 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 取值范围从 18,控制对 ARP 请求的响应策略。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    1 - 仅在目标 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
2
3
4
#ZONE   INTERFACE BROADCAST        OPTIONS
net eth0 206.191.149.223 dhcp
loc eth1 192.168.1.255
dmz eth2 192.168.2.255

示例 2

相同配置,但不指定广播地址:

FORMAT 2:

1
2
3
4
#ZONE   INTERFACE OPTIONS
net eth0 dhcp
loc eth1
dmz eth2

示例 3

你有一个简单的拨号系统,没有以太网连接。

FORMAT 2:

1
2
#ZONE   INTERFACE OPTIONS
net ppp0 -

示例 4 (Shorewall 4.4.9 及以后版本)

你有一个没有 IP 地址的桥接设备,并且你想允许流量通过桥接设备。

FORMAT 2:

1
2
#ZONE   INTERFACE OPTIONS
- br0 bridge

解释

  1. FORMAT 1: 这种格式需要显式指定广播地址。适用于需要手动设置广播地址的环境,通常在老旧系统或不支持自动检测的环境中使用。

  2. FORMAT 2: 这种格式省略了广播地址的指定,适用于较新版本的 Shorewall,能够自动处理广播地址的环境。

  3. 拨号系统: 对于拨号连接(如 PPP 接口),可以用 - 代替广播地址。

  4. 桥接设备: 在配置没有 IP 地址的桥接设备时,使用 bridge 选项来指定该接口为桥接设备。

Universal示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#
# Shorewall version 4 - Interfaces File
#
# For information about entries in this file, type "man shorewall-interfaces"
#
# The manpage is also online at
# http://www.shorewall.net/manpages/shorewall-interfaces.html
#
###############################################################################
?FORMAT 2
###############################################################################
#ZONE INTERFACE OPTIONS
- lo ignore
net all dhcp,physical=+,routeback

三接口示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#
# Shorewall - Sample Interfaces File for three-interface configuration.
# Copyright (C) 2006-2017 by the Shorewall Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# See the file README.txt for further details.
#------------------------------------------------------------------------------
# For information about entries in this file, type "man shorewall-interfaces"
###############################################################################
?FORMAT 2
###############################################################################
#ZONE INTERFACE OPTIONS
net NET_IF tcpflags,dhcp,nosmurfs,routefilter,logmartians,sourceroute=0,physical=eth0
loc LOC_IF tcpflags,nosmurfs,routefilter,logmartians,physical=eth1
dmz DMZ_IF tcpflags,nosmurfs,routefilter,logmartians,physical=eth2

/etc/shorewall/policy

功能: policy 文件用于定义默认的策略。它确定了默认情况下防火墙如何处理流量,通常是那些没有被 rules 文件中的具体规则所处理的流量。换句话说,policy 文件定义了“默认行为”,即当没有匹配到特定规则时,防火墙应采取的行动。

内容: 策略通常包括源区域、目的区域以及默认行为(如 ACCEPT、DROP、REJECT)。你可以设置不同区域之间的默认流量处理方式。

描述

这个文件定义了在 shorewall-zones(5) 中定义的区域之间的高层次连接策略。

重要

文件中的条目顺序很重要

这个文件决定了如果在 shorewall-blrules(5)shorewall-rules(5) 文件中没有匹配到新连接请求时该如何处理。对于每一对源/目的地,文件按顺序处理,直到找到匹配项(”all” 将匹配任何源或目的地)。

重要

区域间的策略是预定义的

对于 $FWshorewall-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。
  • 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 开始,sd 可以后跟一个斜杠 (“/) 和一个整数 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 中的所有主机上进行计算。

示例

  1. 允许从本地网络到互联网的所有连接

  2. 忽略来自互联网的所有连接,但在 syslog 级别 KERNEL.INFO 记录这些连接

  3. 拒绝所有其他连接请求,并在级别 KERNEL.INFO 记录这些请求

1
2
3
4
5
6
7
8
#SOURCE         DEST            POLICY          LOG           BURST:LIMIT
# LEVEL
loc net ACCEPT
net all DROP info
#
# THE FOLLOWING POLICY MUST BE LAST
#
all all REJECT info

解释:

  • locnet 的连接被接受 (ACCEPT)。即所有来自本地网络 (loc) 的连接可以访问互联网 (net)。

  • netall 的连接被丢弃 (DROP),并在日志中记录为 info 级别。这表示来自互联网 (net) 的连接请求将被忽略,但会以 info 级别记录到 syslog。

  • 最后的规则处理所有其他连接请求:allall 的连接请求将被拒绝 (REJECT),并以 info 级别记录。这确保了任何不符合前面规则的连接请求将被拒绝,并记录到日志中。

Universal示例

1
2
3
4
5
6
7
8
9
10
11
12
#
# Shorewall version 4 - Policy File
#
# For information about entries in this file, type "man shorewall-policy"
#
# The manpage is also online at
# http://www.shorewall.net/manpages/shorewall-policy.html
#
###############################################################################
#SOURCE DEST POLICY LOGLEVEL RATE CONNLIMIT
$FW net ACCEPT
net all DROP $LOG_LEVEL

三接口示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#
# Shorewall - Sample Policy File for three-interface configuration.
# Copyright (C) 2006-2015 by the Shorewall Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# See the file README.txt for further details.
#------------------------------------------------------------------------------
# For information about entries in this file, type "man shorewall-policy"
###############################################################################
#SOURCE DEST POLICY LOGLEVEL RATE CONNLIMIT

loc net ACCEPT
net all DROP $LOG_LEVEL
# THE FOLLOWING POLICY MUST BE LAST
all all REJECT $LOG_LEVEL

/etc/shorewall/rules

功能: rules 文件用于定义具体的流量规则。这些规则决定了如何处理进入和离开防火墙的流量。你可以在这个文件中指定哪些流量允许通过,哪些流量被阻止或拒绝。

内容: 规则通常包括源地址、目的地址、协议、端口号等信息。例如,你可以设置规则来允许从特定 IP 地址访问特定端口,或者阻止来自某个子网的所有流量。

描述

此文件中的条目通过定义对 shorewall-policy(5) 中规定的策略的例外来管理连接的建立。默认情况下,使用连接跟踪会自动允许后续的请求和响应。对于特定的(源,目的地)区域对,规则按它们在文件中的出现顺序进行评估,第一个终止匹配的规则决定请求的处理方式。所有规则都是终止规则,除了 LOGCOUNT 规则。

警告

如果你从本地系统到互联网使用了伪装或源地址转换(SNAT),你不能使用 ACCEPT 规则来允许来自互联网的流量进入该系统。你必须使用 DNAT 规则。

文件结构

规则文件被分成多个部分。每个部分由“部分头”引入,部分头是一行以 ?SECTION 开头,后面跟着部分名称。

部分列表(按照列出的顺序出现):

  1. 默认策略
  2. 例外规则
  3. 日志规则
  4. 计数规则

每个部分的具体内容如下:

  • 默认策略:定义基本的处理策略,适用于所有未被其他规则覆盖的连接。
  • 例外规则:定义对默认策略的例外情况。
  • 日志规则:定义用于记录连接尝试的规则。
  • 计数规则:定义用于计数和限制连接的规则。

规则文件的结构

?SECTION

规则文件被分成多个部分,每个部分由“部分头”引入,部分头是一行以 ?SECTION 开头,后面跟着部分名称。部分的顺序非常重要,必须按照以下列出的顺序出现:

  1. ALL

    • 此部分在 Shorewall 4.4.23 中添加。该部分中的规则将被应用于所有连接请求,无论数据包的连接跟踪状态如何,并且在其他部分的规则之前应用。
  2. ESTABLISHED

    • 处理处于 ESTABLISHED 状态的数据包的规则。
    • 该部分中允许的操作(ACTION)包括 ACCEPT、DROP、REJECT、LOG、NFLOG、NFQUEUE 和 QUEUE。
    • 此部分的末尾会隐式添加一个 ACCEPT 规则。
  3. RELATED

    • 处理处于 RELATED 状态的数据包的规则。
    • 该部分中允许的操作(ACTION)包括 ACCEPT、DROP、REJECT、LOG、NFLOG、NFQUEUE 和 QUEUE。
    • 此部分的末尾会隐式添加一个规则,该规则调用 RELATED_DISPOSITION(参见 shorewall.conf(5))。
  4. INVALID

    • 在 Shorewall 4.5.13 中添加。处理处于 INVALID 状态的数据包的规则。
    • 该部分中允许的操作(ACTION)包括 ACCEPT、DROP、REJECT、LOG、NFLOG、NFQUEUE 和 QUEUE。
    • 此部分的末尾会隐式添加一个规则,该规则调用 INVALID_DISPOSITION(参见 shorewall.conf(5))。
  5. UNTRACKED

    • 在 Shorewall 4.5.13 中添加。处理处于 UNTRACKED 状态的数据包的规则。
    • 该部分中允许的操作(ACTION)包括 ACCEPT、DROP、REJECT、LOG、NFLOG、NFQUEUE 和 QUEUE。
    • 此部分的末尾会隐式添加一个规则,该规则调用 UNTRACKED_DISPOSITION(参见 shorewall.conf(5))。
  6. NEW

    • 处理处于 NEW 状态的数据包的规则。如果 INVALID 和/或 UNTRACKED 部分为空或未包含,则对应状态的数据包也会在此部分中处理。
    • 注意:如果你对 Netfilter 的各种连接跟踪状态不够熟悉,建议将所有规则放在 NEW 部分(即在 ?SECTION NEW 行之后)。

注意事项

  • 如果你在 shorewall.conf(5) 中指定了 FASTACCEPT=Yes,则 ALL、ESTABLISHED 和 RELATED 部分必须为空。

    例外情况是,如果你运行的是 Shorewall 4.4.27 或更高版本,并且你为 RELATED_DISPOSITIONRELATED_LOG_LEVEL 指定了非默认值,则可以在 RELATED 部分中包含规则。

  • 你可以省略任何不需要的部分。如果文件中没有出现任何部分头,则所有规则将被视为在 NEW 部分中。

规则定义注意事项

在定义重写目标 IP 地址和/或端口号的规则(即 DNAT 和 REDIRECT 规则)时,重要的是要区分文件中哪些列指定了重写前的数据包特征,哪些列指定了重写后的数据包特征:

  • DEST 列 指定了重写后数据包的最终目标,可以包括最终的 IP 地址和/或端口号。
  • 其余列指定了重写前数据包的特征。特别是,ORIGDEST 列 给出了数据包的原始目标 IP 地址,DPORT 列 给出了原始目标端口。

这是文件中的列说明(其中列名后跟一个不同的名称,括号中的不同名称用于备用规格语法):

ACTION - target[:{log-level|none}[!][:tag]]

以下是对匹配规则的连接请求采取的操作。target 必须是以下之一。

  1. ACCEPT:允许连接请求。

  2. ACCEPT+:类似于 ACCEPT,但还排除了该连接在后续匹配的任何 DNAT[-] 或 REDIRECT[-] 规则。使用 IPv6 需要 Shorewall 4.5.14 或更高版本。

  3. ACCEPT!:类似于 ACCEPT,但规则在 shorewall.conf(5) 中通过 OPTIMIZE=1 设置时,不会被抑制。

    action

    在[ shorewall-actions(5) ](https://shorewall.org/manpages/shorewall-actions.html或 /usr/share/shorewall[6]/actions.std 中声明的操作名称。

  4. ADD(*ipset*:*flags*[:*timeout*])

    在 Shorewall 4.4.12 中添加。使地址和/或端口号添加到指定的 ipset 中。标志指定要添加到集合中的地址或元组,必须与所涉及的 ipset 类型匹配。例如,对于 iphash ipset,可以使用 src 或 dst 标志分别添加源地址或目标地址(请参见 ipset (8) 中的 -A 命令)。
    从 Shorewall 5.0.3 开始,可以指定一个可选的超时。这是 ipset 中新条目保持有效的秒数,覆盖创建 ipset 时指定的任何超时。
    ADD 是非终止的。即使数据包匹配规则,也会传递到下一个规则。

  5. AUDIT[(accept|drop|reject)]:在 Shorewall 4.5.10 中添加。按指定类型审核数据包;如果省略类型,则假定为 drop。需要内核和 iptables 中的 AUDIT_TARGET 支持。

  6. A_ACCEPT, A_ACCEPT**+ and A_ACCEPT**!:在 Shorewall 4.4.20 中添加。分别是 ACCEPT、ACCEPT+ 和 ACCEPT! 的审计版本。需要内核和 iptables 中的 AUDIT_TARGET 支持。A_ACCEPT+ 使用 IPv6 需要 Shorewall 4.5.14 或更高版本。

  7. A_DROP and A_DROP!:在 Shorewall 4.4.20 中添加。分别是 DROP 和 DROP! 的审计版本。需要内核和 iptables 中的 AUDIT_TARGET 支持。

  8. A_REJECT AND A_REJECT!:在 Shorewall 4.4.20 中添加。分别是 REJECT 和 REJECT! 的审计版本。需要内核和 iptables 中的 AUDIT_TARGET 支持。

  9. ?COMMENT:该行的其余部分将作为注释附加到由以下条目生成的 Netfilter 规则中。在 “shorewall show ” 的输出中,注释将用 “//“ 分隔。要阻止注释附加到后续规则,只需在单独一行中包含 ?COMMENT。

  10. CONMARK({*mark*}):在 Shorewall 5.0.7 中添加,CONNMARK 与 MARK 相同,只不过标记的是连接而不是数据包。

  11. CONTINUE:仅适用于专家。不要处理此(源区域,目标区域)的任何后续规则。如果源和/或目标 IP 地址落入 shorewall-zones(5) 中稍后定义的区域或源或目标区域的父区域中,则该连接请求将传递给为该(些)区域定义的规则。有关更多信息,请参见 shorewall-nesting(5)。

  12. CONTINUE!:类似于 CONTINUE,但该规则不会被 shorewall.conf(5) 中的 OPTIMIZE=1 抑制。

  13. COUNT:仅增加规则的数据包和字节计数,然后将数据包传递到下一条规则。

  14. DEL(*ipset*:*flags*):在 Shorewall 4.4.12 中添加。从指定的 ipset 中删除一个条目。标志指定要从集合中删除的地址或元组,并且必须匹配涉及的 ipset 类型。例如,对于 iphash ipset,可以分别使用 src 或 dst 标志删除源或目标地址(参见 ipset(8) 中的 -D 命令)。DEL 是非终止的。即使数据包匹配规则,它也会传递到下一条规则。

  15. DNAT:将请求转发到另一系统(可选地到另一个端口)。使用 IPv6 需要 Shorewall 4.5.14 或更高版本。

  16. DNAT-:仅限高级用户。类似于 DNAT,但只生成 DNAT iptables 规则,而不生成伴随的 ACCEPT 规则。使用 IPv6 需要 Shorewall 4.5.14 或更高版本。

  17. DROP:忽略请求。

  18. DROP!:类似于 DROP,但该规则不会被 shorewall.conf(5) 中的 OPTIMIZE=1 抑制。

  19. HELPER:在 Shorewall 4.5.7 中添加。该操作要求 HELPER 列包含要与匹配此连接的连接关联的 Netfilter 帮助程序的名称。只能在 NEW 部分中指定,并且在适用的策略为 ACCEPT 时非常有用。在 HELPER 规则中不应指定目标区域。

  20. 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 列中指定了地址,它们生成的匹配项将出现在使用 ‘;;’ 或 ‘;’ 指定的匹配项之后。
  21. 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 时使用。

  22. 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 时使用。

  23. LOG:*level*:仅记录数据包并继续处理下一个规则。

    macro**[(*macrotarget*)]**

    指定在名为 macro.macro 的文件中定义的宏。如果宏接受一个操作参数(查看宏源代码以确定其 TARGET 列中是否有 PARAM),则宏名称后跟带括号的 macrotarget(ACCEPT、DROP、REJECT 等),作为参数的替代。

    示例:FTP(ACCEPT)。

    以前的语法,其中宏名称和目标通过斜杠分隔(例如,FTP/ACCEPT),仍然允许使用,但已被弃用。

  24. MARK({*mark*})

    指定一个数据包标记值。

    在 Shorewall 5.0.7 中添加,MARK 需要内核和 iptables 中的 “Mark in filter table” 支持。

    通常会设置当前数据包的标记值。如果前面有一个竖线 (“|”),则标记值将与当前标记值进行逻辑 OR 运算以产生新的标记值。如果前面有一个&符号 (“&”),则将与当前标记值进行逻辑 AND 运算以产生新的标记值。

    “|” 和 “&” 都需要内核和 iptables 中的 Extended MARK Target 支持。

    标记值后面可以选择性地跟一个 “/“ 和一个掩码值(用于确定实际设置的连接标记位)。当指定掩码时,将标记值与掩码进行逻辑 AND 运算的结果必须与标记值相同。

  25. 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 时,日志级别不会改变,而调用该动作或宏时指定了日志级别。

  26. 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 功能。

  27. NFQUEUE![([queuenumber1[:queuenumber2[c]][,bypass]]|bypass)]:与 NFQUEUE 类似,但排除了规则被 shorewall.conf 中的 OPTIMIZE=1 配置抑制的情况。

  28. NONAT:将连接排除在任何后续的 DNAT[-] 或 REDIRECT[-] 规则之外,但不生成接收流量的规则。使用 IPv6 时需要 Shorewall 4.5.14 或更高版本。

  29. QUEUE:将数据包排队到用户空间应用程序(例如 ftwall)。应用程序可以重新插入数据包以进行进一步处理。

  30. QUEUE!:类似于 QUEUE,但免于被 shorewall.conf(5) 中的 OPTIMIZE=1 设置抑制。

  31. 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)
  32. REJECT!:类似于 REJECT,但免于被 shorewall.conf(5) 中的 OPTIMIZE=1 设置抑制。

  33. REDIRECT:将请求重定向到运行在防火墙上的服务器。使用 IPv6 时需要 Shorewall 4.5.14 或更高版本。

  34. REDIRECT-:高级用户专用。类似于 REDIRECT,但仅生成 REDIRECT iptables 规则,而不生成伴随的 ACCEPT 规则。使用 IPv6 时需要 Shorewall 4.5.14 或更高版本。

  35. 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(重置)。没有其他功能。

  36. 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

      当在 SOURCEDEST 列中使用“none”时,规则将被忽略。

    • 类似于 allany,在列出多个区域时,区域内流量通常会被排除。通过在列表末尾添加加号(“+”),可以包括区域内流量。

    • allany 可以跟随感叹号(“!”)和逗号分隔的区域名称列表,以排除指定的区域。

  • 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:&eth0

    防火墙区域中 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 列时,规则被忽略。

    • allany 可以用感叹号 (!) 和逗号分隔的区域名称列表来排除某些区域。

  • 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:&eth0

    匹配防火墙区域中 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 规则:

    1. 列表中列出了 15 个或更少的端口。
    2. 不包含端口范围,或你的内核和 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 规则:

    1. 列表中列出了 15 个或更少的端口。
    2. 不包含端口范围,或你的内核和 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 开始,sd 后可以跟斜杠(”/“)和一个整数 VLSM。当指定了 VLSM 时,所有遇到的源或目标地址将根据给定的前缀长度进行分组,创建的子网将受到速率限制。

    示例:s/24::10/sec

  • 从 Shorewall 4.6.5 开始,可以指定两个限制,用逗号分隔。在这种情况下,第一个限制(name1rate1burst1)指定每个源 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 由以下列表中的标头组成,使用逗号分隔:

  • authah51
    认证头扩展标头。

  • esp50
    加密安全负载扩展标头。

  • hophop-by-hop0
    按跳选项扩展标头。

  • routeipv6-route43
    IPv6 路由扩展标头。

  • fragipv6-frag44
    IPv6 分片扩展标头。

  • noneipv6-nonxt59
    无下一个标头。

  • protoprotocol255
    任何协议标头。

如果指定了 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#
# Shorewall version 4 - Rules File
#
# For information on the settings in this file, type "man shorewall-rules"
#
# The manpage is also online at
# http://www.shorewall.net/manpages/shorewall-rules.html
#
######################################################################################################################################################################################################
#ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/ MARK CONNLIMIT TIME HEADERS SWITCH HELPER
# PORT PORT(S) DEST LIMIT GROUP
?SECTION ALL
?SECTION ESTABLISHED
?SECTION RELATED
?SECTION INVALID
?SECTION UNTRACKED
?SECTION NEW
Invalid(DROP) net $FW tcp
SSH(ACCEPT) net $FW
Ping(ACCEPT) net $FW

三接口示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#
# Shorewall - Sample Rules File for three-interface configuration.
# Copyright (C) 2006-2015 by the Shorewall Team
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# See the file README.txt for further details.
#--------------------------------------------------------------------------------------------------------
# For information about entries in this file, type "man shorewall-rules"
######################################################################################################################################################################################################
#ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/ MARK CONNLIMIT TIME HEADERS SWITCH HELPER
# PORT PORT(S) DEST LIMIT GROUP
?SECTION ALL
?SECTION ESTABLISHED
?SECTION RELATED
?SECTION INVALID
?SECTION UNTRACKED
?SECTION NEW

# Don't allow connection pickup from the net
#
Invalid(DROP) net all tcp
#
# Accept DNS connections from the firewall to the Internet
#
DNS(ACCEPT) $FW net
#
#
# Accept SSH connections from the local network to the firewall and DMZ
#
SSH(ACCEPT) loc $FW
SSH(ACCEPT) loc dmz
#
# DMZ DNS access to the Internet
#
DNS(ACCEPT) dmz net


# Drop Ping from the "bad" net zone.

Ping(DROP) net $FW

#
# Make ping work bi-directionally between the dmz, net, Firewall and local zone
# (assumes that the loc-> net policy is ACCEPT).
#

Ping(ACCEPT) loc $FW
Ping(ACCEPT) dmz $FW
Ping(ACCEPT) loc dmz
Ping(ACCEPT) dmz loc
Ping(ACCEPT) dmz net

ACCEPT $FW net icmp
ACCEPT $FW loc icmp
ACCEPT $FW dmz icmp

# Uncomment this if using Proxy ARP and static NAT and you want to allow ping from
# the net zone to the dmz and loc

#Ping(ACCEPT) net dmz
#Ping(ACCEPT) net loc

See ALSO

shorewall-logging(5)

https://shorewall.org/ipsets.html

https://shorewall.org/configuration_file_basics.htm#Pairsee ALSO

shorewall-logging(5)

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 开始,您可以在此列中指定 prohibitunreachable 以分别创建禁止路由或不可达路由。

  • DEVICE (可选)
    指定设备路由。如果未指定 DEVICE 或 GATEWAY,则使用在 shorewall-providers (5) 中为 PROVIDER 指定的 INTERFACE。如果在 GATEWAY 列中指定了 blackholeprohibitunreachable,则此列必须省略。

  • OPTIONS (可选)
    从 Shorewall 5.0.2 开始增加。

    允许的选项包括:

    • persistent
      如果指定,则即使提供者被禁用,该路由仍保留在提供者的路由表中。
1
2
3
# PROVIDER  DESTINATION    GATEWAY          DEVICE   OPTIONS
internet 192.168.1.0/24 192.168.0.1 eth0 persistent
vpn 10.0.0.0/24 blackhole

/etc/shorewall/hosts

在 Shorewall 的配置中,shorewall-zones 文件用于定义区域 (zones) 以及这些区域的子网和/或单独的 IP 地址。这个文件对大多数简单设置不是必需的,但当你有多个区域通过一个接口连接时,它就变得非常重要。

文件描述

这个文件的主要作用是将网络区域与其相应的子网或 IP 地址关联起来。通常情况下,简单的网络设置不需要在这个文件中放置任何内容。然而,当涉及到通过单一接口连接多个区域时,这个文件变得重要。

文件的结构和使用

  • 文件的顺序: 文件中条目的顺序对区域的组成没有影响。实际上,shorewall-zones 文件中的区域声明顺序决定了记录在文件中的解释顺序。
  • 警告:
    • 如果在 shorewall-interfaces 文件中有针对特定区域和接口的条目,则不应在这个文件中为相同的区域和接口对添加任何条目。
    • 只有在多个区域通过单一接口连接时,才需要这个文件。

列的说明

以下是 shorewall-zones 文件中各列的说明:

  1. ZONE: 该列指定了区域的名称。区域名称应与 shorewall-zones 文件中的区域定义相匹配。
  2. NETS: 该列列出了与区域相关联的子网或 IP 地址。多个子网或 IP 地址用逗号分隔。例如,可以指定一个子网 192.168.1.0/24,或者多个子网 192.168.1.0/24,192.168.2.0/24
  3. 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 addshorewall 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
2
#ZONE       HOST(S)               OPTIONS
vpn ppp+:192.168.3.0/24
1
2
3
4
5
6
7
8
# ZONE     HOST(S)                         OPTIONS
loc enxa446b4906694:192.168.1.0/24
net enxa446b4906694:!192.168.1.0/24

# ZONE INTERFACE OPTIONS
- lo ignore
loc enxa446b4906694 dhcp,nosmurfs,routefilter,logmartians
net enxa446b4906694 dhcp,nosmurfs,routefilter,logmartians

Debian:已知问题

/usr/share/doc/shorewall/known_problems.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1) 在运行 Upstart 的系统上,shorewall-init 不能在接口启动之前可靠地保护防火墙。
2) 'enable''reenable''disable' 命令在配置中 USE_DEFAULT_RT=No 和 DUPLICATE 列中列出的可选提供程序的情况下无法正常工作。
3) 尽管 'ip' 工具现在接受具有多个 'nexthop' 目的地的 IPv6 路由,这些路由并没有被平衡。它们被实例化为具有不同度量的单一路由序列。此外,'ip route replace' 命令在这些路由上失败。从 Shorewall6 5.0.15 开始,生成的脚本使用 "delete..add.." 序列而不是单个 "replace" 命令。
4) 如果在策略文件条目中排除了多个区域,会出现类似以下的错误:
ERROR: 'all' is not allowed in a source zone list
/etc/shorewall/policy (line 8)
在 Shorewall 5.2.3.1 中已修正。
5) Shorewall 5.2 会自动将现有的 'masq' 文件转换为等效的 'snat' 文件。遗憾的是,Shorewall 5.2.3 破坏了这一自动更新,导致出现以下错误消息:
Use of uninitialized value $Shorewall::Nat::rawcurrentline in
pattern match (m//) at /usr/share/shorewall/Shorewall/Nat.pm
line 511, <$currentfile> line nnn.
并且生成的 'masq' 文件仅包含初始注释。
解决方法:
升级到 5.2.3 后,执行以下命令:
'shorewall[6] update'
5.2.3.2 中已修正。
6) 如果在 SPORT 列中列出了一个 ipset,编译器会引发类似以下的错误:
ERROR: Invalid ipset name () /etc/shorewall/rules (line 44)
5.2.3.3 中已修正。
7) 如果使用多队列 NFQUEUE(例如,NFQUEUE(0:1))作为策略,会错误地引发类似以下的错误:
ERROR: Invalid policy (NFQUEUE(0) /etc/shorewall/policy (line 15)
5.2.3.4 中已修正。
8) 如果将多队列 NFQUEUE(例如,NFQUEUE(0:1,bypass))传递给宏,会错误地引发类似以下的错误:
ERROR: Invalid ACTION (PARAM:1c,bypass)))
/usr/share/shorewall/macro.BitTorrent (line 12)
from /etc/shorewall/rules (line 40)
5.2.3.4 中已修正。
9) 如果 shorewall[6].conf 未设置 AUTOMAKE,'update' 命令将生成一个带有 'AUTOMAKE=Yes' 的新文件。这会导致意外的行为变化。
5.2.3.4 中已修正。
10) Shorewall-rules(5) 错误地声明了 NFQUEUE 的 'bypass' 选项,如果没有附加应用程序到队列,则规则会被静默跳过。实际行为是规则像 ACCEPT 一样处理。
5.2.3.4 中已修正。

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’ 时,我的更改没有应用到正在运行的规则集中。为什么会这样?

回答:这种情况发生在以下情况下:

  1. 你使用了 INCLUDE (?INCLUDE)。
  2. 包含的文件位于 /etc/shorewall[6] 的子目录中或单独的目录中。
  3. 你在 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
2
#ACTION    SOURCE      DEST                                   PROTO        DPORT
DNAT net loc:local-IP-address[:local-port] protocol port-number

所以,要将 UDP 端口 7777 转发到内部系统 192.168.1.5,规则是:

1
2
#ACTION    SOURCE   DEST             PROTO    DPORT
DNAT net loc:192.168.1.5 udp 7777

如果要将请求定向到防火墙上的特定地址(external-IP)并转发到内部系统:

1
2
#ACTION SOURCE DEST                                   PROTO       DPORT         SPORT   ORIGDEST
DNAT net loc:local-IP-address[:local-port] protocol port-number - external-IP

如果要将来自特定互联网地址(address)的请求转发:

1
2
#ACTION SOURCE        DEST                                   PROTO       DPORT         SPORT   ORIGDEST
DNAT net:address loc:local-IP-address[:local-port] protocol port-number -

最后,如果需要转发一段端口,在 DEST PORT 列中指定范围为 low-port。

重要: 上述方法不适用于从本地网络转发。如果需要这样做,请参阅 FAQ 2(https://shorewall.org/FAQ.htm#faq2)。

(FAQ 1a)好的,我按照说明操作,但它不起作用。

回答:这通常是以下五个原因之一造成的:

  1. 您尝试重定向一个 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
  2. 您尝试从防火墙内部进行测试(不,这不行,请参阅“(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)

  3. 您的本地系统(您尝试转发到的系统)存在更基本的问题,例如默认网关错误(必须设置为防火墙内部接口的 IP 地址;如果由于某种原因不可能,请参阅 FAQ 1f)。

  4. 您的 ISP 正在阻止该特定端口的入站流量,或者,对于 TCP,您的 ISP 正在丢弃出站的 SYN,ACK 响应。

  5. 您运行的是 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
2
#ACTION SOURCE DEST PROTO DPORT
DNAT net loc:192.168.1.3:22 tcp 1022

(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
2
#ACTION SOURCE DEST PROTO DPORT
DNAT net fw:192.168.1.1:22 tcp 4104

(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。

这导致以下事件序列:

  1. 16.105.221.4 向 206.124.146.176 发送一个目标端口为 21 的 TCP SYN 数据包。

  2. Shorewall 防火墙将目标 IP 地址重写为 192.168.1.4 并转发数据包。

  3. 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
2
#INTERFACE              SOURCE             ADDRESS         PROTO   PORT
eth1:192.168.1.4 0.0.0.0/0 192.168.1.1 tcp 21

在 Shorewall 5.0.14 或更高版本中,等效的 /etc/shorewall/snat 文件规则是:

1
2
#ACTION                 SOURCE              DEST              PROTO  PORT
SNAT(192.168.1.1) 0.0.0.0/0 eth1:192.168.1.4 tcp 21

这个规则有一个不良副作用,即所有来自网络的 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
2
3
4
5
6
7
8
9
10
#ACTION    SOURCE        DEST                   PROTO    DPORT   SPORT   ORIGDEST

?SECTION ALL
?SECTION ESTABLISHED
?SECTION RELATED
?SECTION INVALID
?SECTION UNTRACKED
?SECTION NEW

DNAT net net:66.249.93.111:993 tcp 80 - 206.124.146.176

在 /etc/shorewall/interfaces 中,指定 eth0 上的 routeback 选项:

1
2
3
?FORMAT 2
#ZONE INTERFACE OPTIONS
net eth0 routeback

在 /etc/shorewall/masq 中:

1
2
#INTERFACE              SOURCE          ADDRESS         PROTO   PORT
eth0:66.249.93.111 0.0.0.0/0 206.124.146.176 tcp 993

当运行 Shorewall 5.0.14 或更高版本时,等效的 /etc/shorewall/snat 文件是:

1
2
#ACTION                 SOURCE          DEST                PROTO   PORT
SNAT(206.124.146.176) 0.0.0.0/0 eth0:66.249.93.111 tcp 993

并在 /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
2
#ACTION         SOURCE          DEST            PROTO   DPORT
REDIRECT net 22 tcp 9022

请注意,上述规则也将允许来自 net 的连接访问 TCP 端口 22。如果你不希望这样,请参见 FAQ 1e。

(FAQ 1j) 为什么这个 DNAT 规则不起作用?

我添加了这个规则,但仍然看到以下日志消息:

规则:

1
DNAT           scnet:172.19.41.2       dmz0:10.199.198.145             udp     2055

日志:

1
2
3
Sep 21 12:55:37 fw001 kernel: [10357687.114928] Shorewall:scnet2fw:DROP:IN=eth2 OUT=
MAC=00:26:33:dd:aa:05:00:24:f7:19:ce:44:08:00 SRC=172.19.41.2 DST=172.19.1.1 LEN=1492
TOS=0x00 PREC=0x00 TTL=63 ID=23035 PROTO=UDP SPT=6376 DPT=2055 LEN=1472

答:在你添加规则之前,已经存在一个 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
2
#ACTION         SOURCE          DEST                    PROTO   DPORT   SPORT   ORIGDEST
DNAT net net:192.168.4.22 tcp 80,443 - 206.124.146.178

(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)。

谷歌机械翻译FAQs

https://shorewall.org/FAQ.htm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
Shorewall 常见问题解答
Shorewall 社区
汤姆· 伊斯特普

版权所有 © 2001-2016 Thomas M. Eastep

根据自由软件基金会发布的 GNU 自由文档许可证 1.2 版或任何后续版本的条款,允许复制、分发和/或修改本文档;无固定章节、无封面、无封底文字。许可证副本包含在题为“ GNU 自由文档许可证” 的部分中。

2020/07/25

目录

安装 Shorewall
升级 Shorewall
端口转发(端口重定向)
DNS 和端口转发/NAT
黑名单
网络会议/MSN
开放端口
连接问题
日志记录
路由
启动和停止
多个 ISP
使用 DNS 名称
流量整形
关于 Shorewall
别名 IP 地址/虚拟接口
Shorewall Lite
网络电话
IPv6
无线狗
各种各样的

警告

本文适用于 Shorewall 4.4 及更高版本。如果您运行的是 Shorewall 4.4.0 之前的版本,请参阅该版本的文档。
安装 Shorewall
在哪里可以找到分步安装和配置说明?

答案:查看快速入门指南。
(常见问题 92 Shorewall 有很多软件包;我应该安装哪一个?

答案:首次安装 Shorewall 4.4.0 或更高版本时,必须安装shorewall软件包。如果要配置 IPv6 防火墙,还必须安装shorewall6。从 Shorewall 4.5 开始,必须先安装shorewall-core软件包。
(常见问题解答 92a)有人曾告诉我安装 shorewall-perl;有什么用吗?

答案:这是 Shorewall 4.2 及更早版本中的好建议。在那些版本中,有两个软件包提供基本的防火墙功能: shorewall-shell和shorewall-perl。从 Shorewall 4.4.0 开始, shorewall-shell已停用, shorewall-perl已重命名为shorewall。
(常见问题 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并修改副本即可。
(常见问题 37a)我刚刚在 Debian 上安装了 Shorewall,但找不到示例配置。

回答:从 Shorewall 4.4 开始,示例位于 shorewall 包中,并安装在 中/usr/share/doc/shorewall/examples/。
(常见问题 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。
(常见问题 1.5)安装最新版本(> 5.1.10.1)的 Shorewall 后,当我更改配置并执行“shorewall reload”或“shorewall restart”时,我的更改未出现在正在运行的规则集中。为什么会发生这种情况?

答案:这种情况发生在:

您使用 INCLUDE (?INCLUDE)。

包含的文件位于 /etc/shorewall[6] 的子目录或单独的目录中。

在shorewall[6].conf(5)中已将 AUTOMAKE=Yes 设置成

AUTOMAKE=Yes 时,编译器会在 CONFIG_PATH 中的每个目录中查找比上次生成的防火墙脚本更新的文件。如果没有找到,则按原样使用旧脚本。在 5.1.10.2 之前的版本中,该搜索是递归的,因此会自动搜索 /etc/shorewall[6] 子目录中的更改。如果 CONFIG_PATH 上的目录嵌套很深,这会影响性能。因此,从 5.1.10.2 版本开始,只搜索目录本身。您可以通过设置 AUTOMAKE=recursive AUTOMAKE= 来恢复 5.1.10.2 之前的行为integer,其中 integer 指定搜索深度。如果您包含的文件位于单独的目录中,则必须将该目录添加到 CONFIG_PATH 才能使 AUTOMAKE 正常工作。
升级 Shorewall
(常见问题 66)我正在尝试升级到 Shorewall 4.x 或更高版本;我需要安装以下哪些软件包?

答:请参阅升级问题。
(常见问题 34)我尝试升级到 Shorewall 4.4 或更高版本,但找不到 shorewall-common、shorewall-shell shorewall-perl 软件包?它们在哪里?

答案:在 Shorewall 4.4 中, shorewall-shell软件包已停用。shorewall -common和shorewall-perl软件包已合并为一个shorewall软件包。有关详细信息,请参阅升级问题。
(常见问题 34a)我尝试升级到 Shorewall 4.4,但在启动 Shorewall 时出现错误。我在哪里可以找到有关这些问题的信息?

回答:请参阅升级问题。
(常见问题 34b)我尝试升级到 Shorewall 4.4,但在尝试启动 Shorewall 时看到警告消息。我在哪里可以找到有关这些问题的信息?

回答:请参阅升级问题。
(常见问题 76)我刚刚升级了系统,现在伪装不起作用了?发生了什么?

答案:这种情况发生在那些忽略我们的建议并允许安装程序用具有默认设置的安装程序替换其工作的/etc/shorewall/shorewall.conf人身上。无法转发流量(例如在本地网络伪装网络访问期间)通常意味着/etc/shorewall/shorewall.conf包含默认设置 IP_FORWARDING=Keep;它应该是 IP_FORWARDING=On。

更新:从 Shorewall 4.4.21 开始,有一个shorewall 更新命令,可以对现有的 shorewall.conf 和新的 shorewall.conf 进行智能合并。
(常见问题解答 2.6)升级到 Shorewall 的最新版本(> 5.1.10.1)后,当我更改配置并执行“shorewall reload”或“shorewall restart”时,我的更改未显示在正在运行的规则集中。为什么会发生这种情况?

回答:参见常见问题 1.5
端口转发(端口重定向)
(常见问题 1)我想将 UDP 端口 7777 转发到 IP 地址为 192.168.1.5 的个人电脑。我找遍了所有地方,但找不到如何操作。

答:从网络到本地系统的端口转发规则的格式如下:

#动作源目标原型端口
DNAT net loc:本地IP地址[:本地端口] 协议 端口号

因此要将 UDP 端口 7777 转发到内部系统 192.168.1.5,规则是:

#动作源目标原型端口
DNAT 网络地址:192.168.1.5 udp 7777

如果您想将指向防火墙上特定地址(external-IP)的请求转发到内部系统:

#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
DNAT net loc:本地 IP 地址>[:本地端口] 协议 端口号 - 外部 IP

如果您想要转发来自特定 Internet 地址(地址)的请求:

#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
DNAT net:地址 loc:本地 IP 地址[:本地端口] 协议 端口号 -

最后,如果您需要转发一系列端口,请在 DEST PORT 列中将范围指定为low-port:high-port。
重要的

以上方法不适用于从本地网络转发。如果您想这样做,请参阅常见问题解答 2
(常见问题 1a)好的 - 我按照这些说明操作,但是没有用

答案:这通常是以下五种情况之一造成的结果:

您正在尝试重定向 UDP 端口,并且已经存在通过 ACCEPT 规则创建的流的 conntrack 表条目。

例子:

DNAT 定位:192.168.0.2 dmz:192.168.1.3 udp 53

假设您已经安装了conntrack包,您可以使用以下命令删除所有此类 conntrack 表条目:

conntrack -D -s 192.168.0.2 -p udp --dport 53

您正在尝试从防火墙内部进行测试(不,那样不行 - 请参阅“(常见问题解答 2)我将 www 请求转发到 www.mydomain.com(IP 130.151.100.69)到我本地网络中的系统 192.168.1.5。外部客户端可以浏览 http://www.mydomain.com,但内部客户端不能。” 一节)。

您的本地系统(您尝试转发到的系统)存在更基本的问题,例如默认网关不正确(必须将其设置为防火墙内部接口的 IP 地址;如果由于某种原因无法实现,请参阅常见问题解答 1f)。

您的 ISP 正在阻止该特定端口的入站,或者对于 TCP,您的 ISP 正在丢弃出站 SYN、ACK 响应。

您运行的是 Mandriva Linux 10.0 最终版之前的版本,并且已配置 Internet 连接共享。在这种情况下,您的本地区域的名称是“masq”而不是“loc”(在规则中将“loc”的所有实例更改为“masq”)。您可能需要考虑以与 Shorewall 文档相匹配的配置重新安装 Shorewall。有关详细信息,请参阅双接口快速入门指南。

(常见问题 1b)我仍然遇到端口转发问题

答案:为了进一步诊断此问题:

root 身份输入“ shorewall reset (如果您正在运行 Shorewall Lite,则输入“ shorewall-lite reset ”)。这将清除所有 Netfilter 计数器。

尝试从外部主机连接到重定向端口。

root 身份输入“ shorewall show nat (如果您正在运行 Shorewall Lite,则输入“ shorewall-lite show nat ”)。

找到适当的 DNAT 规则。它将位于名为<source zone> _dnat 的链中(在上面的示例中为“ net_dnat )。

第一列中的数据包计数是否非零?如果是,则连接请求已到达防火墙并被重定向到服务器。在这种情况下,问题通常是本地系统上缺少默认网关设置或默认网关设置不正确(您尝试转发到的系统 - 其默认网关必须是防火墙与该系统的接口的 IP 地址,除非您使用FAQ 1f中描述的黑客技术)。

如果数据包数为零:

连接请求未到达您的服务器(可能被您的 ISP 阻止);或者

您正在尝试连接到防火墙上的辅助 IP 地址,并且您的规则仅重定向主 IP 地址(您需要在DNAT 规则中的“ ORIG. DEST. ”列中指定辅助 IP 地址);或者

您的 DNAT 规则在其他方面与连接请求不匹配。在这种情况下,您可能必须使用数据包嗅探器(例如 tcpdump Wireshark)来进一步诊断问题。

流量正在通过不同的接口进入您的防火墙(接口反转/etc/shorewall/interfaces?)。

如果数据包计数不为零,请检查日志以查看连接是否被丢弃或拒绝。如果是,则可能是区域定义问题,即服务器所在的区域与 DEST 列中指定的区域不同。在 root 提示符下,键入“ shorewall show zone ”(“ shorewall-lite show zone ”),然后确保在 DEST 列中指定了列表中与 REJECT/DROP 日志消息中的 OUT=<dev> DEST= <ip> 匹配的第一个区域。

如果这些测试看起来一切正常,但连接却无法正常工作,则可能是您的 ISP 阻止了 SYN、ACK 响应。此技术可让您的 ISP 检测到您何时运行服务器(通常违反您的服务协议)并阻止与该服务器建立连接。

(常见问题 1c)我想从 Internet 连接到防火墙上的端口 1022,并让防火墙将连接转发到本地系统 192.168.1.3 上的端口 22。我该怎么做?

答案:在/etc/shorewall/rules:

#动作源目标原型端口
DNAT 网络位置:192.168.1.3:22 tcp 1022

(常见问题 1d)我的 DMZ 中有一个 Web 服务器,我使用端口转发使该服务器可从 Internet 访问。这工作正常,但当我的本地用户尝试使用防火墙的外部 IP 地址连接到服务器时,它不起作用。

回答:请参阅常见问题 2b。
(常见问题 1e)为了阻止暴力攻击,我想将非标准端口 (4104) 上的所有连接重定向到路由器/防火墙上的端口 22。我注意到设置重定向规则会导致防火墙同时打开端口 4104 22 以允许来自网络的连接。是否可以仅将 4104 重定向到本地主机端口 22,并丢弃来自网络的端口 22 的连接尝试?
重要的

在具有“扩展连接跟踪匹配”(NEW_CONNTRACK_MATCH)功能的系统上(参见shorewall show capabilities的输出),端口 22 仅对原始目标端口为 4104 的连接开放,并且本常见问题解答不适用。

Ryan 提供的答案:假设您本地防火墙接口的 IP 地址为 192.168.1.1。如果您将 SSHD 配置为仅侦听该地址并添加以下规则,那么您将可以从网络访问端口 4104,并从 LAN 访问端口 22

#动作源目标原型端口
DNAT 网络转发:192.168.1.1:22 tcp 4104

(常见问题 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 系统上有以下规则:

#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
DNAT 网络位置:192.168.1.4 tcp 21 - 206.124.146.176

Internet 主机 16.105.221.4 发出命令ftp 206.124.146.176

这会导致以下事件序列:

16.105.221.4 206.124.146.176 发送一个 TCP SYN 数据包,指定目标端口 21

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:

#接口源地址协议端口
eth1:192.168.1.4 0.0.0.0/0 192.168.1.1 tcp 21

运行 Shorewall 5.0.14 或更高版本时,等效/etc/shorewall/snat文件是:

#动作源目标原型端口
SNAT(192.168.1.1) 0.0.0.0/0 eth1:192.168.1.4 tcp 21

此规则有一个不良副作用,即使来自网络的所有 FTP 连接在 FTP 服务器上看起来好像它们源自 Shorewall 系统。但它将强制 FTP 服务器通过 Shorewall 系统进行回复,然后 Shorewall 系统可以正确地重写响应中的源 IP 地址。
(常见问题 1g)我想将我的公共 IP 地址(206.124.146.176)上的端口 80 重定向到 Internet 主机 66.249.93.111 上的端口 993

答案:这需要类似于FAQ 2中的卑鄙黑客手段。假设您的 Internet 区域名为net并连接到接口eth0:

在/etc/shorewall/rules:

#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST

?全部部分
?部分已建立
?SECTION 相关
?部分无效
?部分未跟踪
?新部分

DNAT 网:66.249.93.111:993 tcp 80 - 206.124.146.176

中/etc/shorewall/interfaces,指定eth0 上的routeback选项:

?格式 2
#区域界面选项
net eth0 路由返回

/etc/shorewall/masq;

#接口源地址协议端口
eth0:66.249.93.111 0.0.0.0/0 206.124.146.176 tcp 993

运行 Shorewall 5.0.14 或更高版本时,等效的 /etc/shorewall/snat 文件是:

#动作源目标原型端口
SNAT(206.124.146.176) 0.0.0.0/0 eth0:66.249.93.111 tcp 993

以及/etc/shorewall/shorewall.conf:

IP_FORWARDING=开启

与常见问题解答 2 中的破解方法类似,此方法会导致所有转发的连接都查看服务器 (66.249.93.11),就好像它们源自您的防火墙 (206.124.146.176)。
(常见问题 1h)如何设置 shorewall 以允许从网络在端口 9022 上使用 ssh?SSHD 正在监听端口 22

答案:使用此规则。

#动作源目标原型端口
重定向网络 22 tcp 9022

请注意,上述规则还将允许来自 TCP 端口 22 的网络的连接。如果您不想要这样,请参阅常见问题解答 1e。
(常见问题 1j)为什么此 DNAT 规则不起作用?

我添加了此规则,但仍然看到下面的日志消息

规则:
DNAT scnet:172.19.41.2 dmz0:10.199.198.145 udp 2055

日志:
9 21 12:55:37 fw001 内核:[10357687.114928] Shorewall:scnet2fw:DROP:IN=eth2 OUT=
MAC=00:26:33:dd:aa:05:00:24:f7:19:ce:44:08:00 SRC=172.19.41.2 DST=172.19.1.1 LEN=1492
TOS=0x00 PREC=0x00 TTL=63 ID=23035 PROTO=UDP SPT=6376 DPT=2055 LEN=1472

答案:在添加规则之前,失败的连接已经有一个 conntrack 条目。安装conntrack实用程序并使用它来删除该条目。

conntrack -D -s 172.19.41.2 -d 172.19.1.1 -p udp -sport 6367 -dport 2055

(常见问题 30)我不清楚何时使用 DNAT 规则以及何时使用 ACCEPT 规则。

答案:最好查看适合您设置的快速入门指南;指南以教程的方式介绍了此主题。DNAT 规则应用于需要与 SNAT/MASQUERADE 相反方向的连接。因此,如果您从本地网络到 Internet 伪装或使用 SNAT,则需要使用 DNAT 规则来允许从 Internet 到本地网络的连接。
笔记

如果同时使用 1:1 NAT SNAT/MASQUERADE,则受 1:1 NAT 约束的连接应使用 ACCEPT 而不是 DNAT。但请注意,DNAT 可用于覆盖 1:1 NAT,以便将连接重定向到与使用 1:1 NAT 时不同的内部系统或端口。

当您有意重写目标 IP 地址或端口号时,您也应该使用 DNAT 规则。在所有其他情况下,您都应使用 ACCEPT,除非您需要在连接通过防火墙时劫持这些连接并在防火墙本身上处理它们;在这种情况下,您应使用 REDIRECT 规则。
笔记

上述答案不应被理解为 DNAT 只能与 SNAT 结合使用。但在使用私有本地地址的常见配置中,这是最常见的用法。
(常见问题 8)我有多个外部 IP 地址,并使用 /etc/shorewall/nat 将它们与我的 DMZ 中的系统关联。当我添加 DNAT 规则(例如针对端口 80 443)时,Shorewall 会将这些端口上的连接重定向到我的所有地址。我如何将 DNAT 限制为仅单个地址?

答案:在ORIGDEST列中指定您想要重定向的外部地址。

例子:

#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST
DNAT 网:192.168.4.22 tcp 80,443 - 206.124.146.178

(常见问题 38)在哪里可以找到有关 DNAT 的更多信息?

答: Ian Allen 写了一篇关于 DNAT Linux 的论文。
(常见问题 48)如何使用 Shorewall 设置透明 HTTP 代理?

答案:请参阅Shorewall_Squid_Usage.html。
DNS 和端口转发/NAT
(常见问题 2)我将 www 请求转发到本地网络中的系统 192.168.1.5 上的 www.mydomain.com(IP 130.151.100.69)。外部客户端可以浏览 http://www.mydomain.com,但内部客户端则不能。

答:我对这种设置有两点反对意见。

在本地网络中拥有可访问 Internet 的服务器就像在鸡舍的角落里养狐狸一样。如果服务器受到攻击,该服务器与您的其他内部系统之间将没有任何联系。只需花费另一块 NIC 和一条交叉电缆,您就可以将服务器置于 DMZ 中,使其与您的本地系统隔离 - 当然,前提是服务器可以位于防火墙附近 :-)

可访问性问题最好通过拆分 DNS来解决(要么为本地客户端使用单独的 DNS 服务器,要么在主名称服务器上使用Bind Version 9 views ”),这样 www.mydomain.com 在外部解析为 130.141.100.69,在内部解析为 192.168.1.5。我在 shorewall.net 上使用单独的 DNS 服务器 (dnsmasq)。

因此,解决此问题的最佳和最安全方法是将您可通过 Internet 访问的服务器移至单独的 LAN 段,并使其具有自己的防火墙接口,然后按照常见问题解答 2b 操作。这样,如果您的服务器遭到黑客攻击,您的本地系统仍然是安全的,并且您不必运行拆分 DNS 配置(单独的服务器或 Bind 9 视图)。

如果物理限制使得将服务器隔离在单独的 LAN 上不切实际,那么下一个最佳解决方案就是使用拆分 DNS。在您抱怨“设置拆分 DNS 太难了!”之前,请先查看此处。

如果您确实想通过防火墙在两个内部系统之间路由流量,请按如下所述进行。
警告

通过使用这种技术重定向的所有流量在服务器看来都好像是来自防火墙而不是原始客户端!因此,服务器的访问日志对于确定哪些本地主机正在访问服务器毫无用处。

假设您的外部接口是 eth0,内部接口是 eth1,且 eth1 IP 地址为 192.168.1.254,子网为 192.168.1.0/24,那么:

在/etc/shorewall/interfaces:

?格式 2
#区域界面选项
loc eth1 路由返回

在/etc/shorewall/masq:

#接口源地址协议端口
eth1:192.168.1.5 192.168.1.0/24 192.168.1.254 tcp www

当运行Shorewall 5.0.14或更高版本时,相应的/etc/shorewall/snat文件是:

#操作源目标协议端口
SNAT(192.168.1.254) 192.168.1.0/24 eth1:192.168.1.5 tcp www

注意:此处描述的技术称为发夹式 NAT ,在RFC 4787的第 6 节中有描述。在该 RFC 中,要求使用外部 IP 地址作为源:

#接口源地址协议端口
eth1:192.168.1.5 192.168.1.0/24 130.151.100.69 tcp www

相等的/etc/shorewall/snat:

#动作源目标原型端口
SNAT( 130.151.100.69 ) 192.168.1.0/24 eth1:192.168.1.5 tcp www

在/etc/shorewall/rules:

#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST

?全部部分
?部分已建立
?SECTION 相关
?部分无效
?部分未跟踪
?新部分

DNAT 位置 loc:192.168.1.5 tcp www - 130.151.100.69

当然,该规则(以及上一条中的第二条规则)仅在您拥有静态外部 IP 地址时才有效。如果您拥有动态 IP 地址,则制定 DNAT 规则:

#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST

?全部部分
?部分已建立
?SECTION 相关
?部分无效
?部分未跟踪
?新部分

DNAT loc loc:192.168.1.5 tcp www - ð0

使用此技术,您将需要配置您的 DHCP/PPPoE/PPTP/... 客户端以便每次获得新的 IP 地址时自动重新加载 Shorewall。
笔记

如果您的本地接口是桥接器,请参阅常见问题解答 2e了解更多配置步骤。

(常见问题 2a)我有一个带有 RFC1918 子网的区域“ Z ”,并且我使用一对一 NAT 将非 RFC1918 地址分配给 Z 中的主机。Z 中的主机无法使用它们的外部(非 RFC1918 地址)相互通信,因此它们无法使用它们的 DNS 名称相互访问。
笔记

如果 /etc/shorewall/nat 中的 ALL INTERFACES 列为空或包含“ Yes ”,则在尝试使用目标主机的公共地址从 Z 中的另一台主机访问 Z 中的主机时,您还将看到如下日志消息:

10月4日 10:26:40 netgw 内核:
岸墙:转发:拒绝:输入=eth1 输出=eth1 SRC=192.168.118.200
DST=192.168.118.210 LEN=48 TOS=0x00 PREC=0x00 TTL=127 ID=1342 DF
协议 = TCP SPT = 1494 DPT = 1491 窗口 = 17472 RES = 0x00 ACK SYN URGP = 0

答案:这是另一个最好使用拆分 DNS 解决的问题。它允许外部和内部客户端使用主机的 DNS 名称访问 NAT 主机。

解决此问题的另一个好方法是从一对一 NAT 切换到代理 ARP。这样,Z 中的主机就有非 RFC1918 地址,并且可以使用同一地址进行外部和内部访问。

如果您不喜欢这些解决方案并且希望将所有 Z->Z 流量路由通过防火墙,那么:

将接口上的routeback选项设置为Z。

nat 文件中的 ALL INTERFACES 列设置为“ Yes ”。

例1.示例:

区域:dmz,接口:eth2,子网:192.168.2.0/24,服务器地址 192.168.2.2

在/etc/shorewall/interfaces:

?格式 2
#区域界面选项
dmz eth2 路由返回

在/etc/shorewall/masq:

#界面来源
eth2:192.168.1.2 192.168.2.0/24

运行 Shorewall 5.0.14 或更高版本时,等效/etc/shorewall/snat于:

#动作源目标原型端口
伪装 192.168.1.0/24 eth2:192.168.1.2 tcp www

中,确保所有接口列中的/etc/shorewall/nat值为“是”

(常见问题 2b)我的 DMZ 中有一个 Web 服务器,我使用端口转发使该服务器可以通过 Internet www.mydomain.com 的形式访问。这可以正常工作,但当我的本地用户尝试连接到 www.mydomain.com 时,它不起作用。

答案:我们假设以下情况:

(www.mydomain.com)上的外部 IP 地址是 206.124.146.176 eth0。

服务器的 IP 地址是 192.168.2.4

您可以通过添加此规则,使用防火墙的外部 IP 地址从本地网络访问服务器:

#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST

?全部部分
?部分已建立
?SECTION 相关
?部分无效
?部分未跟踪
?新部分

DNAT 位置 dmz:192.168.2.4 tcp 80 - 206.124.146.176

如果您的外部 IP 地址是动态的,那么您必须制定 DNAT 规则:

#ACTION SOURCE DEST PROTO DPORT SPORT ORIGDEST

?全部部分
?部分已建立
?SECTION 相关
?部分无效
?部分未跟踪
?新部分

DNAT 位置 dmz:192.168.2.4 tcp 80- ð0

警告

对于动态 IP 地址,您可能不想使用shorewall[-lite] save和shorewall[-lite] restore。
(常见问题 2c)我尝试将常见问题 2 的答案应用到我的外部接口和网络区域,但没有成功。为什么?

回答:您是否在中设置了IP_FORWARDING=Onshorewall.conf?
(常见问题 2d)Shorewall 是否支持发夹式 NAT?

答:是的。

对于简单伪装/SNAT的情况,请参见常见问题2。

对于一对一(静态)NAT,只需在/etc/shorewall/nat中每个条目的所有接口列中输入“是”即可。
(常见问题 2e)我遇到了常见问题 2 中的情况,但我的本地接口是一个桥梁,常见问题 2 中的解决方案不起作用

答案:假设网桥是br0,eth2是连接包含192.168.1.5的LAN的网桥端口

除了常见问题 2 中的步骤(将 eth1 替换为 br0)之外,您还需要:

eth2 上设置发夹选项。

brctl hairpin br0 eth2 开启

Debian 及其衍生版本中,您可以将该命令放在 /etc/network/interfaces 中作为后续命令:

自动 br0
iface br0 inet 静态
bridge_ports eth2
bridge_fd 0
bridge_maxwait 0
地址 192.168.1.1
网络掩码 255.255.255.0
发布 /sbin/brctl hairpin br0 eth2 on

如果尚未安装,请安装 ebtables。

确保从 eth2 发出的所有流量都有正确的 MAC 地址。

ebtables -t nat -A POSTROUTING -o eth2 -j snat --源br0-MAC 地址

其中 br0-MAC-address br0 MAC 地址。

这是执行上述命令的 /etc/shorewall/start 的工作示例。

如果 [ $(ebtables -t nat -L POSTROUTING | wc -l) -lt 4 ]; 然后
ebtables -t nat -A POSTROUTING -o eth2 -j snat --to-source 0:19:21:d0:61:65
fi

黑名单
(常见问题 63)我刚刚将 IP 地址 206.124.146.176 列入黑名单,但我仍然可以 ping 通它。我做错了什么?

答:没什么。

IP 地址列入黑名单会阻止来自该 IP 地址的传入流量。如果您在 中设置了 BLACKLISTNEWONLY=Yes ,则仅禁止来自shorewall.conf该地址的新连接;允许来自该地址的属于已建立连接(例如 ping 回复)的流量。
笔记

Shorewall 4.4.13 开始,您可以使用blacklist中的选项/etc/shorewall/interfaces按目标 IP 地址实现黑名单。
笔记

Shorewall 4.4.26 开始,您可以使用/etc/shorewall/blrules来实现任意黑名单规则。
(常见问题 84)我将一些 IP 放入 /etc/shorewall 中的黑名单文件中以阻止这些 IP,但我仍然收到来自这些 IP PSAD 报告,称它们正在进行端口扫描。列入黑名单难道不应该丢弃来自这些 IP 的所有数据包吗?

答案:您可能忘记在中为外部接口指定黑名单/etc/shorewall/interfaces选项。
网络会议/MSN
(常见问题 3)我想将 Netmeeting MSN Instant Messenger Shorewall 一起使用。我该怎么做?

答案:有一个H.323 连接跟踪/NAT 模块可以帮助 Netmeeting。

在此处查找MSN IM 的解决方案,但请注意,此解决方案存在重大安全风险。另请查看http://www.netfilter.org上的 Netfilter 邮件列表档案。
开放端口
(常见问题 100)启动 Shorewall 后,“iptables -L”的输出看起来好像我的防火墙完全打开了!

答案:这里的问题是,裸露的iptables -L命令会产生完全无用的输出。请改用shorewall show。
笔记

shorewall show命令是iptables -L -n -v的包装器。
(常见问题 51)如何在 Shorewall 中打开端口?

回答:任何使用快速入门指南安装了 Shorewall 的人都不会问这个问题。

无论您使用哪个指南,默认情况下所有出站通信都是开放的。因此您无需“打开端口”进行输出。

输入:

如果您使用独立指南进行安装,请重新阅读本节。

如果你使用双接口指南进行安装,请重新阅读以下章节:端口转发 (DNAT)和其他连接

如果你使用三接口指南进行安装,请重新阅读以下部分:端口转发 (DNAT)和其他连接

如果您使用Shorewall 安装指南进行安装,那么您最好再次阅读该指南——您显然错过了很多内容。

另请参阅本常见问题解答的端口转发部分。
(常见问题 4)我刚刚使用在线端口扫描器检查了我的防火墙,它显示一些端口为“关闭”而不是“阻止”。为什么?

答案:默认的 Shorewall 设置在强制执行 DROP 策略之前会调用Drop操作,而 Internet 上所有区域的默认策略都是 DROP。Drop 操作在 中定义,/usr/share/shorewall/action.Drop它反过来会调用Auth宏(在 中定义/usr/share/shorewall/macro.Auth)来指定REJECT操作(即Auth(REJECT) )。这对于防止使用“ Auth ”机制识别请求用户的服务出现传出连接问题是必不可少的。这是默认设置拒绝的唯一服务。

如果您看到除 113(auth)之外的关闭的 TCP 端口,那么您已经添加了规则来拒绝这些端口,或者防火墙外的路由器正在响应这些端口上的连接请求。

如果您希望“隐藏”端口 113,那么:

如果您运行的是 Shorewall 4.4.20 或更早版本,请复制 /usr/share/shorewall/action.Drop并/etc/shorewall/修改 Auth 的调用为Auth(DROP)。

如果您运行的是 Shorewall 4.4.21 或更高版本,请在 shorewall.conf 中设置 DROP_DEFAULT="Drop(-,DROP)"。请参阅 Action HOWTO了解该魔法的工作原理。

(常见问题 4a)我刚刚对我的防火墙运行了 nmap UDP 扫描,结果显示有数百个端口处于打开状态!!!!

答案:深吸一口气,阅读 nmap 手册页中有关 UDP 扫描的部分。如果 nmap 没有从防火墙收到任何回复,则它会报告端口已打开。如果您想查看哪些 UDP 端口确实已打开,请暂时将您的 net->all 策略更改为 REJECT,重新启动 Shorewall 并再次运行 nmap UDP 扫描。
(常见问题 4b)无论我如何更改规则,我都有一个无法关闭的端口。

我有一条规则允许从我的本地网络 telnet 到我的防火墙;我删除了该规则并重新启动了 Shorewall,但我的 telnet 会话仍然有效!!!

答案:规则仅控制新连接的建立。一旦通过防火墙建立了连接,它将一直可用,直到断开连接(tcp)或超时(其他协议)。如果您停止 telnet 并尝试建立新会话,您的防火墙将阻止该尝试。
(常见问题 4c)如何将 Shorewall PortSentry 一起使用?

答:这里有一篇描述 Shorewall PortSentry 完美整合的文章。
连接问题
为什么这些数据包被丢弃/拒绝?如何解码 Shorewall 日志消息?

请参阅常见问题解答 17
(常见问题 5)我已经安装了 Shorewall,但现在无法通过防火墙进行 ping 操作

答:有关 Shorewall ping ”管理的完整描述,请参阅此页面。
(常见问题 15)我的本地系统无法访问网络

回答:每次我读到“系统无法看到网络”时,我都会想知道发帖者在哪里买了带眼睛的计算机,以及当一切正常运行时这些计算机会“看到”什么:-)。除此之外,导致此问题的最常见原因是:

每个本地系统上的默认网关未设置为本地防火墙接口的 IP 地址。您可以通过以下方式测试:

root shell 提示符下,输入“shorewall clear”。

从本地系统尝试 ping Shorewall 系统的互联网(外部)接口的 IP 地址。如果此操作无效,则表示您 ping 的系统上的默认网关设置不正确。

测试后务必“shorewall start”。

文件中本地网络的条目/etc/shorewall/masq错误或缺失。

本地系统上的 DNS 设置错误,或者用户正在防火墙上运行 DNS 服务器,并且尚未启用从本地网络到防火墙或从防火墙到 Internet UDP TCP 端口 53

未启用转发(这通常是 Debian 用户的问题)。输入此命令:

cat /proc/sys/net/ipv4/ip_forward

如果显示的值为 0(零),则设置IP_FORWARDING=On并/etc/shorewall/shorewall.conf重新启动 Shorewall。

(常见问题 29)FTP 无法工作

答案:请参阅Shorewall FTP 页面。
(常见问题 33)从防火墙后面的客户端,到某些站点的连接失败。从防火墙本身到相同站点的连接则正常。出了什么问题?

答案:最有可能的是,您需要在中设置 CLAMPMSS=Yes/etc/shorewall/shorewall.conf。
(常见问题 35)我有两个以太网接口连接到我的本地网络,并将它们桥接起来。启动 Shorewall 后,我无法通过桥接器传输流量。我已将桥接接口 (br0) 定义为 中的本地接口/etc/shorewall/interfaces;桥接以太网接口未定义到 Shorewall。我如何告诉 Shorewall 允许流量通过桥接器?

答案:在中添加routeback选项。br0/etc/shorewall/interfaces

有关此类配置的更多信息,请参阅Shorewall Simple Bridge 文档。
(常见问题 64)我刚刚将内核升级到 2.6.20(或更高版本),我的网桥/防火墙停止工作。这是怎么回事?

答案:在内核 2.6.20 中,Netfilter physdev 匹配功能已发生更改,因此它不再能够匹配非桥接流量的输出设备。您将在日志中看到如下消息:

4 20 15:03:50 wookie 内核:[14736.560947] physdev 匹配:在 OUTPUT、FORWARD POSTROUTING 链中使用 --physdev-out
不再支持非桥接流量。

虽然这一内核更改是必要的,但这意味着 Shorewall 区域可能不再以桥接端口的形式定义。有关如何配置桥接/防火墙的信息,请参阅Shorewall-perl 桥接文档。
笔记

按照新桥接文档中的说明进行操作不会阻止发出上述消息。
(常见问题 85)Shorewall 拒绝来自我的本地局域网的连接,因为它认为这些连接来自“网络”区域。

我在我的日志中看到这个:

8 31 16:51:24 fw22 内核:Shorewall:net2fw:DROP:IN=eth5 OUT=MAC=00:0c:29:74:9c:0c:08:00:20:b2:5f:db:08:00
SRC=10.1.50.14 DST=10.1.50.7 LEN=57 TOS=0x00 PREC=0x00 TTL=255 ID=32302 DF
协议=UDP SPT=53289 DPT=53 LEN=37

答案:当外部接口和内部接口连接到同一个交换机或集线器时,就会发生这种情况。有关详细信息,请参阅本文。解决方案是永远不要将多个防火墙接口连接到同一个集线器或交换机(一个明显的例外是当您有一个支持 VLAN 标记的交换机并且接口与不同的 VLAN 相关联时)。
日志记录
(常见问题 91)我更改了 /etc/shorewall/ 中的 shorewall.conf 文件,将日志输出到 /var/log/shorewall.log,但在我重新启动 shorewall 后,这种情况并没有发生。LOGFILE=/var/log/shorewall.log <-- 这应该是正确的行,对吗?

答案:不,这是不正确的。LOGFILE 设置告诉 Shorewall 在哪里找到日志;它不能确定消息写入的位置。请参阅下一个常见问题解答。
(常见问题 6)日志消息写在哪里以及如何更改目的地?

答案: NetFilter 使用内核的 syslog 等效项(请参阅“ man syslog ”)来记录消息。它始终使用 LOG_KERN (kern) 工具(请参阅“ man openlog ”),您可以和中选择日志级别(再次请参阅“ man syslog ”)。syslog 记录的消息的目标由 控制(请参阅“ man syslog.conf ”)。更改后,请务必重新启动 syslogd(在 RedHat 系统上为“ service syslog restart ”)。policiesrules/etc/syslog.conf/etc/syslog.conf

还可以设置 Shorewall 将所有 Netfilter 的消息记录到单独的文件中。
(常见问题 6a)是否有任何可与 Shorewall 配合使用的日志解析器?

回答:以下几个链接可能有帮助:


https://shorewall.org/pub/shorewall/parsefw/
http://aaron.marasco.com/linux.html
http://cert.uni-stuttgart.de/projects/fwlogwatch
http://www.logwatch。组织


我个人使用fwlogwatch。它每天从我的各个系统通过电子邮件向我发送一份报告,每份报告总结了相应系统上记录的活动;以下是示例:

fwlogwatch 摘要
root 2010 3 2 日星期二 08:14:37 PST 生成。
文件“/var/log/ulog/syslogemu.log”中的 817 个条目中有 362 个(其中 455 个超过 86400 秒)是数据包日志,其中 138 个具有独特的特征。
第一个数据包日志条目:3 1 08:16:06,最后一个:3 2 08:06:21。
所有条目均由同一主机记录:“网关”。
所有条目都有相同的目标:“-”。
仅显示计数至少为 5 的条目。

net-dmz DROP eth2 36 个数据包从 61.158.162.9 206.124.146.177
net-fw DROP eth0 21 个数据包从 89.163.162.13 76.104.233.98
net-fw DROP eth0 19 个数据包从 61.184.101.46 76.104.233.98
net-fw DROP eth0 12 个数据包从 81.157.214.103 76.104.233.98
net-fw DROP eth0 11 个数据包从 174.37.159.222 76.104.233.98
net-fw DROP eth0 10 个数据包从 221.195.73.86 76.104.233.98
net-dmz DROP eth2 9 个数据包从 202.199.158.6 206.124.146.177
net-fw DROP eth2 9个数据包从202.199.158.6到206.124.146.176
net-dmz DROP eth2 9 个数据包从 202.199.158.6 206.124.146.178
net-fw DROP eth0 6个数据包从221.192.199.35到76.104.233.98
net-fw DROP eth2 5 个数据包从 61.158.162.9 206.124.146.177

Fwlogwatch 包含一个内置的网络服务器,允许以摘要的方式监控最近的活动。
(常见问题 6b)端口 10619 上的 DROP 消息及其连接请求充斥着日志。我是否可以暂时将此端口的这些错误消息排除在 Shorewall 日志之外?

解答:暂时增加如下规则:

#动作源目标原型端口

?全部部分
?部分已建立
?SECTION 相关
?部分无效
?部分未跟踪
?新部分

DROP $FW udp 10619

或者,如果您未设置 BLACKLIST_LOGLEVEL,则可以将端口列入黑名单。在/etc/shorewall/blrules:

#动作源目标原型端口

DROP $FW udp 10619

(常见问题 6d)为什么 Shorewall 日志消息中的 MAC 地址这么长?我以为 MAC 地址只有 6 个字节长。

答案: Netfilter(Shorewall)日志消息中标记为 MAC 地址的实际上是以太网帧头。它包含:

目标 MAC 地址(6 个字节)

MAC 地址(6 个字节)

以太网帧类型(2 个字节)

示例 2.示例

MAC=00:04:4c:dc:e2:28:00:b0:8e:cf:3c:4c:08:00

目标 MAC 地址 = 00:04:4c:dc:e2:28

MAC 地址 = 00:b0:8e:cf:3c:4c

以太网帧类型 = 08:00(IP 版本 4


(常见问题 16)Shorewall 在我的整个控制台上写入日志消息,导致它无法使用!

回答:

需要说明的是,并不是 Shorewall 在您的控制台上写入了所有内容。Shorewall 在每个启动、重新启动、停止等操作期间都会发出一条日志消息。而是您的日志守护进程将消息写入了控制台。Shorewall 本身无法控制特定类别的消息写入何处。请参阅Shorewall 日志记录文档。

发送到控制台的最大日志级别可在 /proc/sys/kernel/printk 中找到:

teastep@ursa:~$ cat /proc/sys/kernel/printk
6 6 1 7
teastep@ursa:~$

第一个数字决定发送到控制台的最大日志级别(系统日志优先级)。优先级低于此数字的消息将发送到控制台。在上面示例中,优先级 0-5 将发送到控制台。由于 Shorewall 默认使用“info”(6),因此 Shorewall 生成的 Netfilter 规则集将生成不会显示在控制台上的日志消息。

第二个数字是未指定日志级别的内核 printk() 调用的默认日志级别。

第三个数字指定最低控制台日志级别,而第四个数字给出默认控制台日志级别。

如果您的系统上的第一个数字是 7 或更大,则默认的 Shorewall 配置将导致消息写入您的控制台。最简单的解决方案是将其添加到您的/etc/sysctl.conf文件中:

内核.printk = 4 4 1 7

然后

sysctl -p /etc/sysctl.conf

(常见问题 16a)cat /proc/sys/kernel/prink 返回 '4 4 1 7',并且 dmesg 仍然被填满

答案:虽然我们认为“dmesg 已填满”不一定是个问题,但消除该问题的唯一方法是设置Shorewall 将所有 Netfilter 的消息记录到单独的文件中。
(常见问题 16b)为什么我在 /var/log/messages 中看不到任何 Shorewall 消息?

一些提出这个问题的人报告说,他们看到的唯一 Shorewall 消息/var/log/messages是“已启动”、“已重新启动”和“已停止”消息。

答案:首先,重要的是要了解 Shorewall 本身并不控制 Netfilter 日志消息的写入位置。中的 LOGFILE 设置shorewall.conf只是告诉/sbin/shorewall[-lite]程序在哪里查找日志。此外,重要的是要了解“debug”日志级别通常会导致 Netfilter 消息写入的文件/var/log比“info”日志级别少。日志级别不控制日志消息的数量或消息的内容。

Netfilter 消息写入的实际日志文件并非标准化,并且会因发行版和发行版本而异。但是,只要您看不到日志记录,就该在 Shorewall 配置之外寻找原因了。例如,最近的SUSE 版本默认使用 syslog-ng,并将 Shorewall 消息写入/var/log/firewall。

请参阅Shorewall 日志记录文档以获取更多信息。
(常见问题 16c) Shorewall 消息充斥着“dmesg”的输出;我该如何阻止这种情况?

回答:改用ulogd。
(常见问题 16d)我设置了 LOGFILE=/var/log/shorewall,但日志消息仍然发送到 /var/log/messages。

答案:请参阅上文常见问题 16b的答案。
(常见问题 17)为什么这些数据包被丢弃/拒绝?如何解码 Shorewall 日志消息?

答案: Shorewall 中的多个链(如日志消息中所示)会记录丢弃/拒绝的数据包:

zone2all、zone-all、all2 zone、all- zone、all2all all-all

您有一个policy指定日志级别的规则,并且该数据包正在根据该策略进行记录。如果您打算接受此流量,则需要一条规则来实现此目的。

从这些链中注销的数据包可能具有不在任何已定义区域中的源和/或目标(请参阅shorewall[-lite] show zone的输出)。请记住,区域成员资格涉及防火墙接口和 IP 地址。
zone12zone2或zone1-zone2

您有一个针对区域 1到区域 2的策略,该策略指定了日志级别,并且该数据包正在该策略下记录,或者该数据包与包含日志级别的规则相匹配。
@ zone12zone2或 @ zone1-zone2

您有一个针对从 到zone1的流量的策略zone2,该策略指定了 TCP 连接速率限制(LIMIT 列中的值)。记录的数据包超出了该限制并被丢弃。请注意,这些日志消息本身的速率受到严格限制,因此 syn-flood 不会因为过多的日志消息而产生二次 DOS。这些日志消息是在 Shorewall 2.2.0 Beta 7 中添加的。
zone12 zone2~、zone1- zone2~ ~blacklistnn

这些是/etc/shorewall/blrules文件中条目的结果。
接口_mac 或接口_rec

该数据包正在maclist 接口选项下记录。
黑名单

由于源 IP 在文件中被列入黑名单,因此该数据包已被记录。 /etc/shorewall/blacklist
输入或转发

数据包的源 IP 地址不在您定义的任何区域中(“ shorewall[-lite] show zone ”并查看打印的区域定义)或链为 FORWARD,而目标 IP 不在您定义的任何区域中。如果链为 FORWARD,并且 IN OUT 接口相同,或者它们与/etc/shorewall/interfaces中的相同通配符条目匹配,那么您可能需要在 中的该接口上使用routeback选项,您需要在 中的相关条目中使用routeback选项 /etc/shorewall/interfaces /etc/shorewall/hosts or you've done something silly like define a default route out of an internal interface.

当shorewall.conf中的 OPTIMIZE=1 时,此类数据包也可能会被从 <zone>2all 链或 all2all 链中注销。
输出

数据包的目标 IP 地址不在您定义的任何区域中(shorewall[-lite] 显示区域并查看打印的区域定义)。

当shorewall.conf中的 OPTIMIZE=1 时,此类数据包也可能会被从 fw2all 链或 all2all 链中注销。
日志标志

该数据包被记录是因为它未能通过tcpflags 接口选项实施的检查。
过滤器

在运行 Shorewall 4.4.20 或更高版本的系统上,数据包与filter 接口选项匹配,或者它被路由到它到达的同一接口,并且接口没有routeback或routefilter 接口选项。

3. 下面是一个例子:

6月27日 15:37:56 网关内核:
岸墙:all2all:REJECT:IN=eth2
OUT=eth1
SRC=192.168.2.2
DST=192.168.1.3 LEN=67 TOS=0x00 PREC=0x00 TTL=63 ID=5805 DF PROTO=UDP
SPT=1803 DPT=53 LEN=47

让我们看一下此消息的重要部分:

all2all:拒绝

这个数据包在all2all链中被拒绝 —— 这个数据包是在“ all -> all REJECT 策略(上面的all2all)下被拒绝的。
输入=eth2

数据包通过 eth2 进入防火墙。如果您看到“ IN= ”但没有接口名称,则数据包源自防火墙本身。
输出=eth1

如果被接受,数据包将在 eth1 上发送。如果您看到“ OUT= ”但没有接口名称,则数据包将由防火墙本身处理。
笔记

DNAT 规则被记录时,永远不会显示 OUT=,因为数据包在路由之前被记录。此外,DNAT 日志记录将显示原始目标 IP 地址和目标端口号。当 REDIRECT 规则被记录时,消息还将显示原始目标 IP 地址和端口号。
源地址=192.168.2.2

数据包由 192.168.2.2 发送
夏令时=192.168.1.3

该数据包的目的地是 192.168.1.3
协议=UDP

UDP 协议
DPT=53

目标端口为 53 (DNS)

在这种情况下,192.168.2.2 位于“ dmz ”区域,而 192.168.1.3 位于“ loc ”区域。我遗漏了以下规则:

接受 dmz loc udp 53


(常见问题 21)我偶尔会看到这些奇怪的日志条目;它们是什么?

11月25日 18:58:52 Linux内核:
岸墙:net2all:DROP:IN=eth1 OUT=
MAC=00:60:1d:f0:a6:f9:00:60:1d:f6:35:50:08:00 SRC=206.124.146.179
DST=192.0.2.3 LEN=56 TOS=0x00 PREC=0x00 TTL=110 ID=18558 PROTO=ICMP
TYPE=3 CODE=3 [SRC=192.0.2.3 DST=172.16.1.10 LEN=128 TOS=0x00 PREC=0x00
TTL=47 ID=0 DF PROTO=UDP SPT=53 DPT=2857 LEN=108 ]

192.0.2.3 是我的防火墙的外部...172.16.0.0/24 是我的内部 LAN

答案:首先,请注意,以上是处理 ICMP 端口不可达数据包 (PROTO=ICMP TYPE=3 CODE=3) 的非常特殊的日志消息类型。不要阅读此答案并假设所有 Shorewall 日志消息都与 ICMP 有关(提示 - 请参阅常见问题解答 17)。

虽然大多数人将互联网控制消息协议 (ICMP) 与“ ping ”联系起来,但 ICMP IP 的一个关键部分。ICMP 用于向数据包发送者报告问题;这就是这里发生的事情。不幸的是,在涉及 NAT(包括 SNAT、DNAT Masquerade)的地方,存在许多不完善的实现。这就是您在这些消息中看到的情况。当 Netfilter 显示这些消息时,“[”之前的部分描述了 ICMP 数据包,“[”和“]”之间的部分描述了 ICMP 所响应的数据包。

这是我对正在发生的事情的解释——为了证实这个分析,必须在连接的两端放置数据包嗅探器。

NAT 网关 206.124.146.179 后面的主机 172.16.1.10 192.0.2.3 发送了一个 UDP DNS 查询,您的 DNS 服务器尝试发送响应(响应信息在括号中 - 注意源端口 53,它将此标记为 DNS 回复)。当响应返回到 206.124.146.179 时,它将目标 IP 重写为 172.16.1.10,并将数据包转发到 172.16.1.10,而 172.16.1.10 不再与 UDP 端口 2857 建立连接。这会导致在 192.0.2.3 上生成端口不可达(类型 3,代码 3)。当此数据包通过 206.124.146.179 发送回来时,该框正确地将数据包中的源地址更改为 206.124.146.179,但不会以类似的方式重置原始 DNS 响应中的 DST IP。当 ICMP 到达您的防火墙 (192.0.2.3) 时,您的防火墙没有向 172.16.1.10 发送 DNS 回复的记录,因此此 ICMP 似乎与发送的任何内容无关。最终结果是数据包在 all2all 链中被记录并丢弃。
(常见问题 52)当我使用“shorewall[-lite] drop www.xxx.yyy.zzz”将某个 IP 地址列入黑名单时,为什么我的日志仍然显示来自该地址的 REDIRECT DNAT 条目?

我使用shorewall drop 130.252.100.59 将地址 130.252.100.59 列入黑名单,但我仍然看到以下日志消息:

1 30 15:38:34 服务器 Shorewall:net_dnat:REDIRECT:IN=eth1 OUT= MAC=00:4f:4e:14:97:8e:00:01:5c:23:24:cc:08:00
SRC=130.252.100.59 DST=206.124.146.176 LEN=64 TOS=0x00 PREC=0x00 TTL=43 ID=42444 DF
协议 = TCP SPT = 2215 DPT = 139 窗口 = 53760 RES = 0x00 SYN URGP = 0

答案:请参阅Shorewall Netfilter 文档。REDIRECT DNAT 规则的记录发生在 nat 表的 PREROUTING 链中,其中原始目标 IP 地址仍然可用。黑名单发生在 filter 表的 INPUT FORWARD 链之外,直到稍后才会遍历这些链。
(常见问题 81)logdrop logreject 不记录。

我喜欢输入“shorewall logdrop ww.xx.yy.zz”并完全阻止特定 IP 地址的功能。但是,日志部分没有发生。当我查看 logdrop 链时,没有 LOG 前缀。

答案:您没有在shorewall.conf (5) 中设置 BLACKLIST_LOGLEVEL 的值。
(常见问题 36)我的日志里充满了这些 BANDWIDTH 消息!

12 15 16:47:30 heath-desktop 内核:[17182740.184000] BANDWIDTH_IN:IN=eth1 OUT=MAC=ff:ff:ff:ff:ff:ff:ff:00:01:5c:23:79:02:08:00
SRC=10.119.248.1 DST=255.255.255.255 LEN=328 TOS=0x00 PREC=0x00 TTL=64
ID=62081 协议=UDP SPT=67 DPT=68 LEN=308
12 15 16:47:30 heath-desktop 最后一条消息重复了 2
12 15 16:47:30 heath-desktop 内核:[17182740.188000] BANDWIDTH_IN:IN=eth1 OUT=MAC=ff:ff:ff:ff:ff:ff:ff:00:01:5c:23:79:02:08:00
SRC=10.112.70.1 DST=255.255.255.255 LEN=328 TOS=0x00 PREC=0x00 TTL=64
ID=62082 协议=UDP SPT=67 DPT=68 LEN=308
12 15 16:47:30 heath-desktop 最后一条消息重复了 2

答案:Webmin 的“带宽”模块添加了命令,/etc/shorewall/start创建规则来记录每个进出防火墙的数据包。不要在 WEBMIN 中启动带宽服务!

一旦发生这种情况,请编辑/etc/shorewall/start并在 BANDWIDTH 规则之前插入“return 0”。
路由
(常见问题 32)我的防火墙有两个来自不同 ISP 的互联网连接。如何在 Shorewall 中设置?

答案:请参阅有关 Shorewall 和多个 ISP 的文章。
(常见问题 49)当我启动 Shorewall 时,我的路由表被吹走了。Shorewall 为什么会这样?

答案:这通常是一对一 nat 配置错误造成的结果:

/etc/shorewall/nat尽管文档(以及文件中的注释)警告您不要这样做,但仍要在 EXTERNAL 列中指定接口的主 IP 地址。

/etc/shorewall/shorewall.conf 中指定 ADD_IP_ALIASES=Yes RETAIN_ALIASES=No。

此组合会导致 Shorewall INTERFACE 列中指定的网络接口中删除主 IP 地址,这通常会导致删除该接口的所有路由。解决方案是在 EXTERNAL 列中不指定接口的主 IP 地址。
启动和停止
(常见问题 94)启动 Shorewall 后,ps 没有显示任何正在运行的 shorewall 进程。Shorewall 守护进程叫什么?

答案: Shorewall 不是守护进程。它是一个配置工具,根据 的内容配置您的内核/etc/shorewall/。一旦启动命令完成,Shorewall 就完成了它的工作,系统中不再有 Shorewall 进程。
(常见问题 7)当我使用“ shorewall[-lite] stop ”停止 Shorewall 时,我无法连接到任何东西。为什么该命令不起作用?

答案:stop命令将防火墙置于安全状态;允许的连接由shorewall.conf (5) 中的 ADMINISABSENTMINDED 设置和shorewall-stoppedrules (5)的内容。要完全打开防火墙,请使用clear命令。
(常见问题 9)为什么 Shorewall 在启动时无法正确检测到我的接口?

我刚刚安装了 Shorewall,当我发出启动命令时,我看到以下内容:

正在处理 /etc/shorewall/params ...
正在处理 /etc/shorewall/shorewall.conf ...
启动 Shorewall...
正在加载模块...
正在初始化...
确定区域...
区域:net loc
验证接口文件...
正在验证主机文件...
确定区域中的主机...
网络区域:eth0:0.0.0.0/0
本地区域:eth1:0.0.0.0/0
正在删除用户链...
创建输入链...
...

为什么 Shorewall 无法正确检测我的接口?

答案:以上输出完全正常。Net 区域定义为通过 连接的所有主机eth0,而 local 区域定义为通过 连接的所有主机eth1。如果您希望防范“ Martians ”(Martian 是指源 IP 地址未从接收数据包的接口路由出去的数据包),则可以在内部接口上设置routefilter选项。如果您这样做,最好也设置 logmartians选项。
(常见问题 22)我有一些 iptables 命令,希望在 Shorewall 启动时运行。我应该把它们放在哪个文件中?

答案:您可以将这些命令放在Shorewall 扩展脚本之一中。请务必查看您将使用命令修改的链的内容,以便命令能够执行预期的操作。HOWTO 和其他指导材料中发布的许多 iptables 命令都使用 -A 命令,该命令将规则添加到链的末尾。Shorewall 构建的大多数链都以无条件的 DROP、ACCEPT REJECT 规则结尾,之后添加的任何规则都将被忽略。检查“ man iptables ”并查看 -I(--insert)命令。
(常见问题 43)我刚刚安装了 Shorewall RPM,但 Shorewall 在启动时无法启动。

答案:使用“rpm -U”命令安装时,Shorewall 不会运行您的发行版的用于配置 Shorewall 启动的工具。您需要运行该工具(insserv、chkconfig、运行级别编辑器等)来配置 Shorewall 以在防火墙系统的默认运行级别中启动。
(常见问题 59)启动 Shorewall 后,会加载大量未使用的 Netfilter 模块。如何避免这种情况?

答案:复制/usr/share/shorewall[-lite]/modules修改/etc/shorewall/modules 副本以仅包含您需要的模块。另一种方法是在shorewall.conf (5) 中设置 LOAD_HELPERS_ONLY=Yes。
(常见问题 68)我在 OpenVZ 系统下有一台虚拟机。我无法摆脱以下消息:

错误:命令“/sbin/iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT”失败。

答案:请参阅Shorewall OpenVZ 文章。
(常见问题 73)当我停止 Shorewall 时,防火墙处于完全打开状态。这难道不是安全风险吗?

重要的是要了解, 中的脚本/etc/init.d通常由您的发行版提供,而不是由 Shorewall 开发人员提供。这些脚本必须满足发行版打包系统的要求,这可能会与严密防火墙的要求相冲突。因此,当您说“…当我停止 Shorewall…”时,有必要区分命令/sbin/shorewall stop和/etc/init.d/shorewall stop。

/sbin/shorewall stop将防火墙置于安全状态,其细节取决于您的/etc/shorewall/stoppedrules文件 ( shorewall-stoppedrules/etc/shorewall/shorewall.conf (5)) 和( shorewall.conf (5) )中 ADMINISABSENTMINDED 的设置

/etc/init.d/shorewall stop可能会或可能不会执行相同的操作。例如,在Debian 系统中,该命令实际上执行/sbin/shorewall clear,从而完全打开防火墙。换句话说,在 init 脚本中, stop会反转start的效果。

Shorewall 4.4 开始,当 Shorewall tarball 安装在 Debian(或衍生)系统上时,该/etc/init.d/shorewall文件与 .deb 安装的文件相同。/etc/init.d/shorewall stop的行为由 中的 SAFESTOP 设置控制/etc/default/shorewall。设置为 0(默认值)时,防火墙被清除;设置为 1 时,防火墙处于安全状态。
(常见问题 78)重启并启动我的 Debian 防火墙后,防火墙后面的主机尝试连接到网络或通过 VPN 的所有流量都被阻止(尽管我可以访问内部防火墙接口并获取转储等)。一旦我发出“shorewall clear”,然后发出“shorewall start”,它就会正常工作,尽管配置没有改变

答案:在 中设置 IP_FORWARDING=On/etc/shorewall/shorewall.conf。
(常见问题 86)我的发行版 (Ubuntu) 使用 NetworkManager 来管理我的接口。我想为我的接口指定 upnpclient 选项,这要求在 Shorewall 启动时启动并配置它们,但 Shorewall NetworkManager 之前启动。

回答:我遇到了类似的问题,解决方法如下:

不要在启动时启动 Shorewall(Debian Ubuntu 用户只需在 中设置 startup=0 /etc/default/shorewall)或使用systemctl disable shorewall.service在 systemd 中禁用它。

在中/etc/network/ip-up.d我添加了一个shorewall脚本,内容如下:

/bin/sh #!/bin/sh 复制代码

shorewall status > /dev/null 2>&1 || shorewall start # 如果 Shorewall 尚未运行,则启动它

确保脚本的执行访问权限安全。

更新:

Shorewall 4.4.10 开始,有一个新的Shorewall Init 包专门用于处理这种情况。

(常见问题 90 Shorewall 启动正常,但几分钟后就停止了。为什么会这样?

答案: Shorewall 使用名为shorewall的链的存在来指示是启动还是停止。该链是在成功执行start、 restart或restore命令期间创建的,并在stop和clear期间删除。如果shorewall status指示 Shorewall 已停止,则表示有东西删除了该链。查看shorewall status的输出;如果它看起来像这样:

网关:〜#岸墙状态
Shorewall-4.4.11 网关状态 - 2010 7 21 日星期三 13:21:41 PDT

Shorewall 已停止
状态:已启动(2010 7 20 日星期二 16:01:49 PDT)

网关:~#

那么这意味着 Shorewall 之外的某些东西删除了该链。这通常意味着您在安装 Shorewall 之前正在运行另一个防火墙包,并且该包已用自己的配置替换了 Shorewall Netfilter 配置。您必须删除(或至少禁用)其他防火墙包并重新启动 Shorewall。

网关:〜#岸墙状态
Shorewall-4.4.11 网关状态 - 2010 7 21 日星期三 13:26:29 PDT

Shorewall 已停止
状态:已停止(2010 7 21 日星期三 13:26:26 PDT)

网关:~#

然后执行了shorewall stop命令(如果输出中显示的 State 为Cleared,则执行了shorewall clear命令)。最有可能的是,您已经安装并配置了shorewall-init包,并且所需的接口已关闭。
(常见问题 99)我的 /var/lib/shorewall-init.log 显示 Shorewall 在启动时正在运行,但启动后“iptables -L”显示空配置

答案:这是由于您在安装 Shorewall 时未能禁用发行版默认的 iptables 配置工具所致。查找在 Shorewall 之后启动的名为“iptables”的服务并将其禁用。
(常见问题 101)如何在较慢的硬件上加快“shorewall start”和“shorewall restart”的速度?

回答:您可以采取以下几个步骤:

如果您的内核支持模块自动加载(并且分发默认内核几乎总是支持),那么请在 shorewall.conf 中设置 LOAD_HELPERS_ONLY=Yes。

shorewall.conf 中设置 AUTOMAKE=Yes。这将避免在配置自上次编译后没有发生更改的情况下进行编译阶段。

不要设置优化选项 8。例如,如果您当前设置了 OPTIMIZE=31,则将其更改为 OPTIMIZE=23。优化选项 8 会合并相同的链,从而生成较小的规则集,但会减慢大型规则集的编译速度。

不要使用 restart,而要使用reload。使用默认设置 RESTART=restart ,restart会执行stop然后执行 start,而reload则避免执行stop部分。

使用功能文件:

运行shorewall show -f capabilties > /etc/shorewall/capabilities

每次安装新内核或新版本的 shorewall 时,请重新运行该命令。

(常见问题 103 Shorewall 无法在启动时启动,但启动后会立即启动

答案:这通常与 SELinux 有关。这里是一个例子。
(常见问题 104)我明白了(常见问题 104)当我启动或重新启动 Shorewall Shorewall6 时,我在日志中内核消息

例子:

> 10 1 13:04:39 deb 内核:[9570.619744] xt_addrtype:ipv6 不支持 BROADCAST 匹配

答案:这些是无害的。Shorewall 尝试执行各种命令来确定系统的功能。如果您的系统不支持某个命令,它通常会发出内核日志消息。
(常见问题 106)使用 systemd Debian 启动时 Shorewall 不会启动

答案:要启用开机自启动功能,请运行systemctl enable shorewall.service
多个 ISP
(常见问题 57)我在 Shorewall 中配置了两个 ISP,但是当我尝试使用第二个 ISP 时,它不起作用。

答案:多 ISP 文档强烈建议您在所有提供商上使用平衡选项,即使您想手动指定要使用的 ISP。如果您不这样做,您的主路由表只有一个默认路由,那么您必须禁用路由过滤。不要在其他接口上指定路由过滤器/etc/shorewall/interfaces选项,并禁用您的发行版提供的任何IP 地址欺骗保护。
(常见问题 58)但是如果我指定“balance”,那么 Shorewall 不会平衡接口之间的流量吗?我不想要那样!

答案:假设您希望所有流量都通过 ISP1(标记为 1)出去,除非您另有指定。那么只需在您的/etc/shorewall/mangle(原为 tcrules)文件中添加以下两条规则作为第一条标记规则即可:

#动作源目标
标记(1):P 0.0.0.0/0
MARK(1) $FW
其他 MARK 规则

现在,任何未被其他 MARK 规则标记的流量都将标记为 1,并通过 ISP1 发送。无论是否指定了余额,这都可以正常工作!
使用 DNS 名称
(常见问题 79)我可以在 Shorewall 配置文件条目中使用 DNS 名称代替 IP 地址吗?

回答:可以,但是我们强烈建议不要这么做。
流量整形
(常见问题 67)我刚刚配置了 Shorewall 的内置流量整形,但现在 Shorewall 无法启动。

我收到的错误如下:

RTNETLINK 回答:没有这样的文件或目录
我们与内核通信时出错
错误:命令“tc filter add dev eth2 parent ffff:协议 ip prio
50 u32 匹配 ip src 0.0.0.0/0 策略速率 500kbit 突发 10k 丢弃 flowid
:1”失败

答案:此消息表明您的内核不支持“流量监管”。如果您的内核是模块化的,您可以通过加载act_police内核模块来解决问题。您需要的其他内核模块包括:
cls_基本
cls_fw
cls_u32
sch_htb
sch_ingress
sch_sfq
(常见问题 97)我启用了 Shorewall 流量整形,现在我的上传速率远低于我指定的值

答案:这可能是由于网络适配器中启用了 TCP 分段卸载 (TSO) 和/或通用分段卸载 (GSO)。要验证,请安装ethtool包并使用 -k 命令:

root@gateway:~# ethtool -k eth1
eth1 的卸载参数:
接收校验和:开启
tx-校验和:开启
分散-聚集:开启
tcp 分段卸载:开启
udp 碎片卸载:关闭
通用分段卸载:开启
通用接收卸载:关闭
大型接收卸载:关闭
ntuple-filters: 关闭
接收哈希:关闭
root@gateway:~#

如果是这种情况,您可以通过调整minburst/etc/shorewall/tcinterfaces(简单流量整形)或 /etc/shorewall/tcdevices(复杂流量整形)中的设置来解决问题。我们建议从 10-12kb 开始,并根据需要进行调整。示例(简单流量整形):

#接口类型 输入带宽 输出带宽
eth0 外部 50mbit:200kb 5.0mbit:100kb:200ms:100mbit: 10kb

或者,您也可以使用此命令关闭 TSO GSO /etc/shorewall/init:

ethtool -K eth N tso 关闭 gso 关闭

(常见问题 97a)我启用了 Shorewall 流量整形,现在我的下载速率远低于我指定的值

答案:这可能是由于网络适配器中启用了通用接收卸载 (GRO)。要验证,请安装ethtool包并使用 -k 命令:

root@gateway:/etc/shorewall# ethtool -k eth1
eth1 的卸载参数:
接收校验和:开启
tx-校验和:开启
分散-聚集:开启
tcp 分段卸载:开启
udp 碎片卸载:关闭
通用分段卸载:开启
通用接收卸载:开启
大型接收卸载:关闭
ntuple-filters: 关闭
接收哈希:关闭
root@gateway:/etc/shorewall#

要解决此问题,请使用以下命令:

ethtool -K eth N gro 关闭

Shorewall 4.4.25 开始,以速率估计监管过滤器的形式提供了另一种选项。

来自 /etc/shorewall/tcdevices 的示例:

#接口输入带宽输出带宽选项
1:COMB_IF ~20mbit:250ms:4sec ${UPLOAD}kbit hfsc,链路层=以太网,开销=0

要创建速率估计滤波器,请在带宽前加上波浪符号(“~”)。可选的间隔和衰减间隔决定了估计速率的频率以及保留多少个样本进行估计。有关详细信息,请参阅http://ace-host.stuart.id.au/russell/files/tc/doc/estimators.txt。
关于 Shorewall
(常见问题 10)Shorewall 与哪些发行版兼容?

答案: Shorewall 可与任何包含适当先决条件的GNU/Linux 发行版兼容。
(常见问题 11)Shorewall 有哪些功能?

答案:请参阅Shorewall 功能列表。
(常见问题 12)有 GUI 吗?

答案:是的!Webmin 中提供 Shorewall 支持。请参阅http://www.webmin.com 。但请注意常见问题解答 36中描述的问题。
(常见问题 13)为什么称之为“ Shorewall ”?

答: Shorewall 是“海岸线” (我居住的城市)和“防火墙 ”的组合。该产品的全名实际上是“海岸线防火墙”,但“ Shorewall ”更常用。
(常见问题 23)为什么你们的网站上使用这么丑的字体?

答案: Shorewall 网站几乎不使用任何字体(除了少数页面外,它没有明确指定字体),因此您看到的字体大部分都是浏览器中配置的默认字体。如果您不喜欢它们,请重新配置您的浏览器。
(常见问题 25)如何知道我正在运行哪个版本的 Shorewall Shorewall Lite?

答案:在 shell 提示符下,输入:

/sbin/shorewall[-lite] 版本 -a

(常见问题 25a)上面说 4.4.7.5;我怎么知道它是 Shorewall-shell 还是 Shorewall-perl?

答案:它是 Shorewall-perl。Shorewall-shell Shorewall 4.4 中已停用。
(常见问题 31)Shorewall 是否提供针对....的保护。

IP 欺骗:使用内部 LAP IP 地址作为源地址通过 WAN 接口发送数据包?

答:是的。
泪滴:发送包含重叠片段的数据包?

答案:这是 IP 堆栈的责任,而不是基于 Netfilter 的防火墙的责任,因为片段重组发生在状态数据包过滤器接触每个数据包之前。
Smurf Fraggle:发送使用 WAN LAN 广播地址作为源地址的数据包?

答案: Shorwall 在/etc/shorewall/interfaces中的nosmurfs接口选项下过滤这些数据包。
Land 攻击:发送使用相同地址作为源地址和目标地址的数据包?

答案:是的,如果选择了routefilter接口选项。
DOS: - SYN Dos - ICMP Dos - 每主机 Dos 保护

答:是的。

(常见问题 65)如何使用 Shorewall 实现故障转移?

回答: Paul Gear 的这篇文章应该可以帮助您入门。
别名 IP 地址/虚拟接口
(常见问题 18)有没有办法将别名 IP 地址与 Shorewall 一起使用,并为不同的 IP 维护单独的规则集?

答案:是的。请参阅Shorewall 和别名接口。
(常见问题 83)没有办法嵌套防火墙区域或创建子区域吗?我有一个带有 Linux-VServers 的系统,它是一个具有多个 IP 的接口 (eth0)

答案:从 Shorewall 4.4.11 Beta 2 开始,您可以嵌套在防火墙区域内的虚拟服务器区域。

4.4.11 Beta 2 之前,无法创建防火墙区域的子区域。但您可以使用 shell 变量使虚拟服务器更易于处理。

/etc/shorewall/params:

VS1=转发:192.168.2.12
VS2=转发:192.168.2.13
VS3=转发:192.168.2.14

/etc/shorewall/rules:

#动作源目标原型端口

?全部部分
?部分已建立
?SECTION 相关
?部分无效
?部分未跟踪
?新部分

接受 $VS1 net tcp 25
DNAT $VS1 tcp 25
ETC...

Shorewall Lite
(常见问题 53)什么是 Shorewall Lite?

答案: Shorewall Lite Shorewall 的配套产品,旨在让您在网络内的单个系统上维护所有 Shorewall 配置信息。有关详细信息,请参阅编译的防火墙脚本文档。
(常见问题 54)如果我想使用 Shorewall Lite,我是否还需要在同一系统上安装 Shorewall?

答案:不。事实上,我们建议您不要在想要使用 Shorewall Lite 的系统上安装 Shorewall。您必须在网络中的至少一个系统上安装 Shorewall 才能使用 Shorewall Lite。
(常见问题 55)我如何决定使用哪种产品 - Shorewall 还是 Shorewall Lite?

答案:如果您只打算使用一个防火墙系统,那么 Shorewall 是合乎逻辑的选择。我还认为 Shorewall 是笔记本电脑系统的合适选择,因为笔记本电脑系统可能需要在旅途中更改防火墙配置。在其余情况下,Shorewall Lite 会工作得很好。在 shorewall.net 上,两个笔记本电脑系统都安装了完整的 Shorewall 产品,我的个人 Linux 桌面系统也是如此。运行防火墙的所有其他 Linux 系统都使用 Shorewall Lite,并且它们的配置目录位于我的桌面系统上。
(常见问题 60)Shorewall Shorewall Lite 之间的兼容性限制是什么

答: Shorewall Shorewall-lite 之间没有兼容性限制。
网络电话
(常见问题 77 Shorewall 正在吞噬我的 Asterisk 出口流量!

不知何故,我的防火墙配置导致 Asterisk 出现单向音频问题。如果有人拨打 PBX,他们听不到我说话,但我能听到他们说话。如果我将 Asterisk 服务器直接插入路由器,绕过防火墙,问题就解决了。

答案:遇到 VOIP 问题时,有两种方法可以尝试。两种方法都是从执行两个rmmod命令开始。

如果你的内核版本是2.6.20或更早版本:

rmmod ip_nat_sip
rmmod ip_conntrack_sip

如果你的内核版本是2.6.21或更高版本:

rmmod nf_nat_sip
rmmod nf_conntrack_sip

对于运行较新内核(2.6.26 或更高版本)的用户来说,第一个替代方案似乎有效:

/usr/share/shorewall/module将s复制到/etc/shorewall(/usr/share/shorewall/helpers如果 shorewall.conf 中有 LOAD_HELPERS_ONLY)。

编辑副本并更改此行:

加载模块 nf_conntrack_sip



加载模块 nf_conntrack_sip sip_direct_media=0

重启shorewall

第二种选择是不加载 SIP 助手:

如果您运行的是内核 2.6.20 或更早版本,则将 shorewall.conf 中的 DONT_LOAD 规范更改为:

DONT_LOAD=ip_nat_sip,ip_conntrack_sip

如果您运行的是内核 2.6.21 或更高版本,则将 shorewall.conf 中的 DONT_LOAD 规范更改为:

DONT_LOAD=nf_nat_sip,nf_conntrack_sip

IPv6
(常见问题 80)Shorewall 是否支持 IPV6?

答案:Shorewall IPv6 支持目前在 Shorewall 4.2.4 及更高版本中可用。
(常见问题 80a)为什么 Shorewall lPv6 支持需要内核 2.6.24 或更高版本?

答案: Shorewall 实现了状态防火墙,要求在 ip6tables 和内核中存在连接跟踪。2.6.20 之前的 Linux 内核不支持 IPv6 的连接跟踪。因此,直到 2.6.20 版本,我们才开始开发 Shorewall IPv6 支持,而且至少在内核 2.6.23 版本之前,该功能都存在严重问题。当发行版开始提供 IPv6 连接跟踪支持时,使用的是内核 2.6.25。因此,这就是我们开发 IPv6 支持的基础,也是我们最初测试的基础。随后,我们在内核为 2.6.24 Ubuntu Hardy 上测试了 Shorewall6。如果您运行的是 2.6.20 或更高版本,您可以尝试通过修改内核版本测试来运行 Shorewall6 /usr/share/shorewall/prog.footer6,以检查您的内核版本,而不是 2.6.24 (20624)。但之后,您就得靠自己了。

内核 = $(printf“%2d%02d%02d \ n”$(echo $(uname -r)2> / dev / null | sed's / -。* / /'| tr'。''')| head -n1)
如果 [ $kernel -lt 20624 ]; 那么
error_message“错误:$PRODUCT 需要 Linux 内核2.6.24或更高版本”
状态=2
别的


更新:上述逻辑在/usr/share/shorewall/prog.footer后来的 Shorewall 版本中被发现。
(常见问题 40)我有一个从 radvd 获取其 IPv6 配置的接口。当我启动 Shorewall6 时,我立即丢失了默认路由。为什么?

答案:您已在接口上配置了转发,这将禁用接口的自动配置。要在 Shorewall6 启动时保留接口上的自动配置,请在shorewall6-interfaces (5)中接口条目的 OPTIONS 列中指定forwarding=0。
(常见问题 96)我开始使用 ipv6,但在我的 ipv4 FW 上,重新启动 Shorewall 时,它会放入 ip6tables 规则。我该如何禁用它?

答案:这是一个两步过程。

在shorewall.conf (5)中设置 DISABLE_IPV6=No并重新启动 Shorewall。

root shell 提示符下执行以下命令:

ip6tables -P 输入接受

ip6tables -P 输出接受

ip6tables -P 转发接受

您可能希望尽快安装Shorewall6,以便拥有 IPv6 防火墙和 IPv4 防火墙。
无线狗
(常见问题 105)Shorewall 可以与 Wifidog 配合使用吗?

答案:是的,但有一些限制:

必须在 Shorewall 之后启动 Wifidog。如果 Shorewall 重新启动/重新加载,则必须重新启动 wifidog。

必须在 shorewall.conf 中设置 FORWARD_CLEAR_MARK No

各种各样的
(常见问题 20)我刚刚设置了服务器。我是否必须更改 Shorewall 以允许从 Internet 访问我的服务器?

答案:是的。请参阅您在初始设置期间使用的快速入门指南,了解如何为服务器设置规则的信息。
(常见问题 24)我如何才能允许仅从 Internet 上的特定 IP 地址连接 ssh 端口?

答案:在规则的 SOURCE 列中, net ”后面跟着一个冒号,以及以逗号分隔的主机/子网地址列表。

网络:<ip1>,<ip2>,...

例4.示例:

接受网络:192.0.2.16/28,192.0.2.44 fw tcp 22


(常见问题 26)当我尝试在防火墙上或防火墙后使用 nmap 中的任何 SYN 选项时,出现“操作不允许”信息。如何将 nmap Shorewall 结合使用?

答案:暂时删除任何rejNotSyn、 dropNotSyn、 dropInvalid、 NotSyn (... )和Invalid (... )规则/etc/shorewall/rules,然后重新启动 Shorewall。
(常见问题 27)我正在为防火墙编译新内核。我应该注意什么?

答案:首先查看Shorewall 内核配置页面。您可能还想确保已在 Netfilter 配置菜单上选择了“本地连接的 NAT(阅读帮助) 。否则,以防火墙为源区域的 DNAT 规则将无法与新内核配合使用。
(常见问题 28)如何使用 Shorewall 作为桥接防火墙?

答案: Shorewall Bridging 防火墙支持可用 —点击此处查看详细信息。
(常见问题 39)如何阻止与特定域名的连接?

我尝试使用此规则来阻止 Google Adsense,您会在每个网站上看到它。Adsense 是人们添加到其网页中的 Javascript。因此我输入了以下规则:

#动作源目标原型
拒绝 fw net:pagead2.googlesyndication.com 全部

但是,这有时也会限制对“google.com”的访问。这是为什么呢?使用 dig,我找到了域名 googlesyndication.com 的以下 IP:

216.239.37.99
216.239.39.99

google.com 的情况如下:

216.239.37.99
216.239.39.99
216.239.57.99

所以我猜你实际上并没有阻止域名,而是阻止了被调用的 IP。那么你究竟是如何阻止实际域名的呢?

答案:像 Netfilter 这样的数据包过滤器根据每个数据包前面的各种协议报头的内容做出决定。状态数据包过滤器(Netfilter 就是一个例子)使用报头内容和数据包过滤器处理早期数据包时创建的状态的组合。Netfilter(以及 Shorewall Netfilter 的使用)还考虑每个数据包进入的网络接口和/或数据包离开防火墙/路由器的位置。

当您在 Shorewall 规则中指定域名时,iptables 程序会将该名称解析为一个或多个 IP 地址,并且实际创建的 Netfilter 规则将根据这些 IP 地址来表示。因此,您输入的规则相当于:

#动作源目标原型
拒绝$FW net:216.239.37.99 全部
拒绝$FW net:216.239.39.99 全部

鉴于基于名称的多重托管是一种常见做法(另一个示例:lists.shorewall.net www1.shorewall.net 都托管在具有单个 IP 地址的同一系统上),仅通过检查协议标头无法过滤到特定名称的连接。虽然某些协议(例如FTP)需要防火墙检查并可能修改数据包负载,但解析单个数据包的负载并不总是有效,因为应用程序级数据流可以以任意方式跨数据包拆分。这是更高版本的 Linux 内核中提供的“字符串匹配”Netfilter 扩展的弱点之一。过滤数据包内容的唯一可靠方法是代理相关连接 - 对于 HTTP,这意味着运行类似Squid 的程序。代理允许代理进程组装完整的应用程序级消息,然后可以准确解析这些消息并根据结果做出决策。
(常见问题 42)如何知道我的内核和 iptables 支持哪些功能?

答案:在 root 提示符下使用shorewall[-lite] show capabilities命令。

网关:〜# shorewall 显示功能
Shorewall 检测到以下 iptables/netfilter 功能:
NAT:可用
数据包处理:可用
多端口匹配:可用
扩展多端口匹配:可用
连接追踪匹配:可用
扩展连接跟踪匹配支持:可用
旧连接跟踪匹配语法:不可用
数据包类型匹配:可用
政策匹配:可用
Physdev Match:可用
Physdev-is-bridged 支持:可用
数据包长度匹配:可用
IP 范围匹配:可用
近期比赛:可用
所有者匹配:可用
Ipset 匹配:可用
CONNMARK 目标:可用
扩展的 CONNMARK 目标:可用
Connmark 匹配:可用
扩展的 Connmark 匹配:可用
原始表:可用
IPP2P 匹配:可用
IPP2P 匹配语法:不可用
分类目标:可用
扩展拒绝:可用
重复匹配:可用
MARK 目标:可用
扩展 MARK 目标:可用
Mangle FORWARD 链: 可用
评论:可用
地址类型匹配:可用
TCPMSS 匹配:可用
哈希限制匹配:可用
旧哈希限制匹配:不可用
NFQUEUE 目标:可用
领域匹配:可用
帮手匹配:可用
Connlimit 匹配:可用
時間匹配:有
转到支持:可用
LOGMARK 目标:可用
IPMARK 目标:可用
日志目标:可用
持久性 SNAT:可用
网关:~#

(常见问题 19)如何打开防火墙以阻止所有往返于 LAN 的流量?

答案:添加这两个策略:

#源目标策略日志级别限制 CONNLIMIT
$FW loc 接受
loc $FW 接受

您还应该删除 $FW->loc loc->$FW 中的任何 ACCEPT 规则,因为这些规则与上述策略是重复的。
(常见问题 88)我可以使用 Shorewall 运行 Snort 吗?

答案:是的。在网络入侵检测系统 (NIDS) 模式下,Snort 基于 libpcap(如 tcpdump),因此不会干扰 Shorewall。我们收到报告称,用户也可以成功将 Snort与 Shorewall结合使用,但目前尚无 HOWTO。
(常见问题 89)如何从我的本地 LAN 连接到 aDSL 调制解调器中的 Web 服务器?

回答:以下是我所做的:

我的本地网络是 172.20.1.0/24,所以我将调制解调器中的 IP 地址设置为 172.20.1.2

我的防火墙到 LAN 的接口的 IP 地址是 172.20.1.254。DSL 接口的逻辑名称是 EXT_IF,我的 LAN 接口是 INT_IF。

我添加了以下两个配置条目:

/etc/shorewall/masq:

#接口源地址

?评论 DSL 调制解调器

EXT_IF:172.20.1.2 0.0.0.0/0 172.20.1.254

运行 Shorewall 5.0.14 或更高版本时,等效/etc/shorewall/snat于:

#动作源目标原型端口
SNAT(172.20.1.254) 0.0.0.0/0 EXT_IF:192.168.1.2 tcp www

/etc/shorewall/proxyarp:

#地址接口外部 HAVEROUTE 持久性
172.20.1.2 EXT_IF INT_IF

如果您无法更改调制解调器的 IP 地址,并且其当前地址不在您的本地网络中,则需要稍微更改它;假设调制解调器的 IP 地址是 192.168.1.1

不包括 中的条目/etc/shorewall/proxyarp。

使用配置的网络管理工具将 192.168.1.0/24 中的 IP 地址添加到外部接口。对于基于 Debian 的系统,这意味着将其添加到接口的节中/etc/network/interfaces:

发布 /sbin/ip addr add 192.168.1.254/24 devexternal-interface

您的输入/etc/shorewall/masq将是:

#接口源地址

评论 DSL 调制解调器

EXT_IF:192.168.1.1 0.0.0.0/0 192.168.1.254

运行 Shorewall 5.0.14 或更高版本时,等效/etc/shorewall/snat于:

#动作源目标原型端口
SNAT(192.168.1.254) 0.0.0.0/0 EXT_IF:192.168.1.1 tcp www

(常见问题 93)我无法使用 Shorewall 管理网桥。我收到以下错误:错误:Shorewall 4.4.13.3 不支持 BRIDGING=Yes。

答案:如果您想要将防火墙规则应用于桥接端口之间传递的流量,请参阅https://shorewall.org/bridge-Shorewall-perl.html。如果您只是想允许端口之间的所有流量,请参阅https://shorewall.org/SimpleBridge.html。
(常见问题 95)我在配置文件和文档中看到的 $FW 是什么?

答案:FW是一个shell 变量,它扩展为您在shorewall-zones (5)中为防火墙区域指定的名称。防火墙区域的默认名称是fw:

#区域类型选项

防火墙

因此,使用默认或示例配置,编写$FW与编写fw相同。如果您为防火墙区域指定不同的名称(例如gate) ,则编写$FW与编写gate相同。

#区域类型选项

防火墙

为什么要这么做?

答:防火墙区域具有特殊的语义,因此以独立于配置的方式引用它可以使编写文档、示例、宏等变得更容易。
(常见问题 98)如何取消订阅邮件列表

答案:有两种方法:

在网上

转到https://lists.sourceforge.net/lists/listinfo/shorewall-users。表单底部有一个名为“ Shorewall-users 订阅者”的部分。在该部分底部找到:

“要取消订阅 Shorewall-users,获取密码提示符,或者更改你的订阅选项,请输入你的订阅电子邮件地址:”。

在提供的框中输入您的电子邮件地址,然后单击“取消订阅或编辑选项”按钮。这将带您进入第二个表单。

第二个表单的顶部是输入密码的框——在那里输入密码,然后单击表单中心的“取消订阅”按钮。您将被取消订阅。

如果您不记得密码,请点击表格底部的“提醒”按钮,您的密码将通过电子邮件发送给您。

通过电子邮件使用此链接:mailto:shorewall-users-request@lists.sourceforge.net?subject=unsubscribe。您很快就会收到一封确认电子邮件;请按照该电子邮件中的说明进行操作。

(常见问题 102)什么是“qt”?我在一些较旧的文档中看到过它。

答案:'qt' 代表 'quiet';qt() 是一个 shell 函数,它接受带有参数的命令作为参数。它将标准输出和标准错误重定向到 /dev/null。它在 Shorewall-core shell lib.common 中定义。

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 !