linux 网关服务
作者:田逸([email]sery@163.com[/email]) 《网管员世界》2006年第5期

在网络互联的应用环境,网关起了非常重要的作用。在internet上,由路由器这样的专用设备来担当网关的职责。对于一些应用要求不是太高或者资金紧张而不愿购买昂贵的路由器的机构,由linux来充当网关无疑是个聪明的选择,实践证明,基于linux部署的网关同样有着很好的性能。
用 linux可以轻松地实现网络地址转换(nat)、动态主机配置协议服务(dhcp)、虚拟专用网络服务(***)和防火墙(firewall)等基本网络网关服务.而完成这些任务仅需一台pc外加一套linux发行套件,是不是很省钱呢?
从功能上看,网关是几个网络互联的中间设备,因此作为网关的计算机,起码应该具备两个以上的网络接口;一个接口连接外部网络(isp接入),另外一个接口连接自己的内部网络。一个需要注意的问题是,在这个计算机上使用的网卡应该能被linux所支持,所以建议使用比较流行的、质量比较好的网卡。物理部件都准备好后,开始安装操作系统。网关操作系统的安装与一般的linux应用服务器有些差别,在安装过程中,选择server (服务器) 方式,安装非常少的一些软件,也不需要xwindow,安装界面也使用文本形式进行,按照自己硬盘的大小和实际情况划分一下分区,要不了几分钟就可以安装完成。以root帐号登录系统,检查网络参数是否设置正确。为了方便起见,在这里指定外网网卡的名称为eth0,内网网卡为eth1.如果网络参数没有被正确的设置,请修改文件 /etc/sysc 202.107.100.22 netmask 255.255.255.0 gateway 202.107.100.29 ,eth1的 ip地址为 192.168.1.1 ,netmask 255.255.255.0。然后运行命令 # ntsysv ,关闭一些不必要的服务,比如sendmail等。

网络地址转换(nat)服务
众所周知,因为ipv4地址的资源短缺,internet接入服务商(isp)分给用户的全球唯一单播地址非常有限,为了让大量没有全球唯一单播地址的内部网络的主机访问互联网,通常的做法就是在自己的内部网络使用网络保留地址(私有网段如192.168.1.0/24这样的网络地址段),然后通过连接网关,在网关上启用网络地址转换功能就实现了整个网络访问internet的功能。nat分两种类型-源地址转换(snat)和目的地址转换(dnat)。源地址转换用于内部网络主机访问internet,目的地址转换(dnat)用于internet上的主机访问网关内的内部主机(使用的是保留地址)。可以在网关上同时实现snat和dnat。
1、源地址转换snat。分两步进行:
(1)启用内核的ip转发功能。通过修改文件 /etc/sysctl.c “net.ipv4.ip_forward = 0改成 net.ipv4.ip_forward = 1”,运行命令 # sysctl -p 使修改立即生效。
(2)编写一个源地址转换脚本/root/sant.sh,使其包含 “/iptables -t nat -A postrouting -o eth0 -j snat -to 202.107.100.22 “行,保存脚本然后给与执行权限,然后执行这个脚本 # /root/snat.sh.
到这里一个具备基本功能的地址转换网关就做成了,我们在内网主机把默认网关设置成网关的内网网卡ip地址192.168.1.1,如果一切正常的话,内网的用户就能访问internet上的资源了。当然,不能每次都手动执行一遍脚本 /root/snat.sh,最好把 /root/snat.sh写在脚本/etc/rc.d/rc.local里,这样只要一开机就可以启动脚本/root/snat.sh的源地址转换功能。
2、目的地址转换dnat.分两步进行:
(1)启用内核ip转发功能。方法与snat相同,不再叙述。
(2)编写一个目的地址转换脚本/root/dnat.sh。其内容如下:
# !/bin/bash
iptables -t nat -A PREROUTING -p tcp -d 202.107.100.22 --dport 80 -j dnat --to 192.168.1.101:80
iptables -t nat -A PREROUTING -p tcp -d 202.107.100.22 -dport 25 -j dnat --to 192.168.1.102:25
iptables -t nat -A PREROUTING -p tcp -d 202.107.100.22 --dport 110 -j dnat --to 192.168.1.101:110
保存该脚本并给与执行权限,就可以从internet访问在内往只有保留地址的各种网络服务。以把这个脚本写入 /etc/rc.d/rc.local,使它随系统一起自动运行。

动态主机配置协议-dhcp
系统管理员使用dhcp服务,可以大大简化客户计算机设定ip地址的工作,因为启用动态主机配置协议(dhcp),服务器会自动地为联网的客户端计算机分配ip地址、子网掩码、默认网关、域名解析服务(dns)等入网所必需的参数值。这同时也减轻了网络管理员管理和维护的负担。当然,并不是所有场合都使用dhcp服务,比如服务器就应该手动设定静态网络参数。一个比较恰当的方案是在一个网络中同时使用dhcp和静态网络参数设定。
dhcp的设定主要发生在服务器端,客户端基本上不用做设置。下面分3步来部署dhcp服务:
1、安装dhcp。默认的情况下,linux自动安装dhcp服务。用 # rpm ╟qa | grep dhcp 检查 dhcp是否被正确安装到系统中,如果没有安装,则下载rpm包或二进制源码包安装。这里假定下载的是rpm包 dhcp-3.0.1-12_el.rpm,运行命令 # rpm ╟ivh dhcp-3.0.1-12_el.rpm安装dhcp。dhcp服务需要读取配置文件dhcpd.conf才能正常提供服务的,但是安装完成dhcp后并没有现成的dhcpd.c /etc/dhcpd.conf.
2、配置dhcp。在安装dhcp 的同时会安装一个范本文件/usr/share/doc/dhcp-3.0.1/dhcpd.conf.sample,把这个范本文件复制到目录/etc下,并改名成dhcpd.c # cp /usr/share/doc/dhcp-3.0.1/dhcpd.conf.sample /etc/dhcpd.conf.照着这个范本的模式修改就不易出错。dhcpd.c
选项/参数
声明{
选项/参数
}
接下来是我的一个dhcp配置文件的实例:
ddns-update-style interim; //动态dns更新类型,这项必选
ignore client-updates; //忽略客户端更新dns纪录

subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.80 192.168.1.200; //可分配给客户端的 ip地址范围
option routers 192.168.1.1; //指定默认路由,可以有多个,中间用逗号隔开
option subnet-mask 255.255.255.0;
option domain-name-servers 202.106.0.20;
default-lease-time 86400; //缺省租期为24小时
max-lease-time 172800; //最大租期为48小时,可以更改这个值
}

上面的配置只是一个网段实施dhcp的情形,在稍大一点的网络应用环境,可能有多个网段需要dhcp服务,可以在每个网段内架设一个dhcp服务器,但这决不是一个好的决策;实际的操作就是用一台dhcp服务器来为多个子网分配ip地址。下面是一个为3个子网提供dhcp地址分配的样例:
ddns-update-style interim;
ignore client-updates;

shared-network public {
option subnet-mask 255.255.255.0;
option domain-name-servers 202.108.0.20;
default-lease-time 86400;
max-release-time 172800;

subnet 192.168.1.0 netmask 255.255.255.0{
 range 192.168.1.80 192.168.1.200;
option routers 192.168.1.1;
}

subnet 192.168.2.0 netmask 255.255.255.0 {
range 192.168.2.20 192.168.2.220;
option routers 192.168.2.1;
}

subnet 192.168.3.0 netmask 255.255.255.0 {
range 192.168.3.10 192.168.3.250;
option routers 192.168.3.1;
}
}
3、启用dhcp服务。执行命令 # service dhcpd start 就启动了dhcp服务器。如果是以2进制源码包形式安装的话,请执行相应安装目录下的守护进程。
对于给多个网段提供dhcp服务的情形,需要在内部的路由上设置ip地址求助功能,具体的设置请参照各路由器厂商的资料,在此不做说明。使用dhcp方式获取ip地址的客户端设置很简单,windows的用户选tcp/ip协议属性“自动获取ip地址”即可。

虚拟专用网络(***)
虚拟专用网是借助公共网络internet来连接在不同地理位置的本地网络,网络间的访问就像本地访问一般。由于***在传输数据的过程中对数据进行了加密,尽管这些数据在公共网络上传输,其安全性还是很高的。这几年带***功能的硬件设备还是卖得很欢的,有些防火墙厂商还拿它的***功能作卖点呢。在这里我们不关注硬件***,只讲linux下的***.
1、安装*** 包。需要dkms-2.0.10-2.fc5.noarch.rpm, kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm , ppp-2.4.3-9.2.i586.rpm 和 pptpd-1.3.1-0.i386.rpm这几个rpm包。然后分别执行命令 # rpm -ivh dkms-2.0.10-2.fc5.noarch.rpm ; rpm -ivh kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm ; rpm -ivh ppp-2.4.3-9.2.i586.rpm ; rpm -ivh pptpd-1.3.1-0.i386.rpm 完成安装。
2、配置***服务。有两个文件需要修改:主配置文件/etc/pptpd.c 和***用户帐号文件/etc/ppp/chap-sescrets。主配置文件需要设置***服务器的本地地址和分配给客户端的地址段,因此只需在主配置文件中手动追加localip和remoteip两行就算完成配置任务。帐号文件保存***客户端拨入需要的验证信息,其格式是:
用户名 服务 密码 分配给用户的口令
其中用户名,密码,分配给用户的ip地址要用双引号括起来,“服务”一般是pptpd。作为参照,下面给出一个pptpd.c
# more /etc/pptpd.c
localip 192.168.1.20
remoteip 192.168.1.201-220

# more /etc/ppp/chap-screts
“sery” pptpd “gshdh7%” “*”
“public” pptpd “gy76423@e” “192.168.1.202”
3、客户端的配置。使用windows的网络连接向导,只要选择“通过ineternet连接到专用网络(v)”,一步步下去即可配置完成。注意:***服务器的ip要填写全球唯一单播地址,即网关服务器的eth0的地址。
4、启用***服务。再启用***之前确认内核的ip转发功能已经打开,然后执行命令 # service pptpd start 启用***等待远程用户接入。

防火墙(firewall)
linux自带包过滤防火墙netfilter/iptables,它可以检查数据包的源和目的ip、源和目的端口、通讯协议、数据包的顺序、 tcp先后顺序、头标记(syn、ack等)状态等,功能十分强大。在安装linux过程中,向导一般会提示用户开启防火墙,但这可能不能满足实际的应用需求,建议关闭默认的防火墙功能,然后自己订制符合需求的规则,写成一个脚本,然后运行这个脚本,以取得更好的安全性能。
iptables的语法确实让人生畏的,让我们先来简化一下,可以把它归纳成如下的格式:
iptables [-t 表] -命令 匹配 操作
iptables内置3个表:filter、 nat 、mangle.实际上常用的是表filter和nat,其中nat已在前面部分实现过了。命令选项常用的有 f-刷新规则、a-添加规则、p-默认策略等几项。匹配选项包括源/目的地址、源/目的端口、协议类型以及端口号等。动作选项主要包括accept-接受收据包、drop-丢弃数据包、reject-拒绝数据包、snat-源地址转换、dnat-目的地址转换、masquerade-ip伪装等。当表的类型是filter时,通常可以省略掉这一项。
一个好的防火墙规则应该是注重策略的,在自己订制的防火墙规则脚本中,应该遵循刷新/清除规则-添加默认策略-订制用户访问策略这样的顺序,业内的术语称作“先关门后开窗”,先禁止所有的访问许可,然后根据实际需求逐个开放访问权限。所以,一般防火墙脚本的前部分可以套用下面的格式:
# !/bin/bash
# refresh rules
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD //启用前先清除所有规则

# default rules
iptables -P INPUT DROP //先禁止
iptables -P OUTPUT ACCEPT
iptables -P FORWORD DROP

# proof dos etc
iptables -a forward -p tcp --syn -m limit -j accept
iptables -a forward -p tcp --tcp-flag syn,ack,fin,rst -m limit
iptables -a forward -p tcp -m --limit 50/s --limit-burst 50 -j accept

# enable loopback
iptables -a input -i lo -p all -j ACCEPT 

# enable lan user access firewall
iptables -a input -i eth1 -j accept
iptables -a output -o eth1 -j accept
iptables -a forward -i eth1 -j accept
iptables -a forward -i eth1 -j accept

# add user access rules
………….
接着就是逐个开放用户的访问权限:
# enable lan user access website in internet
iptables -a output -o eth0 -p tcp -d any/0 --dport 80 -j accept
iptables -a intput -i eth0 -p tcp -s any/0 --sport 80 -j accept
。。。。。。。
脚本写完保存后,给与执行权限然后执行。用局域网内的机器访问internet,检查设置的防火墙是否生效,是否符合我们本来的意图。要让这个防火墙脚本随系统开机启动,可以把这个脚本以行的方式写入/etc/rc.d/rc.local文件。


2006-4-12 白石桥