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水木清华站∶精华区