下一步 上一步 目录

6. 准备 Linux 系统

尽可能少地安装 Linux 系统。我的安装始于服务器配置,然后我关闭了 /etc/inetd.conf 中每个不需要的服务。为了更高的安全性,你应该卸载不需要的服务。

因为大多数发行版没有提供适合你用途的内核。你将需要编译你自己的内核。最好在防火墙以外的计算机上执行此操作。如果你确实在防火墙上安装了 C 编译器和实用程序,请在完成内核配置后删除它们。

6.1 编译内核

从一个干净的最小化 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 一步完成所有这些。

6.2 配置两块网卡

如果你的计算机中有两块网卡,你可能需要在你的 /etc/lilo.conf 文件中添加一个 append 语句来描述两块网卡的 IRQ 和地址。我的 lilo append 语句看起来像这样

 
append="ether=12,0x300,eth0 ether=15,0x340,eth1" 

6.3 配置网络地址

现在我们来到了设置的有趣部分。我不会深入讲解如何设置 LAN。阅读 Networking-HOWTO 来解决你在这里的问题。

你的目标是为你的过滤防火墙系统提供两个网络连接。一个连接到互联网(不安全侧),另一个连接到 LAN(安全侧)。

无论如何,你需要做出一些决定。

  1. 你将使用真实的 IP 地址还是为你的 LAN 编造一些地址。
  2. 你的 ISP 会分配号码,还是你将使用静态 IP 地址?

由于你不希望互联网访问你的私有网络,你不需要使用“真实地址”。你可以为你的私有 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"

6.4 测试你的网络

首先使用 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 到你的网络。如果跟踪在你的提供商的路由器处停止,那么他们没有转发你的流量。

它工作了吗?太棒了。最困难的部分已经完成了。 :-)

6.5 保护防火墙安全

如果构建防火墙的系统仍然对攻击敞开大门,那么防火墙就没有任何好处。“坏人”可以通过非防火墙服务获得访问权限并根据自己的需要修改它。你需要关闭任何不需要的服务。

查看你的 /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 设置重新启动系统才能修改安全文件。(我也建议启动到单用户模式。)


下一步 上一步 目录