BBS水木清华站∶精华区
发信人: ruster (尘埃*沧海任浮沉), 信区: Linux
标 题: killerlife look this
发信站: BBS 水木清华站 (Mon Dec 11 14:09:38 2000)
这个是比较bt的做法
8.4.3 拨号服务器
现在我们来研究如何做一个拨号网络服务器。作拨号服务器仍然是利用pppd程序,不
过,这一次我们必须解释一点东西。
在最简单的情况下,假如你是一个ISP管理者,你只需要让用户连接到你的系统中,就
可以为他们提供网路服务。在这种情况下,客户的机器逻辑上是你的子网的一部分,为
了是客户机器可以和同一子网的机器通讯,我们可以使用ARP代理功能,就是拨号服务器
替客户应答ARP询问,因此其他机器会把应该送给客户机器的信息包交给服务器,服务器
再转交给客户机器。这个和我们前面讨论分割地址空间时的ARP代理没有任何区别。这种
情况下,客户机器到外界的联系完全由服务器代理,因此客户端几乎不需要设置任何东
西。相反,如果你是要用电话线把两个子网连接起来,那么你需要的是在两个子网上建
立缺省投递路径,内容就和我们第一节介绍的完全一样,甚至也可以用ipchains控制信
息的流动。
当客户拨号到服务器上的时候,首先是调制解调器之间建立连接,为了实现这个功能
,服务器的调制解调器必须设置为等待/应答方式,一旦有拨入就能接受服务。如果你仅
仅是想把客户机器当成终端来使用服务器,那么这就足够了;否则,如果你使用拨号网
络等windows 9x的ppp客户程序来拨入,它将向服务器传输PAP认证信息。你的拨号服务
器接受到这些信息之后,对客户的身份进行验证并且去处理缺省的拨号脚本,启动pppd
程序在两台机器之间建立起数据通路,这样,客户机器就被连接到服务器所在的网络上
。
现在我们来介绍如何制作第一种情况下的PPP服务器,仍然假定你的内核编译的时候已
经加入了PPP支持。我们首先建立一个下面形式的/etc/ppp/options文件:
asyncmap 0
netmask 255.255.255.0
proxyarp
lock
crtscts
modem
ms-dns 202.199.248.2
这个文件的详细含义请参考man ppp。proxyarp和netmask给出了PPP连接的工作方式为
ARP代理。lock是锁定调制解调器避免拨号连接被其他程序干扰,crtscts设置调制解调
器使用硬件流控制方式。需要特殊说明的只有最后一行,一般来说,作为拨号客户的总
是windows 机器,而windows 9x期望从服务器上取得关于网关和DNS服务器的信息,这行
就是起这个作用的,ms-dns将DNS服务器的地址传递给拨号客户。另外还有几个很常用的
参数,其中最重要的是nodetach,它避免pppd复制出一个在后台运行的子进程,如果你
发现在拨号连接被切断之后pppd程序没有正确退出,加入这样一行。另外,还有一对de
faultroute和nodefaultroute选项,在我们现在的情况,缺省值nodefaultroute就可以
满足要求了。
下一步,我们必须为每个拨入调制解调器准备一个配置文件,配置文件的名字规则是
/etc/ppp/options.ttyXX,例如你的modem接在COM1上,就需要生成一个文件/etc/ppp/
options.ttyS0。以此类推。
options.ttyXX的内容非常简单,就是[本地IP]:[远端IP]。例如,我的PPP server的
IP地址是202.199.248.8,名字是server,我想为从com1拨入的用户分配IP地址202.199
.248.19,名字是dialclient。那么需要在/etc/ppp/options.ttyS0文件中写上:
202.199.248.8:202.199.248.19
或者
server:dialclient
接下来,需要作的是建立身份验证文件。一般情况下,我们在客户端用的是windows
9x,而windows使用的是PAP验证,所以我们必须为PAP准备身份验证文件。这个文件的缺
省名字是/etc/ppp/pap-secrets,而它的行的格式是:
[用户名] [远端机器名] [口令] [远端IP]。可以使用通配符"*"。
例如,我们希望允许用户user01可以从任何地方拨入,并且可以使用前面定义的远端
IP地址202.199.248.18,口令是test01,那么使用这样的行:
user01 * test01 202.199.248.18
如果希望user01可以从任何地方拨入,而且可以使用所有定义在options.ttyXX中的远
端IP地址,那么使用
user01 * test01 *
由于pppd程序需要控制网络接口(建立网络接口),所以需要使用root身份来执行,
为了让所有拨号用户都能使用pppd,需要设置pppd为setuid程序:
# ls -l /usr/sbin/pppd
-rwxr-xr-x 1 root root 138596 Sep 20 1999 /usr/sbin/pppd
pppd程序的拥有者是root,只要setuid就行了:
chmod u+s /usr/sbin/pppd
接下来是最困难的步骤了,启动调制解调器应答。为了驱动调制解调器,你的系统中
必须有一个串行口管理程序。我们使用的是mgetty,它包含在大部分Linux发行版本中。
假设你已经安装了mgetty程序,例如
$rpm -q mgetty
mgetty-1.1.14-9
就可以开始设置调制解调器应答了,进入到/etc/mgetty+sendfax目录,编辑mgetty.
config文件。
下面是我们的mgetty.config文件,你可以按照这个方式自己编写:
# !mgetty.config
debug 4
speed 38400
port ttyS0
init-chat "" ATZ OK "AT M0E1Q0S0=0" OK
answer-chat "" ATA CONNECT \c \r
port ttyS1
init-chat "" ATZ OK "AT M0E1Q0S0=0" OK
answer-chat "" ATA CONNECT \c \r
这个文件的内容倒是十分简单的,debug 4将mgetty的纪录级别定义为4,在你调试正
常之后可以将它改成一个合适得值;speed 38400设置了传输速度为33.6k;接下来的就
是各端口连接的调制解调器的初始化段落,port ttyS0往下的段落定义了一个接在COM1
上的调制解调器,而init-chat和answer-chat分别定义调制解调器的初始化和应答命令
。port ttyS1则是COM2上的调制解调器,这样,每一个调制解调器都需要自己的段落。
这里的init-chat和answer-chat中的命令可以适用于大部分调制解调器。不要问我这些
命令从那里来的,你可以自己参考关于调制解调器的标准。必须注意缺省的mgetty.con
fig文件中,有一行(fax_id ....)是用来设置缺省应答为传真的,你必须手工把它去掉
。
如同我们说的,调制解调器的驱动是靠mgetty程序,我们可以手工启动mgetty程序,
不过更常见的方法是修改运行级别。我们知道,缺省的/etc/inittab定义了所有的运行
级别,在多用户级别,它利用mingetty程序开出了六个虚拟屏幕,我们可以用同样的方
法开出一个虚拟终端,这只需要修改/etc/inittab文件的下面部分(加粗体的是我们加
入的部分):
#!/etc/inittab
………………
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
sm1:35:respawn:/sbin/mgetty ttyS0
…………………………
在运行级别三和五,对ttyS0启动mgetty。如果你有更多的调制解调器,启用更多的m
getty行就可以了。
上面给出的是一个接在com1上的调制解调器的驱动方式,如果你有更多的调制解调器
,为每个调制解调器在mgetty.config文件中加入一个段落,并且在/etc/inittab中开出
一个mgetty进程。不过,我个人只实验过连接两个调制解调器,如果你需要接续8个或更
多的同时连接,你多半需要某种多串口卡。据说,多串口卡上的串行口相应的设备名字
是ttyCXX,你可以自己试试。也许要在核心中编译相应的支持。
在客户程序拨入的时候,mgetty程序将试图调用/etc/mgetty+sendfax/login.config
,从中查找关于AutoPPP的内容,所以我们必须建立这个文件,如果你只是要使用PPP服
务,可以将这个文件设置为只有下面这样一行:(实际上,你的缺省安装的mgetty里面
已经有一个这样的模板了)
!#login.config
/AutoPPP/ - a_ppp /usr/sbin/pppd auth silent -chap +pap login
-chap +pap表示使用pap身份认证方式。为了避免输出不必要的垃圾信息,使用silen
t选项。另外,如果你希望用户连接中的信息以用户的名字(而不是缺省的a_ppp)进行
记录的话,将a_ppp改成一个"-"。
至此,我们配置好了调制解调器的行为,接下来,连接调制解调器,打开调制解调器
电源,重新启动服务器以便确保inittab中开出的mgetty被正确执行,不要忘了打开核心
IP转发,然后就可以接受客户机器的拨号呼叫了。
上面说的是基于ProxyARP的拨号服务,这个服务的最大特点是客户机器和服务器处在
一个子网之内,如果你想要用拨号网络连接两个子网,那么你需要去掉/etc/ppp/optio
ns文件中的proxyarp命令行,并且设置缺省路由递送路径。特别是,需要把拨号网络的
服务器/客户的拨号网络接口当成一个缺省路由路径,这可以手工加入路由路径,但是更
常用的方法是使用在/etc/ppp/options文件中加入defaultroute行(没有参数),这样
ppp管理程序会自动将拨号连接作为一个缺省路由路径加入,在ppp被切断之后自动删除
路径。注意服务器和客户端都必须使用这个选项。
ppp server是一种非常容易出现问题的东西,为此,缺省情况下,pppd产生的信息将
会被存储到/var/log/messages中,而mgetty则对任何ttyXX产生一个/var/log/mgetty.
log.ttyXX文件,如果你的ppp莫名其妙地当掉或者无法建立连接,请研究这些记录文件
中的错误信息。
另外,也存在其他的拨号连接数据传递方式,例如uucp和slip。不过,由于本书是一
本处理常规问题的教本,我不想在这里讨论这个问题。毕竟,ppp已经够用了,对吗?
最后我们要额外说明一句,有时某些人并不希望建立一个网络连接,相反,他希望能
够以终端方式连接到服务器上。在这种情况下,你只要按照前面的方法设置好调制解调
器应答,开出合适的mgetty进程,就会发现用户已经可以拨号连接到服务器上了。这个
技术的一个古怪的应用是用Null-Modem连接来接通两台机器,详细的资料可以参考随mg
etty提供的文档。
--
西风扬旧笺,飞雪闭婵娟。
冰酒独酌意,今宵梦亦寒。
※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.112.90.76]
BBS水木清华站∶精华区