Linux 烹饪之道:简化防火墙的几个秘诀
弗朗索瓦!你管这叫安全通知?如果一个有自尊的系统管理员想要根据通知采取行动,消息必须包含比“这是紧急安全广播系统的测试”更多的信息。我该拿你怎么办呢? 弗朗索瓦,你在看什么?什么?哦,我的朋友们,请原谅我。我没有注意到你们的到来。我们正在 Linux 服务器上设置一些新的安全策略,弗朗索瓦写了一个脚本来检测我的端口扫描,我完全分心了。
弗朗索瓦!给我们的朋友们来点酒。快点!快点! 来吧,我的朋友们。让我带你们去餐桌。当你们坐舒服后,我应该告诉你们关于我的服务员让系统发出的这条消息。我对系统进行了彻底的端口扫描,但他发送的通知仍然是老旧的“这是紧急情况等等的测试”类型的消息。描述性不强,不是吗? 你们知道吗,当我年轻的时候,电视上播放这些消息时,我总是怀疑,如果真的发生了紧急情况,我们就不会收到消息,因为那些知道问题的人早就躲起来了。一个小玩笑,我的朋友们。啊,弗朗索瓦。是的。真是个绝佳的葡萄酒选择。你们会喜欢这款酒的,我的朋友们,一款极品的 1995 年蒙哈榭。请倒酒吧,弗朗索瓦。
安全,正如你们所知,确实是非常严肃的事情。每天,我们都听到病毒造成的损害,以及黑客利用新的漏洞破坏系统。对于我们这些在信息技术餐饮业的人来说,这是一个充满挑战的时代。我们必须时刻保持警惕。那么,一个好的防火墙就是一个极好的开端。但如何简单地做到这一点才是问题,不是吗?
保护你的机器最简单的方法(除了把它锁在没有互联网连接的酒窖里之外)是从你的 /etc/inetd.conf 文件中禁用所有非必要的服务,并让你的 TCP 包装器程序控制谁可以进入,谁不能进入。列表 1 中的三行是从 /etc/inetd.conf 文件中提取的示例。
请注意,第三行被注释掉了。该服务(rlogin)在该系统上不可用,而 telnet 和 FTP 是可用的。现在,你看到的 /usr/sbin/tcpd 实际上是 TCP 包装器程序的路径。它决定是否允许那些未被注释的服务作为传入流量。如果有人尝试访问被拒绝的服务,你将在你的 /var/log/secure 文件中得到一个日志,其中包含一条友好的“拒绝”消息,让你知道有人在做坏事。以下是如何操作的。
将以下行添加到你的 /etc/hosts.deny 文件中
ALL:ALL
你首先要拒绝任何人的所有访问。第一个 ALL 指的是所有服务。第二个 ALL 仅仅意味着所有人。你可能期望会有一个 hosts.allow 文件来对抗 hosts.deny 文件,你是对的。该文件包含你想要从全局服务拒绝中排除的主机。假设你的内部网络的基本地址是 192.168.1.0。我们希望能够 telnet 或 ftp 连接的主机是该网络中的主机。在 /etc/hosts.allow 文件中,你应该放入这些条目
ALL: 127.0.0.1< > ALL: 192.168.1.1 后面的点表示 192.168.1.任何 都是可以接受的。最后要做的是重启主网络进程 inetd。在大多数 Linux 系统上,可以像这样完成
/etc/rc.d/init.d/inet restart正如我所提到的,这非常简单,但也只涵盖了一些非常基础的知识。也许太基础了。例如,你的 TCP 包装器只覆盖 /etc/inetd.conf 中列出的那些服务。构建防火墙的更好方法是使用 ipchains,这是一个用于运行内核版本略低于 2.2 的 Linux 机器的数据包过滤系统。ipchains 程序是旧的 ipfwadm 程序的继任者。大多数较新的发行版将需要 ipchains 进行数据包过滤。
如果你读过 ipchains 的文档,你可能也感到一丝恐慌,因为你开始意识到这一切有多么复杂。我将在接下来的几段中用一些(我希望)简单的解释来阐述这个过程,然后我会向你展示一些来自优秀开源大厨的秘诀,这些秘诀将使这个过程不那么可怕,更有趣。
Ipchains 是一个命令行实用程序,允许你创建名为“链”的数据包过滤规则集。这些链有几种不同的类型:input(来自外部的传入数据包)、output(发往外部世界的数据包)和 forward(通过你的系统路由的数据包,例如在 IP 转发和伪装的情况下)。实际上还有第四种,可以是用户定义的和命名的。命令的格式类似于以下内容
/sbin/ipchains -A forward -j MASQ< > -s 192.168.1.0/24 -d 0.0.0.0/0
-A 表示向链中添加规则。其他选项包括 -D 删除,-R 替换,-I 插入,-N 创建新的用户定义链,以及其他一些选项。上面的命令创建了一个规则集,该规则集将转发来自我的内部网络上任何主机的包,并将它们伪装成好像所有流量都来自一台机器。 0.0.0.0 表示数据包目的地可以是任何地方。 -j 标志定义了此规则的操作。除了上面这个将为你的站点进行伪装的规则之外,你还可以指定 ACCEPT(允许数据包通过)、REJECT(拒绝数据包,但让对方知道它被拒绝了)和 DENY(不允许数据包通过,也不提供任何解释)。
我们还能用它做什么?首先,我可以通过添加以下单个规则来创建一个相当安全的系统
/sbin/ipchains -A input -j DENY -s 0.0.0.0/0 -d<
>
0.0.0.0/0
No one will get into your system, and no one will ever know why. It might
be an idea, then, to insert this rule into the chain before you
do the above. Then at least your local network will have access to
your server.
/sbin/ipchains -I input -j ACCEPT -s< > 192.168.22.0/24 -d 0.0.0.0/0
让我们尝试一些更复杂的。从头开始,我可以设置以下输入链。请注意,这里不应该有断行。列表中的每个命令都以 /sbin/ipchains 开头。你可能还会注意到,我的互联网地址是虚构的。没有 IP 地址以 259 开头。
#< > # Input Rules # /sbin/ipchains -F input # /sbin/ipchains -P input ACCEPT # /sbin/ipchains -A input -j ACCEPT -s 192.168.1.0/24 -d< > 0.0.0.0/0 # /sbin/ipchains -A input -j ACCEPT -s 0.0.0.0/0 -d 0.0.0.0/0 # /sbin/ipchains -A input -j DENY -p tcp -s 0.0.0.0/0 -d 259.25.132.55< > 137:139 # /sbin/ipchains -A input -j DENY -p udp -s 0.0.0.0/0 -d< > 259.25.132.55 137:139 # /sbin/ipchains -A input -j ACCEPT -p tcp -s< > 0.0.0.0/0 -d 259.25.132.55 80 # /sbin/ipchains -A -d 0.0.0.0/0我们首先“刷新”我们的输入链。那是 -F 选项的作用。然后我们使用 -P 选项分配默认策略 ACCEPT。接下来的两个规则允许来自我们本地网络和外部世界的所有流量进入。接下来,我们 DENY 所有发往端口 137 到 139 的 netbios 服务(Windows 或 SAMBA 文件共享)的流量。TCP 端口范围用起始数字、冒号和结束数字表示。由于我们确实希望允许对这个神话系统进行 Web 服务器访问,因此我们打开端口 80。最后,我们捕获任何仍然打开且不符合上述规则的内容,方法是像之前一样使用全包含的 DENY 关闭访问。
Mais oui,十二号桌那位注重安全的绅士质疑我采用 ACCEPT 而不是 DENY 策略作为起点的理由。你是在想,马塞尔是不是喝了他自己的酒喝多了?好吧,我的朋友们,在构建这个示例时,我考虑的是远程逐行创建规则集,无论是从你自己的内部网络还是从外部。如果你立即 DENY 所有内容,你也会拒绝你自己。现在,当需要编写所有这些命令的脚本时,你可能需要考虑设置默认的 DENY 策略而不是 ACCEPT。即便如此,当规则在启动时在脚本中执行时,最终结果是你 DENY 任何未被明确 ACCEPT 的内容,黑客利用此策略的窗口非常小。
在任何时候,你都可以通过键入 /sbin/ipchains -L 来列出所有规则。你也可以通过键入 /sbin/ipchains -F 来刷新所有链、规则集等的表。这绝不是一个完整的防火墙设置,也不是完全现实的。在真实服务器上的真实设置中,我希望打开其他端口(例如电子邮件或 DNS 服务)。我还想明确地关闭对我 X window 套接字(端口 6000、6001 等)的访问。
如果从头开始创建防火墙的前景让你感到有些畏惧,并且你更喜欢使用一种非常快速而简陋的方法来构建基于规则的 IP 过滤系统,那么 Ian Hall-Beyer 分发的“ipchains-firewall”脚本就是你的不二之选。要创建基本防火墙,你只需要使用你的外部接口和内部接口作为参数来调用脚本。以下是我在我的系统上使用外部 PPP 连接的方式
./firewall.sh ppp0 eth0
当脚本运行时,它将设置伪装,阻止远程访问诸如 netbios(SAMBA 和 Windows 文件共享)和 X 会话之类的东西。你可以在图 1 中看到脚本的运行情况。使用 /sbin/ipchains -L,你可以列出脚本创建的规则。Ian 的脚本是一个防火墙系统的开端,它考虑了“通常情况”。可以通过编辑脚本来进行自定义,你无疑会想要这样做。默认设置相当严格。例如,像 SMTP 这样的重要服务默认情况下是被拒绝的。以下示例来自脚本本身,显示了我取消注释端口 25(以及其他端口)的位置
# telnet (23)< > # $IPCHAINS -A input -p tcp -s 0/0 -d $1 23 -j ACCEPT # echo -n "." # smtp (25) $IPCHAINS -A input -p tcp -s 0/0 -d $1 25 -j ACCEPT echo -n "." # DNS (53) $IPCHAINS -A input -p tcp -s 0/0 -d $1 53 -j ACCEPT $IPCHAINS -A input -p udp -s 0/0 -d $1 53 -j ACCEPT echo -n ".."
什么?啊,你在问我们有没有更刺激的菜单。Mais oui。对于那些喜欢图形化方法的人,我想推荐以下两个项目:Easy Firewall 和 GTK+ Firewall Control Center。
Easy Firewall 是 Daniel Roche 的创意,它是一个 Tcl/Tk(版本 8)应用程序,为防火墙管理提供了一个简洁友好的界面。对于那些运行旧版本 Linux 的用户来说,此应用程序也适用于 ipfwadm。该程序以 tar.gz 压缩包或 Red Hat RPM 的形式提供。由于它是一个 Tcl/Tk 应用程序,因此如果你碰巧好奇,也很容易浏览该程序。安装也很容易,因为 Tcl/Tk 脚本不需要编译。
Easy Firewall 附带了一些预定义的防火墙配置,这些配置很容易修改。使用命令 easyfw 启动程序。友好的大屏幕让你只需单击一个按钮即可选择你的内部和外部接口。然后,它将扫描你的系统以查找可能已生效的任何 ipchains 规则,并在界面中显示它们。根据你的需要修改、添加或删除规则。当你有一个令人满意的配置时,你可以选择将该配置 应用 到你正在运行的网络(现在或在启动时),并保存到文件。文件选项非常适合了解防火墙规则的结构。此外,由于该文件是一个 shell 脚本,你可以在启动时从你的 /etc/rc.d/rc.local 中调用它。
我们的下一个产品来自 Koo Kyoseon,一个名为 GTK+ Firewall Control Center 的小程序。与我们之前的厨师风格相同,Koo 构建了一个简洁友好的 ipchains 管理界面。该程序以 RPM 或源代码格式提供。如果你要从源代码构建它,请注意你还需要 libipfwc 库。幸运的是,libipfwc 包含在 gfcc 的源代码中。在撰写本文时,我获得了 0.7.4 版本的软件包 gfcc-0.7.4.tar.gz。以下是构建软件包和库的步骤
tar -xzvf gfcc-0.7.4.tar.gz< > cd gfcc-0.7.4
进入此目录后,我们可以构建 libipfwc
tar -xzvf libipfwc.tar.gz< > cd libipfwc make现在,更改回 gfcc 目录并构建它
cd ..< > ./configure --with-ipfwc=./libipfwc make make install通过键入 gfcc 启动程序。该程序实际上有两种不同的保存信息的方式。一种是规则列表,非常类似于你在 /proc 文件系统中查看现有规则时所看到的。你可以通过键入以下命令来执行此操作
cat /proc/net/ip_fwchains如果你想要像我之前提到的那样好的 shell 脚本,你可以使用 export 功能来创建脚本。例如,如果我将我的规则导出到 /usr/local/.Admin/fwrules.sh,我可以在下次重新启动时通过将该路径作为单行命令包含在我的 /etc/rc.d/rc.local 脚本的末尾来加载它。
现在我们已经把所有这些想法都摆在桌面上了,让我提出一个替代的服务建议。如果你真的不熟悉这些,并且你觉得开始构建自己的防火墙让你感到不舒服,请使用 Ian 的 ipchains-firewall 脚本来生成初始规则集。然后,使用 EasyFw 或 gfcc 来修改规则。这是一个轻松入门,走向更安全系统的好方法。
唉,时钟告诉我们快要打烊了,不是吗? 在你离开之前,弗朗索瓦会最后一次为你们续杯。安全是一个至关重要的话题。Linux 强大的、支持网络的架构打开了许多扇门,包括一些你可能更喜欢关闭的门。通过在 Linux 厨房中进行一些实验,锁定这些门不必是一件可怕的经历。直到下次,我邀请你安全地联网,并且请在你离开之前锁门。我们下次在 Chez Marcel 再见。你们的餐桌将恭候光临。
祝您健康!用餐愉快!
