前言
随着个人计算机的普及,对于家庭用户来说,拥有一台以上PC的已经不少了,我们希望能够方便地同时上网。一些规模较小的学校、科研单位、商业机构,由于难以负担足够IP地址的费用,对共享IP上网也有迫切的需要。
随着宽带上网的逐渐推广,多台计算机共享一个Internet高带宽的连接显得越来越有意义。比较常见的做法一是购买专门的网络地址翻译(下简称NAT)机,二是在一台网关计算机上安装NAT软件或者应用程序代理服务软件1,其他计算机通过这个网关上网。第一种方法虽然安装、维护比较简便,性能好,但是需要进行一定的设备投资,并且NAT机的功能相对比较单一,难以实现其他Internet服务。第二种方法,网关机的操作系统如果使用Windows 95/98则稳定性不佳,不适合长期开机;使用Windows NT/2000则对作为硬件配置要求相对较高。
于是手头有一台低配置PC机的用户可能会想到Linux,但是本文要介绍的是BSD。与Linux不同,BSD是AT&T UNIX的“后代”,它不象Linux那样发行版本众多,却有更好的性能、可靠性与安全性。
目前有3个[url=http://www.pccode.net].net" class="wordstyle"源码开放的BSD版本:FreeBSD,NetBSD和OpenBSD。FreeBSD是用户数最多的版本,它的主要特点是性能好,Yahoo、ftp.cdrom.com等知名网站用的就是这个操作系统。NetBSD的特点是对各种硬件平台的广泛支持,它支持从手持设备到大型服务器的多种平台。OpenBSD的特点是安全性,在OpenBSD的网址,我们可以看到这样一句话:“三年来没有发现缺省安装的OpenBSD的一个远程安全漏洞!”,另外它支持的硬件平台也不少,不过目前还不支持SMP(对称多处理器)。
现在我们就以线缆(Cable)宽带接入为例,谈谈如何利用基于OpenBSD操作系统的网关机,使多台计算机共享一个线缆调制解调器(Cable Modem,下称CM)的Internet连接。
安装OpenBSD
我们先准备一下硬件:Pentium133 CPU,16M内存,1G硬盘,2块以太网卡。其实OpenBSD可以在低得多的配置上运行得很好,不过既然我们会开通一些网络服务,配置还是不要太低了。另外如果共享上网的客户机很多,可以适当增加内存。显卡、显示器、软驱、CDROM和键盘,仅仅在安装、配置的过程中需要,一旦系统投入运行,就都不需要了。
两点建议:(1) OpenBSD的分区工具的功能强大,但是易用性不大好(不如Linux),所以建议将整个硬盘全部分配给OpenBSD使用,不要和其他操作系统混用--不是不可以,而是分区比较麻烦。(2)网卡建议用常见的NE2000兼容网卡,比如Realtek RTL8029(AS)芯片的10M PCI卡。OpenBSD支持的网卡并不是很多,用名牌的网卡对于速度等方面并没有太大的帮助,万一兼容性有问题还要添麻烦。
OpenBSD有3种安装方式:CDROM安装,FTP安装和硬盘安装。如果PC的BIOS支持光盘启动的话,那么CDROM安装是最方便的,我们来看一下安装的主要过程。
从CDROM启动后选择(I)nstall,对提示的“Specify terminal type”直接按回车采用默认值,系统会列出当前所有的硬盘并提问“Which disk is the root disk?”。注意对于IDE接口的硬盘,BSD给它的设备名是 wd0,wd1,……;对于SCSI接口的硬盘是 sd0,sd1,……。我们的PC有一个IDE硬盘,输入wd0并回车。系统提问“Do you want to use the *entire* disk for OpenBSD?”,输入yes并回车,系统会启动fdisk并将整个硬盘空间都分给BSD系统。输入write、quit,系统会保存分区设置并启动disklabel。Disklabel的作用是在fdisk建立的给BSD用的BIOS分区中,划分出不同的BSD分区。我们可以在disklabel的命令提示符“>”下,随时使用?命令显示帮助信息,使用p命令打印当前的BSD分区划分情况。为了不搞得太复杂,我们仅把它划分为一个“/”和一个swap分区。先用z命令把BSD分区清空,再用“a b”命令添加一个新分区,offset直接回车用缺省值,size输入“128M”(如果任务比较重而有足够的磁盘空间,也可以大一些比如256M甚至512M),FS type用缺省的“swap”。然后用“a a”命令添加一个新分区,offset用缺省值,size输入“*”使用全部剩余空间,FS type用缺省的“4.2BSD”。最后用w、q保存并退出disklabel。接着系统会提示更改mount point信息,看看wd0a和wd0b是不是分别mount到了“/”和“swap”,完成后输入done结束。如果一切正确就一直回车直到看到“Are you really sure that you're ready to proceed?”,输入“y”回车,系统就开始格式化硬盘了。格式化完毕,先不要进行网络配置。接着是设置root用户的口令。下面问要不要运行X Window System,这个图形用户界面对我们没有用,如果硬盘空间够的话,选上也可以。下一步就是正式开始安装了,系统会问从什么地方安装(我们这里是CDROM)、CDROM设备名、文件系统种类以及安装文件位置,全部用缺省值。接着系统列出全部安装包,可以输入一个“*”全部选上,再输入一个“done”开始安装。安装完毕后系统问“Extract more sets?”,直接回车跳过。下一步是设置时区,中国是在Asia下面,选择你所在的城市。最后系统会建立启动信息等等,直到看到“CONGRATULATIONS! You have successfully installed OpenBSD! ”说明安装已经成功,系统返回命令提示符下,输入“reboot”并回车,重新启动系统。
配置网络
重新启动后,用root用户和刚才设置的口令进入系统,键入“ifconfig -a”查看所有网络接口,我们会看到有诸如“ne3: …… media: Ethernet ……”这样的显示,针对不同的网卡OpenBSD会有不同的接口名,这里假设用的的是NE2000兼容网卡,命名为“ne”,后面的数字表示它插在第几号PCI槽(从AGP槽的那面开始数)。现在假设我们的两块网卡分别插在3号、4号PCI槽里,则它们的接口名分别是ne3、ne4。现在我们打算把ne4接到CM上,把ne3接到内部LAN的HUB上。
由于CM是通过DHCP来获得IP地址的,我们先把ne4设置成通过DHCP获得IP地址:
# echo dhcp > /etc/hostname.ne4
OpenBSD启动的时候发现hostname.ne4中的内容是“dhcp”,就会启动dhcp client去请求IP地址、子网掩码、网关地址、DNS地址等设置。可以手工调整dhcp client的配置,但是这里没有必要了。
然后我们设置连接内部LAN的ne3的网络设置(假设内部网络使用的是保留的IP地址192.168.0.x,子网掩码是255.255.255.0):
# echo "inet 192.168.0.1 255.255.255.0 NONE" > /etc/hostname.ne3
将ne3的IP地址设置为192.168.0.1,最后的那个NONE表示不指定网卡的media option。
为了在NAT机上可以正确进行DNS解析,我们还需要配置一下/etc/resolv.conf文件,举例来说:
# cat /etc/resolv.conf
nameserver 210.52.149.2
nameserver 202.96.209.133
lookup file bind
第一、二行列出了两个不同的DNS服务器的IP,第三行表示先从/etc/hosts文件中查找,如果失败再到DNS服务器查找。
NAT大概的运作方式是这样的:假设内部网络上的计算机A需要访问Internet,则A把数据包发送到网关机N,N收到A的数据包后,把请求者的IP地址换成自己,然后发送到目的地去。收到目的地发来的回答后,N再把它转发到A机。NAT是在低层次起作用的,与在高层次起作用的代理比如应用层代理(常见的有HTTP proxy等)相比,对于A机来说,它不用将自己的应用程序设置成使用代理(有的应用程序并不支持代理),除了无法从外部直接连接到A机之外,所有的使用都和直接连接Internet一样。
下面我们来配置NAT:
修改 /etc/rc.conf
ipfilter=YES
ipnat=YES
修改 /etc/sysctl.conf
再修改配置防火墙规则,现在我们先不设置任何复杂规则,仅仅允许所有的信息通过:
# cat /etc/ipf.rules
pass in from any to any
pass out from any to any
然后是NAT规则:
# cat /etc/ipnat.rules
map ne4 192.168.0.0/24 -> ne4/32 portmap tcp/udp 10000:60000
map ne4 192.168.0.0/24 -> ne4/32
这些规则表示将内部网的IP地址192.168.0.x 、子网掩码为255.255.255.0,映射到ne4网络接口上去。第一行是映射TCP和UDP的,第二行是映射其他协议的。
现在所有的配置都完成了,把CM和ne4连接好,并把内部LAN的HUB连接到ne3上,键入reboot重启动。将内部LAN上的计算机的网卡接口的IP设置成 192.168.0.2,192.168.0.3……,子网掩码为255.255.255.0,网关为192.168.0.1,DNS服务器为ISP提供的DNS服务器的IP(比如210.52.149.2,202.96.209.133),根据需要可能需要重启动。试试看是不是已经可以上Internet了?
进一步的配置
下面介绍一下在我们刚才构筑的基于OpenBSD的NAT网关机的基础上,进一步设置一些网络服务的方法。值得注意的是:从安全性考虑,不是必要的服务就不要开!
1. 远程登录
OpenBSD缺省安装后,启动的服务很少。telnet服务是缺省关闭的,因为telnet是明文的协议,有被窃听的危险。OpenBSD打开了ssh服务,这是一个加密的远程登录服务。为了使用这个服务,必须在客户机上安装支持ssh协议的终端软件。在Windows操作系统下,可以用SecureCRT。安装完终端软件后,建立到服务器192.168.0.1的连接,注意使用standard SSH。
2. 串口终端
对于这个NAT服务器来说,我们可以不要显卡、显示器和键盘。但是如果配置网络出了问题,远程登录无法连接到服务器就比较麻烦了--因为我们已经把服务器的显示系统和键盘都去掉了。所以有必要建立一个比较保险的连接途径。我们可以通过串口终端的方式,连接到服务器。
a) echo -P > /boot.config 这个目的是告诉boot模块,如果发现键盘不存在,就进入serial console模式;
b) 修改 /etc/ttys,将tty00的status改为on,后面可以加上secure(允许root从serial console登录)--这里假设你用的是COM1口;如果你没有那种标准的null modem线,而只有那种RX、TX、地三根线的串口电缆,就再加上一个 softcar;
c) 在COM1上接终端,或者接到另一台电脑,比如运行Windows的PC,随便安装一个支持串口终端方式的软件,比如Hypertermial、Netterm、SecureCRT,新建立一个session,用串口协议,速率9600,data 8, parity none, stopbit 1,flow control XON/XOFF(假设用的是softcar);
d) 重启OpenBSD的机器,不要忘记拔掉键盘!
如果觉得9600bps的速率太慢,可以在 /etc/ttys中设置,并且将终端或者终端仿真软件的速率设置成相同的就可以了。举个例子:
tty00 "/usr/libexec/getty std.57600" vt100 on secure softcar
3. WEB服务
将/etc/rc.conf中,找到httpd_flags=NO,将NO去掉,下次启动的时候WEB服务就打开了。WEB服务的缺省根目录是/var/www,配置文件是/var/www/conf/httpd.conf。
4. 匿名FTP服务
首先要增加一个用户名ftp,但是为了安全原因,这个用户不允许登陆,仅仅作为匿名FTP使用:
a) echo /usr/bin/false >> /etc/shells
这是允许/usr/bin/false作为用户的shell
b) 添加一个用户ftp,属于ftp组,HOME为/home/ftp,注意将该用户的shell设置为/usr/bin/false,这样ftp用户就不能登陆到系统了。
再建立一些目录:
c) mkdir /home/ftp/pub
chmod 555 /home/ftp/pub
这个目录对所有人都是只读的,提供下载。
d) mkdir /home/ftp/incoming
chmod 777 /home/ftp/incoming
这个目录对所有人都是可写的2,提供上传和下载。
然后是设置ftpd的启动:
e) 编辑/etc/rc.conf,找到ftpd_flags,修改为ftpd_flags="-DllUSA"。
这些参数将使得ftpd作为守护进程启动,只允许匿名FTP,并且会将详细的连接、使用情况记录到/var/log/ftpd和/var/log/xferlog中。
最后,还有一些信息文件可以修改:
f) /etc/ftpwelcome
当用户使用ftp客户端软件连接到服务器后,显示的欢迎信息。
g) .message
/home/ftp下面的任何目录里都可以有这个文件,用户进入这个目录后就会显示这个文件的内容。
5. 动态域名解析
一般宽带接入商不一定提供固定IP给用户,每次开机动态分配的IP都有可能不同。为了方便外界连接,最好有一个动态的域名解析。Internet上提供免费域名解析的服务商很多,这里我们以hammernode为例介绍一下如何配置动态域名解析。
首先是申请一个免费的域名。访问hammernode的主页http://www.hn.org,点击Create an Account申请一个帐号。具体过程并不复杂,这里从略。假设申请到的用户名是someuser,那么我们就有了一个someuser.hn.org的域名。
然后我们要设置OpenBSD在启动获得DHCP分配的IP地址后,自动去更新someuser.hn.org对应的IP地址,我们可以在/etc/rc.local的末尾运行一个程序来完成这个更新。
# Register someuser.hn.org with IP address of ne4 interface
if [ -x /usr/local/sbin/hn-register.pl ]; then
/usr/local/sbin/hn-register.pl &
fi
在服务器关机的时候,有必要将someuser.hn.org动态域名关闭,不知情的使用者连接到别的主机上去,修改/etc/rc.shutdown,在末尾加上:
# Turn off someuser.hn.org IP address
if [ -x /usr/local/sbin/hn-turnoff.pl ]; then
/usr/local/sbin/hn-turnoff.pl
fi
上面的hn-register.pl和hn-turnoff.pl是根据
http://www.technopagan.org/software/hammernode.pl
改写的,这是一段用perl写的简单程序(必须先安装perl的package)。 hn-register.pl是连接到服务器,提供用户名和密码后,服务器会根据探测到的IP地址,自动进行注册,5分钟之内会生效。Hn-turnoff.pl是将IP地址注册为指定的0.0.0.0。
6. 电子邮件服务sendmail
一般来说sendmail服务需要一个固定的IP,但是由于服务器一般是常开的,所以我们还是可以运行sendmail服务的。这里有一个难点,就是一般免费的动态域名注册服务都是进行域名->IP的正向解析,而IP->域名的反向解析不能实现。但是sendmail服务启动的过程中却会使用gethostbyaddr取得域名,才能正常使用。为此我们必须做一点手脚:
a) 再次访问hammernode的主页,点击Modify your Account,输入someuser和用户名,在Primary MX前面打钩。
b) 检查/etc/rc.conf中,sendmail_flag=NO。因为我们不能在ne4通过DHCP得到IP之前启动sendmail。
c) 将原先的/etc/hosts保存到另一个文件中
cp /etc/hosts /etc/hosts.fixed
d) 在/etc/rc.local的末尾添加这些内容:
# Set hosts
if [ -e /etc/hosts.fixed ]; then
cp /etc/hosts.fixed /etc/hosts
/sbin/ifconfig ne4|grep "inet "|awk '{print($2," someuser someuser.hn.org