将LinuxPC连接到PPP服务器
摘自互联网
原始文件:Linux PPP HOWTO
Robert Hart, [email protected]
v2.0, 21 July 1996
档案叙述:点对点协定使用说明
文件编号:LRG.LDTP.HOWTO.005
翻译日期:1996/08/28
翻译维护:[email protected]
简体中文版维护:dfbb, [email protected]
--------------------------------------------------------------------------
这份文件展示如何把你的 Linux PC 连接到一台 PPP 服务器上,如何
使用 PPP 把局域网连结在一起并且提供一种把你的 Linux 电脑设
定为 PPP 服务器的方法。
版权
作者保留这份文件的版权。允许藉由电子形式以及光碟散布这份文件,
但必须完全依照其原始的格式。同时也允许列印这份文件的拷贝供个人
使用。
The copyright of this document is retained by the author. Permission
is granted to distribute the document by electronic means and on CDs
provided that it is kept entirely in its original format. Permission
is also granted to print a copy of this document for personal use.
没有版权所有者的允许禁止藉由任何不同於上述形式的方式重新发行这
份文件的部份或全部内容。
The republishing of this document in part or in whole without the
permission of the copyright holder by any means other than as noted
above is prohibited.
发布
一旦这份文件有新的版本产生就会贴到 comp.os.linux.answer 讨论群
。也可以在此取得 HTML 格式的文件:
。http://sunsite.unc.edu/mdw/linux.html#howto
其它格式(SGML, ASCII, postscript, DVI)的文件可以从这里取得:
ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/other-formats
因为 sunsite.unc.edu 的负载非常地重,请使用最靠近你的适当映射
(mirror)节点。
1. 简介
PPP (点对点协定)是在串口连结上跑 IP (网际网络协定)以及其它
网络协定的一种机制,串口连结可以是直接的串口连接(使用无调制解调器
缆线)或是使用调制解调器以及电话线路所造出的连结。使用 PPP, 你可以
把你的 Linux PC 连接到一台 PPP 服务器上并存取该服务器所连接的
网络资源(几乎)就如同你是直接连接在该网络上一般。
你也可以把你的 Linux PC 设为一台 PPP 服务器,这样一来其它电脑
就可以拨入你的电脑并且存取在你局域网里的资源。
因为 PPP 是一种点对点 (peer-to-peer) 的系统,因此你也可以使用
两台 Linux PC 上的 PPP 把网络连结在一起(或是把局域网连结到
网际网络上)。
最主要的差异当然是速度 - 标准的以太网络连线是以 10 Mbps(每秒
百万位元)这个理论上的最大交换量在动作,而在调制解调器这方面最大是
以 33.6 kbps(每秒千位元)的速度在动作。同时,依据 PPP 连线的
型态,某些应用以及服务在使用上可能会有些限制。
1.1. 客户端以及服务端
PPP 是一种完完全全是点对点的协定;拨接的机器以及接受拨接的机器
之间(在技术上)并没有差异。然而,为了清楚明白的缘故,以服务端
与客户端的方式来思考是很有用的。
当你拨入一个节点要建立 PPP 连线时,你是客户端。你所连线的那台
机器是服务端。
当你在设定一台 Linux box 使其接收并处里拨入的 PPP 连线时,你
正在设立一台 PPP 服务器。
任何 Linux PC 都可以是 PPP 服务端以及客户端 - 甚至於如果你有
一个以上的串口 (以及调制解调器,如果有必要)的话还可以同时扮演这
两种角色。如同前面所说的,就 PPP 而言,一旦连线建立那麽客户端
与服务端之间并不真的有什麽差异。
为了清楚明白的关系,这份文件把启始呼叫(即”拨入”)的那台机器
称作客户端,而把回应电话,核对拨入请求之验认(利用使用者代号,
密码以及其它可能的机制)的那台机器称作服务端。
使用 PPP 做为客户端把某个地方的一台或多台机器连结到网际网络上
是有可能的,大多数人都有这个兴趣。在这份文件中所描述的程序将会
让你能够建立并自动化你的网际网络连线。
这份文件也将在把你的 Linux PC 设为 PPP 服务器以及使用 PPP 来
连结两个局域网(有完整的递送设定)这些方面给你指引(这常常被
称作建立广域网络连结)。
2. IP 号码
每一个连上网际网络的设备都必须拥有它们自己的,唯一的 IP 号码。
这些是由每个国家的有关单位集中指定的。
请注意在这整份文件里所使用的 IP 号码(有一些个例外)都是从保留
给没有(不曾)连上网际网络的网络所使用的‘未连线网络号码’系列
来的。
如果你要把局域网连上网际网络,在你的局域网里你所拥有的所有
电脑及设备都必须使用从指定给你的网络□围里分配的 IP 号码。即使
连接另一个局域网(在网际网络之外)你也绝不能凭空取用 IP 号码
因为这将会引起全体性的大破坏。
有一些特别留给不连接网际网络的网络使用的 IP 号码。这些 IP 号码
依序是:
。1 个 A-等级 的位址
10.0.0.0 - 10.255.255.255
。16 个 B-等级 的位址
172.16.0.0 - 172.31.255.255
。256 个 C-等级 的位址
192.168.0.0 - 192.168.255.255
如果你的网络还没从你国家的权责单位分配到 IP 号码,那麽你的机器
应该使用前面所列这些网络号码中的一个。
这些号码永远不该使用在网际网络上。
不过,使用 Linux 以及 ipfwadm 软件的 IP 伪装能力,你就可以把
你的局域网连上网际网络(提供的服务会有些限制)。
对於大部分的使用者,经由 PPP 连接单一机器到网际网络服务提供者
(Internet Service Providers: ISP) ,取得一个 IP 号码(或更正确
的说,一个网络号码)的使用者是没有这个必要的。
如果你希望连接一个小型的局域网到网际网络上,许多网际网络服务
提供者可以从他们已有的 IP 位址空间中提供给你一个次网络(特定的
一段 IP 号码)。
对於经由 ISP 连接单一 PC 到网际网络上的使用者,大部分的提供者
使用动态的 IP 指定。这是说,连线程序的一部份中,你所联系的 PPP
服务将会告诉你的机器在现下这次连线的期间里该 PPP 界面应该使用
什麽 IP 号码。
使用动态的 IP 号码,你每次的连线不会都取得相同的 IP 号码。这对
在你 Linux 机器上的服务型态应用程序像是 sendmail, ftpd, httpd
以及诸如此类的软件而言会产生问题。由於动态的 IP 号码指定而有所
限制的服务(以及避免的方法,可能的话)稍後会在这份文件中讨论。
3. 这份文件的企图达成的目的
3.1. 设立 PPP 客户端
这份文件提供想要使用 Linux 以及 PPP 拨接到某一台 PPP 服务器
并且使用 PPP 设立 IP 连线的人们一些指引。文件中假设 PPP 已经
编译好并且安装在你的 Linux 机器上(但简短地涵盖重新配置/重新
编译你的核心以便包含 PPP 支援的部份)。
3.1.1. 使用 DIP - 不,使用 CHAT 取代之
虽然 DIP(建立 SLIP 连线的标准方式)可以用来创造 PPP 连线,但
DIP 指令稿一般都相当地复杂。因为这个缘故,这份文件并不涵盖使用
DIP 来创造 PPP 连线的部份。
取而代之的是,这份文件描述标准的 Linux PPP 软件(chat/pppd) 。
3.2. 设立 PPP 服务器
这份文件提供如何配置你的 Linux PC 做为 PPP 服务器的指引(允许
其他人拨接到你的 Linux PC 并且建立 PPP 连线)。
你应该注意的是设定 Linux 作为 PPP 服务器的方法有无数种。这份
文件(目前)给你一种方式 - 作者用来它设立一台小型 PPP 服务器
(共有 16 台调制解调器)。
这个方式已知运行良好。不过,它不一定是最好的方式。如果其他使用
者有特别聪明的 PPP 服务器设定,请别在意把它们寄给这份使用说明
的作者。
3.3. 使用 PPP 连结两个局域网或连结一个局域网到网际网络上
这份文件提供关於连结两个局域网或连结一个局域网到网际网络上
的(基本)信息。
3.4. 这份文件目前尚未涵盖的...
。连接以及配置调制解调器到 Linux 上(细节)
参阅 Serial-HOWTO
。使用 DIP 创造 PPP 连线
使用 chat 取代...
。使用 socks 或是 IP Masquerade
已经有涵盖这两个套件的绝佳文件。
4. 涵盖的软件版本
这份使用说明假设你使用 Linux 1.2.x 核心配合 PPP 2.1.2 软件或
Linux 1.3.X/2.0.x 以及 PPP 2.2 版。
使用 PPP 2.2.0 配合核心 1.2.13 是有可能的。然而,要这样做需要
核心修补。这份文件不包括这个软件组合。
请注意这份文件不包括使用 Linux 核心 2.0.x 的可载入模组所引起
的问题。请参阅 kerneld mini-HOWTO 以及核心/模组 2.0.x 的文件
(在 Linux 2.0.x 的原始程序目录里)。
因为这份文件是设计来协助新手的,强烈建议你使用已知能稳定地共同
运行的 Linux 版本及适当的 PPP 版本。
5. 其它有用的/重要的文件
鼓励使用者阅读:
。随附於 PPP 套件的文件
。pppd 以及 chat 的线上使用手册
。Linux 网络管理指引 (NAG)
。the Net-2 HOWTO
。在 /usr/src/linux/Documentation 里的 Linux 核心文件
。由 O'Reilly and Associates 出版的最佳 Unix/Linux 书籍(参阅
http://www.ora.com/ 里的目录)。如果你是 Unix/Linux 的新手,
立刻跑(不要用走的)到离你最近的电脑书店去投资几样这些资料。
虽然即使不必阅读这些资料中的任何一份你也可以使用这份文件来建立
你的 PPP 连结,但是如果你去阅读这些文件那麽你对於究竟发生了些
什麽的了解将会好的多。
这些文件(与各种其它文件,包括相关的 RFCs 等)提供额外的以及比
这份使用说明所能包含的更多细节解释。
如果你要使用 PPP 连接局域网到网际网络上,那麽你将得知道一些
关於 TCP/IP 网络运行的知识。补充一点这份文件前面提到的资料,你
将会发现 O'Reilly 出版的 "TCP/IP Network Administration" 以及
"Building Internet Firewalls" 很有好处。
6. 配置你的 Linux 核心
为了要能够使用 PPP ,你编译的 Linux 核心必须包含 PPP 的支援
。如果你还没有 Linux 的原始程序码请先取得 - 在 Linux 的档案
系统标准中它是放在 /usr/src/linux 里面。
Linux 核心的原始程序可以从 sunsite.unc.edu 或其映射节点取得。
一旦你的 /usr/src 里面有 linux 核心的包裹档案後,使用这个指令
解开它们:
______________________________________________________________________
tar xzf linux-2.0.6.tar.gz
______________________________________________________________________
一旦解开後,你将会发现 /usr/src/linux... 目录树已经建立,其中
包含著原始程序码。
在 /usr/src/linux 里你将会发现最少有一个解说(README)档。这包含
如何去配置以及编译一个新核心的最佳解释。阅读这个档案(虽然你得
直到编译足够多次以後才能知道你该怎麽做但是把它列印出来并在手边
持有一份拷贝是个好主意)。
6.1. 了解你的硬体
如果你要重新编译你的核心你必须知道在你 PC 里面的界面卡/设备!!
对於某些设备(像是音效卡)你也得知道各种设定(像是硬体中断号码
,输出入位址以及诸如此类的信息)。
6.2. 编译核心 - the Linux 1.2.13 kernel
要开始配置程序,首先依照在解说档里的说明适当地安装原始程序码。
然後以下面的指令开始核心的配置程序。
make config
为了要能够使用 PPP ,你必须配置核心包含 PPP 的支援(使用 PPP
需要 pppd 以及核心的 PPP 支援两者)。 ______________________________________________________________________
PPP (point-to-point) support (CONFIG_PPP) [n] y
______________________________________________________________________
根据在你 PC 里面的硬体以及你想要的 Linux 作业系统特色回答其它
的配置问题。然後继续依照该解说档来编译并安装你的新核心。
注意:
如果你想要把你的 Linux 设为 PPP 服务器或是网络间的闸道,那麽
你也应该包含 IP 转送(forwarding)的支援(你将会需要它的! )。
虽然连上网际网络但如果你关心你的电脑以及/或是局域网的安全,
你可能会想要加入 IP 防火墙(firewalls) 的支援。
这个 1.2.13 版的核心只会建立 4 个 PPP 设备。对於多端口的串口卡
,你将得编辑核心的 ppp 原始程序以获得更多的端口。(请参阅随附於
PPP-2.1.2 套件的 README.linux 档案以便了解你需要做的简单编辑的
全部细节)。
注意: 这个 1.2.13 的配置对白不允许你回头 - 所以如果你在回答其
中一个问题时犯了错的话,藉由键入 CTRL C 脱离并再次开始。
6.3. 编译核心 - the Linux 1.3.x and 2.0.x kernels
对於 Linux 2.0.x 的核心,你可以使用类似 Linux 1.2.13 的程序。
再一次,依照在解说档里的说明适当地安装原始程序码。然後以下面的
指令开始核心的配置程序。
make config
然而,你也有另外的选择
make menuconfig
这提供一个以选单为基础配合线上辅助的配置系统,允许你在配置程序
中随意所之。
也有一个以 X windows 为基础的配置界面
make xconfig
你可以直接编译 PPP 的支援到核心里去或者是做成可载入模组。如果
你只在你 Linux 机器运行的一部份时间里使用 PPP 的话,那麽建议
你把 PPP 的支援编译为可载入模组。使用 'kerneld',你的核心将会
在你开始你的 PPP 连结程序时自动载入提供 PPP 支援所需的模组。
这节省了宝贵的记忆体空间(因为核心没有任何一个部份可以被置换到
记忆体外)。
要这样做的话,你需要打开可载入模组的支援:
______________________________________________________________________
Enable loadable module support (CONFIG_MODULES) [Y/n/?] y
______________________________________________________________________
要加入 PPP 的核心支援,回答下列这个问题:
______________________________________________________________________
PPP (point-to-point) support (CONFIG_PPP) [M/n/y/?]
______________________________________________________________________
要做成可载入模组的话,回答 M 即可,否则就编译成核心的一部份,
回答 Y 就是。
与 1.2.13 的核心不同的是,2.0.x 的核心视需要自动建立 PPP 设备
并且一点都不需要去研究原始程序码以增加可用的 PPP 设备。
6.4. 配置核心的一般考虑
如果你要把你的 Linux PC 设为一台 PPP 服务器的话,那麽你必须把
IP forwarding 的支援编译进去。
如果你要连接一个局域网到网际网络上(或者甚至只是连接两个区域
网络),你应该要关心安全上的问题。在核心中加入 IP firewalls 的
支援可能是必须的!
如果你想要用 IP 伪装连接使用前述任何一个‘未连线’IP 网络号码
的局域网那麽你也需要这个配置。
一旦你完成新核心的安装以及重新启动之後,你就可以开始配置并测试
你的 PPP 连结。
7. 取得你所需要关於 PPP 服务的信息
在你可以建立到某台服务器的 PPP 连线之前,你需要取得下列的信息
(从 PPP 服务器的系统管理/使用者支援人员取得):
。拨接服务的电话号码
如果你是在私用交换机(PABX)系统下,你还需要拨出外线信号的私用
交换机号码 - 通常是零。
。服务器使用动态或静态的 IP 号码?
如果服务器使用静态的 IP 号码,那麽你需要知道在 PPP 连线中你
这端要使用哪个 IP 号码。大部分的网际网络服务提供者都使用动态
的 IP 号码。如前述,这对於你可以使用的服务会有些限制。
。如果你使用静态的 IP 号码,查问你的 ISP 使用的网络遮罩。
。ISP 的领域名称服务器 IP 号码是什麽?
虽然只需要一个但最少应该得要有两个。
。该服务器是否需要使用 PAP/CHAP ?
如果是这样你需要知道你用来连线 "id" 以及 "secret" 。(这大概
会是你的使用者名称以及密码)。
。服务器会自动起动 PPP 或者在一旦你接入之後需要发出任何指令来
起动服务端的 PPP?
如果你必须发出某个指令来起动 PPP 的话,它是什麽?
仔细地注意这些信息 - 你马上要使用它们!
7.1. 测试你调制解调器的拨接连线
你应该确认你的调制解调器设定正确而且你知道它连接到哪个串行口。
谨记:
。DOS com1: = Linux /dev/cua0 (and /dev/ttyS0)
。DOS com2: = Linux /dev/cua1 (and /dev/ttyS1)
et cetera
使用你的终端机通讯软件(像是 minicom),拨到你想使用 PPP 连线
的那台 PPP 服务器。
(注意: 在这个阶段我们并不尝试建立 PPP 连线 - 只是要证实我们
拥有正确的电话号码以及为了接入并且起动 PPP 而确实地找出服务器
究竟传送给我们什麽讯息)。
在这个过程中,可以截取(记录到一个档案里)整个接入的过程或者是
小心地(非常小心地)确实写下远端服务器所给你提示输入你的使用者
名称以及密码的讯息(以及任何建立 PPP 连线需要下达的指令)。
这最少值得拨接两次 - 某些服务器会在每次你接入时改变提示(例如
依时间改变! )。你的 Linux box 在每次你拨入的时候要能够辨认的
两个主要的提示是:
。要求你输入使用者名称的提示;
。要求你输入密码的提示;
如果你必须发出某个指令来起动服务端的 PPP ,那麽你也会需要找出
一旦你接入之後服务器所给你的提示。
如果你的服务器自动起动 PPP 的话,一旦你接入完成,你将开始见到
萤幕上出现垃圾 - 这是 PPP 服务端传送给你的机器以起动并且配置
PPP 连线的信息。
这看起来应该会是像这样的东西:
~y}#.!}!}!} }8}!}$}%U}"}&} } } } }%}& ...}'}"}(}"} .~~y}
(而且它还会一直进来! )
这个时候,你就可以挂断你的调制解调器(通常是,快速地键入 +++ 一旦
你的调制解调器回应 ok 然後接著发出 ATHO 指令。
在某些系统中 PPP 必须在服务端上明确地加以起动。这通常是因为该
服务器被设定成允许使用相同使用者名称/密码配对来做 PPP 接入及
一般使用界面(shell) 的接入。如果是这样,一旦你接入就发出该指令
。再一次,你将会见到 PPP 连线服务端起动的垃圾信息 - 所以现在
你可以挂断了。
如果当服务端起动 PPP 的时候你并没有在你的萤幕上见到这些垃圾,
那麽相当有可能(虽然并不确定)是你做错了些什麽。
即使如此,某些 PPP 服务器被设定成被动的 - 它们不传送任何讯息
直到客户端(你的电脑)从你这边起动 PPP 程序。
无论如何,大多数的服务器都是设定为主动的而且你应该会见到这些个
垃圾。 如果你不能使你的调制解调器运行的话,阅读你的调制解调器使用手册,你通讯
软件的线上使用手册以及 Serial HOWTO! 一旦你解决该问题,继续进
行前面所说的。
8. 关於串行口以及速度上的注意事项
如果你使用高速调制解调器(14,400 Baud or above)的话,你的串行口必须
有能力处理这样的一台调制解调器所能产生的贯通量,特别是在调制解调器压缩
资料的时候。你的串行口需要使用像是 16550(A) 这样的现代化 UART
(通用非同步接收转换器)。如果你使用的是旧机器(或者是旧的串口
界面卡),你的串行口相当可能只有 8250 UART,这在使用高速调制解调器
的时候将会引起值得考虑的问题。
使用这个指令
setserial -a /dev/ttySx
要求 Linux 报告你所拥有之 UART 的型态。如果你没有 16550A 型的
UART,投资一块新的串口界面卡吧(大约 $50 以下就可以取得)。
注意: 第一版的 16550 UART 晶片有个错误。这很快就被发现而且新版
的晶片已经出来了 - 此即 16550A UART。然而少数有错误的晶片已经
流入市场。你不太可能会遇上这些晶片但你仍应找寻显示 16550A 的回
应讯息,特别是在某些期间的串口界面卡上。
9. 配置你的调制解调器
为使用 PPP 你将得正确地配置你的调制解调器 - 要完成这件工作请阅读
你的调制解调器使用手册! 大部分的调制解调器都有 PPP 所需求的的出厂预设
选项。
。硬体流量控制 (RTS/CTS)(在许多使用海斯指令集的调制解调器上是 &K3
指令)
你应该要研究的其它设定(使用标准海斯指令)是:
。 E1 开启指令的本地回应( chat 运行所需)
。 Q0 回报执行结果代码( chat 运行所需)
。 S0=0 关闭自动回应(除非你想让你的调制解调器接听电话)
。 &C1 只在连线之後侦测载波
。 &S0 Data Set Ready (DSR) 永远设为开启
。 (depends) Data Terminal Ready
在你的电脑与调制解调器之间的调制解调器串口面界面如何运行也值得研究了解
。大部分现代的调制解调器都允许你以固定的速度使用串口界面,即使电话
线路界面切换到最高的速度它跟远端调制解调器都能够处理。
这称为 split speed operation 。如果你的调制解调器能支援这项功能,
把调制解调器的串口界面锁定在它的最高速度(通常是 115,200 baud )。
使用你的通讯软件(例如 minicom)找出关於你调制解调器的配置信息并且
设为 PPP 所需的设定。许多调制解调器会在 AT&V 指令的回应中回报它们
目前的设定状况,但是你应该查看一下你的调制解调器使用手册。如果你把
设定全都弄乱了,那麽你可以藉由发出 AT&F 指令回到稳定状态(通常
可以) - 回到出厂设定。(在我遇过的大部分现代调制解调器中,出厂的
设定包含所有使用 PPP 所需的设定 - 但是你应该做个检查)。
把你的调制解调器配置储存到不会消失的记忆体里(通常可以使用 AT&W 此
调制解调器指令达成 - 但是请检查你的调制解调器使用手册)。
正确的调制解调器配置已经存入调制解调器之後,重置调制解调器将会使其开始作用
。这样的安排大大简化了 PPP 连线所需的 chat 指令稿。
9.1. 串口流量控制注意事项
当资料在串口通讯线路上流动的时候,可能会发生资料到达的比电脑能
处理的还要快这种情况(电脑可能忙著做其它的事 - 记得,Linux 是
一个多使用者,多工的作业系统)。为了确保资料不会漏失(在缓冲区
中的资料不会超载而因此漏失掉),需要某些控制资料流量的方法。
有两种方法可以在串口线路上达成这个目的:
。使用硬体信号 (Clear To Send/Request to Send - CTS/RTS)
。使用软件信号 (control S and control Q).
虽然後者用在终端机(文字)连结上可能很好,但是在 PPP 上的资料
使用整个 8 bit 编码空间 - 而且在资料中的某个地方相当可能存在
会被转成 control S 以及 control Q 的位元组。所以,如果调制解调器
设成使用软件流量控制的话,那麽传输很容易被扰乱!
对於 PPP(使用 8 bit 资料编码)硬体流量控制是很重要的。
10. 使用 PPP 以及 root 权限
因为 PPP 需要设定网络设备,变更核心递送表格以及诸如此类的动作
,所以它需要以 root 的权限来做这些事。
如果 root 以外的使用者要能设立 PPP 连线,那麽 pppd 程序应该设
为以 root 的身分执行(setuid):
-r-sr-xr-x 1 root root 95225 Jul 11 00:27 /usr/sbin/pppd
如果 /usr/sbin/ppd 不是设定为这样,那麽以 root 的身分发出这个
指令:
chmod u+s /usr/sbin/pppd
另外一种办法,允许使用者使用 sudo 来起动 ppp 连结(比起前述的
方式这个方法在安全性上更占优势)。
根据你希望你的系统如何运行而定,特别是如果你希望你系统里的任何
使用者都能启始 PPP 连结,你应该把你的 ppp-on/off 指令稿设定为
全部的人都可以读取/执行。(如果你的 PC 只由你使用那麽这样大概
不错)。
无论如何,如果你不希望任何人都能起始 PPP 连线(例如,你的孩子
在你的 Linux PC 上有帐号而你不希望他们在没有你的监督下连上网际
网络),你将得建立一个 PPP 群组(编辑 /etc/group 档案)并且:
。使 ppp-on/off 指令稿由使用者 root 以及群组 PPP 所拥有
。使 ppp-of/off 指令稿能由群组 PPP 读取/执行
。关闭其它的存取权限
。把能够起动 PPP 的使用者加入 /etc/group 档案的 PPP 群组里
-rwxr-x--- 1 root PPP 587 Mar 14 1995 /usr/sbin/ppp-on
-rwxr-x--- 1 root PPP 631 Mar 14 1995 /usr/sbin/ppp-off
此外,你将得把 ppp-off 设为以 root 的身分执行(或者再一次允许
PPP 群组使用 sudo 存取)。没有这样做的话,使用者将不能终止他们
启始的 PPP 连结。
在我家里的 PC 上,我并没有把 pppd 设为以 root 的身分执行。为了
起动 ppp 连结我必须先切换成 root 。这提供我监督我儿子存取网际
网络的能力。
11. 设定 PPP 连线的档案
你必须以 root 接入来建立这些目录并且编辑这些设立 PPP 连线所需
的档案,即使你想让所有的使用者都能使用 PPP 。
在你的 /etc 目录里应该要有个目录:
drwxrwxr-x 2 root root 1024 Oct 9 11:01 ppp
如果它不存在的话 - 建立它。
如果这个目录已经存在,它应该会包含一个称为 options.tpl 的选项
档案样板。这个档案包括在下面。
因为它包含所有 PPP 选项的解释所以请你把它印出来(配合 pppd 的
线上使用手册来阅读将会是很有用的)。虽然你可以使用这个档案作为
/etc/ppp/options 档案的基础,但是建立你自己的,没有包含所有在
这个样板里的指令的选项档案可能会更好 - 它会短得多而且比较容易
阅读/维护。
如果你有多个串口线路/调制解调器(典型的例子是 PPP 服务器),那麽
建立一个一般化的 /etc/ppp/options 档案,其中包含每个你提供支援
拨入的串行口所使用的共同选项并且为每一个需要个别设定以建立 PPP
连线的串口线路设立个别的选项档案。
这些档案名为 option.ttyx1, option.ttyx2 依此类推(其中 x 是你
串行口的适当代字)。
然而,对於单一 PPP 连线,你可以直接使用 /etc/ppp/options 这个
档案。另外一种办法,你可以把所有的选项放进 pppd 指令作为参数。
使用 /etc/ppp/option.ttySx 档案的设定方式会比较容易加以维护。
如果你使用 PPP 来连线到好几个不同的节点去的话,那麽你就可以在
/etc/ppp/options.site 里面为每个节点建立选项档案然後在你连线时
指定选项档案作为 PPP 指令的参数。
11.1. 替代的 options.tpl
某些个 PPP 的发行套件似乎漏失了 options.tpl 这个档案,所以在
这里有个完整的档案。我建议你不要直接编辑这个档案来建立你自己的
/etc/ppp/options。把它拷贝到一个新的档案然後编辑该档案比较好。
如果你弄乱了你编辑的档案,你可以回头从原始档案再度开始。
______________________________________________________________________
# /etc/ppp/options -*- sh -*- general options for pppd
# created 13-Jul-1995 jmk
# autodate: 01-Aug-1995
# autotime: 19:45
# Use the executable or shell command specified to set up the serial
# line. This script would typically use the "chat" program to dial the
# 调制解调器 and start the remote ppp session.
#connect "echo You need to install a connect command."
# Run the executable or shell command specified after pppd has
# terminated the link. This script could, for example, issue commands
# to the 调制解调器 to cause it to hang up if hardware 调制解调器 control signals
# were not available.
#disconnect "chat -- /d+++/d/c OK ath0 OK"
# async character map -- 32-bit hex; each bit is a character
# that needs to be escaped for pppd to receive it. 0x00000001
# represents '/x01', and 0x80000000 represents '/x1f'.
#asyncmap 0
# Require the peer to authenticate itself before allowing network
# packets to be sent or received.
#auth
# Use hardware flow control (i.e. RTS/CTS) to control the flow of data
# on the serial port.
#crtscts
# Use software flow control (i.e. XON/XOFF) to control the flow of data
# on the serial port.
#xonxoff
# Add a default route to the system routing tables, using the peer as
# the gateway, when IPCP negotiation is successfully completed. This
# entry is removed when the PPP connection is broken.
#defaultroute
# Specifies that certain characters should be escaped on transmission
# (regardless of whether the peer requests them to be escaped with its
# async control character map). The characters to be escaped are
# specified as a list of hex numbers separated by commas. Note that
# almost any character can be specified for the escape option, unlike
# the asyncmap option which only allows control characters to be
# specified. The characters which may not be escaped are those with hex
# values 0x20 - 0x3f or 0x5e.
#escape 11,13,ff
# Don't use the 调制解调器 control lines.
#local
# Specifies that pppd should use a UUCP-style lock on the serial device
# to ensure exclusive access to the device.
#lock
# Use the 调制解调器 control lines. On Ultrix, this option implies hardware
# flow control, as for the crtscts option. (This option is not fully
# implemented.)
#调制解调器
# Set the MRU [Maximum Receive Unit] value to for negotiation. pppd
# will ask the peer to send packets of no more than bytes. The
# minimum MRU value is 128. The default MRU value is 1500. A value of
# 296 is recommended for slow links (40 bytes for TCP/IP header + 256
# bytes of data).
#mru 542
# Set the interface netmask to , a 32 bit netmask in "decimal dot"
# notation (e.g. 255.255.255.0).
#netmask 255.255.255.0
# Disables the default behaviour when no local IP address is specified,
# which is to determine (if possible) the local IP address from the
# hostname. With this option, the peer will have to supply the local IP
# address during IPCP negotiation (unless it specified explicitly on the
# command line or in an options file).
#noipdefault
# Enables the "passive" option in the LCP. With this option, pppd will
# attempt to initiate a connection; if no reply is received from the
# peer, pppd will then just wait passively for a valid LCP packet from
# the peer (instead of exiting, as it does without this option).
#passive
# With this option, pppd will not transmit LCP packets to initiate a
# connection until a valid LCP packet is received from the peer (as for
# the "passive" option with old versions of pppd).
#silent
# Don't request or allow negotiation of any options for LCP and IPCP
# (use default values).
#-all
# Disable Address/Control compression negotiation (use default, i.e.
# address/control field disabled).
#-ac
# Disable asyncmap negotiation (use the default asyncmap, i.e. escape
# all control characters).
#-am
# Don't fork to become a background process (otherwise pppd will do so
# if a serial device is specified).
#-detach
# Disable IP address negotiation (with this option, the remote IP
# address must be specified with an option on the command line or in an
# options file).
#-ip
# Disable magic number negotiation. With this option, pppd cannot
# detect a looped-back line.
#-mn
# Disable MRU [Maximum Receive Unit] negotiation (use default, i.e.
# 1500).
#-mru
# Disable protocol field compression negotiation (use default, i.e.
# protocol field compression disabled).
#-pc
# Require the peer to authenticate itself using PAP.
#+pap
# Don't agree to authenticate using PAP.
#-pap
# Require the peer to authenticate itself using CHAP [Cryptographic
# Handshake Authentication Protocol] authentication.
#+chap
# Don't agree to authenticate using CHAP.
#-chap
# Disable negotiation of Van Jacobson style IP header compression (use
# default, i.e. no compression).
#-vj
# Increase debugging level (same as -d). If this option is given, pppd
# will log the contents of all control packets sent or received in a
# readable form. The packets are logged through syslog with facility
# daemon and level debug. This information can be directed to a file by
# setting up /etc/syslog.conf appropriately (see syslog.conf(5)). (If
# pppd is compiled with extra debugging enabled, it will log messages
# using facility local2 instead of daemon).
#debug
# Append the domain name to the local host name for authentication
# purposes. For example, if gethostname() returns the name porsche,
# but the fully qualified domain name is porsche.Quotron.COM, you would
# use the domain option to set the domain name to Quotron.COM.
#domain
# Enable debugging code in the kernel-level PPP driver. The argument n
# is a number which is the sum of the following values: 1 to enable
# general debug messages, 2 to request that the contents of received
# packets be printed, and 4 to request that the contents of transmitted
# packets be printed.
#kdebug n
# Set the MTU [Maximum Transmit Unit] value to . Unless the peer
# requests a smaller value via MRU negotiation, pppd will request that
# the kernel networking code send data packets of no more than n bytes
# through the PPP network interface.
#mtu
# Set the name of the local system for authentication purposes to .
#name
# Set the user name to use for authenticating this machine with the peer
# using PAP to .
#user
# Enforce the use of the hostname as the name of the local system for
# authentication purposes (overrides the name option).
#usehostname
# Set the assumed name of the remote system for authentication purposes
# to .
#remotename
# Add an entry to this system's ARP [Address Resolution Protocol]
# table with the IP address of the peer and the Ethernet address of this
# system.
#proxyarp
# Use the system password database for authenticating the peer using
# PAP.
#login
# If this option is given, pppd will send an LCP echo-request frame to
# the peer every n seconds. Under Linux, the echo-request is sent when
# no packets have been received from the peer for n seconds. Normally
# the peer should respond to the echo-request by sending an echo-reply.
# This option can be used with the lcp-echo-failure option to detect
# that the peer is no longer connected.
#lcp-echo-interval
# If this option is given, pppd will presume the peer to be dead if n
# LCP echo-requests are sent without receiving a valid LCP echo-reply.
# If this happens, pppd will terminate the connection. Use of this
# option requires a non-zero value for the lcp-echo-interval parameter.
# This option can be used to enable pppd to terminate after the physical
# connection has been broken (e.g., the 调制解调器 has hung up) in
# situations where no hardware 调制解调器 control lines are available.
#lcp-echo-failure
# Set the LCP restart interval (retransmission timeout) to seconds
# (default 3).
#lcp-restart
# Set the maximum number of LCP terminate-request transmissions to
# (default 3).
#lcp-max-terminate
# Set the maximum number of LCP configure-request transmissions to
# (default 10).
#lcp-max-configure
# Set the maximum number of LCP configure-NAKs returned before starting
# to send configure-Rejects instead to (default 10).
#lcp-max-failure
# Set the IPCP restart interval (retransmission timeout) to
# seconds (default 3).
#ipcp-restart
# Set the maximum number of IPCP terminate-request transmissions to
# (default 3).
#ipcp-max-terminate
# Set the maximum number of IPCP configure-request transmissions to
# (default 10).
#ipcp-max-configure
# Set the maximum number of IPCP configure-NAKs returned before starting
# to send configure-Rejects instead to (default 10).
#ipcp-max-failure
# Set the PAP restart interval (retransmission timeout) to seconds
# (default 3).
#pap-restart
# Set the maximum number of PAP authenticate-request transmissions to
# (default 10).
#pap-max-authreq
# Set the CHAP restart interval (retransmission timeout for
# challenges) to seconds (default 3).
#chap-restart
# Set the maximum number of CHAP challenge transmissions to
# (default 10).
#chap-max-challenge
# If this option is given, pppd will rechallenge the peer every
# seconds.
#chap-interval
# With this option, pppd will accept the peer's idea of our local IP
# address, even if the local IP address was specified in an option.
#ipcp-accept-local
# With this option, pppd will accept the peer's idea of its (remote) IP
# address, even if the remote IP address was specified in an option.
#ipcp-accept-remote
______________________________________________________________________
11.2. 我应该使用什麽选项?
嗯,完全视情况而定(唉)。
这里所提供的是涵盖最普通情况的两个基本版本。
无论如何,如果它无法运行的话,阅读样板档(/etc/ppp/options.tpl)
以及 pppd 的线上使用手册并且告诉你所连线之服务器的系统管理/使
用者支援人员。
11.2.1. /etc/ppp/options (NO PAP/CHAP)
下面这个设定应该能够在不需要 PAP/CHAP 验认的连线上运行。
______________________________________________________________________
# /etc/ppp/options (NO PAP/CHAP)
#
# If you are using a STATIC IP number, edit the 0.0.0.0 part of the
# following line to your static IP number.
0.0.0.0:
#
# use the 调制解调器 control lines
调制解调器
# use uucp style locks to ensure exclusive access to the serial device
lock
# use hardware flow control
crtscts
# create a default route for this connection in the routing table
defaultroute
# do NOT set up any "escaped" control sequences
asyncmap 0
# use a maximum transmission packet size of 552 bytes
mtu 552
# use a maximum receive packet size of 552 bytes
mru 552
#
#-------END OF SAMPLE /etc/ppp/options (no PAP/CHAP)
______________________________________________________________________
11.2.2. /etc/ppp/options (using PAP/CHAP)
如果你连线的服务器需要 PAP 或是 CHAP 验认,在上述的选项档案中
加入下列几行
______________________________________________________________________
#
# force pppd to use your ISP username as your 'host name' during the
# authentication process
name # you need to edit this line
#
# If you need to force PAP or CHAP authentication on the server,
# uncomment the appropriate one of the following lines.
#+chap
#+pap
#
# If you are using ENCRYPTED secrets in the /etc/ppp/pap-secrets
# file, then uncomment the following line.
#+papcrypt
______________________________________________________________________
12. 设立你的 /etc/resolv.conf 档案
虽然我们人类喜欢给事物取个名称,电脑喜欢数字。在 TCP/IP 网络上
(这也就是网际网络),我们藉由特定的名称呼叫某台机器,而且每台
机器都存在於一个特定的标记;领域标记里面。举例而言,我的 Linux
工作站称为 archenland 而它是存在於 hedland.edu.au 这个领域里。
所以它在人们心目中的位址就是 archenland.hedland.edu.au 。为了
使网际网络上的其它机器找的到这台机器,事实上它是藉由其 IP 号码
来认知的。
把机器(以及领域)的名称转译(解析)成为在网际网络上所实际使用
的 IP 号码是提供领域名称服务之机器的工作。
当你创造出 PPP 连线时,你需要告诉你的 Linux 机器它可以在哪里
找到主机名称对照到 IP 号码(位址解析)的信息,如此你就可以使用
机器的名称而你的电脑可以把这些名称转译成它运行所需的 IP 号码。
一个方法是输入所有你想联络的主机到 /etc/hosts 档案里(如果你是
连上网际网络的话这真的是完全不可能的事);另一个方法是使用相对
於机器名称的 IP 号码(要记得全部的 IP 位址是不可能的除非在最小
的局域网上)。
最好的方法是设定你的 Linux 使它知道该到哪取得这项名称到号码的
信息 - 自动地。这项服务是由领域名称服务器系统所提供。需要做的
全部工作是把 IP 号码输入到你的 /etc/resov.conf 档案里。
你的 PPP 服务器系统管理/使用者支援人员应该要提供给你两个 DNS
的 IP 号码(只需要一个 - 但是两个在出问题时可以多些帮助)。
你的 /etc/resolv.conf 看起来应该会像这样:
______________________________________________________________________
domain your.isp.domain.name
nameserver 10.25.0.1
nameserver 10.25.1.2
______________________________________________________________________
编辑这个档案(如果有必要就建立它)以呈现你的 ISP 提供的信息。
它的拥有者以及权限应该像下面这样:
-rw-r--r-- 1 root root 73 Feb 19 01:46 /etc/resolv.conf
如果你因为本来就在局域网上所以已经设立 /etc/resolv.conf 档案
的话,只要简单的把 PPP 连线的 DNS 服务器 IP 号码加到你已有的
档案里即可。
13. PAP/CHAP 暗码档
如果你有使用 pap 或是 chap 验认,那麽你也需要建立这些暗码档。
它们是:
______________________________________________________________________
/etc/ppp/pap-secrets
/etc/pp/chap-secrets
______________________________________________________________________
关於 PAP 以及 CHAP 第一点要注意的是它们是设计来验认电脑系统而
不是使用者的。
我听见你在问”哼? 那有什麽差别? ”
现在呢,一旦你的电脑建立到服务器的 PPP 连线之後,在你系统上的
任何使用者都能使用该连线 - 不是只有你而已。这就是为什么你可以
使用 PPP 设立接合两个局域网的广域网络连结。
这就是说,你的 ISP 可能给你一个使用者名称以及密码让你可以连线
到他们的系统并且由此连上网际网络。你的 ISP 对你电脑的名称一点
都不感兴趣,所以你大概得要把你在 ISP 里的使用者名称给你的电脑
使用。
这是使用 pppd 的 name 使用者名称选项完成的。所以,如果你使用你
ISP 所给的使用者名称,那麽加入下面这行
______________________________________________________________________
name your_username_at_your_ISP
______________________________________________________________________
到你的 /etc/ppp/options 档案里。
从技术上来说,PAP 其实应该要使用 user 使用者名称这个选项,但是
如果使用到 PAP 的话那麽 pppd 聪明的足以把 name 解译为 user 。
使用 name 这个选项的好处是这对於 CHAP 也是有效的。
因为 PAP/CHAP 是用来验认电脑的,在技术上你也需要指定远端电脑的
名称。然而,大部分的人只接一家 ISP 所以你可以在暗码档里的远端
主机名称使用通用字元(*) 。
许多 ISPs 有多个调制解调器拨接中心连接到不同的终端机服务器 - 每个
终端机服务器都有不同的名称,但都从单一的(自动转线)号码拨接。
在某些情形下可能因此而很不容易预先知道远端电脑的名称。
13.1. PAP 暗码档
/etc/ppp/pap-secrets 这个档案看起来像
______________________________________________________________________
# Secrets for authentication using PAP
# client server secret acceptable local IP addresses
______________________________________________________________________
这四个栏位是以空白分界。
假定你的 ISP 给你的使用者名称是 fred 而密码是 flintstone 的话
那麽你应该在 /etc/ppp/option.ttySx 里设定 name fred 这个选项
并且把你的 /etc/ppp/pap-secrets 档案设成下面这样
______________________________________________________________________
# Secrets for authentication using PAP
# client server secret acceptable local IP addresses
fred * flintstone
______________________________________________________________________
这是说对於 fred 这个本地机器名称(我们已经告诉过 pppd 使用这个
名称,即使这不是我们本地机器的名称也一样)以及任何的服务器,都
使用 flintstone 这个密码(暗码)。
注意到我们并不需要指定本地的 IP 位址,除非有要求要我们使用一个
特定的,固定的 IP 位址。
如果你使用 PAP 连接到好几台机器去,那麽不是在每台机器上安排不
同的使用者名称就是找出你将要连上的远端机器名称。这样将能允许你
增加几行设定到你的 pap-secrets 档案里 - 提供你正确设定你所要
连接的各台机器所需的 name 选项。
13.2. CHAP 暗码档
目前的 pppd 版本要求你要有互相验认的方法 - 这是说你必须能够让
从你的机器到远端服务器以及从远端服务器到你的机器这两种验认都能
进行。
所以,如果你的机器是 fred 而远端是 barney 的话,则在它们个别的
/etc/ppp/options.ttySx 里你的设为 name fred remotename barney
而远端机器应设为 name barney remotename fred 。
fred 这台机器的 /etc/chap-secrets 档案看起来会像
______________________________________________________________________
# Secrets for authentication using CHAP
# client server secret acceptable local IP addresses
fred barney flintstone
______________________________________________________________________
而 barney 的是
______________________________________________________________________
# Secrets for authentication using CHAP
# client server secret acceptable local IP addresses
barney fred flintstone
______________________________________________________________________
14. 手动设立 PPP 连线
现在你已经建立你的 /etc/ppp/options 以及 /etc/resolv.conf 档案
(以及,如果有需要,还有 /etc/ppp/pap|chap-secrets 档案),你
可以藉由手动设立 PPP 连线来测试这些设定。(一旦我们使手动连线
能运行,我们将会自动化该过程)。
要做这件事,你的通讯软件必须能在不重置你的调制解调器的情况下结束。
Minicom 可以做到 - ALT Q (或者在比较旧的 minicom 版本是使用
CTRL A Q)
确定你以 root 接入。
起动你的通讯软件(像是 minicom),拨接到 PPP 服务器并且像一般
一样的接入。如果你需要发出某个指令来起动服务端上的 PPP ,那麽
就做吧。你将会看见你以前看过的垃圾。
如果你使用 pap/chap 的话,那麽只是连线到远端系统应该就会起动在
远端上的 PPP 而且你将在没有接入的情况下就见到这些垃圾。(虽然
这在某些服务器上不会发生)。
现在,在不要重置调制解调器的情况下结束通讯软件(ALT Q or CTL A Q in
minicom)并且在 Linux 的提示符号下(以 root 的身分)键入
pppd -d -detach /dev/cuaX &
如果你使用 pap/chap 验认,你的 pap/chap 档案必须已经设定好。
-d 这个选项开启侦错功能 - ppp 连线起动时的”交谈”将会记录到
你的系统记录里去 - 如果你遇上麻烦这会很有用的。
自然,你应该使用 cua0 或是 cua1 等等 - 你的调制解调器真正连接的端口
,而不是 cuaX!
你调制解调器的灯现在应该要闪烁,因为要建立 PPP 连线。PPP 连线的建
将会花点时间。
此时你可以观察 PPP 界面,藉由发出这个指令
ifconfig
在你所拥有的任何以太网络以及回授设备之外,你应该会看见像这样的
信息:
______________________________________________________________________
ppp0 Link encap:Point-Point Protocol
inet addr:10.144.153.104 P-t-P:10.144.153.51 Mask:255.255.255.0
UP POINTOPOINT RUNNING MTU:552 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0
TX packets:0 errors:0 dropped:0 overruns:0
______________________________________________________________________
其中
。inet addr:10.144.153.10 是该连结中你这端的 IP 号码。
。P-t-P:10.144.153.5 是服务端的 IP 号码。
(自然, ifconfig 不会报告这些 IP 号码,除了你的服务器所使用的
以外。)
注意: ifconfig 也告诉你该连结已经起动并且正在执行!
如果你得到的是像这样的信息:
______________________________________________________________________
ppp0 Link encap:Point-Point Protocol
inet addr:0.0.0.0 P-t-P:0.0.0.0 Mask:0.0.0.0
POINTOPOINT MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0
TX packets:0 errors:0 dropped:0 overruns:0
______________________________________________________________________
你的 PPP 连线并没有建立... 参阅稍後有关错误排除的章节!
现在藉由 ifconfig 之输出所回报的 IP 号码来 'ping' 一下该服务器
以测试这个连结,像这样 ping 10.144.153.51
你应该会接收到像这样的输出
PING 10.144.153.51 (10.144.153.51): 56 data bytes
64 bytes from 10.144.153.51: icmp_seq=0 ttl=255 time=328.3 ms
64 bytes from 10.144.153.51: icmp_seq=1 ttl=255 time=190.5 ms
64 bytes from 10.144.153.51: icmp_seq=2 ttl=255 time=187.5 ms
64 bytes from 10.144.153.51: icmp_seq=3 ttl=255 time=170.7 ms
这将会一直列印下去 - 按下 CTRL C 终止它,那时你将会接收到更多
讯息:
--- 10.144.153.51 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 170.7/219.2/328.3 ms
到目前都很好。
现在试著藉由名称 ping 某台主机(不是 PPP 服务器它自己的名称,
而是在另一个地方的一台你知道可能已经起动而且正在运行的主机)。
例如
ping sunsite.unc.edu
这时会有一点停顿,因为 Linux 从你在 /etc/resolv.conf 里指定的
DNS 取得你要 'ping' 的完整主机名称所对应的 IP 位址 - 所以不要
担心(但是你将会看见你的调制解调器灯号闪烁)。在短暂的时间後你将会
接收到像这样的输出
PING sunsite.unc.edu (152.2.254.81): 56 data bytes
64 bytes from 152.2.254.81: icmp_seq=0 ttl=254 time=190.1 ms
64 bytes from 152.2.254.81: icmp_seq=1 ttl=254 time=180.6 ms
64 bytes from 152.2.254.81: icmp_seq=2 ttl=254 time=169.8 ms
64 bytes from 152.2.254.81: icmp_seq=3 ttl=254 time=170.6 ms
64 bytes from 152.2.254.81: icmp_seq=4 ttl=254 time=170.6 ms
再一次,藉由按下 CTRL C 终止输出并取得统计资料...
--- sunsite.unc.edu ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 169.8/176.3/190.1 ms
如果你没有收到任何回应,查看这份文件中有关错误排除的章节。
如果一切正常,藉由键入这个指令终止该连线
ppp-off
一段短暂的停顿之後,调制解调器应该会自己挂断电话。
如果这个指令无法动作的话,那麽不是关掉你的调制解调器就是起动你的通
讯软件并且以 +++ 中断调制解调器然後当你接收到调制解调器的 OK 提示时以
ATH0 挂断电话。
你可能也得清除 pppd 所建立的锁定档
______________________________________________________________________
rm -f /var/lock/LCK..cuaX
______________________________________________________________________
15. 自动化你的连线 - 建立 chat 指令稿
一份 chat 指令稿可以自动化接入以及起动 PPP 的程序,因此所有你得
做的(以 root 或是 ppp 群组组员的身分)只是发出单一个指令来起动
你的连线。
15.1. 以使用者名称/密码验认的 chat 指令稿
如果你的 ISP 并不要求使用 PAP/CHAP 的话,这些就是为你准备的!
一份 chat 指令稿基本上包含期待以及送出的配对。例如,一旦调制解调器
拨号并连上远端调制解调器,我们期待接收到接入提示(可能会有许多前导
文字,像是在服务端机器上的 /etc/issue 档案)。一旦我们接收到这
个讯息,我们就送出我们的使用者名称。下一步我们期待密码的提示并
送出我们的密码而且这样继续下去。
规则真的相当简单。
如果 ppp 套件有正确地安装,你应该拥有两个□例档案。 ppp 2.1.2
中它们是在 /usr/sbin 而在 ppp 2.2 中它们在 /etc/ppp/scripts
里面。它们在 PPP-2.1.2 中称为
ppp-on
ppp-off
而在 PPP-2.2 中是
ppp-off
ppp-on
ppp-on-dialer
现在,如果你使用 ppp 2.1.2 的话,我强烈鼓励你删除这些□例档案
。它们里面有些潜在的问题 - 不要告诉我它们运行良好 - 我也使用
过它们一段时间(而且在这份使用说明的第一版中还推荐过它们! )
为了 ppp 2.1.2 使用者的利益,这里有比较好的样板档案,这些是从
ppp 2.2 发行套件里拿来的。
15.2. ppp-on
这是实际起动连线的一对指令稿中的第一个。
______________________________________________________________________
#!/bin/sh
#
# Script to initiate a ppp connection. This is the first part of the
# pair of scripts. This is not a secure pair of scripts as the codes
# are visible with the 'ps' command. However, it is simple.
#
# These are the parameters. Change as needed.
TELEPHONE=555-1212 # The telephone number for the connection
ACCOUNT=george # The account name for logon (as in 'George Burns')
PASSWORD=gracie # The password for this account (and 'Gracie Allen')
LOCAL_IP=0.0.0.0 # Local IP address if known. Dynamic = 0.0.0.0
REMOTE_IP=0.0.0.0 # Remote IP address if desired. Normally 0.0.0.0
NETMASK=255.255.255.0 # The proper netmask if needed
#
# Export them so that they will be available to 'ppp-on-dialer'
export TELEPHONE ACCOUNT PASSWORD
#
# This is the location of the script which dials the phone and logs
# in. Please use the absolute file name as the $PATH variable is not
# used on the connect option. (To do so on a 'root' account would be
# a security hole so don't ask.)
#
DIALER_SCRIPT=/etc/ppp/ppp-on-dialer
#
# Initiate the connection
#
#
exec /usr/sbin/pppd debug /dev/ttySx 38400 /
$LOCAL_IP:$REMOTE_IP /
connect $DIALER_SCRIPT
______________________________________________________________________
15.3. 编辑这里所提供的 ppp-on 指令稿
你将得编辑这个指令稿以反映你 ISP 的使用者名称,你 ISP 的密码
,你 ISP 的电话号码。
而且,如果你在 /etc/ppp/options 档案里设定了 IP 号码,删除这行
______________________________________________________________________
$LOCAL_IP:$REMOTE_IP /
______________________________________________________________________
如同你所见到的,这是分成两部份的指令稿。另一个是 DIALER_SCRIPT
看起来像:
______________________________________________________________________
#!/bin/sh
#
# This is part 2 of the ppp-on script. It will perform the connection
# protocol for the desired connection.
#
exec chat -v /
TIMEOUT 3 /
ABORT '/nBUSY/r' /
ABORT '/nNO ANSWER/r' /
ABORT '/nRINGING/r/n/r/nRINGING/r' /
'' /rAT /
'OK-+++/c-OK' ATH0 /
TIMEOUT 30 /
OK ATDT$TELEPHONE /
CONNECT '' /
ogin:--ogin: $ACCOUNT /
assword: $PASSWORD
______________________________________________________________________
注意: 一份 chat 指令稿一般全都放在同一行里。倒斜线是用来让一行
可以跨过数行的实体行(便於人们阅读)而并不是指令稿本身组成的一
部份。
这些档案依然可以放在 /etc/ppp/scripts 里。然而这并不在 root 的
搜寻路径里所以你将得记得它们在哪里。另一个办法是,把它们拷贝到
/usr/sbin 里去。
再一次,我建议你不要编辑原始档案本身 - 把它们拷贝到 /usr/sbin
并且直接在该目录下编辑这些拷贝版 - 或者是把原始的指令稿拷贝成
/etc/ppp/scripts/some-name.bak 然後再编辑原始档案。这样如果有
必要的话你仍然拥有纯粹的原始档案可以回头重来。
档案的权限以及拥有者应该是:
-rwxr-xr-- 1 root PPP 502 Sep 3 20:04 ppp-off
-rwxr-xr-- 1 root PPP 612 Sep 3 20:04 ppp-on
-rwxr-xr-- 1 root PPP 612 Sep 3 20:04 ppp-on-dialer
15.4. 一份 chat 指令稿其中的含意...
对於 chat 指令需要些讨论。一份 chat 指令稿是一系列”期待字串”
”送出字串”的配对。特别是,注意到我们总是在送出某些讯息之前
先期待某些讯息出现。
如果我们在没有先接收到任何讯息的情况下要送出某些讯息的话,我们
必须使用空的期待字串(藉由 "" 指明)而在没有送出任何讯息的情况
下要期待某些讯息作法也类似! 而且,如果字串包含好几个字,(例如
NO CARRIER),你必须把字串用引号括住,这样 chat 会把字串当作是
单一个项目。
在我们样板里的 chat 指令行是:
。exec chat -v
起动 chat , -v 告诉 chat 将其所有的输出/入拷贝到系统记录里
(通常是 /var/log/messages)
一旦你觉得 chat 指令稿的运行稳定而可靠,编辑这一行把 -v 移除
以便减少你系统记录的混杂。
。TIMEOUT 3
这设定接收所期待的输入逾时时限为三秒。如果你使用真的是很慢的
调制解调器那麽你可能得要增加这个设定到 5 秒或是 10 秒!
。ABORT '/nBUSY/r'
如果接收到 BUSY 字串,中止执行。
。ABORT '/nNO ANSWER/r'
如果接收到 NO ANSWER 字串,中止执行。
。ABORT '/nRINGING/r/n/r/nRINGING/r'
如果接收到(重复的)RINGRING 字串,中止执行。这是因为某人正
打电话给你。
。'' /rAT
不期待调制解调器传送任何讯息并且送出 AT 字串。
。'OK-+++/c-OK' ATH0
这一个比较复杂一点,因为它使用了某些 chat 的错误回复功能。它
所代表的是...
期待 OK ,如果没有收到(因为调制解调器并不在指令模式下)那麽送出
+++ (使调制解调器返回指令模式的标准海斯相容调制解调器字串)并且期待
OK;接著送出 ATH0 (调制解调器挂断字串)。
这让你的指令稿可以应付你的调制解调器黏在线上无法断线的情况。
。TIMEOUT 30
设定指令稿其馀部份执行的逾时时限为 30 秒。如果你曾经因为逾时
而经验过 chat 指令稿被终止的问题,把它增加为 45 秒或更久。
。OK ATDT$TELEPHONE
期待 OK (调制解调器对 ATH0 指令的回应)并且拨接到我们想要呼叫的
号码。
。CONNECT ''
期待 CONNECT (当远端调制解调器有回应时我们的调制解调器送出的)并且
不送出任回覆讯息。
。ogin:--ogin: $ACCOUNT
再一次,这里面我们有一些错误回复设定。期待接入提示(...ogin:)
但是如果我们在逾时前没有接收到,送出一个返回字元(return)然後
再次找寻接入提示。当接收到提示时,送出使用者名称(存放在使用
者界面的 $ACCOUNT 环境变数里)。
。assword: $PASSWORD
期待密码提示并且送出密码(再一次,存放在使用者界面的一个环境
变数里)。
这个 chat 指令稿有合理的错误回复功能。 Chat 还有许多重要的特色
,比这里所展示还要更多。更详细的信息请参阅 chat 的线上使用手册
(man 8 chat)。
15.5. 使用於 PAP/CHAP 验认连线的 chat 指令稿
如果你的 ISP 使用 PAP/CHAP 验认,那麽你的 chat 指令稿会简单得
多。你的 chat 指令稿所要做的全部只是拨接电话,等待接上线,然後
就让 pppd 去处理接入事宜。
______________________________________________________________________
#!/bin/sh
#
# This is part 2 of the ppp-on script. It will perform the connection
# protocol for the desired connection.
#
exec chat -v /
TIMEOUT 3 /
ABORT '/nBUSY/r' /
ABORT '/nNO ANSWER/r' /
ABORT '/nRINGING/r/n/r/nRINGING/r' /
'' /rAT /
'OK-+++/c-OK' ATH0 /
TIMEOUT 30 /
OK ATDT$TELEPHONE /
CONNECT '' /
______________________________________________________________________
16. 编辑你的 ppp-on 档案
把 ppp-on 以及 ppp-on-dialler 拷贝到新的名称去(因为我拥有数个
PPP 帐号,为了方便以及帮助记忆所以我倾向於使用 ppp-sitename 与
ppp-dialer-sitename )。这样,如果你弄乱了你所建立的拷贝你也还
可以再回到原始的指令稿。
现在,我们将要编辑这个档案,使用我们从 PPP 服务端的系统管理者
所得到的信息。
ppp-on 是个 Bourne shell 指令稿。它先设立一些环境变数以备稍後
使用。
16.1. PPP 服务器的电话号码(TELEPHONE)
这是拨接到 PPP 服务器的电话号码(不要忘记透过 PABX 需要的任何
前导号码)。如果有必要的话,你也可以插入 ',' 这个标准拨号暂停
指令。
编辑 TELEPHONE= 这一行把它改为 PPP 服务器的电话号码。
16.2. 使用者名称(ACCOUNT)
这是你用来接入 PPP 服务器的使用者名称。
编辑 ACCOUNT= 这一行把它改为你 PPP 服务器上的使用者名称(不要
忘记, Unix 以及大部分的 PPP 服务器都区分大小写 - 所以大小写
要正确! )。
16.3. 密码(PASSWORD)
这是你用来接入 PPP 服务器的密码。
编辑 PASSWORD 这一行把它改为你的密码,就如你在 password: 提示
下所键入的(再一次,记得密码可以是有大写跟小写的! )
现在,这里会有点问题! 因为这个档案的权限是预设的,任何人都可以
读取 ppp-on (或是你使用的任何名称)档案 - 并且可以因此而取得
你的密码! 所以,当你完成这个档案的编辑後要把它的权限变更为 750
(chmod 750 /usr/sbin/ppp-on)如此只有 root 使用者以及 PPP 群组
的组员可以读取这个档案!
记得,即使你是你系统的唯一使用者,你是在设立它到网际网络(或是
其它网络)的连结。Linux 是个多使用者的作业系统而且只要你连线,
在网际网络上的任何人都可能尝试进如你的机器 - 如果他们因为这个
漏洞而取得你的使用者名称及密码,他们就可以接入你的帐号 - 如果
情况不严重至少也会浪费你的钱或者更糟糕的是如果他们使用你的帐号
做些恶劣的事!
16.4. 你的 IP 位址(LOCAL_IP)
如果你连线的服务器使用动态 IP 号码,这个设定可以保持为 0.0.0.0
(修改过的指令稿不会使用这个,因为它藉由 /etc/ppp/options 档案
来设定)。
如果你的 PPP 服务器管理者已经给你一个属於你自己的 IP 号码,你
使用的就是静态 IP 号码。所以要修改这一行把它设为给你的 IP 号码
(再一次,修改过的指令稿不会使用这个而你得在 /etc/ppp/options
里加以设定)。
16.5. 远端 IP 号码(REMOTE_IP)
这是你所连线的远端机器之 IP 号码。在所有可能的情况下,你都不会
知道这是什麽,任何情况都该保持这个设定为 0.0.0.0 (而且在任何
情况下都不会使用到这个设定)。
16.6. 网络遮罩(NETMASK)
再一次,这是在 /etc/ppp/options 档案里设定的,但是把它变更为你
的 ISP 给你的网络遮罩不会有什麽坏处。(如果他们给你的话)。
16.7. 编辑 DIALER_SCRIPT 这一行
确定它指到你确实要使用的拨接指令稿所在的完整路径与名称。所以,
如果你把它搬移到 /usr/sbin 或是改变了它的名称,确定你有正确地
编辑这一行。 16.8. 设定串行口
虽然你可以在系统的启动时期使用 /etc/rc.serial 设定你的串行口,
我发现在 ppp-on 指令稿里明确地设定串行口是个好主意。这让我可以
在不连线时使用调制解调器做其它用途(这可能会重置串行口的设定)。
紧接在真正起动 pppd 那一行之前,加入这一行
______________________________________________________________________
/bin/setserial /dev/cuaX spd_vhi
______________________________________________________________________
这会设定串行口,在要求 38,400 baud 的速度时把 baud rate 确实
设为 115,200 baud 。这对 28.8k(或更快)baud 的调制解调器很好。然
而,许多 14,400 baud 的调制解调器在这个速度下不能确实地传回它们的
串行口资料。
核对你的调制解调器使用手册,如果你调制解调器的最高串口速度是 38,400 则
使用这一行
______________________________________________________________________
/bin/setserial /dev/cuaX spd_normal
______________________________________________________________________
16.9. 编辑 pppd 起动行
因为你已经在 /etc/ppp/options 里设定了所有必须的选项,所有你得
放在 pppd 这一行的是
______________________________________________________________________
exec /usr/sbin/pppd /dev/ttyS0 38400 connect $DIALER_SCRIPT
______________________________________________________________________
16.9.1. 起动服务端的 PPP
虽然这个 ppp-on-dialer 指令稿对於一旦你接入之後就自动起动服务
端 pppd 的服务器而言很好用,某些服务器会要求你明确地起动服务端
的 PPP 。
如果你需要发出一个命令来起动在服务器上的 PPP ,那麽你需要编辑
ppp-on-dialer 指令稿。
在指令稿尾端(密码行後面)加入一对额外的期待送出配对 - 这一对
找寻你的接入提示(当心在 Bourne shell 里有特殊意义的字元 - 如
$ 以及 / 或是 (各种左右括号)并且发出起动 ppp 的指令。
以我为例,我的 PPP 服务器使用标准的 Linux Bash 提示
______________________________________________________________________
[hartr@kepler hartr]$
______________________________________________________________________
并且要求我键入
______________________________________________________________________
ppp
______________________________________________________________________
来起动服务端的 PPP
在这里允许一点错误回复是个好主意,所以在我的例子中我使用
______________________________________________________________________
hartr--hartr ppp
______________________________________________________________________
这其中也有些错误回复 - 如果我们没有在逾时时限前接收到该提示,
那麽 chat 会送初一个返回字元并再次找寻提示。
注意: 不要忘记在前一行的尾端加上一个 / 这样 chat 仍然会把整个
chat 指令稿当作一行。
不幸的,某些服务器产生的提示非常不一样! 你可能得要使用 minicom
接入数次以便了解发生了些什麽并且拣取可靠的”期待”字串。
16.10. 编辑 pppd 这一行
因为你已经设定 /etc/ppp/options 档案,你不需要指定除了 $DEVICE
(这告诉 ppp 连接哪个串行口)以外的任何 ppp 选项。
然而,所有 PPP 选项都可以加以指定,唯一的要求是 pppd 指令及其
选项必须在一行里 - 或是如同在原先的指令稿中一样使用倒斜线 (/)
”分界”。
如同我们所见过的,你可以使用 pppd 的 -d 选项打开侦错信息的记录
功能。这里的 'debug' 选项功能相同。
因为我们以新的指令稿来建立新的连线,现在应该保留这个侦错选项。
(警告: 如果你的磁碟空间很吃紧,记录 pppd 之间的讯息交换可能会
很快的扩张你的系统记录档并且使你遭遇麻烦 - 但是你必须连线失败
并且持续让它尝试几分钟才会这样)。
一旦所有的指令都能正确动作,那麽你就可以移除这个选项。
如果不是使用 /etc/ppp/options 或是 /etc/ppp/options.ttySx 作为
你的 ppp 选项档案名称,那麽以 -f 选项把档案名称指定给 pppd -
例如
______________________________________________________________________
-f options.myserver
______________________________________________________________________
16.11. 储存你的指令稿
OK! 就这样 - 离开编辑器并且现在变更你的指令稿档案权限为 750!!
17. 测试你的连线指令稿
开启一个新的 Xterm(如果你在 X 底下)或开启一个新的虚拟主控台
并且以 root 接入。
在这个新的阶段作业中,发出这个指令
tail -f /var/log/messages
(或是你系统记录档案的任何名称)。
在第一个视窗(或是虚拟主控台中)发出这个命令
ppp-on &
(或是任何你所编辑的 /usr/sbin/ppp-on 版本之名称)。如果你没有
藉由在这个指令的尾端指定 & 使得指令稿进入背景执行的话,那麽在
ppp 结束(当连线结束时)之前你都不能回到终端机提示下。
现在切换到追踪系统记录档的视窗。
你将会见到某些像下列的东西(假定你对 chat 指定 -v 并且对 pppd 指
定 -d 选项)....这是紧跟在 pppd 起动信息之後记录到系统记录档案里
的 chat 指令稿及其回应:
______________________________________________________________________
Oct 21 16:09:58 hwin chat[19868]: abort on (NO CARRIER)
Oct 21 16:09:59 hwin chat[19868]: abort on (BUSY)
Oct 21 16:09:59 hwin chat[19868]: send (ATZ^M)
Oct 21 16:09:59 hwin chat[19868]: expect (OK)
Oct 21 16:10:00 hwin chat[19868]: ATZ^M^M
Oct 21 16:10:00 hwin chat[19868]: OK -- got it
Oct 21 16:10:00 hwin chat[19868]: send (ATDT722298^M)
Oct 21 16:10:00 hwin chat[19868]: expect (CONNECT)
Oct 21 16:10:00 hwin chat[19868]: ^M
Oct 21 16:10:22 hwin chat[19868]: ATDT722298^M^M
Oct 21 16:10:22 hwin chat[19868]: CONNECT -- got it
Oct 21 16:10:22 hwin chat[19868]: send (^M)
Oct 21 16:10:22 hwin chat[19868]: expect (ogin:)
Oct 21 16:10:22 hwin chat[19868]: 57600^M
Oct 21 16:10:23 hwin chat[19868]: ^[[;H^[[2J^M^M
Oct 21 16:10:23 hwin chat[19868]: ^M
Oct 21 16:10:23 hwin chat[19868]: ^M
Oct 21 16:10:23 hwin chat[19868]: ^I^I This is node kepler.hedland.edu.au^M
Oct 21 16:10:23 hwin chat[19868]: ^I^I^I at Hedland Campus^M
Oct 21 16:10:23 hwin chat[19868]: ^I^I^I Hedland College^M
Oct 21 16:10:23 hwin chat[19868]: ^M
Oct 21 16:10:23 hwin chat[19868]: ^I^I Authorised user ONLY are to use this system^M
Oct 21 16:10:23 hwin chat[19868]: ^M
Oct 21 16:10:23 hwin chat[19868]: ^M
Oct 21 16:10:23 hwin chat[19868]: ^I^I For more information, contact ComputerSystems^M
Oct 21 16:10:23 hwin chat[19868]: ^I^I^I on +61 (0)91 72 0400^M
Oct 21 16:10:23 hwin chat[19868]: ^I^I^I^I or^M
Oct 21 16:10:23 hwin chat[19868]: ^I^I email: [email protected]^M
Oct 21 16:10:23 hwin chat[19868]: ^M
Oct 21 16:10:23 hwin last message repeated 3 times
Oct 21 16:10:23 hwin chat[19868]: kepler login: -- got it
Oct 21 16:10:23 hwin chat[19868]: send (hartr^M)
Oct 21 16:10:23 hwin chat[19868]: expect (ssword:)
Oct 21 16:10:23 hwin chat[19868]: hartr^M
Oct 21 16:10:23 hwin chat[19868]: Password: -- got it
Oct 21 16:10:23 hwin chat[19868]: send (??????^M)
Oct 21 16:10:23 hwin chat[19868]: expect (hartr)
Oct 21 16:10:23 hwin chat[19868]: ^M^M
Oct 21 16:10:24 hwin chat[19868]: Last login: Sat Oct 21 14:55:53 on ttyC0^M
Oct 21 16:10:24 hwin chat[19868]: ^M
Oct 21 16:10:24 hwin last message repeated 9 times
Oct 21 16:10:24 hwin chat[19868]: ^I^IYou have logged into node kepler.hedland.edu.au^M
Oct 21 16:10:24 hwin chat[19868]: ^M
Oct 21 16:10:24 hwin chat[19868]: This is a Compaq Prolinea 486DX2/50 running Linux 1.1.54^M
Oct 21 16:10:24 hwin chat[19868]: ^M
Oct 21 16:10:24 hwin chat[19868]: This computer operates as the main Hedland Campus communications^M
Oct 21 16:10:24 hwin chat[19868]: ^I node, providing dial-in terminal and SLIP access,^M
Oct 21 16:10:24 hwin chat[19868]: ^I^I Kepler also runs the Hedland end of^M
Oct 21 16:10:24 hwin chat[19868]: ^I^I the Hedland/Newman inter-Campus WAN link^M
Oct 21 16:10:24 hwin chat[19868]: ^M
Oct 21 16:10:24 hwin chat[19868]: ^M
Oct 21 16:10:24 hwin chat[19868]: [hartr -- got it
Oct 21 16:10:24 hwin chat[19868]: send (ppp^M)
Oct 21 16:10:27 hwin pppd[19872]: pppd 2.1.2 started by root, uid 0
Oct 21 16:10:27 hwin pppd[19873]: Using interface ppp0
Oct 21 16:10:27 hwin pppd[19873]: Connect: ppp0 <--> /dev/cua1
Oct 21 16:10:27 hwin pppd[19873]: fsm_sdata(LCP): Sent code 1, id 1.
Oct 21 16:10:27 hwin pppd[19873]: LCP: sending Configure-Request, id 1
Oct 21 16:10:27 hwin pppd[19873]: fsm_rconfreq(LCP): Rcvd id 1.
Oct 21 16:10:27 hwin pppd[19873]: lcp_reqci: rcvd MRU
Oct 21 16:10:27 hwin pppd[19873]: (1500)
Oct 21 16:10:27 hwin pppd[19873]: (ACK)
Oct 21 16:10:27 hwin pppd[19873]: lcp_reqci: rcvd ASYNCMAP
Oct 21 16:10:27 hwin pppd[19873]: (0)
Oct 21 16:10:27 hwin pppd[19873]: (ACK)
Oct 21 16:10:27 hwin pppd[19873]: lcp_reqci: rcvd MAGICNUMBER
Oct 21 16:10:27 hwin pppd[19873]: (a098b898)
Oct 21 16:10:27 hwin pppd[19873]: (ACK)
Oct 21 16:10:27 hwin pppd[19873]: lcp_reqci: rcvd PCOMPRESSION
Oct 21 16:10:27 hwin pppd[19873]: (ACK)
Oct 21 16:10:27 hwin pppd[19873]: lcp_reqci: rcvd ACCOMPRESSION
Oct 21 16:10:27 hwin pppd[19873]: (ACK)
Oct 21 16:10:27 hwin pppd[19873]: lcp_reqci: returning CONFACK.
Oct 21 16:10:27 hwin pppd[19873]: fsm_sdata(LCP): Sent code 2, id 1.
Oct 21 16:10:27 hwin pppd[19873]: fsm_rconfack(LCP): Rcvd id 1.
Oct 21 16:10:27 hwin pppd[19873]: fsm_sdata(IPCP): Sent code 1, id 1.
Oct 21 16:10:27 hwin pppd[19873]: IPCP: sending Configure-Request, id 1
Oct 21 16:10:27 hwin pppd[19873]: fsm_rconfreq(IPCP): Rcvd id 1.
Oct 21 16:10:27 hwin pppd[19873]: ipcp: received ADDR
Oct 21 16:10:27 hwin pppd[19873]: (10.144.153.51)
Oct 21 16:10:27 hwin pppd[19873]: (ACK)
Oct 21 16:10:27 hwin pppd[19873]: ipcp: received COMPRESSTYPE
Oct 21 16:10:27 hwin pppd[19873]: (45)
Oct 21 16:10:27 hwin pppd[19873]: (ACK)
Oct 21 16:10:27 hwin pppd[19873]: ipcp: returning Configure-ACK
Oct 21 16:10:28 hwin pppd[19873]: fsm_sdata(IPCP): Sent code 2, id 1.
Oct 21 16:10:30 hwin pppd[19873]: fsm_sdata(IPCP): Sent code 1, id 1.
Oct 21 16:10:30 hwin pppd[19873]: IPCP: sending Configure-Request, id 1
Oct 21 16:10:30 hwin pppd[19873]: fsm_rconfreq(IPCP): Rcvd id 255.
Oct 21 16:10:31 hwin pppd[19873]: ipcp: received ADDR
Oct 21 16:10:31 hwin pppd[19873]: (10.144.153.51)
Oct 21 16:10:31 hwin pppd[19873]: (ACK)
Oct 21 16:10:31 hwin pppd[19873]: ipcp: received COMPRESSTYPE
Oct 21 16:10:31 hwin pppd[19873]: (45)
Oct 21 16:10:31 hwin pppd[19873]: (ACK)
Oct 21 16:10:31 hwin pppd[19873]: ipcp: returning Configure-ACK
Oct 21 16:10:31 hwin pppd[19873]: fsm_sdata(IPCP): Sent code 2, id 255.
Oct 21 16:10:31 hwin pppd[19873]: fsm_rconfack(IPCP): Rcvd id 1.
Oct 21 16:10:31 hwin pppd[19873]: ipcp: up
Oct 21 16:10:31 hwin pppd[19873]: local IP address 10.144.153.104
Oct 21 16:10:31 hwin pppd[19873]: remote IP address 10.144.153.51
______________________________________________________________________
(注意 - 我使用静态的 IP 号码 - 因此我的机器送这些东西到 PPP
服务器去 - 如果你使用动态的 IP 号码那麽你将不会看见这些。)
这看起来没什麽问题 - 所以如同前面的测试般, ping 一些 IP 号码
以及主机名称。
起动你的全球信息浏览器或是任何其它东东并且开始逛 - 你上线了!
18. 终止 PPP 连结
当你完成 PPP 连结之後,可以使用标准的 ppp-off 指令终止它(要
记得 - 你得是 root 或者是 PPP 群组的组员! )
你将会在你的系统记录里看见一些像这样的的东西:
______________________________________________________________________
Oct 21 16:10:45 hwin pppd[19873]: Interrupt received: terminating link
Oct 21 16:10:45 hwin pppd[19873]: ipcp: down
Oct 21 16:10:45 hwin pppd[19873]: default route ioctl(SIOCDELRT): Bad address
Oct 21 16:10:45 hwin pppd[19873]: fsm_sdata(LCP): Sent code 5, id 2.
Oct 21 16:10:46 hwin pppd[19873]: fsm_rtermack(LCP).
Oct 21 16:10:46 hwin pppd[19873]: Connection terminated.
Oct 21 16:10:46 hwin pppd[19873]: Exit.
______________________________________________________________________
19. 侦错
你的连线有各种可能的原因无法运行 - chat 无法正确地完成,你的
线路杂讯很大等等。所以,检查你的系统记录找寻指引。
一个非常普遍的原因是在你的指令稿里你少打了某些东西。你得要重头
到尾小心地检查 - 而且心里要记得我们人类有种倾向,阅读的是我们
认为我们键入的 - 而不是真的在那里的!
另一个原因是尝试使用 ppp-2.2 配合核心 1.2.X 或是使用 ppp 2.1.2
配合核心 1.3.X/2.0.X - 视你的核心使用正确的 ppp 版本!
现在仔细看看 PPP FAQ (这真的是一系列的问题与回答)。这是一份
非常详实的文件而且答案就在里面! 以我自己(很烂)的经验,如果你
的问题答案不在其中,那麽该问题就不是 ppp 的错! 以我为例我使用
ELF 核心而且没有升级适当的核心模组。在曙光出现之前我仅仅浪费了
大概两天(以及一个晚上的大部分时间)诅咒去它的 PPP 服务器。
19.1. 我把 PPP 编译进去但是 Linux 说我没有!
你使用的核心是 1.3.X/2.0.X 而且编译了模组支援并且把 PPP 支援
编译成一个模组(并且安装了该模组) - 是不是?
如果你没有使用 kerneld 来自动载入需要的模组,那麽在你执行 PPP
之前你必须明确地载入 ppp 这个模组! (而且可能也要载入串口支援
模组)
你可以手动执行这个工作 - 以 root 的身分,键入
______________________________________________________________________
insmod ppp
______________________________________________________________________
你也可能得要先载入串口支援模组...
______________________________________________________________________
insmod slhc
______________________________________________________________________
然而,你应该选用自动载入核心模组的方式 - 所以你应该去查阅一下
kerneld mini-howto!
19.2. 我不能设立预设递送路径
你有个已经设立预设递送路径的以太网络(或是另外某种网络连线)。 ’局域网上的特殊递送路径’该节涵盖正确的设定(简短地)。
你的问题是你不能拥有一个以上的预设递送路径。预设递送路径是没有
涵盖在指定递送路径里的所有封包递送的目的地。一般说来,预设递送
路径将指到从你的电脑到网际网络的路由器上。
不幸的,某些 Linux 发行套件把欲设定送路径设定到某一个以太网络
界面上。你需要变更处理以太网络界面的系统初始设定并且建立经过该
界面的递送路径也就是建立到你的以太网络界面之指定递送路径。
关於这项信息请参阅 NET2-Howto 以及 Linux Network Administrator
Guide 。
20. 使用 PPP 连结两个网络
基本上连结单一台 Linux PC 到 PPP 服务器以及使用 PPP 连结两个
局域网没有什麽差别。记得,PPP 是一种点对点的协定。
然而,你的确得了解关於递送路径如何建立的问题。阅读 NET-2 howto
以及 Linux Network Administrator Guide (NAG)。你也将发现这本书
"TCP/IP Network Administration" (by O'Reilly and Assoc - ISBN
0-937175-82-X)会是极佳的协助。
为了连结两个局域网,你使用的必须是不同的 IP 网络编号而且你将
得使用静态的 IP 号码 - 或使用 IP 伪装。如果你想要使用 IP 伪装
的话,参阅 IP masquerade mini-howto 有关它的设定介绍。
20.1. 设定 IP 号码
与其它局域网的网络管理者协商两端的 PPP 界面使用的 IP 号码。
如果你使用静态的 IP 号码,这可能也会要求你拨接特定的电话号码。
现在编辑专属的 /etc/ppp/options[.ttyXX] 档案 - 对於此连线在你
这一端使用特定的调制解调器及串行口是个好主意。你可能也得要去变更你
的 /etc/ppp/options 档案 - 并且也要为任何其它的连线建立专属的
options.ttyXX 档案。
在专属的选项档案里指定 PPP 连接中你这端的 IP 号码,这与前面所
展示使用静态 IP 号码拨接的方式完全相同。
20.2. 设定递送路径
你必须安排你局域网上的封包经过 PPP 连结所建立的界面递送出去
。这是个两阶段的过程。
首先,你必须建立从执行 PPP 连结的机器到连结的远方网络去的递送
路径。如果该连结通往网际网络,那麽这可以藉由 pppd 它自己建立的
预设递送路径来处理而你不必做任何事。
然而如果该连结只是连结两个局域网,那麽必须加入一个指定的网络
递送路径。这是在 /etc/ppp/ip-up 指令稿中使用 'route' 指令执行
的(参阅连线起动之後... 该节里有关如何执行的介绍)。
你得做的第二件事是告诉在你局域网上的其它电脑这台 Linux 电脑
确实是该 ppp 连结中通往远方网络的’闸道’。
当然,这些工作该连结另一端的网络管理者也全都得做。
20.3. 网络安全
如果你使用 PPP 连结你的局域网到网际网络上去 - 或甚至只是到
一个”国外的"局域网上去,你都必须考虑安全性的问题。我强烈鼓励
你考虑设立一台防火墙!
21. 连线起动之後...
一旦 PPP 连结建立後, pppd 会找寻 /etc/ppp/ip-up 指令稿。如果
这个指令稿存在并且可以执行的话,那麽 PPP 服务程序就会执行这个
指令稿。这允许你自动执行任何可能有必要的特殊递送路径指令及任何
你想在每次 PPP 连结起动时执行的行动。
例如,你可能想要 sendmail 赶快处理在邮件伫列中等待外送的讯息。
类似上例,你可以在 ip-up 里插入一些指令取得(使用 POP)在你的
的 ISP 那边等著你的任何电子邮件。
21.1. 特殊递送路径
如果你连结的是两个局域网,你将得设立一个到”国外的”局域网
的指定递送路径。这可以很容易的使用 /etc/ppp/ip-up 指令稿达成。
唯一的困难发生在你的机器有多个 PPP 连结时。
这是因为 /etc/ppp/ip-up 这个指令稿是由每一个起动的 ppp 连线所
执行的,所以你得要小心地为每一个起动的连结执行正确的递送指令。
在 pppd 传递给指令稿的特定参数上使用 bash 的 `case' 叙述来完成
这个工作。例如,这是我用来处理我们的广域网络连结及通往我家以太
网络的(也是由相同的 PPP 服务器处理) /etc/ppp/ip-up 指令稿。
______________________________________________________________________
#!/bin/bash
#
# Script which handles the routing issues as necessary for pppd
# Only the link to Newman requires this handling.
#
# When the ppp link comes up, this script is called with the following
# parameters
# $1 the interface name used by pppd (eg ppp3)
# $2 the tty device name
# $3 the tty device speed
# $4 the local IP address for the interface
# $5 the remote IP address
# $6 the parameter specified by the 'ipparam' option to pppd
#
case "$5" in
# Handle the routing to the Newman Campus server
202.12.126.1)
/sbin/route add -net 202.12.126.0 gw 202.12.126.1
# and flush the mail queue to get their email there asap!
/usr/sbin/sendmail -q &
;;
139.130.177.2)
# Our Internet link
# When the link comes up, start the time server and synchronise to the world
# provided it is not already running
if [ ! -f /var/lock/subsys/xntpd ]; then
/etc/rc.d/init.d/xntpd.init start &
fi
# Start the news server (if not already running)
if [ ! -f /var/lock/subsys/news ]; then
/etc/rc.d/init.d/news start &
fi
;;
203.18.8.104)
# Get the email down to my home machine as soon as the link comes up
# No routing is required as my home ethernet is handled by ip
# masquerade and proxyarp routing.
/usr/sbin/sendmail -q &
;;
*)
esac
exit 0
______________________________________________________________________
起动通往我们纽曼校园的 ppp 连结以及这个指令稿的结果,我们最後
得到下面这个递送表格记录(这台机器也是我们通常用的 PPP 服务器
并且处理我们的网际网络连结)。我已经在这个输出里加入一些注解以
解释每个项目是什麽:
______________________________________________________________________
[root@kepler /root]# route -n
Kernel routing table
Destination Gateway Genmask Flags MSS Window Use Iface
# the HOST route to our remote internet gateway
139.130.177.2 * 255.255.255.255 UH 1500 0 134 ppp4
# the HOST route to our Newman campus server
202.12.126.1 * 255.255.255.255 UH 1500 0 82 ppp5
# the HOST route to my home ethernet
203.18.8.104 * 255.255.255.255 UH 1500 0 74 ppp3
# two of our general dial up PPP lines
203.18.8.64 * 255.255.255.255 UH 552 0 0 ppp2
203.18.8.62 * 255.255.255.255 UH 552 0 1 ppp1
# the specific network route to the Newman campus LAN
202.12.126.0 202.12.126.1 255.255.255.0 UG 1500 0 0 ppp5
# the route to our local ethernet (super-netting two adjacent C classes)
203.18.8.0 * 255.255.254.0 U 1500 0 1683 eth0
# the route to the loopback device
127.0.0.0 * 255.0.0.0 U 3584 0 483 lo
# the default route to the Internet
default 139.130.177.2 * UG 1500 0 3633 ppp4
______________________________________________________________________
21.2. 处理电子邮件
上一节提及如何处理外送的邮件 - 一旦连线建立之後简单地藉由刷新
邮件伫列达成。
如果你执行连往广域网络的连结,你可以跟远端局域网的网络管理者
协调请它们执行完全相同的动作。例如,在我们的广域网络连结中纽曼
校园那一端的 /etc/ppp/ip-up 指令稿看起来像:
______________________________________________________________________
#!/bin/bash
#
# Script which handles the routing issues as necessary for pppd
# Only the link to Hedland requires this handling.
#
# When the ppp link comes up, this cript is called with the following
# parameters
# $1 the interface name used by pppd (eg ppp3)
# $2 the tty device name
# $3 the tty device speed
# $4 the local IP address for the interface
# $5 the remote IP address
# $6 the parameter specified by the 'ipparam' option to pppd
#
case "$5" in
203.18.8.4)
/usr/sbin/sendmail -q
;;
*)
esac
exit 0
______________________________________________________________________
然而如果你只能使用动态 IP 号码方式的 PPP 连线连往你的 ISP ,
你得从在你 ISPs 机器上的帐号取得你的电子邮件。这通常是使用邮局
协定(POP: Post Office Protocol) 来达成的。可以使用 `popclient'
程序处理这个程序 - 而 ip-up 指令稿也可以为你自动化这个程序。
简单地建立一个 /etc/ppp/ip-up 指令稿,其中包含有起动 popclient
程序的适当指令。在我执行 Red Hat Linux 的膝上型电脑上(任何的
旅行我都带著它)是这样的
______________________________________________________________________
popclient -3 -c -u hartr -p kepler.hedland.edu.au |formail -s procmail
______________________________________________________________________
你可以使用 slurp 或其它软件以相同的方式取得网络新闻,以及诸如
此类的服务。记得,ip-up 这个指令稿只是个标准的 bash 指令稿因此
可以用来自动化当每次适当的 PPP 连结建立时需要完成的任何功能。
22. 终止该连结
现有的 /usr/sbin/ppp-off 指令稿应该能胜任愉快。你唯一可能希望
的变更是想让这个指令稿能等待任何 sendmail 正在往外送的电子邮件
送完再终止连线。
这就留给学生当练习!
此外,你可以建立一个一旦连线被终止就会执行的指令稿档案。这存放
在 /etc/ppp/ip-down 。它可以用来回复你在相对的 /etc/ppp/ip-up
指令稿中指定执行的任何动作。
23. 局域网上的递送问题
如果你已经连接在某个局域网上但是仍然想要使用在你个人的 Linux
机器上的 pppd 的话,你得要应付某些递送封包的问题,从你的机器到
你的局域网(经过你的以太网络界面)以及到远端的 PPP 服务器和
更外面的世界。
这一节并不尝试教你有关封包递送的机制 - 它只处理一个简单的,特
定的递送情况(静态的)。
如果你不熟悉递送机制的话,那麽我强烈地鼓励你阅读 Linux Network
Administrator Guide (NAG) 。同时 O'Reilly 的书 "TCP/IP Network
Administration" 也以非常容易了解的方式涵盖了这个主题。
静态递送路径的基本规则是预设递送路径应该是指向网络位址号码最大
的那一个。对於其它的网络则在递送表格中输入指定递送路径。 我唯一打算在这里介绍的情况是你的 Linux box 在一个没有连上网际
网络的局域网上 - 而你想要在仍然连接著局域网的情况下拨接到
网际网络上供自己使用。
首先,确定你的以太网络递送路径是设往能够通过你的局域网的指定
网络位址 - 不是设往预设递送路径!
藉由发出 route 指令检查之,你应该会看见如下的讯息:
[root@hwin /root]# route -n
Kernel routing table
Destination Gateway Genmask Flags MSS Window Use Iface
loopback * 255.255.255.0 U 1936 0 50 lo
10.0.0.0 * 255.255.255.0 U 1436 0 565 eth0
如果你的以太网络界面 (eth0) 指向预设递送路径,(在 eth0 该行的
第一列上会显示 "default" 字样)那麽你得要变更你的以太网络启始
指令稿使它指向指定的网络号码而非预设递送路径(参照 Net2 HOWTO
以及 NAG)。
这将允许 pppd 设立你的预设递送路径,如下所示:
[root@hwin /root]# route -n
Kernel routing table
Destination Gateway Genmask Flags MSS Window Use Iface
10.144.153.51 * 255.255.255.255 UH 488 0 0 ppp0
127.0.0.0 * 255.255.255.0 U 1936 0 50 lo
10.1.0.0 * 255.255.255.0 U 1436 0 569 eth0
default 10.144.153.51 * UG 488 0 3 ppp0
如同你所见到的,我们拥有经由 ppp0 到 PPP 服务器(10.144.153.51)
的主机递送设定而且也拥有使用 PPP 服务器作为闸道的预设网络递送
设定。
如果你的设定得要比此更复杂 - 阅读已经提过有关递送的文件并请教
在你身旁的专家!
如果你的局域网上已经有路由器,那麽在你那里已经建立了通往宽广
网络世界的闸道。你仍应把你的预设递送路径指往 PPP 界面 - 并且
使其它的递送路径指定到由路由器服务的网络。
23.1. 安全上的注意事项
当你在现有的局域网上设定一台 Linux box 连结到网际网络上,你
在不知不觉中已经对网际网络 - 以及在那里的骇客们 - 开放了你的
整个局域网。在你这样做之前,我强烈地鼓励你请教你的网络管理者
并参考该处的安全策略。如果你的 PPP 连线被成功地用来攻击你的话
,那麽你最少也会招致同夥的使用者,网络及系统的管理者强烈的愤怒
。你也可能会发现你自己置身於非常严重的麻烦!
在你连接局域网到网际网络上去之前,甚至是动态的连线你都应该要
考虑安全的隐忧 - 因此早点参考 the O'Reilly "Building Internet
Firewalls"!
24. 当完全陷於胶著时如何取得帮助
如果你不能使你的 PPP 连结运行,回头重新阅读这份文件并检查每一
件事 - 同时配合 "chat -v..." 以及 "pppd -d" 在你的系统记录里
建立的输出作为参考。
也要参考 PPP 本身的文件以及 FAQ 并加上在此曾经提及的文件。
如果你仍然陷於胶著状态的话,那麽有些能够在 PPP 这方面帮你的人
(包括我自己在内)会合理的、有规律的扫描 comp.os.linux.misc 与
comp.os.linux.network 新闻讨论群,与 comp.protocols.ppp 相同。
你可以尝试寄个人的电子邮件给我,但我真的有自己的工作(和生活)
而且我不保证会很快地回覆(即使不完全会这样)因为这得视我目前的
工作负担以及我私人的生活状态而定!
特别是 - 不要张贴剪下来的错误侦测输出到新闻讨论群上也不要藉由
电子邮件寄给我 - 前者浪费大量的网络频宽而後者将转给 /dev/null
(除非我特别要求寄它给我! )
25. 连结运行之後普遍的问题
一个问题是你将会发现许多服务提供者只支援他们给新帐号的套装连线
软件。这(典型)是给微软视窗环境的 :-( - 而且许多服务提供者的
支援处看来一点都不了解 Unix (or Linux)。所以要有准备,从他们那
得不到太多协助。
你当然可以帮他们一个忙并且教育他们关於 Linux 的知识(任何 ISP
的协助人员在网际网络用语中都应该”知道它”而这意味著他们在家里
应该要有台 Linux box - 当然是这样)!
25.1. 我无法看见我连线的 PPP 服务器以外的世界
OK - 你的 PPP 连线已建立并执行中而且你可以藉由该 PPP 服务器
的 IP 号码(藉由 ifconfig ppp0 指令所显示的第二个或 "remote"
的 IP 号码) ping 该服务器,但是你不能触及其後的任何地方。
首先,尝试 ping 你在 /etc/resolv.conf 里指定作为名称服务器那台
机器的 IP 号码。如果可以的话,那麽你就可以见到在你 PPP 服务器
之外的东西(除非这个 IP 号码跟你连线的 "remote" IP 号码相同)
。所以现在来试试 ping 你的服务提供者的完整网际网络名称 - 例如
ping my.provider.net.au
如果这样无法成功,那麽你有个名称解析上的问题。这可能是因为在你
的 /etc/resolv.conf 档案里有打字错误。对照你打电话给服务提供者
所得的信息小心地检查这个档案。如果看起来全都没问题,
如果它仍然无法运行(而且你的服务提供者确认他的名称服务器有开机
并且正在执行),那麽你的问题在其它的地方 - 而且我建议你小心地
从头到尾检查你安装的 Linux(特别注意档案权限)。
如果你仍然不能藉由 IP 号码 ping 你服务提供者的 IP 名称服务器,
那麽不是他们关掉机器(打个电话给他们确定一下)就是有个递送问题
发生在你的服务提供者那边。再一次,打电话给他们查问看看。
有个可能是”远端”是一台 Linux PPP 服务器而在其核心里没有指定
IP forwarding 选项!
一个良好的测试方法是使用大多提供给(一整套) Microsoft Windows
的软件尝试进入你的服务提供者。如果完全相同的帐号在另外一套作业
系统下一切正常,那麽问题是在你的 Linux 系统上而不是在你的服务
提供者那边。
25.2. 我可以寄送电子邮件,但不能接收
如果你使用动态的 IP 号码,这是很正常的。参阅下面的”设立服务”
该节。
25.3. 为什麽人们不能来我的机器 finger, WWW, gopher, talk 等等?
再一次,如果你使用动态的 IP 号码,这是非常正常的。参阅下面有关
”设立服务”该节。
26. 配合动态的 IP 号码使用网际网络服务
如果你使用动态的 IP 号码(许多服务提供者也只提供动态的 IP 号码
除非你为你的连线付出更多代价),那麽你必须认识这隐含的限制。
首先,外送服务请求将不会有问题。这是说你可以使用 sendmail 送出
电子邮件,从远端节点传输(ftp)档案, 调查(finger)在其它机器上的
使用者,浏览全球信息网等等。 特别是,虽然你不在线上但你可以回覆带回你机器上的电子邮件。邮件
将单纯地丢在你的邮递伫列中直到你拨回你的 ISP 再行送出。
然而,你的机器并非一天 24 小时都连接在网际网络上,它每次连线也
不会拥有相同的 IP 号码。所以你不可能接得到直接寄到你机器的电子
邮件,或是设立一台全球信息服务器或档案传输服务器! 因为网际网络
与你的机器不存在一种唯一的,永久可以联系的关系,因为你的机器并
没有唯一的 IP 号码。
如果你设立一台 WWW(或任何其它服务器),在网际网络上的任何人都
完全不会知道除非他们知道你的机器现在正在线上以及它确实(目前)
的 IP 号码。他们有许多管道可以得到这项信息,包括由你打电话给他
们,寄发电子邮件告诉他们或者是在你服务提供者的帐号上巧妙地使用
".plan" 档案(假设你的提供者允许 shell 存取)。
现在,对大部分的使用者而言,这不是个问题 - 大部分人们所想要做
的全部只是寄送与接收电子邮件(使用在你服务提供者上的帐号)以及
连线到全球信息网,传输档案以及其它网际网络上的服务。如果你必须
拥有由外往内的连线服务,你真的应该取得静态的 IP 号码。另外一种
方法是研究前面提示过的方法。
26.1. 设定电子邮件
即使是动态的 IP 号码,你的确可以配置你机器上的 sendmail 来送出
你在当地写就的任何电子邮件。有关 sendmail 的配置可能会是很含糊
而且很困难的 - 所以这份文件不会试图告诉你该怎麽做。然而,你可
能应该配置你的 sendmail 以便你的网际网络服务提供者能授命你作为
"smart relay" 主机(在 sendmail 的 DS 选项)。(更为详细的配置
信息请参阅 sendmail 的文件 - 并详阅随附於 sendmail 的 m4 配置
巨集。几乎可以确定里面一定有一个能符合你的需要)。
一旦你配置好 sendmail 後,你可能想在 PPP 连线刚一起动的时候就
要 sendmail 赶快送出任何待在邮件伫列里的讯息。要这麽做的话,加
入这行指令
sendmail -q &
到你的 /etc/ppp/ip-up 指令稿中。
由外往内的电子邮件对动态的 IP 号码而言是个问题。处理这个问题的
方法是:
。配置你的使用者邮递程序让所有送出去的邮件在 "reply to" 表头中
有个在你的网际网络服务提供者上的电子邮递位址。
。使用 popclient 程序从你的服务提供者那边撷取你的电子邮件。
你可以藉由在 /etc/ppp/ip-up 指令稿中放入必要的指令以便在拨接时
自动化这个过程。
26.2. 设定本地的名称服务器
虽然你大可使用在你 ISP 那里的领域名称服务器,你也可以设立一台
本地的暂存专用(次要)名称服务器,并藉由 ip-up 指令稿启动。跑
本地(暂存专用)名称服务器的好处是如果你在连线期间常常联系相同
的节点那麽它可以节省你的时间(以及频宽)。
暂存专用名称服务器(在 named.boot 档案里使用一行 'forwarders'
指向你 ISPs 的 DNS)的 DNS 配置比较简单。 O'Reilly book (DNS
and Bind) 解释所有你需要知道的东西。
也有一份 DNS-HOWTO 可以取得。
网络作业的一个要点: 当你要在你 ISP 的领域里开始启用一台次要的
,暂存专用的名称服务器之前先询问你的 ISP 相关的权限。正确配置
它,你的 DNS 一点都不会造成你 ISP 的困扰,但是如果你做错了些
什麽,它可能会引起麻烦...
27. 设立 PPP 服务器
如同前面提过的,这件工作有许多方法可以可以达成。我在这里所介绍
的是我怎麽做的方法(使用 Cyclades 多端口串口卡)以及一组自动转接
的电话线路。
如果你不喜欢我在这里介绍的方法,请别在意使用你自己的。不过,我
我很乐意在这份使用说明未来的版本中包含额外的方式。所以,请把你
的评论跟方法寄给我。
请注意,这一节只跟如何设定 Linux 作为 PPP 服务器有关。我不想
(不曾)包含有关设定特殊终端机服务器及这一类的信息。
而且,我尚未实验过配合 shadow 密码使用(但应该会做)。因此目前
介绍的信息并不包含任何 shadow 需要的设定。
27.1. 编译核心
所有早先提过关於编译核心以及核心与 pppd 版本的说明都适用。这节
假设你已经读过这份文件前面的章节!
对於 PPP 服务器,你必须在你的核心中包含 IP forwarding 的功能
。你也可能会希望包含其它的功能(像是 IP firewalls, accounting
等等)。
如果你使用多端口串口卡,那麽你也必须明确地在你的核心中包含必要的
驱动程序!
27.2. 这个服务系统的概观
我们使用相同的使用者名称/密码配对提供拨接 PPP (and SLIP) 帐号
以及 shell 帐号。这样做的好处(对我们而言)是使用者只需要一个
帐号就可以使用所有种类的连线。
因为我们是教育组织,我们并不对职员以及学生的使用收费,所以不必
担心计算与收费的问题。
在我们的节点与网际网络之间我们设置有一台防火墙,而这会限制某些
使用者的存取,因为拨接线路是在我们的(网际网络)防火墙内(理由
很明显,其他网际网络防火墙的细节也不会在此出现而且在任何情况下
都没有关系)。
使用者建立连往我们节点之 PPP 连结的程序(当然是在他们拥有有效
的帐号後)是:
。拨入我们的自动转接拨号器(这是连结一堆调制解调器的单一电话号码-
第一台空□的调制解调器会接起拨入的电话)。
。使用一对有效的使用者名称以及密码接入。
。在 shell 提示符号下,发出指令 ppp 起动服务器上的 PPP 。
。起动他们机器上的 PPP(可以是执行 windows, DOS, Linux, MAC OS
或任何作业系统的机器 - 这是他们的问题)。
这台服务器为每个拨入的端口使用个别的 /etc/ppp/options.ttyXX 档案
,而这为动态的 IP 分配设定远端的 IP 号码。服务器为远地的客户端
使用代理位址解析协定(proxyarp)来递送封包(经由适当的 pppd 选项
加以设定)。这避免了使用 routed 或是 gated 的需求。
当使用者从他们那端挂断时, pppd 会侦测出来并告诉调制解调器要它挂断
,同时停掉 PPP 连结。
27.3. 所需的全部软件
你将会需要下列的软件:
。Linux, 包含必要的选项适当地编译。
。适合於你核心的 pppd 版本。
。一套能够聪明地处理调制解调器通讯的 'getty' 程序。在这里我们使用
的是 getty_ps2.0.7h ,但积极考虑 mgetty 。我了解 mgetty 可以
侦测出使用 pap/chap 的呼叫( pap 是 Windows95 使用的标准)并
自动地起动 pppd ,但是我尚未研究过它。
。你的拨接使用者能够存取的一台领域名称服务器 (DNS)。如果有可能
的话你真的应该执行你自己的 DNS...
27.4. 设定标准的拨接(shell access)
在你可以设立你的 PPP 服务器之前,你的 Linux box 必须能够处理
标准的拨接存取。
这份使用说明并不涵盖这项设定方法。请参阅你选择之 getty 的文件
以及 Serial HOWTO 里有关这项设定的信息。
27.5. 设立 PPP 选项档案
你将得为所有拨接端口设立一个全体的 /etc/ppp/options 档案,其中是
通用的选项。我们使用的选项是:
______________________________________________________________________
asyncmap 0
netmask 255.255.254.0
proxyarp
lock
crtscts
调制解调器
______________________________________________________________________
你几乎一定会希望提供动态分配的 IP 号码给你的拨接使用者。你可以
藉由分配 IP 号码给每个拨接端口来达成目的。现在,为你的每个拨接端口
建立一个 /etc/ppp/options.ttyXX 档案。
在这里面,只要简单地放入本地(服务器)的 IP 号码及该端口所要使用
的 IP 号码。例如
______________________________________________________________________
kepler:slip01
______________________________________________________________________
特别注意,在这个档案里你可以使用合法的主机名称(我发现我只记得
在我网络上重要机器与设备的 IP 号码 - 名称会更有意义才对)!
27.6. 设定 pppd 以便让使用者(成功地)执行它
因为起动 ppp 连结隐含著配置核心设备(网络界面)及操控核心递送
表格的动作,所以需要特别的权限 - 事实上需要完整的 root 权限。
幸运的是, pppd 已经设计成可以安全地设定为以 root 的身分执行。
所以你将得
______________________________________________________________________
chmod u+s /usr/sbin/pppd
______________________________________________________________________
当你列出这个档案时,它应该会如同这样
______________________________________________________________________
-rwsr-xr-x 1 root root 74224 Apr 28 07:17 /usr/sbin/pppd
______________________________________________________________________
如果你没有这样做,使用者将不能设立他们的 PPP 连结。
27.7. 为 pppd 设定一个全域的别名(alias)
为了简化我们拨接 PPP 使用者的连线程序,我们建立一个全域的别名
(in /etc/bashrc)如此一旦他们接入之後只要一个简单的指令就能起动
服务端的 ppp 。
这看起来像
______________________________________________________________________
alias ppp="exec /usr/sbin/pppd -detach"
______________________________________________________________________
它所作的是
。exec: 这意指以这个指令所执行的程序替换正在执行的程序(在这个
例子中是 shell)。
。ppp -detach: 起动 pppd 并且不要把产生的程序放入背景执行。这
确保当 pppd 结束时不会留下任何程序。
当一个使用者像这样接入时,他们在 'w' 的输出中会像这样
______________________________________________________________________
6:24pm up 3 days, 7:00, 4 users, load average: 0.05, 0.03, 0.00
User tty login@ idle JCPU PCPU what
hartr ttyC0 3:05am 9:14 -
______________________________________________________________________
就这样... 我告诉过你这是一个很简单的,基本的 PPP 服务系统!