企业网中用Linux作为路由器
现在,因为使用线缆和DSL的Internet连接速度已经超过了T1(传输速率可达1.544Mb/s的通讯线路),所以这两种连接方式已经在商业领域得到了广泛的应用。对于DSL和线缆连接来说,使用Linux来做路由器,是一个非常经济的解决方案。特别是和一些高端商家(比如Cisco)的解决方案相比,这种优势尤为明显。
使用Linux路由器作为一个现有的、已经成熟的网络的一个部分,将会有一个比较特殊的问题。如果我们使用Linux服务器作为DSL或者线缆连接的NAT(网络地址转换)服务器,那么我们将可通过Linux路由器对外提供服务。但是,对于大多数已经成熟的企业网络基础构架,这种方式却不一定实用,也不一定可行。比如,如果你的公司在现有的内部HTTP和SMTP服务上已经投入了可观的资金,或者在一个HTTP服务器上使用了负载平衡以支持电脑商务交易,那么你的公司将不太可能把这些服务移植到Linux服务器上。但是,如果公司想寻找一种经济的途径来同时控制一些Internet服务,那么基于Linux的路由器将是一个很好的选择。
NAT的使用
让我们来看一看公司的DSL/线缆连接只有一个IP地址的情况。我们如何才能把这个只有一个IP地址的流入数据包映射到内部主机呢?事实上,Linux已经把这一功能内建到了自己的内核中,所以我们只需几个免费的软件工具就可以来管理这个功能。
在数据包流出内部网时,我们使用一个叫做IP伪装的功能来提供NAT解决办法,它可以让众多的内部网主机共享一个IP地址。而对于外部连接来说,似乎所有的得到的信息都来自同一个IP地址。在Linux里,具有NAT功能的组件是一个比较容易搞混的功能,它可以在端口级别执行入站数据包的翻译(有进也叫反向NAT或者解除伪装)。Linux路由器会监听端口80(HTTP服务使用的默认端口)的所有连接请求,并且当检测到一个连接请求时,它会自动地把数据包转发到内部网对应的主机上。
事实上,之所以我们对反向NAT功能不太了解,是因为在主流的Linux发行版本中,一般没有包括对该功能的配置工具。一个最一般的,也是用得最广泛的用于管理这一功能的应用程序是“ipmasqadm”。要检查你是否安装了这一应用程序,你可以以系统管理员的身份登录,并在shell提示符下输入“ipmasqadm”,如果得到“Command not found”的错误信息,那么你可以从网上下载最新的RPM安装包(比如:rpmfind.net就有)。
典型的网络配置
下图描述的是一个线缆连接中使用Linux作为路由器的典型的网络结构图。其中一个以太网端口(eth0)为线缆调制解调器提供了物理连接,另外一个端口(eth1)把路由器连接到LAN。此外,我们还可以使用第三个以太网端口eth2,虽然这不是必需的,但是使用它来提供一个独立的DMZ (demilitarized zone,即非军事区)。DMZ是放置公共信息的最佳位置,这样用户、潜在用户和外部访问者都可以直接获得他们所需的关于公司的一些信息,而不用通过内网。你公司中的机密的和私人的信息可以安全地存放在内网中,即DMZ的后面。DMZ服务器上的破坏最多只可能造成在你恢复服务器时的一段中断服务。这样通过使用独立的NIC(网卡)把服务器隔离,我们就把他们所有的活动和企业局域网其它的部分分开。一般来说,我们使用DMZ来提供更好的防火墙保护,但是不管有无DMZ,在Linux服务器上的端口转发都不会受到影响。
图1 典型的网络结构图
端口转发的配置
端口转发的功能很简单:与Sendmail、Apache响应SMTP和HTTP信息不同,我们使用“ipmasqadm portfw”来转发所有的信息。
在激活端口转发之前,要确保所有相关的内核都已加载。和端口转发服务相关的有三个模块,具体命令是(以root身分执行):
# insmod ip_masq_autofw.o
# insmod ip_masq_portfw.o
# insmod ip_masq_mfw.o
一旦运行了这些命令,Linux路由器就开始准备处理端口转发请求。来看下面的指令:
# ipmasqadm portfw -f
其中-f选项告诉Linux路由器刷新端口转发规则表。执行这个命令不是必需的,只不过如果当前的表有多余或者错误条目时,这是一个好办法。
接下来的一系列命令将建立起Linux路由器转发信息的规则。语法如下所示:
# ipmasqadm portfw -a -P PROTO -L LADDR LPORT -R RADDR RPORT [-p PREF]
其中-a参数指示这条规则应该被加入规则表中;-P PROTO参数告诉Linux路由器转发到哪一个IP地址(该选项只对TCP和UDP有效);-L参数指示要监控的IP地址和端口(默认的IP地址和Internet网卡端口);-R参数告诉路由器把数据包送到哪儿(IP地址和端口)。
在上述例子中,要路由流入的SMTP和HTTP的信息,我们使用如下指令:
# ipmasqadm portfw -a -P tcp -L 172.16.1.1 25 -R 192.168.1.1 25
# ipmasqadm portfw -a -P tcp -L 172.16.1.1 80 -R 192.168.1.2 80
第一行设置一个规则,告诉Linux路由器监听对IP地址为172.16.1.1,端口为25的连接请求。并且把这些请求路由到内部网中IP地址为192.168.1.1的电子邮件服务器的25端口上。同样,第二条规则告诉路由器监听端口80的连接请求,并将其路由到IP地址为192.168.1.2的HTTP服务器的端口80上。
好了,现在所有在端口25和80的连接请求,都会被自动地转发到应的内部网主机上了。并且,任何时候,我们都可以使用“ipmasqadm portfw -l”命令来查看正在起作用的端口转发规则:
prot localaddr rediraddr lport rport pcnt pref
TCP 172.16.1.1 192.168.1.2 80 80 10 10
TCP 172.16.1.1 192.168.1.1 25 25 10 10
-n标记告诉命令不要执行DNS查找IP地址,并且只打印出所指定数量的IP地址。
非默认端口的连接
当然,我们也可以使用Linux的端口转发能力来转发非默认的端口到默认的端口,反之亦然。比如下例:
# ipmasqadm portfw -a -P tcp -L 172.16.1.1 11011 -R 192.168.1.1 110
# ipmasqadm portfw -a -P tcp -L 172.16.1.1 80 -R 192.168.1.2 25044
以上所示的第一行告诉Linux路由器把端口11011的连接请求,转发到内部主机192.168.1.1的端口110(POP3端口)。如果内部主机是一个POP3服务器,那么这个命令将可以让远程用户使用非默认的端口连接到他们的POP3信箱。这可以阻止一些网络黑客试图使用公共端口入侵POP邮件系统。
以上所示的第二行把Linux路由器上HTTP服务器标准端口80上的请求转发到非标准端口25044上。这种情况主要是用于已经在默认端口上运行了Web服务器,但是又想让其能够响应其它非默认的端口。
负载平衡
如果公司有一个高层的电子商务站点,而同时又运行着一些Web服务器,那么就可以使用ipmasqadm portfw的 -p PREF参数来实现在这些服务器中的负载平衡。
-p的值虽然被称为首选项,事实上它实现的是一个计数器的功能。一旦Linux路由器建立起了规则所指定的相应数目的连接,它就会跳到下一个入口。
比如,现在我们来创建如下所示的端口转发规则:
# ipmasqadm portfw -a -P tcp -L 172.16.1.1 80 -R 192.168.1.2 80 -p 5
# ipmasqadm portfw -a -P tcp -L 172.16.1.1 80 -R 192.168.1.3 80 -p 25
# ipmasqadm portfw -a -P tcp -L 172.16.1.1 80 -R 192.168.1.4 80 -p 10
# ipmasqadm portfw -a -P tcp -L 172.16.1.1 80 -R 192.168.1.5 80 -p 30
上面的指令说明,首先和Linux路由器连接的5个请求,将被送到IP地址为192.18.1.2的HTTP服务器;接下去的25个连接将被送到地址为192.168.1.3的HTTP服务器;接下去的10个连接送到192.168.1.4;下30个连接送到192.168.1.5。一旦30个连接都被送到192.168.1.5以后,整个过程重新开始。
这个转发顺序的规则说明192.168.1.3 和192.168.1.5两个服务器处理连接的能力要强于192.168.1.2 和192.168.1.4。通过监测这些机器的服务器负载,网络管理员就可以调整服务器的映射参数,以使整个站点保持最佳的响应时间。
总结
在Linux里,端口转发是一个强大的功能,但是相关的文档较少。不过通过以上的学习,我们发现,其实这个功能并不难实现。现在,你不仅可以把所有流入的Internet信息转发到内部网中的对应主机上了,而且还可以使你的整个网络在信息流入和流出时共享一个IP地址,这将可以大增强内部网络的安全性。
文章录入:csh 责任编辑:csh