你应该阅读 Firewall-HOWTO。
那会告诉你从哪里获取 ipfwadm,如果你还没有的话。还有其他工具你可以获取,但在我尝试 ipfwadm 之前我没有取得任何进展。它很好而且是底层工具!你可以确切地看到它在做什么。
你已经将 IP 转发和伪装编译到内核中,所以你将要检查防火墙是否处于其默认(接受)状态,使用命令:
ipfwadm -I -l ipfwadm -O -l ipfwadm -F -l
这分别是“显示影响防火墙的...” 入站、出站或转发(伪装)“...侧的规则”。 “-l” 表示 “list”(列表)。
你可能也编译了记账功能
ipfwadm -A -l
你应该看到没有定义任何规则,并且默认设置为接受每个数据包。你可以随时使用以下命令回到这个工作状态:
ipfwadm -I -f
ipfwadm -O -f
ipfwadm -F -f
“-f” 表示 “flush”(刷新)。你可能需要使用它。
我想将我的内部网络与外部世界隔绝,并且不做其他任何事情,所以我将要给出一个最后的(默认)规则,即防火墙应该忽略任何来自内部网络并 направленные 到外部的数据包。我将所有规则(按此顺序)放入 /etc/rc.d/rc.firewall 中,并在启动时从 /etc/rc.d/rc.local 执行它。
ipfwadm -I -a reject -S 192.168.2.0/255.255.255.128 -D 0.0.0.0/0.0.0.0
“-S” 是源地址/掩码。“-D” 是目标地址/掩码。
这种格式有点冗长。Ipfwadm 对网络名称和一些常用缩写很智能。查看 man 页面。
通过使用 “-O” 而不是 “-I” 将其中一些或所有这些规则放在防火墙的出站半部分可能更方便,但我在这里声明的规则都是为入站半部分制定的。
在默认规则之前,我必须放置一些规则,作为对外部服务对内部客户端的普遍拒绝的例外。
我想特殊对待防火墙机器在内部网络上的地址。除非他们有特殊权限,否则我将阻止人们登录到防火墙机器,但是一旦他们在那里,他们应该被允许与外部世界通信。
ipfwadm -I -i accept -S 192.168.2.100/255.255.255.255 \
-D 0.0.0.0/0.0.0.0
我也希望内部客户端能够与防火墙机器通信。也许他们可以劝说它让他们出去!
ipfwadm -I -i accept -S 192.168.2.0/255.255.255.128 \
-D 192.168.2.100/255.255.255.255
此时检查你是否可以从防火墙外部通过 telnet 进入客户端,但你不能出去。 这应该意味着你几乎可以建立初步联系,但客户端无法向你发送任何提示符。 如果你使用防火墙机器作为中转站,你应该能够完全进入。 尝试 rlogin 和 ping,同时在其中一个网卡上运行 tcpdump。 你应该能够理解你所看到的。
我继续逐个协议地放宽规则。 例如,我想允许从外部到内部的 ping 获得回显,所以我插入了规则
ipfwadm -I -i accept -P icmp -S 192.168.2.0/255.255.255.128 \
-D 0.0.0.0/0.0.0.0
“-P icmp
” 使用特定于协议的魔法。
在获得 ftp 代理之前,我还允许 ftp 调用输出,并使用特定端口的放宽。 这针对外部机器上的端口 20、21 和 115。
ipfwadm -I -i accept -P tcp -S 192.168.2.0/255.255.255.128 \
-D 0.0.0.0/0.0.0.0 20 21 115
我无法在本地客户端之间使 sendmail 工作,除非有名称服务器。 而不是当时就在防火墙上设置名称服务器,我只是精确地针对最近的现有名称服务器解除了 tcp 域服务查询的防火墙限制,并将它的地址放在客户端的 /etc/resolv.conf 中(在单独的一行上写 “nameserver 123.456.789.31
”)。
ipfwadm -I -i accept -P tcp -S 192.168.2.0/255.255.255.128 \
-D 123.456.789.31/255.255.255.255 54
你可以使用 tcpdump 找到服务所需的端口号和协议。 使用 ftp 或 telnet 或其他任何方式,从内部机器触发服务,然后使用 tcpdump 监视防火墙的输入和输出端口
tcpdump -i eth1 -e host client04
例如。 /etc/services 文件是另一个重要的线索来源。 要允许从外部 telnet 和 ftp 进入防火墙,你必须允许本地客户端在特定端口上进行 OUT 调用。 我理解为什么这对 ftp 是必要的 - 最终是服务器建立数据流 - 但我不确定为什么 telnet 也需要这样做。
ipfwadm -I -i accept -P tcp -S 192.168.2.0/255.255.255.128 ftp telnet \
-D 0.0.0.0/0.0.0.0
某些守护进程存在一个特殊问题,它们会查找防火墙机器的主机名,以确定它们的网络地址。 Rpc.yppasswdd 是我遇到麻烦的那个。 它坚持广播信息,表明它在防火墙外部(在第二张网卡上)。 这意味着内部的客户端无法联系它。
与其启动 IP 别名或更改守护进程代码,不如在客户端的 /etc/hosts 中将名称映射到内部网卡地址。
你想要测试你仍然可以从外部 telnet、rlogin 和 ping。 从内部你应该能够 ping 出去。 你也应该能够从内部 telnet 到防火墙机器,并且后者应该能够做任何事情。
就是这样。 在这一点上,你可能想了解 rpc/Yellow Pages 以及与密码文件的交互。 防火墙网络希望在没有其非特权用户能够登录到防火墙的情况下运行 - 从而出去。 这是另一个 HOWTO 的主题了!