在Linux中设置防火墙可能对新手或不太熟悉iptables的人来说是一个很大的挑战。幸运的是,Shorewall提供了一个非常易于使用的解决方案。
在这篇多部分的教程中,我将带你入门Shorewall,并深入讲解一些更高级的主题,帮助你掌握这个强大的防火墙系统。
什么是Shorewall?
Shorewall本质上是iptables的前端,它是一个命令行环境前端,通过多个文本文件进行配置。虽然Shorewall是一个功能强大的防火墙系统,能够扩展到服务大量计算机的大型网络,但我们将从一个基本的双接口配置开始,掌握其基础知识。
双接口配置指的是一个具有两个以太网端口的机器,一个端口连接到外网,另一个端口连接到本地网络。
在Linux中安装Shorewall防火墙
Shorewall可以通过apt和yum包管理工具进行安装。
– 在基于Debian的系统上:
sudo apt install shorewall
– 在基于RHEL的系统上:
sudo yum install shorewall
安装完成后,我们需要将“/usr/share/doc/shorewall”目录中的示例配置复制到Shorewall的默认配置目录“/etc/shorewall”中。
sudo cp /usr/share/doc/shorewall/example/two-interfaces/* /etc/shorewall
cd /etc/shorewall
如果我们查看该目录,会看到一些文件和`shorewall.conf`文件。

Shorewall将网络视为不同区域的组合,因此我们首先要查看的文件是`/etc/shorewall/zones`文件。
sudo nano /etc/shorewall/zones

在这个文件中,我们看到默认定义了三个区域:fw、net和loc。需要注意的是,Shorewall将防火墙本身视为一个独立的区域,并将其存储在一个名为$fw的变量中。
`/etc/shorewall/zones`文件是自解释的。你有net区域(面向互联网的接口),loc区域(面向局域网的接口),以及fw区域,表示所有内容。
这个配置的作用如下:
– 允许来自loc区域(局域网)到net区域(互联网)的所有连接请求。
– 丢弃来自net区域到防火墙和局域网的所有连接请求(忽略)。
– 拒绝并记录所有其他请求。
LOG LEVEL这一项应该是任何做过Apache、MySQL或其他自由开源程序管理的人都很熟悉的。在这里,我们告诉Shorewall使用“info”级别的日志记录。

现在,区域和策略已经设置好了,我们需要配置接口。你可以通过编辑`/etc/shorewall/interfaces`文件来完成这一点。
sudo nano /etc/shorewall/interfaces

在这个文件中,我们将面向互联网的接口设置为`eth0`,并将其分配到net区域。局域网一侧的接口`eth1`被设置为loc区域。请根据自己的配置调整此文件。
对于每个接口,你可以设置的选项非常多,最好通过`man shorewall-interfaces`命令查看详细说明。
常见的接口选项
一些常见的选项包括:
– nosmurfs – 过滤源地址为广播地址的包。
– logmartians – 记录源地址不合法的包。
– routefilter – 内核路由过滤,防止IP欺骗。
当然,现在我们的系统已经有了防火墙,我们需要允许某些连接通过以完成我们需要的工作。你可以在“/etc/shorewall/rules”文件中定义这些规则。
sudo nano /etc/shorewall/rules

这个文件刚开始看起来有点混乱,主要是因为列对齐有些重叠,但头部标识已经很自解释了。首先,你有ACTION列,描述你希望执行的操作。
接下来是SOURCE列,你在这里定义数据包的源区域。然后是DEST,即目标区域或IP地址。让我们通过一个例子来说明。
假设你想在防火墙后面运行一个SSH服务器,机器的IP地址是192.168.1.25。你不仅需要在防火墙中打开一个端口,还需要告诉防火墙,任何进入22端口的流量都需要转发到IP地址为192.168.1.25的机器上。
这叫做端口转发(Port Forwarding),是大多数防火墙/路由器上的常见功能。在`/etc/shorewall/rules`文件中,你可以通过添加如下行来实现:
SSH(DNAT) net loc:192.168.1.25
上述配置中,我们定义了任何来自net区域并指向SSH的流量,必须通过目标地址192.168.1.25的22端口进行NAT(网络地址转换)。
这就是所谓的网络地址转换(NAT)。其中的“D”表示这是一个针对目标地址的NAT。
为了使这个配置生效,你必须在内核中启用NAT支持。如果你需要NAT但没有启用,请查看我的《如何重新编译Debian内核》的教程。
在下一篇文章中,我们将探讨各种Shorewall配置和选项。不过,当前提供的内容已经足够帮助你入门了。像往常一样,请参考man手册获取更深入的理解。











