引言:作为一个网管,为了保护你的网络,你可以花数万元来对流入流出的信息进行控制,也可以分文不花而达到同样的目的。听起来是不是觉得不太可能?下面就让我们来试一试吧!不试怎么知道行不行呢?
24小时在线的宽带Internet连接的优点是显而易见的,它快速、便宜、方便。不过,它潜在的危险相对来说,则不易为人们所注意。事实上,如果没有合适的保护,这种不间断的连接将使你公司的服务器和数据时刻处于危险之中。
一个带有防火墙功能的路由器可以有效地消除这些危险。你可以花很多的钱去买一个路由器,也可以把钱省下来,完全使用Linux内建的路由和防火墙的功能来达到目的。在很多情况下,你甚至可以把你的Linux服务器同时作为路由器使用。不过,如果你的Web站点信息流量很大的话,最好使用一台PC来单独完成这项任务。
使信息可进可出
有时,你可能想让路由器限制内部网中特定的PC,使其无法从Internet访问,不过,更多时候,你会让Linux路由器阻止一些不速之客的访问。在使用DSL或者线缆连接时,一般都使用一个HUB,将其中一个端口连到Internet。这种情况下,只要是能够连接到HUB上的人,就可以使用一些很容易得到的软件,对流过你站点的数据进行监听,甚至可以直接访问你的网络资源。
为此,我们可以关闭Telnet和FTP等容易被居心叵测者所监听的服务。这显然可以保证网络免于被入侵的威险,但是一般来说,公司都会用得上这些服务。也就是说,公司的业务一般要求路由器即要有安全性,又要让信息能够顺畅地流入流出。所以,你应该做的是有选择性的限制对这些服务的访问,而不是完全关闭它们。一旦你建立好了合适的配置脚本,Linux路由器/防火墙就会为你完成这些工作。
服务、端口和协议
一般来说,e-mail或者Web等Linux服务器,都必须可以被外部网所能访问。对于这种类型的通信,一些行业的标准端口常被用于帮助定义这些服务。比如,Web服务器一般使用80端口,SMTP(用于电子邮件服务)一般使用25端口等等。服务器里运行的服务以及其使用的端口,可以在/etc/services文件里找到。
(这是我一台Linux机器上的services文件内容)
此外,你还要清楚路由器应该使用什么协议。以太网的协议种类很多,不过最常用的是TCP和UDP协议。(机子所使用的协议可以在/etc/protocols中找到)。
使用的命令
对于Linux路由器来说,我们使用的其实只是内核中IP地址转发和防火墙部分。所以你根本不需要额外的软件,只需要一些命令脚本,为路由器在处理收到的数据包时所做的反应定一些规则。这其中包括一系列输入、输出和转发方面的规则。
输入方面的规则要调整流入的数据包,比如,如果运行的是Web服务器,那么你可能想使用端口80来接收流入的数据包。输出方面的规则定义路由器是否允许数据被送到Internet,这常被用于拒绝与一些特定站点的连接(通过IP地址)。转发方面的规则,用于控制数据包从一个地方转发到另一个地方;通过在网络里定义特定的子网并且设置规则只允许一些子网可以转发信息,从而达到限制Internet访问的目的。
设置过程
在我所使用的Red Hat7 Linux路由器里,要管理防火墙的行为,我使用ipchains来设置规则(在Red Hat 6或者更早的版本里使用ipfwadm)。对于一些其它的Linux发行版,虽然名字可能不一样,但是功能却是完全一样的(比如,FreeBSD中要使用ipfw)。在不同的发行版本中,防火墙命令的语法会有一些细微的差别(对于这些差别,可以用man命令来查看),不过,只要熟悉了其中一个版本中的配置,其它版本中的配置都是类似的。防火墙配置的管理最好的办法就是使用在系统启动过程中会调用的脚本。
对于我例子中的脚本,我做如下说明:
1. 我的路由器中有两个网卡(NIC),分别是eth0和eth1。
2. eth0通过HUB连接到LAN,并且在192.168.1.0/24的网络中(24指的是子网)。
3. eth1连接在线缆或者DSL调制解调器上,并且使用的IP地址是由ISP提供的207.1.1.1。
默认情况下,Linux路由器会接收并且送出所有的信息,这相当于和下面一系列的命令等价:
ipchains -F
ipchains -P input ACCEPT
ipchains -P output ACCEPT
ipchains -P forward ACCEPT
在本例中:
* -F选项会重置所有规则,去除所有规则,然后重新开始配置。
* -P选项告诉防火墙使用默认的规则,直到有新的规则对其进行改变。事实上,如果只使用默认规则,路由器将很容易受到攻击。
从关到开
我们可以先打开所有的服务,然后再来关闭那些不想让别人访问的东西,这看起来似乎很不错。不过在实际中,我们往往把这个过程倒过来,也就是说,我们首先禁止所有的和路由器的通信,然后再把一些特定的服务和端口打开。所以我们可以采用以下的命令过程:
ipchains -F
ipchains -P input DENY
ipchains -P output REJECT
ipchains -P forward DENY
对这些命令说明如下:
* -P input DENY对所收到的数据包不做任何反应。
* -P output REJECT不接收任何数据包,但会给出一个ICMP无法到达的返回信息。
下面,我们再增加规则,允许内部网里的信息流出:
ipchains -A input -i lo -j ACCEPT
ipchains -A output -i lo -j ACCEPT
ipchains -A input -i eth0 -s 192.168.1.0/24 -j ACCEPT
ipchains -A output -i eth0 -d 192.168.1.0/24 -j ACCEPT
刚开始的两行告诉路由器接收所有流入的信息,放行所有流出的信息。第三行和第四行为内部网网卡eth0建立一些流入和流出的规则。
这其中:
* -i选项指定要应用规则的接口(在第一行中是lo,在最后两行中使用的是eth0)。
* -A告诉路由器要增加一个规则。
* -j告诉路由器如何处理数据包。
* -s指示源地址(对于输入而言)。
* -d指明目的地址(对于输出而言)。
第三行在内部网(eth0)上创建了一个输入规则,允许路由器接收所有源地地址为192.168.1.0/24的数据包。第四行指明,所有去往以上地址的数据包都可以通行。
转发
下面,我们将增加一些规则,控制流出数据的转发:
ipchains -A forward -i eth1 -s 192.168.1.0/24 -j MASQ
ipchains -A forward -i eth0 -s 192.168.1.0/24 -j ACCEPT
ipchains -A forward -i eth0 -d 192.168.1.0/24 -j ACCEPT
这三条转发的规则非常的简单。第一行告诉路由器允许所有源地址为192.168.1.0的数据都可以发到Internet上。-j MASQ选项告诉路由器要使用IP伪装,这使得多个内部网主机可以使用同一个IP地址来访问Internet。接下来两行创建的规则,允许路由器转发所有源自或者送往内部网192.168.1.0的数据包。
到此,最基本的东西就已经配置完成。但是,有时,我们可能需要限制一些内部网里的用户对Internet的访问。要做到这一点,我们可以让用户使用不同的子网,这样,他的IP地址和规则不相符,那么所有源自这些主机的数据包就不能转发到Internet。类似地,我们却可以让这些用户使用其它的服务(比如e-mail服务等)。
开启信息通路
到现在为止,我们的路由器还不会正常工作,因为我们已经使用DENY和REJECT选项把路由器锁住,它不会让任何信息通过。现在我们需要添加一些脚本命令来打开各需要的Internet服务。比如,要让用户可以访问我们的Web站点,我们可以添加以下的命令:
ipchains -A output -i eth1 -p tcp -s 207.1.1.1 1024:65535 -destination-port 80 -j ACCEPT
ipchains -A input -i eth1 -p tcp ! -y --source-port 80 -d 207.1.1.1 1024:65535 -j ACCEPT
这两行,可以让路由器向远程的服务器发送一个数据包,请求一个连接(第一行),并且接收一个流入的数据包(第二行)。因为我们的信息流出接口使用了IP地址伪装,所以所有向外的连接其使用的IP地址看起来似乎都是207.1.1.1(这个地址只是一个例子)。同样,如果我们想让用户访问外部的POP3电子邮件服务,我们只需要把这两行命令的端口号80改为110(POP3端口)即可。不管你要添加什么服务,只要增加相应的行即可。
允许访问
如果你不想让外部世界来访问我们的路由器服务,那么我们已经达到目的了,因为我们缺少的规则已经被设置成拒绝所有的信息流入的请求。但是有时我们需要在服务器上运行Web服务,以让外部的人也可以访问,这时我们可以添加以下命令:
ipchains -A input -i eth1 -p tcp --source-port 1024:65535 -d 207.1.1.1 80 -j ACCEPT
ipchains -A output -i eth1 -p tcp ! -y -s 207.1.1.1 80 --destination-port 1024:65535 -j ACCEPT
第一行告诉路由器去接收(-j ACCEPT)所有来自外部网并且目的地址是我们路由器的数据包。接着的一行让路由器可以发送数据包。要配置其它的服务,其和以上的命令非常的类似。比如,我们要在内部运行SMTP或者POP3服务器,那么我们只需将上述命令的端口80分别改为25和110即可。
图1 例子所述的网络结构图
检查并且激活服务
在任何时候,你都可以输入“ipchains -L”命令来检查你的规则脚本。
通过更改一些系统文件,你可以让这些脚本在每一次路由器启动时,都会被自动的被激活。要做到这一点,方法很多。比如,如果你的ISP给你的是一个动态IP地址并且你的系统在启动时使用“/sbin/pump”来获取这一地址,那么你必需更改你的“/etc/pump.conf”文件,将其配置为等“/sbin/pump”完成后,再激活脚本。如果你使用的是静态IP地址,那么你可以在“/etc/rc.d/rc.local”后面来激活脚本。
最后,一定要测试一下,确保路由器所做的和自己想像中的完全一样。此外,一旦你的网络和服务有更改或者用户的增加减少,你的这些脚本可能都要相应地做一些调整。