2.1 设置基本的拨号服务器
在这一节里,我们一步一步的建立拨号服务器,力求做到条理清楚。做拨号服务器的方法很多,这里讲的只是其中一种方法而已。
我们首先要确保 linux的内核支持 ppp,并且支持IP转发( IP ipchains),这个功能让你通过 linux 拨号服务器访问局域网上其他的机器,进而访问 Internet ,而不只是拨号服务器本身。幸好现在的linux 发布版本所带的内核都支持这些功能,如果你使用自己编译的内核,你就要注意这个问题了。
在内核支持 IP 转发之后,还要激活IP 转发这个功能。使用如下命令: echo "1">/proc/sys/net/ipv4/ip_forward
如果使用 RedHat,可以将 /etc/sysconfig/network 文件里的 FORWARD_IPV4=false 改成 true 就行了。之后需要重启动以激活IP 转发。
使 linux 能够接受电话拨入
要实现这个功能,要用到一个叫 getty 的程序,它的功能就是向用户显示 login: 和 password: 这样的登录提示,并调用 login 程序实现登录。我们平时在局域网里用 telnet 登录某台 unix 主机时,也是这个过程。只不过现在我们走的物理线路不同,我们走的是电话线—〉 modem —〉串口,而 telnet 程序走的是网线和网卡。
目前 linux 上有三种 getty : getty_ps , agetty , mgetty 。 getty_ps 就 是所说的 getty ,另外两种也都实现了 getty的功能。其中 mgetty 的功能比较强大,我们决定就用 mgetty 了。 RedHat6 包含了mgetty 的四个软件包,mgetty-1.1.14-8.i386.rpm 是必须安装的,如果你要用回拨功能,就要安装 mgetty-sendfax-1.1.14-8.i386.rpm , callback 程序包含在这个包里(不明白为什么在这个包里)。我反正不管那么多, rpm -Uvh mgetty* ,全安装上算了。
我们现在要做的就是使 modem 所接的那个串口可以接受外来连接。打开 /etc/inittab, 你会看到这样的几行:
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingettytty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
在这几行之后,加上如下一行:
7:2345:respawn:/sbin/mgetty ttyS1
它的意思就是让 mgetty 在串口 ttyS1 上监听,等待连接,如果有连接请求, mgetty 就向用户提示用户名和密码。 Mgetty 也有好多参数,预知详情,请看mgetty 的手册页。注意:程序的名字是 megtty 而不是上面几行写的 mingetty 。 Mingetty 是 RedHat自己的终端程序,它不支持 modem 连接。我的一个同学曾经把 mgetty 错敲成 mingetty ,结果怎么拨电话, linux
也不接。另外,这行开头的数字“ 7 ”并不是一定的,只要是在文件中没有重的,唯一的就行了,可以是两个字符或数字。
改好之后,要使修改有效,运行: init q
为了从远端登录,我们要有一个账号,用 useradd 命令加一个叫 ppp 的用户,并用 passwd 命令为它设置口令。
下面我们就用 win95 的客户来试一试,我们在 win95 下新建一个连接,电话号码当然要填对,然后右键单击这个连接,依次选择属性 - 〉常规 - 〉设置 - 〉选项,将“ 拨号后出现终端窗口”打上勾,再按两次确定关闭对话框。现在双击这个连接,用户名和 密码不用填,直接按“连接”,你会听到拨号声和一阵乱叫,接着会弹出一个黑底白字的窗口,这就是登录的终端窗口了!你会看到这与你登录 linux 时是一样的,输入用户名 ppp 和密码,你看到的是 shell 提示符,你通过 modem 登录到 linux 主机上了!但这 种终端的形式上网,并不是 ppp 连接,相信你一定不会满意,你需要的是有 WWW ,FTP 等丰富功能的网络。我们下面就来看看怎么实现 ppp 连接,现在在 shell 提示符下输入 exit 退出。
启动 pppd 与客户建立 ppp 连接
上面一小节已经实现跟 telnet 差不多的终端联网,但还很不够,现在我们要用 pppd 实现端对端的连接,实现真正的联网。
为了给客户分配 IP 地址,我们要编辑一个新文件: /etc/ppp/options.ttyXX 。文件名中的 ttyXX 就是你所用到的串口设备文件,我的就是 /etc/ppp/options.ttyS1 。 在这个文件中给出一个 IP 地址对,就像这样: 10.39.1.1:10.39.1.123
冒号前面的的拨号服务器的 IP 地址,后面的是要分配给客户的 IP 地址。
在前面讲述 ppp 客户时我们已经清楚, pppd 程序要在服务器和客户机分别启动,并进行握手,实现连接。客户的 pppd 程序现在是用 win95 的拨号网络,我们就不管了,服务器端的pppd 怎么启动呢?诚然,你可以登录后手工输入下面命令来启动 pppd : pppd debug proxyarp asyncmap 0 lock modem crtscts
但这似乎太过麻烦,我们需要 pppd 能自动启动,下面就来看看怎么搞!
打开 /etc/passwd 文件,找到用户 ppp 的哪一行,差不多是这样的: ppp:x:500:500::/home/ppp: /bin/bash
你可以看出用户 ppp 使用的 shell 程序是 bash ,我们现在要做的就是用 pppd 换掉这个 bash ,这样当用 ppp 登录时,就不会执行bash ,而是执行 pppd ,如此, pppd 就在服务器端启动了。
具体我们可以这样做:在 /etc/ppp 建立一个 ppplogin 文件,内容如下:
#!/bin/sh exec /usr/sbin/pppd debug passive asyncmap 0 proxyarp
lock modem crtscts
pppd 的参数大多都见过,其中 proxyarp 的意思就是让 ppp 客户通过 ppp 服务器访问网上其他机器,而不只是 ppp 服务器一台。将 ppplogin 设成可执行的: chmod +x ppplogin 用
ppplogin 替换用户 ppp 的登录 shell ,就像这样: ppp:x:500:500::/home/ppp:/etc/ppp/ppplogin
由于 pppd 执行必须要 root 权限,还要将 pppd 设成以 root 权限执行: chmod u+s /usr/sbin/pppd
替换了登录 shell 和修改 pppd 属性之后,我们来试一试。与上一小节一样的进行 拨号,在输入了用户名和密码之后,你是否看到pppd 所特有垃圾字符?并且一行一行 的没完?如果看到的话,恭喜你!服务器端 pppd 已经启动了!你接着点继续按钮,也 就是启动客户的 pppd ,与服务器的 pppd 进行握手,一会儿,你就会看到登录网络成功,那个熟悉的绿色小电脑又出了!你是不是意识到什么?对了!你可以上网了!如果你使用 linux 做客户的话,工作就完成了。但是由于 win95 的一些特殊要求,我们还要针对 win95 做一些特殊设置。
针对 win95 客户的特殊设置
前面谈到了 win95 与 linux 做客户,对域名服务器的要求是不一样的。Win95 要求域名服务器在连接的时候传给它,这在 linux 拨号服务器上怎么做呢?
如果你看过 pppd 的手册页,你可能已经看到 pppd 有个参数 ms-dns ,它就是用 来传 dns 给客户的。在你的 ppplogin 里加上这个参数就可以了,比如:
#!/bin/sh
exec /usr/sbin/pppd
debug passive asyncmap 0 proxyarp
lock \ modem
crtscts ms-dns 10.39.0.133 ms-dns 10.39.1.133
两个 dns 第一个是主,第二个是辅。
在前面讲 win95 拨号时,我们使用“拨号后出现终端窗口”,然后手工输入才登 录上的,而别的 ISP 却不是这样。我们把“拨号后出现终端窗口”选项去掉,按照常规在拨号对话框里填入用户名和密码,但这样会出错,怎样才能按照常规那样拨号不用弹出终端窗口呢? getty 有几个配置文件在 /etc/mgetty+sendfax ,其中 login.config 是比较重要的。在 login.config 中有下面这样一行:
#/AutoPPP/ - a_ppp /usr/sbin/pppd auth -chap +pap login debug modem crtscts proxyarp lock
我们把行首的注释 # 去掉就行了。由于拨号连接可以是 ppp 也可以是 slip ,Win95 客户与拨号服务器对话的时候,要求自动使用 ppp , win95 客户向拨号服务器发出某种信号,让拨号服务器自动启动 ppp 。我们这里所做的就是让 mgetty 响应 这个信号并启动 pppd 实现AutoPPP 。我们看到这里的 pppd 程序的参数多了几个:auth -chap +pap login ,我们只要知道这些跟 win95 的安全认证有关系就行了, 具体含义请看 pppd 的手册页。为了支持这几个参数,需要编辑 /etc/ppp/pap-secrets 文件。这个文件是 pap 认证用的,我们不做研究,在里面填 上一行最通用的就行了,如果你要对用户进行安全认证,请参阅 pppd 所带的例子和相关的文档。这个文件的内容就像这样:
# Secrets for authentication using PAP
# client server secret IP addresses * * "" *
现在我们用 win95 建立一个新的拨号连接,就像连接别的 ISP 一样输入用户名和口令,也可以在“保存口令”上打上勾,好了,连接吧!你会看到你的 linux 拨号服务器工作的像别的 ISP 一样好!
--------------------next---------------------