尽可能少地安装 Linux 系统。我的安装始于服务器配置,然后我关闭了 /etc/inetd.conf 中每个不需要的服务。为了更高的安全性,你应该卸载不需要的服务。
因为大多数发行版没有提供适合你用途的内核。你将需要编译你自己的内核。最好在防火墙以外的计算机上执行此操作。如果你确实在防火墙上安装了 C 编译器和实用程序,请在完成内核配置后删除它们。
从一个干净的最小化 Linux 发行版安装开始。你加载的软件越少,漏洞、后门和/或错误就越少,从而减少服务器中的安全问题。
选择一个稳定的内核。我的系统正在使用内核 2.2.13。所以本文档是基于它的设置。
你将需要使用适当的选项重新编译 Linux 内核。如果你以前没有重新编译过内核,你应该阅读 Kernel HOWTO、Ethernet HOWTO 和 NET-2 HOWTO。
以下是我知道可以工作的网络相关设置。我用“?”标记了一些。如果你将使用此功能,也请将其打开。
我使用 "make menuconfig" 来编辑我的内核设置。
<*> Packet socket [ ] Kernel/User netlink socket [*] Network firewalls [ ] Socket Filtering <*> Unix domain sockets [*] TCP/IP networking [ ] IP: multicasting [*] IP: advanced router [ ] IP: kernel level autoconfiguration [*] IP: firewalling [?] IP: always defragment (required for masquerading) [?] IP: transparent proxy support [?] IP: masquerading --- Protocol-specific masquerading support will be built as modules. [?] IP: ICMP masquerading --- Protocol-specific masquerading support will be built as modules. [ ] IP: masquerading special modules support [*] IP: optimize as router not host < > IP: tunneling < > IP: GRE tunnels over IP [?] IP: aliasing support [*] IP: TCP syncookie support (not enabled per default) --- (it is safe to leave these untouched) < > IP: Reverse ARP [*] IP: Allow large windows (not recommended if <16Mb of memory) < > The IPv6 protocol (EXPERIMENTAL) --- < > The IPX protocol < > Appletalk DDP < > CCITT X.25 Packet Layer (EXPERIMENTAL) < > LAPB Data Link Driver (EXPERIMENTAL) [ ] Bridging (EXPERIMENTAL) [ ] 802.2 LLC (EXPERIMENTAL) < > Acorn Econet/AUN protocols (EXPERIMENTAL) < > WAN router [ ] Fast switching (read help!) [ ] Forwarding between high speed interfaces [ ] PU is too slow to handle full bandwidth QoS and/or fair queueing --->
在你完成所有需要的设置后,你应该重新编译、重新安装内核并重启。
我使用命令
make dep;make clean;make bzlilo;make modules;make modules_install;init 6 一步完成所有这些。
如果你的计算机中有两块网卡,你可能需要在你的 /etc/lilo.conf 文件中添加一个 append 语句来描述两块网卡的 IRQ 和地址。我的 lilo append 语句看起来像这样
append="ether=12,0x300,eth0 ether=15,0x340,eth1"
现在我们来到了设置的有趣部分。我不会深入讲解如何设置 LAN。阅读 Networking-HOWTO 来解决你在这里的问题。
你的目标是为你的过滤防火墙系统提供两个网络连接。一个连接到互联网(不安全侧),另一个连接到 LAN(安全侧)。
无论如何,你需要做出一些决定。
由于你不希望互联网访问你的私有网络,你不需要使用“真实地址”。你可以为你的私有 LAN 编造地址。但这不推荐。如果数据路由出你的 LAN,它可能会最终到达另一个系统的端口。
有许多互联网地址范围是为私有网络预留的。其中,192.168.1.xxx 被预留,我们将在我们的示例中使用它。
你将需要使用 IP 地址伪装来实现这一点。通过这个过程,防火墙将转发数据包并将它们转换为“真实的” IP 地址以在互联网上travel。
使用这些不可路由的 IP 地址使你的网络更安全。互联网路由器不会传递带有这些地址的数据包。
你可能想在此时阅读 IP Masquerading HOWTO。
24.94.1.123 __________ 192.168.1.1 _/\__/\_ \ | | / _______________ | | \| Firewall |/ | | / Internet \--------| System |------------| Workstation/s | \_ _ _ _/ |__________| |_______________| \/ \/ \/
你必须有一个“真实”的 IP 地址分配给你的互联网网卡。这个地址可以永久分配给你。(静态 IP 地址)或者它可以在网络连接时通过 PPP 进程分配。
你分配你的内部 IP 地址。例如 192.168.1.1 给 LAN 网卡。这将是你的网关 IP 地址。你可以将保护网络(LAN)中的所有其他机器分配一个 192.168.1.xxx 范围内的号码。(192.168.1.2 到 192.168.1.254)
我使用 RedHat Linux。为了在启动时配置网络,我在 /etc/sysconfig/network-scripts 目录中添加了一个 ifcfg-eth1 文件。你可能还会在这个目录中找到 ifcfg-ppp0 或 ifcfg-tr0。这些 'ifcfg-' 文件被 RedHat 用于在启动时配置和启用你的网络设备。它们以连接类型命名。
这是我们的示例的 ifcfg-eth1 (第二块网卡);
DEVICE=eth1 IPADDR=192.168.1.1 NETMASK=255.255.255.0 NETWORK=192.168.1.0 BROADCAST=192.168.1.255 GATEWAY=24.94.1.123 ONBOOT=yes
如果你要使用拨号连接,你将需要查看 ifcfg-ppp0 和 chat-ppp0 文件。这些文件控制你的 PPP 连接。
这个 ifcfg 文件可能看起来像;
DEVICE="ppp0" ONBOOT="yes" USERCTL="no" MODEMPORT="/dev/modem" LINESPEED="115200" PERSIST="yes" DEFABORT="yes" DEBUG="yes" INITSTRING="ATZ" DEFROUTE="yes" HARDFLOWCTL="yes" ESCAPECHARS="no" PPPOPTIONS="" PAPNAME="LoginID" REMIP="" NETMASK="" IPADDR="" MRU="" MTU="" DISCONNECTTIMEOUT="" RETRYTIMEOUT="5" BOOTPROTO="none"
首先使用 ifconfig 和 route 命令。如果你有两块网卡,ifconfig 应该看起来像这样
#ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:3924 Metric:1 RX packets:1620 errors:0 dropped:0 overruns:0 TX packets:1620 errors:0 dropped:0 overruns:0 collisions:0 txqueuelan:0 eth0 Link encap:10Mbps Ethernet HWaddr 00:00:09:85:AC:55 inet addr:24.94.1.123 Bcast:24.94.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1000 errors:0 dropped:0 overruns:0 TX packets:1100 errors:0 dropped:0 overruns:0 collisions:0 txqueuelan:0 Interrupt:12 Base address:0x310 eth1 Link encap:10Mbps Ethernet HWaddr 00:00:09:80:1E:D7 inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1110 errors:0 dropped:0 overruns:0 TX packets:1111 errors:0 dropped:0 overruns:0 collisions:0 txqueuelan:0 Interrupt:15 Base address:0x350
并且你的路由表应该看起来像这样
#route -n Kernel routing table Destination Gateway Genmask Flags MSS Window Use Iface 24.94.1.0 * 255.255.255.0 U 1500 0 15 eth0 192.168.1.0 * 255.255.255.0 U 1500 0 0 eth1 127.0.0.0 * 255.0.0.0 U 3584 0 2 lo default 24.94.1.123 * UG 1500 0 72 eth0
注意: 24.94.1.0 是此防火墙的互联网侧,而 192.168.1.0 是私有 (LAN) 侧。
你应该首先确保你的 LAN 上的每台计算机都可以 ping 通你的防火墙系统的内部地址。(在本例中为 192.168.1.1)如果不能,请再次查看 NET-2 HOWTO 并进一步处理网络问题。
接下来,从防火墙,尝试 ping 一个互联网系统。我使用 www.internic.net 作为我的测试点。如果它不起作用,尝试你的 ISP 的服务器。如果这不起作用,你的互联网连接的某些部分是错误的。你应该能够从防火墙连接到互联网上的任何地方。尝试查看你的默认网关设置。如果你正在使用拨号连接,请仔细检查你的用户名和密码。重新阅读 Net-2 HOWTO,然后重试。
现在尝试从你的 LAN 上的一台计算机 ping 防火墙的外部地址 (24.94.1.123)。这应该不起作用。如果它起作用了,你已经打开了地址伪装或 IP 转发,或者你已经设置了一些数据包过滤。关闭它们并重试。你需要知道过滤已就位。
对于内核版本高于 2.1.102 的内核,你可以发出命令;
echo "0" > /proc/sys/net/ipv4/ip_forward
如果你正在使用旧内核 (为什么),你将需要重新编译你的内核,并关闭转发。(只需升级。)
再次尝试 ping 防火墙的外部地址 (24.94.1.123)。它应该不起作用。
现在打开 IP 转发和/或地址伪装。你应该能够从你的 LAN 上的任何系统 ping 通互联网上的任何地方。
echo "1" > /proc/sys/net/ipv4/ip_forward
重要提示: 如果你在你的 LAN 上使用“真实” IP 地址(而不是 192.168.1.*),并且你无法 ping 通互联网,但你可以 ping 通你的防火墙的互联网侧,请确保你的 ISP 正在为你的私有网络地址路由数据包。
针对此问题的一个测试是让互联网上的其他人(例如使用本地提供商的朋友)使用 traceroute 到你的网络。如果跟踪在你的提供商的路由器处停止,那么他们没有转发你的流量。
它工作了吗?太棒了。最困难的部分已经完成了。 :-)
如果构建防火墙的系统仍然对攻击敞开大门,那么防火墙就没有任何好处。“坏人”可以通过非防火墙服务获得访问权限并根据自己的需要修改它。你需要关闭任何不需要的服务。
查看你的 /etc/inetd.conf 文件。此文件配置 inetd,也称为“超级服务器”。它控制着许多服务器守护进程,并在数据包到达“众所周知”的端口时启动它们。
你应该关闭 echo, discard, daytime, chargen, ftp, gopher, shell, login, exec, talk, ntalk, pop-2, pop-3, netstat, systat, tftp, bootp, finger, cfinger, time, swat 和 linuxconfig(如果你有的话)。
要关闭一项服务,请在服务行的第一个字符处放置 #。完成后,通过键入 "kill -HUP <pid>" 向进程发送 SIG-HUP,其中 <pid> 是 inetd 的进程号。这将使 inetd 重新读取其配置文件 (inetd.conf) 并重新启动,而不会使你的系统宕机。
通过 telnet 到防火墙上的端口 15 (netstat) 来测试这一点。如果你得到任何输出,说明你没有关闭这些服务。
telnet localhost 19
你还可以创建文件 /etc/nologin。在其中放入几行文本,例如 (BUZZ OFF)。当此文件存在时,login 将不允许用户登录。他们将看到此文件的内容并且他们的登录将被拒绝。只有 root 可以登录。
你还可以编辑文件 /etc/securetty。如果用户是 root,则登录必须发生在 /etc/securetty 中列出的 tty 上。失败将被记录到 syslog 工具中。有了这两个控制措施,登录防火墙的唯一方法将是通过控制台以 root 身份登录。
永远不要使用 TELNET 连接到系统并以 ROOT 身份登录。如果你需要远程 root 访问,请使用 SSH(安全外壳)。你甚至可以关闭 telnet。
如果你真的非常偏执,你需要使用 lids (Linux 入侵检测系统)。它是一个 Linux 内核的入侵检测系统补丁;它可以保护重要文件不被更改。当它生效时,任何人(包括 root)都无法更改受保护的文件或目录及其子目录。你必须使用 security=1 LILO 设置重新启动系统才能修改安全文件。(我也建议启动到单用户模式。)