PPP HOWTO 中译版 <author> 作者: Robert Hart <tt><htmlurl url="mailto:hartr@interweft.com.au" name="hartr@interweft.com.au"></tt><newline> 译者: <htmlurl url="http://ultima.ncnu.edu.tw/~asdchen/" name="Asd L. Chen"> & <htmlurl url="http://www.phys.ntu.edu.tw/~cwhuang/pub/" name="C.W.Huang"> <date>v3.0, 31 March 1997. 翻译日期: 25 August - 9 October 1997 <abstract> 这份文件展示如何把你的 Linux PC 连接到一台 PPP 伺服器上, 如何使用 PPP 把区域网路连结在一起并且提供一种把你的 Linux 电脑设定为 PPP 伺服器的方法. 本文同时提供帮助侦错无法正常运作的 PPP 连结. </abstract> <!-- Table of contents --> <toc> <p> <bf>版权声明</bf> <p> 本文件的散布必须依据 GPL (GNU Public License). <p> <bf>散布</bf> <p> 一旦这份文件有新的版本产生就会贴到 comp.os.linux.answer 讨论群. 也可以在此取得 HTML 格式的文件: <itemize> <item><url url="http://sunsite.unc.edu/LDP/HOWTO/" name="Linux Howto Index"> <item><url url="http://www.interweft.com.au/other/ppp-howto/ppp-howto.html" name="PPP-HOWTO"> </itemize> <p> 其它格式(SGML, ASCII, postscript, DVI)的文件可以从这里取得: <url url="ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/other-formats" name="Howtos - other formats">. <p> 因为 sunsite.unc.edu 的负载非常地重,请使用最靠近你的适当映射(mirror)节点. <p> <bf>感谢</bf> <p> 不断地有许多人提供我写作此文件的协助. 特别感谢 Al Longyear 对 PPP 本身的指导(如果这里有任何错误,那是我的而不是他的), Greg Hankins(Linux HOWTOs 的维护人)以及 Debi Tackett (MaximumAccess.com) 许多在形式,内容顺序,逻辑与解释清晰度的有用建议. <p> 最後,对於许多以电子邮件提供我意见的人,感谢您. 就像所有 HOWTO 的作者一样,帮助他人所获得的满足感就是我们所收到的报酬,而这已足够. 经由写作这份 HOWTO 文件我偿还一小部份人情债,这是我,以及所有其馀 Linux 的使用者, 所积欠给为我们撰写与维护这个作业系统的人的. <sect>简介 <p> PPP (点对点协定)是在串列连结上跑 IP (网际网路协定)以及其它网路协定的一种机制, 串列连结可以是直接的串列连接(使用 null-modem 缆线)或是使用数据机以及电话线路所造出的连结 (当然也包括如 ISDN 的数位线路). <p> 使用 PPP, 你可以把你的 Linux PC 连接到一台 PPP 伺服器上并存取该伺服器所连接的网路资源(几乎)就如同你是直接连接在该网路上一般. <p> 你也可以把你的 Linux PC 设为一台 PPP 伺服器,这样一来其它电脑就可以拨入你的电脑并且存取在你区域网路里的资源. <p> 因为 PPP 是一种点对点 (peer-to-peer) 的系统,因此你也可以使用两台 Linux PC 上的 PPP 把网路连结在一起(或是把区域网路连结到网际网路上). <p> 最主要的差异当然是速度 - 标准的乙太网路连线是以 10 Mbps(每秒百万位元)这个理论上的最大贯通量在动作, 而在数据机这方面最大是以 56 kbps(每秒千位元)的速度在动作. <p> 同时,依据 PPP 连线的型态,某些应用以及服务在使用上可能会有些限制. <sect1>客户端以及伺服端 <p> PPP 是一种完完全全是<bf/点对点/的协定;拨接的机器以及接受拨接的机器之间(在技术上)并没有差异. 然而,为了清楚明白的缘故,以<bf/伺服端/与<bf/客户端/的方式来思考是很有用的. <p> 当你拨入一个节点要建立 PPP 连线时,你是<bf/客户端/.你所连线的那台机器是<bf/伺服端/. <p> 当你在设定一台 Linux 机器使其接收并处理拨入的 PPP 连线时,你正在设立一台 PPP <bf/伺服端/. <p> 任何 Linux PC 都可以是 PPP 伺服端以及客户端 - 甚至於如果你有一个以上的串列埠(以及数据机,如果有必要)的话还可以同时扮演这两种角色. 如同前面所说的,就 PPP 而言,一旦连线建立那麽客户端与伺服端之间并不真的有什麽差异. <p> 为了清楚明白的关系,这份文件把启始呼叫(即 "拨入")的那台机器称作<bf/客户端/, 而把回应电话,核对拨入请求之验认(利用使用者代号,密码以及其它可能的机制)的那台机器称作<bf/伺服端/. <p> 使用 PPP 做为客户端把某个地方的一台或多台机器连结到网际网路上可能是大部份人都感兴趣的一点 - 这是将他们的 Linux 机器作为一客户端. <p> 在这份文件中所描述的程序将会让你能够建立并自动化你的网际网路连线. <p> 这份文件也将在把你的 Linux PC 设为 PPP <bf/伺服器/以及使用 PPP 来连结两个区域网路(有完整的递送设定)这些方面给你指引(这常常被称作建立广域网路连结). <sect1>不同 Linux 套件间的差异 <p> 有这多不同的 Linux 套件,他们有自己的特质与行为模式. <p> 特别地,Linux (以及 Unix)电脑有两种不同的起始方式,界面设定等等. <p> 这两种分别是 <bf/BSD system initialisation/ 与 <bf/System V system initialisation/. 如果你进入某些 Unix 的新闻讨论群,你会发现经常有双方支持者的战争. 如果你觉得有趣,就加入这个浪费网路频宽的行列! <p> 最普遍使用的套件可能是 <itemize> <item>Slackware<newline> 使用 BSD 形式的系统起始 <item>Red Hat (and its former associate Caldera)<newline> 使用 SysV 系统起始(有些许的修改) <item>Debian<newline> 使用 SysV 系统起始 </itemize> <p> BSD 形式的系统起始通常将它的启动档案放在 <tt>/etc/...</tt>,这些档案是: <code> /etc/rc /etc/rc.local /etc/rc.serial (也可能有其它档案) </code> <p> 最近,一些 BSD 系统的起始模式将使用 <tt>/etc/rc.d...</tt> 做为启动档案的存放目录,而不是将所有的东西都丢到 <tt>/etc</tt> 下. <p> System V 起始模式将启动档案存放在 <tt>/etc/...</tt> 或 <tt>/etc/rc.d/...</tt> 及其下的一堆子目录中: <code> drwxr-xr-x 2 root root 1024 Jul 6 15:12 init.d -rwxr-xr-x 1 root root 1776 Feb 9 05:01 rc -rwxr-xr-x 1 root root 820 Jan 2 1996 rc.local -rwxr-xr-x 1 root root 2567 Jul 5 20:30 rc.sysinit drwxr-xr-x 2 root root 1024 Jul 6 15:12 rc0.d drwxr-xr-x 2 root root 1024 Jul 6 15:12 rc1.d drwxr-xr-x 2 root root 1024 Jul 6 15:12 rc2.d drwxr-xr-x 2 root root 1024 Jul 18 18:07 rc3.d drwxr-xr-x 2 root root 1024 May 27 1995 rc4.d drwxr-xr-x 2 root root 1024 Jul 6 15:12 rc5.d drwxr-xr-x 2 root root 1024 Jul 6 15:12 rc6.d </code> <p> 如果你尝试寻找你的乙太网路卡及网路递送设定真正的配置地方,你需要追踪到这些档案里找出配置指令的所在. <sect1>套件相关的 PPP 配置工具 <p> 在某些安装套件(如 Red Hat 与 Caldera),有一个以 X window 设定的 PPP 拨接系统. 这份 HOWTO 并未包含这种与最件相关的工具.如果你在使用上有问题,直接和套件的发行人询问. <p> 对於 Red Hat 4.x 的使用者,可以在 Linux 的资源区找到 <url url="http://www.interweft.com.au" name="Red Hat PPP-TIP">, 也可在支援区找到 <url url="http://www.Red Hat.com" name="Red Hat Software">. <sect>IP 号码 <p> 每一个连上网际网路的设备都必须拥有它们自己的,唯一的 IP 号码.这些是由每个国家的有关单位集中指定的. <p> 如果你要把区域网路连上网际网路,在你的区域网路里你所拥有的所有电脑及设备都<bf/必须/使用从指定给你的网路□围里分配的 IP 号码. 即使连接另一个区域网路(在网际网路之外)你也<bf/绝不能/凭空取用 IP 号码. 如果你'偷来'的 IP 号码开始干扰其它已经使用这个 IP 的电脑的话,最糟时不仅不会动,还将会引起全体性的大破坏. <p> 请注意在这整份文件里所使用的 IP 号码(有一些个例外)都是从保留给没有(不曾)连上网际网路的网路所使用的‘未连线网路号码’系列来的. <p> 有一些特别留给不连接网际网路的网路使用的 IP 号码.这些 IP 号码依序是: <itemize> <item>1 个 A-等级 的位址<newline> 10.0.0.0 (netmask 255.0.0.0) <item>16 个 B-等级 的位址<newline> 172.16.0.0 - 172.31.0.0 (netmask 255.255.0.0) <item>256 个 C-等级 的位址<newline> 192.168.0.0 - 192.168.255.0 (netmask 255.255.255.0) </itemize> <p> 如果你的网路<bf/还没/从你国家的权责单位分配到 IP 号码,那麽你的机器应该使用前面所列这些网路号码中的一个. <p> 这些号码<bf/永远不该/使用在网际网路上. <p> 然而,它们仍可使用在一部连接在网际网路的机器上的内部乙太网路卡上. 因为 IP 号码是分配给网路界面,而不是电脑本身的. 因此虽然你的乙太网路界面使用 10.0.0.1 (例如),当你以 PPP 连上网际网路时,你的 PPP 界面将由伺服器分配给另一个(合法的) IP 号码. 你的 PC 将有网际网路的连接能力,但其它区域网路内的电脑则没有. <p> 不过,使用 Linux 以及 ipfwadm 软体的 IP 伪装能力(也叫做 NAT - Network address Translation 网路位置转换), 你就可以把你的区域网路上不具合法 IP 号码的机器连上网际网路(提供的服务会有些限制). <p> 想得到更多资讯请参考 <url url="http://sunsite.unc.edu/mdw/HOWTO/mini/IP-Masquerade" name="Linux IP Masquerade mini HOWTO">. <p> 对於大部分的使用者,经由 PPP 连接单一机器到网际网路服务提供者(Internet Service Providers: ISP), 取得一个 IP 号码(或更正确的说,一个网路号码)是没有必要的. <p> 如果你希望连接一个小型的区域网路到网际网路上,许多网际网路服务提供者可以从他们已有的 IP 位址空间中提供给你一个次网路(特定的一段 IP 号码). 或者,使用 IP 伪装能力.  <p> 对於经由 ISP 连接单一 PC 到网际网路上的使用者,大部分的提供者使用动态的 IP 指定. 这是说,连线程序的一部份中,你所联系的 PPP 服务将会告诉你的机器这次连线的期间里该 PPP 界面应该使用什麽 IP 号码. 每次你连上 ISP 所得到的号码不会一样. <p> 使用动态的 IP 号码,你每次的连线<bf/不会/都取得相同的 IP 号码. 这对在你 Linux 机器上的伺服型态应用程式像是 sendmail, ftpd, httpd 以及诸如此类的软体而言会产生问题. 这些服务根基於这部提供服务的电脑能以同样的 IP 号码取用. <p> 由於动态的 IP 号码指定而有所限制的服务(以及解决的方法,可能的话)稍後会在这份文件中讨论. <sect>这份文件的目的 <sect1>设立 PPP 客户端 <p> 这份文件提供想要使用 Linux 以及 PPP 拨接到某一台 PPP 伺服器并且使用 PPP 设立 IP 连线的人们一些指引. 文件中假设 PPP 已经编译好并且安装在你的 Linux 机器上(但简短地涵盖重新配置/重新编译你的核心以便包含 PPP 支援的部份). <p> 虽然 DIP(建立 SLIP 连线的标准方式)可以用来创造 PPP 连线,但 DIP 指令稿一般都相当地复杂. 因为这个缘故,这份文件并不涵盖使用 DIP 来建立 PPP 连线的部份. <p> 取而代之的是,这份文件描述标准的 Linux PPP 软体(chat/pppd). <sect1>使用 PPP 连结两个区域网路或连结一个区域网路到网际网路上 <p> 这份文件提供关於连结两个区域网路或连结一个区域网路到网际网路上的(基本)资讯. <sect1>设立 PPP 伺服器 <p> 这份文件提供如何配置你的 Linux PC 做为 PPP 伺服器的指引(允许其他人拨接到你的 Linux PC 并且建立 PPP 连线). <p> 你应该注意的是设定 Linux 作为 PPP 伺服器的方法有无数种.这份文件(目前)给你一种方式 - 作者用来它设立一台小型 PPP 伺服器(共有 16 台数据机). <p> 这个方式已知运作良好.不过,它不一定是最好的方式. <sect1>使用 PPP 於直接缆线(direct null modem)连结 <p> 本文件提供使用 PPP 连结於两部 Linux PCs 於 null modem 缆线的简短描述. 以此法连结其它作业系统於 Linux 也是可能的. 如果要这样做,你必须参考你要连结的作业系统的文件. <sect1>这份文件目前尚未涵盖的... <p> <itemize> <item>编译 PPP 软体<newline> 参见随附你使用的 pppd 版本而来的文件. <item>连接以及配置数据机到 Linux 上(细节)<newline> 请参阅 Serial-HOWTO,以及数据机相关的起始设定,参阅 <url url="http://www.in.net/info/modems/index.html" name="Modem Setup Information"> 里的资讯可能对你设定数据机有所帮助. <item>使用 DIP 创造 PPP 连线<newline> 使用 chat 取代... <item>使用 socks 或是 IP Masquerade<newline> 已经有涵盖这两个套件的绝佳文件. <item>使用 <tt/diald/ 以建立自动连线<newline> 请参阅 <tt/diald/ 文件里的资讯. <item>使用 EQL 将两部数据机合成单一 PPP 连结. <item>与套件相关的 PPP 连线方法(例如 Red Hat 4.x 网路设定工具)<newline> 请参阅该套件中的文件. <item>不断增加的自动建立 PPP 工具<newline> 请参阅适当的文件. </itemize> <sect>涵盖的软体版本 <p> 这份使用说明假设你使用 Linux 1.2.x 核心配合 PPP 2.1.2 软体或 Linux 1.3.X/2.0.x 以及 PPP 2.2 版. <p> 在本文件撰写之时,Linux 的 PPP 软体最新正式版本是 ppp-2.2f. 最新的版本(ppp-2.3)还在 beta 阶段. <p> 使用 PPP 2.2.0 配合核心 1.2.13 是有可能的.然而,要这样做需要核心修补. 建议核心 1.2.13 版本的使用者升级到 ppp-2.2 因为它包含了许多错误修正及功能加强. <p> <bf/还有,你应特别注意不能将 PPP 2.1.2 与 Linux 核心 2.0.X 合用./ <p> 请注意这份文件<bf/不/包括使用 Linux 核心 2.0.x 的可载入模组所引起的问题. 请参阅 kerneld mini-HOWTO 以及核心/模组 2.0.x 的文件(在 Linux 2.0.x 的原始程式目录 <tt>/usr/src/linux/Documentation/...</tt> 里). <p> <bf>因为这份文件是设计来协助新手的,强烈建议你使用已知能稳定地共同运作的 Linux 版本及适当的 PPP 版本.</bf> <sect>其它有用的/重要的文件 <p> 鼓励使用者阅读:- <itemize> <item>随附於 PPP 套件的文件; <item>pppd 以及 chat 的线上使用手册;<newline> (使用 <tt/man chat/ 以及 <tt/man pppd/ 来阅读) <item>Linux 网路管理指引 (NAG);<newline> 参阅 <url url="http://sunsite.unc.edu/mdw/LDP-books/nag-1.0/nag.html" name="The Network Administrators' Guide"> <item>Net-2/3 HOWTO;<newline> 参阅 <url url="http://sunsite.unc.edu/mdw/HOWTO/NET-2-HOWTO.html" name="Linux NET-2/3-HOWTO"> <item>在 <tt>/usr/src/linux/Documentation</tt> 里的 Linux 核心文件; <item>数据机设定资讯 - 参阅 <url url="http://www.in.net/info/modems/index.html" name="Modem Setup Information"> <item>由 O'Reilly and Associates 出版的最佳 Unix/Linux 书籍(参阅 <url url=" http://www.ora.com/" name="O'Reilly and Associates On-Line Catalogue"> 里的目录). 如果你是 Unix/Linux 的新手,立刻<bf/跑/(不要用走的)到离你最近的电脑书店去投资几样这些资料. <item>由 Al Longyear 所维护的 PPP-FAQ,可在 <url url="ftp://sunsite.unc.edu/pub/Linux/docs/faqs" name="Linux PPP-FAQ"> 取得.<newline> 里面包括了大量有用的资讯以问答的形式出现,在试图找出为何 PPP 不能(正常)工作时相当有用. <item>不断新增由不同出版社与作者出品的书籍;<newline> 鼓励你去查阅这些流通的书籍.Linux 的发展与套件的演进相当快速,而书籍的改版速度(一般来说)相当的慢! 买一本已经过期的好书(现在有许多)可能使得新使用者感到困惑与失望. </itemize> <p> Linux 文件的最佳起点就是 <url url="http://sunsite.unc.edu/mdw/" name="The Linux Documentation Project Home Page">. HOWTOs 倾向於定期地更新. <p> 虽然即使不必阅读这些资料中的任何一份你也可以使用这份文件来建立你的 PPP 连结, 但是如果你去阅读这些文件那麽你对於你所做的究竟发生了些什麽将会了解更多! 你将能够精确的提出自己的问题(或至少在 comp.os.linux... 新闻讨论群或 Linux mailing lists 中问出较有深度的问题). <p> 这些文件(与各种其它文件,包括相关的 RFCs 等)提供额外的以及比这份使用说明所能包含的更多细节解释. <p> 如果你要使用 PPP 连接区域网路到网际网路上,那麽你将得知道一些关於 TCP/IP 网路运作的知识. 补充一点这份文件前面提到的资料,你将会发现 O'Reilly 出版的 "TCP/IP Network Administration" 以及 "Building Internet Firewalls" 很有好处! <sect1>有用的 Linux 电子邮递列表 <p> 有许多在不同使用者等级之间流通的电子邮递列表(mailing lists). 选择你有兴趣以及对你专业知识及观点有所帮助的列表来订阅. <p> <bf/一些忠告/: 有些列表是给那些"专家级"使用者或是特殊主题的. 虽然没有人会抱怨你"潜伏"(订阅但不发表文章)在里面, 不过如果你在不适合的列表中提出"新手"的问题你可能会收到一些愤怒的意见. <p> 这并不是因为专家级的使用者讨厌新进的使用者,而是因为这些列表是用来处理具有一定困难度的特殊主题的. <p> 加入那些可以公开订阅的列表,但请局限你的意见於列表的相关主题上面. <p> Linux 电子邮递列表一个很好的起点是 <url url="http://summer.snu.ac.kr/~djshin/linux/mail-list/index.shtml" name="Linux Mailing List Directory">. <sect>将 PPP 设定为客户端的工作概要 <p> 这份文件包含了许多资讯 - 而且每次改版又不断增加! <p> 因此,本节的目的在於提供一简短的概要说明要将你的 Linux 系统作为客户端连接到 PPP 伺服器所需的工作. <sect1>取得/安装软体 <p> 如果你的 Linux 套件并未包含 PPP 软体,你可从此取得: <url url="ftp://sunsite.unc.edu/pub/Linux/system/network/serial/ppp/ppp-2.2.0g.tar.gz" name="the Linux PPP daemon">. <p> 这是本文件撰写的时候最新正式版本.然而,尽量从该站取的最新的版本(本文件撰写时 ppp-2.3 尚在 beta 阶段而且应该很快会发行). <p> 这份 PPP 套件包含了如何编译及安装所需的指引,<bf/因此本文并不包含此部份/! <sect1>编译核心加入 PPP 支援 <p> Linux 的 PPP 运作包含两部份 <itemize> <item>上面提到的 PPP daemon <item>PPP 的核心支援 </itemize> <p> 许多套件似乎在它们预设的安装核心中提供 PPP 的支援,但其馀则否. <p> 如果在启动时核心报告这样的讯息 <code> PPP Dynamic channel allocation code copyright 1995 Caldera, Inc. PPP line discipline registered. </code> <p> 你的核心已编译 PPP 支援在内. <p> 那就是说,不论你使用什麽套件你可能希望自行编译核心以在你的特定硬体配置之下得到最有效的系统资源利用. 请记住核心不能被置换出记忆体因此尽量让核心保持最小在记忆体有限的机器上相当有用. <p> 本文件在 <ref id="Kernel configuration" name="配置你的 Linux 核心"> 一节提供了重新编译核心的最少说明. <p> 细节部份请参阅 <url url="Kernel-HOWTO.html" name="The Linux Kernel HOWTO">. <sect1>从你的 ISP 取得资讯 <p> 几乎有无数种设定 PPP 伺服器的方法. 为了连上你的 ISP, 你必须取得 PPP 伺服器如何运作的资讯. <p> 因为你用的是 Linux, 在一些仅知道 MS Windows 客户端的 ISP 谘询部门可能会遭遇困难. <p> 然而,愈来愈多的 ISP 使用 Linux 提供服务 - 而且 Linux 也渗入公司环境,如果你真的遇到问题你也可能会很幸运. <p> <ref id="Server info" name="取得你所需的 PPP 伺服器资讯"> 一节告诉你需要知道你连接的 PPP 伺服器的什麽资讯 - 以及如何找出这些资讯. <sect1>设定你的数据机及串列埠 <p> 为了连上 PPP 伺服器并取得最佳的资料传输速率,你的数据机必须设定正确. <p> 同样地,连接数据机及电脑的串列埠也必须正确地设定. <p> <ref id="Modem" name="设定你的数据机及串列埠"> 一节提供这方面的资讯. <sect1>建立名称到位址解析(DNS) <p> 除了执行 PPP 及自动签入 PPP 伺服器的档案之外,还有一些文字配置档案必须设定, 以便让你的电脑能将像这样的名称 <tt/www.interweft.com.au/ 解析为 IP 位址以便真正与那台电脑连线. 这些档案是:- <itemize> <item><tt>/etc/resolv.conf</tt> <item><tt>/etc/host.conf</tt> </itemize> <p> <ref id="DNS" name="建立名称到位址解析"> 一节提供这方面的设定细节. <p> 特别地,你并<bf/不需要/在你的 Linux PC 上执行名称伺服器以连接到网际网路上(虽然或许你会想这麽做). 你所需的只是知道至少一部你能使用的名称伺服器 IP 位址(最好是你的 ISP 所提供的). <sect1>PPP 与 root 权限 <p> 因为在你的 Linux 电脑与另一个 PPP 伺服器建立连结需要操作网路界面(PPP 界面是一个网路界面)与核心的路由表,pppd 需要使用 root 的权限. <p> 细节部份,参阅 <ref id="root" name="使用 PPP 与 root 权限"> 一节. <sect1>检查你的 PPP 套件档案及设定 PPP 选项 <p> 有好几个配置及拨号档案需要建立以便让 PPP 运作.在 PPP 套件中有一些□例,而本节告诉你应有的这些档案是什麽:- <code> /etc/ppp/options /etc/ppp/scripts/ppp-on /etc/ppp/scripts/ppp-on-dialer /etc/ppp/options.tpl </code> <p> 看你想用 PPP 达到的目标是什麽你可能需要一些额外的档案:- <code> /etc/ppp/options.ttyXX /etc/ppp/ip-up /etc/ppp/pap-secrets /etc/ppp/chap-secrets </code> <p> 除此之外,PPP daemon 有大量的线上选项,正确地使用是很重要的; 因此本节带你看这些标准 PPP 选项并帮助你选择你应使用的选项. <p> 细节部份,请参阅 <ref id="options" name="设定 PPP 连接档案"> 一节. <sect1>如果你的 PPP 伺服器使用 PAP 认证(Password Authentication Protocol) <p> 许多 ISP 设立 PPP 伺服器使用 PAP 认证.如果你的伺服器<bf/并不/使用 PAP (如果你可以用手动签入并收到标准的使用者名称/密码提示符号那麽它并未使用 PAP),那麽你可以跳过此节. <p> 取代在进入伺服器时出现提示符号输入使用者名称及密码的是,使用 PAP 的 PPP 伺服器并不需要文字模式的签入方式. <p> 使用者认证是连接控制协定(link control protocol, LCP)的一部份,在建立 PPP 连线之初期交换的资讯. <p> <ref id="pap" name="如果你的 PPP 伺服器使用 PAP 认证(Password Authentication Protocol)"> 一节提供你使用 PAP 建立 PPP 连结所需档案的资讯. <sect1>以手动方式连接至 PPP 伺服器 <p> 已经建立完基本的档案之後,透过手动(使用 minicom 或 seyon)的方式连接及启动你 Linux PC 的 pppd 来测试是个不错的主意. <p> 参见 <ref id="manual" name="以手动方式建立 PPP 连结"> 说明设定的细节部份. <sect1>使你的 PPP 连结自动化 <p> 一旦你成功地用手动方式签入,你可以试著建立一指令稿以自动建立此连结. <p> <ref id="automate" name="使你的连结自动化 - 创造连结指令稿"> 一节包含了建立所需的指令稿,以及相当多的注意力集中在 <tt/chat/ 命令於 PPP 伺服器的签入过程. <p> 这节也讨论了使用指令稿於 PAP/CHAP 认证的伺服器上. <sect1>结束连结 <p> 一旦你的连结能够建立并正常正作,你必需能够结束连结. <p> 这在 <ref id="off" name="结束 PPP 连结"> 一节说明. <sect1>如果你遭遇问题 <p> 许多人无法让 PPP 正常地工作.PPP 伺服器的种类以及和它们建立连线的方法有非常多种. 类似地,PPP 有许多的选项 - 而有些选项是不能一起用的. <p> 除了签入并起始 PPP 服务的问题之外,数据机本身及电话线路也可能会有问题. <p> <ref id="problems" name="解决问题"> 一节提供一般错误的基本资讯,以及如何分离并解决的方法. <p> 这里提供的<bf/不过/是基本的资讯.Al Longyear 所维护的 PPP-FAQ 包含了更多这一方面的资讯! <sect1>建立连结之後 <p> 一旦 PPP 连结可以运作了(特别地,一旦 IP 层可以运作),Linux 的 PPP 可以自动执行(以 root 身份)一指令稿完成<bf/任何/你想达成的功能. <p> <ref id="ip-up" name="建立连结之後"> 一节提供 <tt>/etc/ppp/ip-up</tt> 指令稿的资讯, 它如何接收 PPP 传来的参数以及如何利用它来做一些像自 ISP 取回你的电子邮件, 送出在你机器伫列中存放的邮件等等工作. <sect1>动态 IP 连接提供标准 IP 服务的问题 <p> 就像在简介一节里指出的,动态 IP 号码影响你的 Linux PC 作为网际网路伺服器的能力. <p> <ref id="dynamic-server" name="动态 IP 连接提供标准 IP 服务的问题"> 一节提供(主要)受影响的服务以及你所能做(如果有的话)的克服办法. <sect>配置你的 Linux 核心<label id="Kernel configuration"> <p> 为了要能够使用 PPP,你编译的 Linux 核心必须包含 PPP 的支援. 如果你还没有 Linux 的原始程式码请先取得 - 在 Linux 的档案系统标准中它是放在 <tt>/usr/src/linux</tt> 里面. <p> 检查这个目录 - 许多的 Linux 套件会在安装过程中安装此原始程式码(档案及次目录). <p> 在启动时,你的 Linux 核心会印出大量的讯息.如果核心支援 PPP 的话会包含此一讯息. 要观看这些讯息的话,看看你的系统记录档或用 <tt/dmesg | less/ 指令将这些讯息显示在萤幕上. 如果核心支援 PPP 的话你将会看到像这样的几行 <code> PPP Dynamic channel allocation code copyright 1995 Caldera, Inc. PPP line discipline registered. </code> <p> (这是 Linux 2.0.x 系列核心的讯息). <p> Linux 核心的原始程式可以从 <tt/sunsite.unc.edu/ 或其映射节点取得. <sect1>安装 Linux 核心原始程式码 <p> 下面是简短的取得及安装 Linux 核心原始程式码的指示.详细的资讯可以在 <url url="Kernel-HOWTO.html" name="The Linux Kernel HOWTO"> 中找到. <p> 为了安装及编译核心,你必须以 root 的身份签入. <enum> <item>切换到 <tt>/usr/src</tt> 目录下<newline> <tt>cd /usr/src</tt> <item>检查 <tt>/usr/src/linux</tt> 看看你是否已经安装了原始程式码. <item>如果没有的话,由 <url url="ftp://sunsite.unc.edu/pub/Linux/kernel/v2.0" name="Linux kernel source directory"> 或离你最近的映射节点取回.<newline> 如果你想找更旧版本的核心(例如 1.2.X),可到 <url url="ftp://sunsite.unc.edu/pub/Linux/kernel/old" name="Old Linux kernel source directory"> 找找. <item>选择适当的核心 - 通常是最近的版本.取回後将此 'tar' 压缩档放在 <tt>/usr/src</tt>.<newline> <bf/注意/: 一个 'tar' 档案是一种压缩档 - 可能压了许多档案和目录在里头.它相当於 DOS 下的 zip 档案. <item>如果你已经安装了原始程式,但想要升级到新版的核心,你必须先移除旧的程式码.用这个指令<newline> <tt>rm -rf /usr/src/linux</tt> <item>用这个指令解压缩<newline> <tt>tar xzf linux-2.0.XX.tar.gz</tt> <item>然後,<tt>cd /usr/src/linux</tt> 并看看 README 档.里头包含了完整的解释如何配置及编译新核心. 仔细阅读这个档案(将它印出来放在手边是个好主意,直到你已做了足够多次知道怎麽办). </enum> <sect1>□解你的硬体 <p> 如果你要重新编译你的核心你<bf/必须/知道在你 PC 里面的界面卡/设备!! 对於某些设备(像是音效卡)你也得知道各种设定(像是硬体中断号码,输出入位址以及诸如此类的资讯). <sect1>编译核心 - Linux 1.2.13 核心 <p> 要开始配置程序,首先依照在解说档里的说明适当地安装原始程式码.然後以下面的指令开始核心的配置程序 <tscreen><verb>make config</verb></tscreen> <p> 为了要能够使用 PPP ,你必须配置核心包含 PPP 的支援(使用 PPP 需要 pppd 以及核心的 PPP 支援两者). <code> PPP (point-to-point) support (CONFIG_PPP) [n] y </code> <p> 根据在你 PC 里面的硬体以及你想要的 Linux 作业系统特色回答其它的配置问题.然後继续依照该解说档来编译并安装你的新核心. <p> 核心 1.2.13 只要制造四个 PPP 装置.对於多埠卡(multi-port serial cards)来说,你必须修改核心 PPP 的原始程式以便得到更多埠的支援. (参见随附 PPP-2.1.2 套件而来的 README.linux 档案说明你需要做的细节部份). <p> 注意: 核心 1.2.13 的配置对话不允许你回头 - 因此如果你在 <tt/make config/ 对话中答错问题,用 <tt/CTRL-C/ 跳出来重新开始. <sect1>编译核心 - Linux 1.3.x 及 2.0.x 核心 <p> 对於 Linux 2.0.x 的核心,你可以使用类似 Linux 1.2.13 的程序. 再一次,依照在解说档里的说明适当地安装原始程式码.然後以下面的指令开始核心的配置程序 <tscreen><verb>make config</verb></tscreen> <p> 然而,你也有另外的选择 <tscreen><verb>make menuconfig</verb></tscreen> <p> 这提供一个以选单为基础配合线上辅助的配置系统,允许你在配置程序中随意所之. <p> 也有一个以 X windows 为基础的配置界面 <tscreen><verb>make xconfig</verb></tscreen> <p> 你可以直接编译 PPP 的支援到核心里去或者是做成可载入模组. <p> 如果你只在你 Linux 机器运作的一部份时间里使用 PPP 的话,那麽建议你把 PPP 的支援编译为可载入模组. 使用 'kerneld',你的核心将会在你开始你的 PPP 连结程序时自动载入提供 PPP 支援所需的模组. 这节省了宝贵的记忆体空间(因为核心没有任何一个部份可以被置换到记忆体外,但可载入模组在未使用时会自动被移除). <p> 要这样做的话,你需要打开可载入模组的支援: <code> Enable loadable module support (CONFIG_MODULES) [Y/n/?] y </code> 要加入 PPP 的核心支援,回答下列这个问题:- <code> PPP (point-to-point) support (CONFIG_PPP) [M/n/y/?] </code> <p> 要做成可载入模组的话,回答 <bf/M/ 即可,否则就编译成核心的一部份,回答 <bf/Y/ 就是. <p> 与 1.2.13 的核心不同的是,2.0.x 的核心视需要自动建立 PPP 设备并且一点都不需要去研究原始程式码以增加可用的 PPP 设备. <sect1>PPP-2.2 与 <tt>/proc/net/dev</tt> 的注意事项 <p> 如果你在使用 PPP-2.2,你会发现建立 PPP 装置的一个副作用就是如果你观察 <tt>/proc/net</tt> 档案系统看不到 PPP 的装置, 直到开始使用 pppd 装置才会被建立起来:- <code> [hartr@archenland hartr]$ cat /proc/net/dev Inter-| Receive | Transmit face |packets errs drop fifo frame|packets errs drop fifo colls carrier lo: 92792 0 0 0 0 92792 0 0 0 0 0 eth0: 621737 13 13 0 23 501621 0 0 0 1309 0 </code> <p> 一旦你有一个(或更多) PPP 服务启动後,你会看到像这样的项目(从一部 PPP 伺服器上取得):- <code> [root@kepler /root]# cat /proc/net/dev Inter-| Receive | Transmit face |packets errs drop fifo frame|packets errs drop fifo colls carrier lo: 428021 0 0 0 0 428021 0 0 0 0 0 eth0:4788257 648 648 319 650 1423836 0 0 0 4623 5 ppp0: 2103 3 3 0 0 2017 0 0 0 0 0 ppp1: 10008 0 0 0 0 8782 0 0 0 0 0 ppp2: 305 0 0 0 0 297 0 0 0 0 0 ppp3: 6720 7 7 0 0 7498 0 0 0 0 0 ppp4: 118231 725 725 0 0 117791 0 0 0 0 0 ppp5: 38915 5 5 0 0 28309 0 0 0 0 0 </code> <sect1>配置核心的一般考量 <p> 如果你要把你的 Linux PC 设为一台 PPP 伺服器的话,那麽你必须把 IP forwarding 的支援编译进去. 如果你想使用 Linux 连接两个区域网路或将区域网路连接到网际网路上的话这个选项也是需要的. <p> 如果你要连接一个区域网路到网际网路上(或者甚至只是连接两个区域网路),你应该要关心安全上的问题.在核心中加入 IP firewalls 的支援可能是必须的! <p> 如果你想要用 IP 伪装连接使用前述任何一个‘未连线’IP 网路号码的区域网路那麽你也需要这个配置. <p> 要使用 IP 伪装与 IP firewalling,你<bf/必须/在 <tt/make config/ 过程中的第一个问题上回答 yes:- <code> Prompt for development and/or incomplete code/drivers (CONFIG_EXPERIMENTAL)? </code> <p> 虽然这听起来对新使用者有些困难,许多人仍愉快地使用 Linux 2.0.X 核心的 IP 伪装与 IP firewalling 功能而没有问题. <p> 一旦你完成新核心的安装以及重新启动之後,你就可以开始配置并测试你的 PPP 连结. <sect>取得你所需的 PPP 伺服器资讯<label id="Server info"> <p> 在你可以建立到某台伺服器的 PPP 连线之前,你需要取得下列的资讯(从 PPP 伺服器的系统管理/使用者支援人员取得):- <itemize> <item>拨接服务的电话号码<newline> 如果你是在私用交换机(PABX)系统下,你还需要拨出外线信号的私用交换机号码 - 通常是 0 或 9. <item>伺服器使用动态或静态的 IP 号码?<newline> 如果伺服器使用静态的 IP 号码,那麽你需要知道在 PPP 连线中你这端要使用哪个 IP 号码. 如果你的 ISP 提供你一合法 IP 号码的次网路,你需要知道你能使用的 IP 号码及网路遮罩.<newline> 大部分的网际网路服务提供者都使用动态的 IP 号码.如前述,这对於你可以使用的服务会有些限制.<newline> 然而,即使你使用静态的 IP 号码,大部份的 PPP 伺服器也不允许(为了安全理由)客户端自行指定 IP 号码,因为这有安全风险. 你仍然<bf/必须/知道这些资讯. <item>ISP 的领域名称伺服器 IP 号码是什麽?<newline> 虽然只需要一个但最少应该得要有两个.<newline> 这里可能会有一个问题.微软的 Windows 95 PPP 设定允许让 DNS 的地址在连线过程中传到客户端. 因此你的 ISP (或公司的谘询室)可能会告诉你不需要知道 DNS 伺服器的 IP 位址.<newline> 对於 Linux 来说,你<bf/必须/至少知道一个 DNS 的位址. 目前 Linux 的 PPP 实作中不允许在连立连线之时动态地指定 DNS 的 IP 号码 - 很可能将来也不会.<newline> <bf/注意/: 虽然,Linux (作为 PPP 的客户端)不能从伺服器中接受 DNS 的位址,然而,作为 PPP 伺服器时, 它可以用 pppd 的选项 <tt/dns-addr/ 为客户端指定这个资讯. <item>该伺服器是否需要使用 PAP/CHAP?<newline> 如果是这样你需要知道你用来连线 "id" 以及 "secret" .(这大概会是你的在这个 ISP 的使用者名称以及密码). <item>伺服器会自动起动 PPP 或者在一旦你签入之後需要发出任何指令来起动伺服端的 PPP?<newline> 如果你必须下某个指令来起动 PPP 的话,它是什麽? <item>如果伺服器是微软的 Windows NT 系统,它是否使用微软的 PAP/CHAP 系统?<newline> 许多公司的区域网路似乎是使用 Windows NT 的系统以增加安全性. </itemize> <p> 仔细地注意这些资讯 - 你马上要使用它们! <sect>设定你的数据机及串列埠<label id="Modem"> <p> 你应该确认你的数据机设定正确而且你知道它连接到哪个串列埠. <p> <bf>谨记</bf>:- <itemize> <item>DOS com1: = Linux /dev/cua0 (and /dev/ttyS0) <item>DOS com2: = Linux /dev/cua1 (and /dev/ttyS1)<newline> 等等 </itemize> <p> 还要提醒你就是如果你有四个串列埠,标准 PC 上让 com1 与 com3 共用 IRQ4 且让 com2 与 com4 共用 IRQ3. <p> 如果你有其它机装置和串列埠共用一个 IRQ 的话可能会有问题. 你必须确定你的数据机串列埠拥有它自己,唯一的一个 IRQ.许多现在的串列埠卡(与品质较佳的主机板上的串列埠)允许你将串列埠上的 IRQ 移开. <p> 如果你在用 Linux 2.0.X 核心,你可以用 <tt>cat /proc/interrupts</tt> 检查使用中的 IRQ,你会看到像这样的输出结果 <code> 0: 6766283 timer 1: 91545 keyboard 2: 0 cascade 4: 156944 + serial 7: 101764 WD8013 10: 134365 + BusLogic BT-958 13: 1 math error 15: 3671702 + serial </code> <p> 这里显示了一个串列埠在 IRQ4 (一个滑鼠)与一个串列埠在 IRQ15. (也有一串列埠在 com2, IRQ3 与 com4 是在 IRQ14,但并未使用,没有显示出来). <p> 请小心 - 如果你要调你的 IRQ 的话你要确实知道你在做些什麽! 你不只需要打开你的电脑外壳,将界面卡拔下并调整 jumper,你还需要知道那个占用什麽 IRQ. 以我的例子来说,这完全是以 SCSI 为主的 PC,因此我将主机板上的通常会占用 IRQ14 与 15 的 IDE 界面关掉. <p> 你还需要注意如果你的 PC 还跑了其它的作业系统,更动 IRQ 的位址可能使那个作业系统启动不正常,或根本开不了机! <p> 如果真的将串列埠移到了非标准的 IRQ,那麽你需要告诉 Linux 每一个埠所用的 IRQ 位址. 这可以用 <tt/setserial/ 指令达成,而且最好将它放到 <tt/rc.local/,或在 SysV 系统中由 <tt/rc.local/ 所呼叫的 <tt/rc.serial/ 里面成为开机过程的一部份. 以我上面所列的机器来说,用这样的指令 <code> /bin/setserial -b /dev/ttyS2 IRQ 11 /bin/setserial -b /dev/ttyS3 IRQ 15 </code> <p> 然而,如果你使用由 <tt/kerneld/ 行程所负责的动态载入串列模组,你不能像这样每次开机时设定一次 IRQ 後就把它忘了. 这是因为如果串列模组被移除,Linux 就会忘了这些特殊的设定. <p> 因此,如果你以动态方式载入串列模组,你必须要在每入载入模组时重新设定 IRQ 才行. <sect1>串列埠与速度相容性的注意事项 <p> 如果你使用高速(外接式)数据机(14,400 baud 或更高),你的串列埠速度必须能够处理这种数据机所产生的资料量,特在是当数据机在压缩资料时. <p> 你的串列埠需要一种新型的 UART (Universal Asynchronous Receiver Transmitter),像是 16550(A). 如果你在使用一部旧的机器(或旧的串列卡),很可能串列埠上只有旧的 8250 UART,这在你使用高速数据机时可能会发生问题. <p> 使用这个指令 <tscreen><verb>setserial -a /dev/ttySx</verb></tscreen> <p> 让 Linux 回报你使用的 UART 类型.如果你没有 16550A 型的 UART,去买一块新的串列卡(不到 $50). 当你买一块新卡时,确定你能调整上面的 IRQ! <p> 注意: 最早版本的 16550 UART 晶片上有瑕疵.这点很快就被发现了而且也发行了新版的晶片 - 16550A UART. 但仍有少部份有瑕疵的晶片流入了市面.虽然不太可能刚好就让你买到,但你还是应该看一下晶片类型是不是 16550A,特别是在一些较早期的串列卡上. <sect1>串列埠名称 <p> 以前,Linux 用 <tt/cuaX/ 表示拨出的串列埠名而 <tt/ttySx/ 表示拨入的名称. <p> 自核心 2.0.X 之後这样的要求已经改变了,所以你应该可以用 <tt/ttySx/ 同时表示拨入及拨出的名称. 据我了解 <tt/cuaX/ 的装置名称在未来版本的核心中可能会取消. <sect1>配置你的数据机 <p> 为使用 PPP 你将得正确地配置你的数据机 - 要完成这件工作请阅读你的数据机使用手册! 大部分的数据机都有 PPP 所需求的的<bf>出厂预设选项</bf>. 最基本的配置是:- <itemize> <item>硬体流量控制 (RTS/CTS) (&K3 在许多采用 Hayes 指令集的数据机) </itemize> <p> 你应该要研究的其它设定(使用标准 Hayes 指令)是: <itemize> <item>E1 开启指令的本地回应 (chat 运作所需) <item>Q0 回报执行结果代码 (chat 运作所需) <item>S0=0 关闭自动回应 (除非你想让你的数据机接听电话) <item>&C1 只在连线之後侦测载波 <item>&S0 Data Set Ready (DSR)永远设为开启 <item>(看情况) Data Terminal Ready </itemize> <p> 有一个站台提供你不断增加的数据机款式的设定,可能会对你有所帮助,在 <url url="http://www.in.net/info/modems/index.html" name="Modem setup information">. <p> 在你的电脑与数据机之间的数据机串列面界面如何运作也值得研究了解. 大部分现代的数据机都允许你以固定的速度使用串列界面,即使电话线路界面切换到最高的速度它跟远端数据机都能够处理. <p> 这称为 split speed operation.如果你的数据机能支援这项功能,把数据机的串列界面锁定在它的最高速度(通常是 115,200 baud ,但对 14,400 数据机来说可能是 38,400 baud). <p> 使用你的通讯软体(例如 minicom)找出关於你数据机的配置资讯并且设为 PPP 所需的设定. 许多数据机会在 AT&V 指令的回应中回报它们目前的设定状况,但是你应该查看一下你的数据机使用手册. <p> 如果你把设定全都弄乱了,那麽你可以藉由发出 AT&F 指令回到稳定状态(通常可以) - 回到出厂设定. (在我遇过的大部分现代数据机中,出厂的设定包含所有使用 PPP 所需的设定 - 但是你应该做个检查). <p> 一旦你找出了必要的设定字串就把它写下来.然後你必须做个决定: 你可以将这些设定值存在数据机上的非挥发性记忆体中这样可以用适当的 AT 指令就可叫出. 另一个做法是将这些正确的设定在 PPP 的拨号过程中传入. <p> 如果你只从 Linux 下使用数据机连接到 ISP 伺服器,最简单的做法就是将这些设定值存入数据机上的非挥发性记忆体(non-volatile RAM). <p> 另一方面,如果你要还在其它的应用程式或作业系统上使用数据机,最保险的做法是在每次拨号时才将这些资讯传入, 如此可以确保在每次拨号时数据机总是在正确的状态.(记下这些设定字串还有个好处就是在数据机遗失了记忆体的内容时,这确实可能发生). <sect1>串列流量控制注意事项 <p> 当资料在串列通讯线路上流动的时候,可能会发生资料到达的比电脑能处理的还要快这种情况(电脑可能忙著做其它的事 - 记得,Linux 是一个多使用者,多工的作业系统). 为了确保资料不会漏失(在缓冲区中的资料不会超载而因此漏失掉),需要某些控制资料流量的方法. <p> 有两种方法可以在串列线路上达成这个目的:- <itemize> <item>使用硬体信号(Clear To Send/Request to Send - CTS/RTS) <item>使用软体信号(control S and control Q, also known as XON/XOFF). </itemize> <p> 虽然後者用在终端机(文字)连结上可能很好,但是在 PPP 上的资料使用整个 8 bits 编码空间 - 而且在资料中的某个地方相当可能存在会被转成 control S 以及 control Q 的位元组. 所以,如果数据机设成使用软体流量控制的话,那麽传输很容易被扰乱! <p> 对於使用 PPP 的高速连结(使用 8 bits 资料编码)来说硬体流量控制是很重要的,因此你必须使用硬体流量控制. <sect1>测试你的数据机的拨出功能 <p> 在你完成了串列埠与数据机的设定之时试著拨到你的 ISP 上看看能否连上以确定设定是否有误. <p> 使用你的终端机通讯软体(像是 minicom),拨到你想使用 PPP 连线的那台 PPP 伺服器. <p> (注意: 在这个阶段我们并不尝试建立 PPP 连线 - 只是要证实我们拥有正确的电话号码以及为了签入并且起动 PPP 而<bf/确实地/找出伺服器究竟传送给我们什麽讯息). <p> 在这个过程中,可以截取(记录到一个档案里)整个签入的过程或者是小心地(非常小心地)确实写下远端伺服器所给你提示输入你的使用者名称以及密码的讯息(以及任何建立 PPP 连线需要下达的指令). <p> 如果你的伺服器使用 PAP,你可能不会看见签入的提示符号,而是(以文字表示的)连结通讯协定(看起来像是垃圾)出现在你的萤幕上. <p> 一些警告:- <itemize> <item>某些伺服器相当聪明: 你可以用文字模式的使用者名称/密码方式或使用 PAP 签入. 因此如果你的 ISP 或公司站台使用 PAP 但你没有立刻在萤幕上看到垃圾,也并不表示你做错了. <item>某些站台要求你先输入一些起始的文字<em/然後/才启动标准的 PAP 程序. <item>某些 PPP 伺服器是被动的 - 它们就坐在那里等待而不送出任何资料,直到客户端拨入并送出合法的连结控制协定. 如果你要连接的 PPP 伺服器是被动模式的,你将不会看到任何垃圾! <item>某些伺服器在你按下 <tt/ENTER/ 前不会启动 PPP - 因此如果你正确签入但未看到垃圾的话可以试试! </itemize> <p> 这最少值得拨接两次 - 某些伺服器会在每次你签入时改变提示(例如依时间改变!). 你的 Linux 机器在每次你拨入的时候要能够辨认的两个主要的提示是:- <itemize> <item>要求你输入使用者名称的提示; <item>要求你输入密码的提示; </itemize> <p> 如果你必须发出某个指令来起动伺服端的 PPP,那麽你也需要找出一旦你签入之後伺服器所给你输入指令以启动 PPP 的提示. <p> 如果你的伺服器自动起动 PPP 的话,一旦你签入完成,你将开始见到萤幕上出现垃圾 - 这是 PPP 伺服端传送给你的机器以起动并且配置 PPP 连线的资讯. <p> 这看起来应该会是像这样的东西:- <code> ~y}#.!}!}!} }8}!}$}%U}"}&} } } } }%}& ...}'}"}(}"} .~~y} </code> <p> (而且它还会一直进来! ) <p> 在某些系统中 PPP 必须在伺服端上明确地加以起动.这通常是因为该伺服器被设定成允许使用相同使用者名称/密码配对来做 PPP 签入及一般使用界面(shell) 的签入. 如果是这样,一旦你签入就发出该指令.再一次,你将会见到 PPP 连线伺服端起动的垃圾资讯 - 所以现在你可以挂断了. <p> 如果你没有在连上时立即在萤幕上看到这些垃圾(如果必要的话先签入并启动 PPP 伺服器), 按下 <bf/Enter/ 试试能否启动 PPP 伺服器... <p> 这个时候,你就可以挂断你的数据机(通常是,快速地键入 <tt>+++</tt> 一旦你的数据机回应 OK 然後接著下 ATHO 指令). <p> 如果你不能使你的数据机运作的话,阅读你的数据机使用手册,你通讯软体的线上使用手册以及 Serial HOWTO! 一旦你解决该问题,继续进行前面所说的. <sect>建立名称到位址解析(DNS)<label id="DNS"> <p> 虽然我们人类喜欢给事物取个名称,电脑喜欢数字. 在 TCP/IP 网路上(这也就是网际网路),我们藉由特定的名称呼叫某台机器,而且每台机器都存在於一个特定的领域标记里面. 举例而言,我的 Linux 工作站称为 <bf>archenland</bf> 而它是存在於 <bf>interweft.com.au</bf> 这个领域里. 所以它在人们心目中的位址就是 <bf>archenland.hedland.edu.au</bf>. (称为 FQDN - fully qualified domain name.) <p> 然而,为了使网际网路上的其它电脑找的到这台机器,事实上电脑在网际网路上沟通时它是藉由其 IP 号码来认知的. <p> 把机器(以及领域)的名称转译(解析)成为在网际网路上所实际使用的 IP 号码是提供领域名称服务之机器的工作. <p> 它是这样子运作的:- <itemize> <item>你的机器需要知道某部特定电脑的 IP 位址.需要这项资讯的应用程式向你的 Linux PC 上的'名称解析器'询问此资讯; <item>名称解析器查询机器内部的主机名称档案(可能是 <tt>/etc/hosts</tt> 以及/或是知道这项资讯的领域名称伺服器,而名称解析器实际的行为由 <tt>/etc/host.conf</tt> 档案决定); <item>如果答案在主机名称档案中,就以此答案回答; <item>如果是在指定的领域名称伺服器中,你的 PC 就向该机器询问; <item>如果这部领域名称伺服器已经知道被询问名称的 IP 号码,就以此回答.否则,它会透过网际网路向其它的名称伺服器找寻资讯. 最後这部名称伺服器会将资讯传回给原来询问的名称解析器,然後传给要求此资讯的应用程式. </itemize> <p> 当你创造出 PPP 连线时,你需要告诉你的 Linux 机器它可以在哪里找到主机名称对照到 IP 号码(位址解析)的资讯,如此<bf/你/就可以使用机器的名称而<bf/你的电脑/可以把这些名称转译成它运作所需的 IP 号码. <p> 一个方法是输入所有你想联络的主机到 <tt>/etc/hosts</tt> 档案里(如果你是连上网际网路的话这真的是完全不可能的事); 另一个方法是使用相对於机器名称的 IP 号码(要记得全部的 IP 位址是不可能的除非在最小的区域网路上). <p> 最好的方法是设定你的 Linux 使它知道该到哪取得这项名称到号码的资讯 - 自动地. 这项服务是由领域名称伺服器系统所提供.需要做的全部工作是把 IP 号码输入到你的 <tt>/etc/resov.conf</tt> 档案里. <sect1><tt>/etc/resolv.conf</tt> 档案 <p> 你的 PPP 伺服器系统管理/使用者支援人员应该要提供给你两个 DNS 的 IP 号码(只需要一个 - 但是两个在出问题时可以多些帮助). <p> 如前所述,Linux 不能以像 MS Windows 95 一样的方式来设定它的名称伺服器的 IP 号码. 所以你必须(有礼貌地)<bf/坚持/你的 ISP 提供你这项资讯! <p> 你的 <tt>/etc/resolv.conf</tt> 看起来应该会像这样: <code> domain your.isp.domain.name nameserver 10.25.0.1 nameserver 10.25.1.2 </code> <p> 编辑这个档案(如果没有的话就建一个新的)以呈现你的 ISP 提供的资讯.它的拥有者以及权限应该像下面这样:- <tscreen><verb> -rw-r--r-- 1 root root 73 Feb 19 01:46 /etc/resolv.conf </verb></tscreen> <p> 如果你因为本来就在区域网路上所以已经设立 <tt>/etc/resolv.conf</tt> 档案的话,只要简单的把 PPP 连线的 DNS 伺服器 IP 号码加到你已有的档案里即可. <sect1><tt>/etc/host.conf</tt> 档案 <p> 你也应该检查你的 <tt>/etc/host.conf</tt> 档案是否设定正确.它看起来应该像这样 <code> order hosts,bind multi on </code> <p> 它告诉你的名称解析器在向名称伺服器询问之前先使用主机名称档案中的资讯. <sect>使用 PPP 与 root 权限<label id="root"> <p> 因为 PPP 需要设定网路设备,变更核心递送表格以及诸如此类的动作,所以它需要以 root 的权限来做这些事. <p> 如果 root 以外的使用者要能建立 PPP 连线,那麽 pppd 程式应该设为以 root 的身分执行(setuid):- <tscreen><verb>-rwsr-xr-x 1 root root 95225 Jul 11 00:27 /usr/sbin/pppd</verb></tscreen> <p> 如果 <tt>/usr/sbin/ppd</tt> 不是设定为这样,那麽以 <bf>root</bf> 的身分下这个指令: <p> <tscreen><verb>chmod u+s /usr/sbin/pppd</verb></tscreen> <p> 这样是让 pppd 以 root 的权限执行,即使是由一般使用者所执行的. 这能让一般使用者执行的 pppd 具有必要的权限建立网路界面及核心递送表格. <p> 以 root 的身分执行的程式在安全上是潜在的漏洞,所以你对於设定为 'setuid' 的程式必须非常地小心. 许多地程式(包括 pppd)已经被小心地撰写以将用 root 的身分执行的危险降到最低,所以这样做应该是安全地(不过不保证). <p> 根据你希望你的系统如何运作而定,特别是如果你希望你系统里的任何使用者都能启始 PPP 连结,你应该把你的 ppp-on/off 指令稿设定为全部的人都可以读取/执行.(如果你的 PC 只由你使用那麽这样大概不错). <p> 然而,如果你不希望任何人都能起始 PPP 连线(例如,你的孩子在你的 Linux PC 上有帐号而你不希望他们在没有你的监督下连上网际网路),你将得建立一个 PPP 群组(编辑 <tt>/etc/group</tt> 档案)并且: <itemize> <item>将 pppd 设定为以 root 的权限执行,拥有者是 root 而群组是 PPP,而其它的权限都关闭.它看起来应该像这样 <tscreen><verb>-rwsr-x--- 1 root PPP 95225 Jul 11 00:27 /usr/sbin/pppd</verb></tscreen> <item>使 ppp-on/off 指令稿由使用者 root 以及群组 PPP 所拥有 <item>使 ppp-of/off 指令稿能由群组 PPP 读取/执行 <tscreen><verb> -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 </verb></tscreen> <item>关闭其它的存取权限 <item>把能够起动 PPP 的使用者加入 /etc/group 档案的 PPP 群组里 </itemize> <p> 即使如此,一般使用者仍然无法以软体的方式中止连结. 执行 <tt/ppp-off/ 指令稿需要 root 的权限.然何,任何使用者都可以关掉数据机(或将电话线由内接式数据机拔下). <p> 另外一种(更好的)办法,允许使用者使用 <tt/sudo/ 来起动 ppp 连结. 这样可以提供更佳的安全性并且可以让你设定让任何(可信任的)使用者使用指令稿来启动/结束连结. 使用 <tt/sudo/ 可以让一位可信任的使用者乾净而安全地启动/结束 PPP 连结. <sect>设定 PPP 连接档案<label id="options"> <p> 你必须以 <bf/root/ 身份签入来建立这些目录并且编辑这些设立 PPP 连线所需的档案,即使你想让所有的使用者都能使用 PPP. <p> PPP 使用几个档案来建立并设定 PPP 连结.这些档案在 PPP 2.1.2 与 2.2 中的名称与位置都不同. <p> 在 PPP 2.1.2 中这些档案是:- <code> /usr/sbin/pppd # PPP 执行档 /usr/sbin/ppp-on # 拨号/连线指令稿 /usr/sbin/ppp-off # 断线指令稿 /etc/ppp/options # 所有连线所使用的选项 /etc/ppp/options.ttyXX # 给某一特定通讯埠使用的选项 </code> <p> 在 PPP 2.2 中这些档案是:- <code> /usr/sbin/pppd # PPP 执行档 /etc/ppp/scripts/ppp-on # 拨号/连线指令稿 /etc/ppp/scripts/ppp-on-dialer # 拨号的 chat 指令稿部份 /etc/ppp/scripts/ppp-off # 断线指令稿 /etc/ppp/options # 所有连线所使用的选项 /etc/ppp/options.ttyXX # 给某一特定通讯埠使用的选项 </code> <p> Red Hat Linux 的使用者应注意标准的 Red Hat 4.X 安装将这些指令稿放在 <tt>/usr/doc/ppp-2.2.0f-2/scripts</tt>. <p> 在你的 <tt>/etc</tt> 目录里应该要有个目录: <tscreen><verb> drwxrwxr-x 2 root root 1024 Oct 9 11:01 ppp </verb></tscreen> <p> 如果它不存在的话 - 以这样的权限建立它. <p> 如果这个目录已经存在,它应该会包含一个称为 <bf>options.tpl</bf> 的选项档案样板.这个档案包括在下面. <p> 因为它包含所有 PPP 选项的解释所以请你把它印出来(配合 pppd 的线上使用手册来阅读将会是很有用的). 虽然你可以使用这个档案作为 <tt>/etc/ppp/options</tt> 档案的基础,但是建立你自己的,没有包含所有在这个样板里的指令的选项档案可能会更好 - 它会短得多而且比较容易阅读/维护. <p> 如果你有多个串列线路/数据机(典型的例子是 PPP 伺服器),那麽建立一个一般化的 <tt>/etc/ppp/options</tt> 档案,其中包含每个你提供支援拨入的串列埠所使用的共同选项并且为每一个需要个别设定以建立 PPP 连线的串列线路设立个别的选项档案. <p> 这些档案名为 <tt/options.ttyx1/, <tt/options.ttyx2/ 依此类推(其中 <tt/x/ 是你串列埠的适当代码). <p> 然而,对於单一 PPP 连线,你可以直接使用 <tt>/etc/ppp/options</tt> 这个档案.另外一种办法,你可以把所有的选项放进 pppd 指令作为参数. <p> 使用 <tt>/etc/ppp/options.ttySx</tt> 档案的设定方式会比较容易加以维护. 如果你使用 PPP 来连线到好几个不同的节点去的话,那麽你就可以在 <tt>/etc/ppp/options.site</tt> 里面为每个节点建立选项档案然後在你连线时指定选项档案作为 PPP 指令的参数. (使用 <tt/file option-file/ 参数於 pppd 的指令列). <sect1>替代的 options.tpl 档案 <p> 某些个 PPP 的发行套件似乎漏失了 options.tpl 这个档案,所以在这里有个完整的档案. 我建议你不要直接编辑这个档案来建立你自己的 <tt>/etc/ppp/options</tt>. 把它拷贝到一个新的档案然後编辑该档案比较好.如果你弄乱了你编辑的档案,你可以回头从原始档案再度开始. <code> # /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 # modem 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 modem to cause it to hang up if hardware modem 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 modem 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 modem control lines. On Ultrix, this option implies hardware # flow control, as for the crtscts option. (This option is not fully # implemented.) #modem # Set the MRU [Maximum Receive Unit] value to <n> for negotiation. pppd # will ask the peer to send packets of no more than <n> 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 <n>, 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. # This requires TWO WAY authentication - do NOT use this for a standard # PAP authenticated link to an ISP as this will require the ISP machine # to authenticate itself to your machine (and it will not be able to). #+pap # Don't agree to authenticate using PAP. #-pap # Require the peer to authenticate itself using CHAP [Cryptographic # Handshake Authentication Protocol] authentication. # This requires TWO WAY authentication - do NOT use this for a standard # CHAP authenticated link to an ISP as this will require the ISP machine # to authenticate itself to your machine (and it will not be able to). #+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 <d> 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 <d> # 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 <n>. 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 <n> # Set the name of the local system for authentication purposes to <n>. # This will probably have to be set to your ISP user name if you are # using PAP/CHAP. #name <n> # Set the user name to use for authenticating this machine with the peer # using PAP to <u>. # Do NOT use this if you are using 'name' above! #user <u> # Enforce the use of the host name 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 <n>. #remotename <n> # 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 <n> # 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 modem has hung up) in # situations where no hardware modem control lines are available. #lcp-echo-failure <n> # Set the LCP restart interval (retransmission timeout) to <n> seconds # (default 3). #lcp-restart <n> # Set the maximum number of LCP terminate-request transmissions to <n> # (default 3). #lcp-max-terminate <n> # Set the maximum number of LCP configure-request transmissions to <n> # (default 10). # Some PPP servers are slow to start up. You may need to increase this # if you keep getting 'serial line looped back' errors and your are SURE # that you have logged in correctly and PPP should be starting on the server. #lcp-max-configure <n> # Set the maximum number of LCP configure-NAKs returned before starting # to send configure-Rejects instead to <n> (default 10). #lcp-max-failure <n> # Set the IPCP restart interval (retransmission timeout) to <n> # seconds (default 3). #ipcp-restart <n> # Set the maximum number of IPCP terminate-request transmissions to <n> # (default 3). #ipcp-max-terminate <n> # Set the maximum number of IPCP configure-request transmissions to <n> # (default 10). #ipcp-max-configure <n> # Set the maximum number of IPCP configure-NAKs returned before starting # to send configure-Rejects instead to <n> (default 10). #ipcp-max-failure <n> # Set the PAP restart interval (retransmission timeout) to <n> seconds # (default 3). #pap-restart <n> # Set the maximum number of PAP authenticate-request transmissions to # <n> (default 10). #pap-max-authreq <n> # Set the CHAP restart interval (retransmission timeout for # challenges) to <n> seconds (default 3). #chap-restart <n> # Set the maximum number of CHAP challenge transmissions to <n> # (default 10). #chap-max-challenge # If this option is given, pppd will re-challenge the peer every <n> # seconds. #chap-interval <n> # 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 </code> <sect1>我应该使用什麽选项? (无 PAP/CHAP) <p> 嗯,完全视情况而定(唉).这里所提供的应该适用於大部份的伺服器. <p> 然而,如果它无法运作的话,阅读样板档(<tt>/etc/ppp/options.tpl</tt>) <bf/以及/ pppd 的线上使用手册<bf/并且/告诉你所连线之伺服器的系统管理/使用者支援人员. <p> 你还应该注意这里所展示的连结指令稿也使用了一些给 pppd 的命令列选项以便让事情容易调整些. <code> # /etc/ppp/options (NO PAP/CHAP) # # 避免 pppd 进入背景执行 -detach # # 使用数据机控制线 modem # 使用 uucp 形态的锁定档以避免它人取用串列装置 lock # 使用硬体流量控制 crtscts # 在递送表格中将此连结建立为预设递送装置 defaultroute # 不使用任何"逸出"控制序列 asyncmap 0 # 最大传送封包大小为 552 bytes mtu 552 # 最大接收封包大小为 552 bytes mru 552 # #-------END OF SAMPLE /etc/ppp/options (no PAP/CHAP) </code> <sect>如果你的 PPP 伺服器使用 PAP 认证(Password Authentication Protocol)<label id="pap"> <p> 如果你连接的伺服器需要 PAP 或 CHAP 认证,你需要多一点的工作. <p> 在上面的选项档案中,加上下面几行 <code> # # 告诉 pppd 使用你的 ISP 名称做为认证过程中的"主机名称" name <your ISP user name> # 你需要改变这一行 # # 如果你执行 PPP *伺服器* 并且需要使用 PAP 或 CHAP 认证,适当除去下面的 # 注解.不要在你做为客户端连上伺服器时使用此选项(即使它使用 PAP 或 CHAP) # 因为这是告诉伺服器必须为它自己在你的机器上提供认证(这几乎是不可能的, # 所以连结会失败). #+chap #+pap # # 如果你使用在 /etc/ppp/pap-secrets 档案中经编码的密码,除去下面一行的注解. # 注意: 这和 Windows NT 上的远端存取服务里的微软编码密码是不同的. #+papcrypt </code> <sect1>使用 MSCHAP <p> 微软的 Windows NT 远端存取服务(RAS)可以被设定为使用一种 CHAP(Challenge/Handshake Authentication Protocol) 的变种. 在你的 PPP 原始程式码中,你可以找到一个叫 <tt/README.MSCHAP80/ 的档案讨论这件事. <p> 你可以开启 pppd 的侦错功能判断伺服器是否要求使用此认证协定. 如果伺服器使用 MS CHAP 认证,你会看到这样的一行 <code> rcvd [LCP ConfReq id=0x2 <asyncmap 0x0> <auth chap 80> <magic 0x46a3>] </code> <p> 关键的讯息是 <bf/auth chap 80/. <p> 为了使用 MS CHAP,你必须重新编译 pppd 以支援此协定. 请参见 PPP 原始程式码中的 <tt/README.MSCHAP80/ 说明如何编译以使用此变种协定. <p> 你还要注意这里的程式码只是让 Linux PPP 做为客户端连接上 MS Windows NT 伺服器用的. 它<bf/并不/支援将 Linux 设立为让客户端使用 MSCHAP80 认证 PPP 伺服器. <sect1>PAP/CHAP 密码档案 <p> 如果你使用 PAP 或 CHAP 认证,你必须建立这些密码档案.它们是: <code> /etc/ppp/pap-secrets /etc/ppp/chap-secrets </code> <p> 这些档案拥有者必须为 root,群组为 root,同时为了安全档案权限应为 740. <p> 关於 PAP 与 CHAP 第一点要指出的是它们是设计用来认证<bf/电脑系统/而不是<bf/使用者/的. <p> "嗯? 有什麽不同呢?" 我听到你在问. <p> 哦,一旦你的电脑建立与伺服器建立 PPP 连线,你系统上的<bf/任何/使用者都可以使用此连线 - 不只是你而已. 这也是为何你可以使用 PPP 将两个区域网路(LAN)连接起来建立一广域网路(WAN)的原因. <p> PAP (还有 CHAP <bf/也是/)需要<bf/双向/认证 - 也就是每一电脑需要一个合法的名称与密码在另一电脑上. 然而,这<bf/并不是/大部份提供拨接式 PAP 认证连接的 PPP 伺服器运作的方式. <p> 也就是说,你的 ISP 可能会给你一个使用者名称与密码以允许你连接到他们的系统进而连接到网际网路上. 你的 ISP 对於你电脑的名称一点也不感兴趣,因此你可能必须使用你在 ISP 上的使用者名称做为你电脑的名称. <p> 这点要使用 pppd 选项的 <tt/name user name/ 来达成. 因此,如果你使用你 ISP 给你的使用者名称,加上这一行 <code> name your_user name_at_your_ISP </code> <p> 到你的 <tt>/etc/ppp/options</tt> 档案中. <p> 从技术上来说,PAP 其实应该要使用 <tt/user our_user name_at_your_ISP/ 这个选项,但是如果使用到 PAP 的话那麽 pppd 聪明的足以把 <tt/name/ 解译为 <tt/user/. 使用 <tt/name/ 这个选项的好处是这对於 CHAP 也是有效的. <p> 因为 PAP/CHAP 是用来验认<bf/电脑/的,在技术上你也需要指定远端电脑的名称. 然而,大部分的人只接一家 ISP 所以你可以在密码档里的远端主机名称使用通用字元(*) . <p> 许多 ISP 有多个数据机拨接中心连接到不同的终端机伺服器 - 每个终端机伺服器都有不同的名称,但都从单一的(自动转线)号码拨接. 在某些情形下可能因此而很不容易预先知道远端电脑的名称! <sect1>PAP 密码档 <p> <tt>/etc/ppp/pap-secrets</tt> 这个档案看起来像 <code> # Secrets for authentication using PAP # client server secret acceptable_local_IP_addresses </code> <p> 这四个栏位是以空白分界而且最後一项可以是空白(如果你使用动态 IP 或由你的 ISP 所提供的静态 IP). <p> 假定你的 ISP 给你的使用者名称是 <tt/fred/ 而密码是 <tt/flintstone/ 的话那麽你应该在 <tt>/etc/ppp/options[.ttySx]</tt> 里设定 <tt/name fred/ 这个选项并且把你的 <tt>/etc/ppp/pap-secrets</tt> 档案设成下面这样 <code> # Secrets for authentication using PAP # client server secret acceptable local IP addresses fred * flintstone </code> <p> 这是说对於 <tt/fred/ 这个本地机器名称(我们已经告诉过 pppd 使用这个名称,即使这不是我们本地机器的名称也一样)以及<bf/任何/的伺服器,都使用 <tt/flintstone/ 这个密码(暗码). <p> 注意到我们并不需要指定本地的 IP 位址,除非有要求要我们使用一个特定的,固定的 IP 位址. 即使你试著用一固定的 IP,这也不大可能行得通因为对於大部份的 PPP 伺服器(为了安全的理由)不允许远端系统自行指定 IP 号码. <sect1>CHAP 密码档 <p> 目前的 pppd 版本要求你要有互相验认的方法 - 这是说你必须能够让从你的机器到远端伺服器<bf/以及/从远端伺服器到你的机器这两种验认都能进行. <p> 所以,如果你的机器是 <tt/fred/ 而远端是 <tt/barney/ 的话,则在它们个别的 <tt>/etc/ppp/options.ttySx</tt> 里你的设为 <tt>name fred remotename barney</tt> 而远端机器应设为 <tt>name barney remotename fred</tt>. <p> fred 这台机器的 <tt>/etc/ppp/chap-secrets</tt> 档案看起来会像 <code> # Secrets for authentication using CHAP # client server secret acceptable local IP addresses fred barney flintstone barney fred wilma </code> <p> 而 barney 的是 <code> # Secrets for authentication using CHAP # client server secret acceptable local IP addresses barney fred flintstone fred barney wilma </code> <p> 特别要注意的是双方机器都必须具有双向认证的项目.这允许本地的机器向远端机器认证它自己<bf/并且/让远地机器向本地机器认证它自己. <sect1>处理多重 PAP 认证连接 <p> 一些使用者拥有多於一部使用 PAP 的伺服器可连线. 如果你的使用者名称在每部你想连接的机器上都不同,这并不是问题. <p> 然而,许多使用者在两个系统(或者甚至是全部)上具有相同的使用者名称. 这在从 <tt>/etc/ppp/pap-secrets</tt> 中正确地选择适当一行时会有问题. <p> 如你所料地,PPP 提供一种机制以克服此因难. PPP 允许你使用 <bf/remotename/ 选项为远端伺服器设定一个"假想名称". <p> 假设你连接到两部 PPP 伺服器都使用名称 fred.你以此方式建立 <tt>/etc/ppp/pap-secrets</tt> 档案 <code> fred pppserver1 barney fred pppserver2 wilma </code> <p> 如此,在与 pppserver1 连线时你在 pppd 选项中使用 <tt>name fred remotename pppserver1</tt> 并在连线 pppserver2 时使用 <tt>name fred remotename pppserver2</tt>. <p> 因为你可以使用在 pppd 使用 <tt>file filename</tt> 以指定 ppp 选项,你可以建立一指令稿以连接到每部 PPP 伺服器,正确地取用选项档案并且选择正确的 <tt>remotename</tt> 选项. <sect>以手动方式建立 PPP 连结<label id="manual"> <p> 现在你已经建立你的 <tt>/etc/ppp/options</tt> 以及 <tt>/etc/resolv.conf</tt> 档案(以及,如果有需要,还有 <tt>/etc/ppp/pap|chap-secrets</tt> 档案),你可以藉由手动设立 PPP 连线来测试这些设定(一旦我们使手动连线能运作,我们将会自动化该过程). <p> 要做这件事,你的通讯软体必须能在不重置你的数据机的情况下结束. Minicom 可以做到 - <tt/ALT Q/ (或者在比较旧的 minicom 版本是使用 <tt/CTRL A Q/). <p> 确定你以 root 签入. <p> 启动你的通讯软体(像是 minicom),拨接到 PPP 伺服器并且像平常一样的签入. 如果你需要发出某个指令来起动伺服端上的 PPP,那麽就做吧.你将会看见你以前看过的垃圾. <p> 如果你使用 PAP 或 CHAP 的话,那麽只是连线到远端系统应该就会起动在远端上的 PPP 而且你将在没有签入的情况下就见到这些垃圾(虽然这在某些伺服器上不会发生 - 试著按下 <bf/Enter/ 看看能否看到这些垃圾). <p> 现在,在不要重置数据机的情况下结束通讯软体(在 minicom 使用 <tt/ALT Q/ 或 <tt/CTL A Q/)并且在 Linux 的提示符号下(以 root 的身分)键入 <code> pppd -d -detach /dev/ttySx 38400 & </code> <p> <tt/-d/ 这个选项开启侦错功能 - ppp 连线起动时的”交谈”将会记录到你的系统记录里去 - 如果你遇上麻烦这会很有用的. <p> 你数据机的灯现在应该要闪烁,因为要建立 PPP 连线.PPP 连线的建立将会花点时间. <p> 此时你可以观察 PPP 界面,藉由发出这个指令 <code> ifconfig </code> <p> 在你所拥有的任何乙太网路以及回授设备之外,你应该会看见像这样的资讯: <code> 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 </code> <p> 其中 <itemize> <item>inet addr:10.144.153.10 是该连结中你这端的 IP 号码. <item>P-t-P:10.144.153.5 是伺服端的 IP 号码. </itemize> <p> (自然, ifconfig 不会报告这些 IP 号码,而是你的 PPP 伺服器上使用的.) <p> 注意: ifconfig 也告诉你该连结已经起动并且正在执行! <p> 如果没有 ppp 装置列出或得到的是像这样的资讯: <code> 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 </code> <p> 你的 PPP 连线并没有建立... 参阅稍後有关错误排除的章节! <p> 你还可以看到这部远端机器(及其後的)的递送路径.要做到这点,下这个指令 <code> route -n </code> <p> 你应该看到像这样的:- <code> Kernel routing table Destination Gateway Genmask Flags MSS Window Use Iface 10.144.153.3 * 255.255.255.255 UH 1500 0 1 ppp0 127.0.0.0 * 255.0.0.0 U 3584 0 11 lo 10.0.0.0 * 255.0.0.0 U 1500 0 35 eth0 default 10.144.153.3 * UG 1500 0 5 ppp0 </code> <p> 特别注意这里,我们有两个项目指到我们的 ppp 装置. <p> 第一项是主机递送(以 H 旗号表示)并且允许我们看到这部我们正在连接的主机 - 但再来就没有了. <p> 第二项是预设递送路径(由 pppd 的 <tt/defaultroute/ 选项所建立的). 这份递送路径告诉我们的 Linux PC 将任何不在内部乙太网路的封包送到那里 - 到我们指定的网路 - 也就是到 PPP 伺服器本身. 而 PPP 伺服器有责任为我们将封包递送到网际网路并将回应的封包送回给我们. <p> 如果你在递送表格中没看到两个项目,有些事不对劲. 特别是如果你的系统记录(syslog)显示一讯息告诉你 pppd 无法取代已存在的预设递送路径,那麽你已有一预设递送路径指向你的乙太网路界面 - 而这<bf/必须/由指定的网路递送来取代: <bf/你只能有一个预设递送路径!!!/ <p> 你必须检查一下你系统的起始档案以找出预设递送是在那里建立的(这是由 <tt/route add default.../ 指令指定的). 将它改成像这样的 <tt/route add net.../. <p> 现在藉由 ifconfig 之输出所回报的 IP 号码来 'ping' 一下该伺服器以测试这个连结,像这样 <code> ping 10.144.153.51 </code> <p> 你应该会接收到像这样的输出 <code> 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 </code> <p> 这将会一直列印下去 - 按下 <tt/CTRL C/ 终止它,那时你将会接收到更多讯息: <code> --- 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 </code> <p> 到目前都很好. <p> 现在试著藉由名称 ping 某台主机(不是 PPP 伺服器它自己的名称,而是在另一个地方的一台你知道可能已经起动而且正在运作的主机).例如 <code> ping sunsite.unc.edu </code> <p> 这时会有一点停顿,因为 Linux 从你在 <tt>/etc/resolv.conf</tt> 里指定的 DNS 取得你要 'ping' 的完整主机名称所对应的 IP 位址 - 所以不要担心(但是你将会看见你的数据机灯号闪烁). 在短暂的时间後你将会接收到像这样的输出 <code> 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 </code> <p> 再一次,藉由按下 <tt/CTRL C/ 终止输出并取得统计资料... <code> --- 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 </code> <p> 如果你没有收到任何回应,试著 ping 一下你的 ISP 提供的 DNS 的 IP 位址. 如果你从这里得到肯定的结果,那麽看起来问题在你的 <tt>/etc/resolv.conf</tt> 档案里. <p> 如果这样会没有结果,问题出在网路递送上,或者是你的 ISP 在将封包递送回给你时出了问题. 检查上面的递送表格,如果没问题,和你的 ISP 联络.一个测试 ISP 的好方法是用另一种作业系统来连接. 如果这样就可以动,那麽问题就在你这边. <p> 如果一切正常,藉由键入这个指令终止该连线 <code> ppp-off </code> <p> 一段短暂的停顿之後,数据机应该会自己挂断电话 <p> 如果这个指令无法动作的话,那麽不是关掉你的数据机就是起动你的通讯软体并且以 <tt/+++/ 中断数据机然後当你接收到数据机的 OK 提示时以 <tt/ATH0/ 挂断电话. <p> 你可能也得清除 pppd 所建立的锁定档 <code> rm -f /var/lock/LCK..ttySx </code> <sect>使你的连结自动化 - 创造连结指令稿<label id="automate"> <p> 一旦你可以用上述的方法用手动方式签入,更好的做法是建立一些指令稿来自动为你进行这些工作. <p> 一份 chat 指令稿可以自动化签入以及起动 PPP 的程序,因此所有你得做的(以 root 或是 ppp 群组组员的身分)只是发出单一个指令来起动你的连线. <p> <sect1>以使用者名称/密码认证的指令稿 <p> 如果你的 ISP 并不要求使用 PAP/CHAP 的话,这些就是为你准备的! <p> 如果 ppp 套件安装正确,你应该会有两个□例档案. 在 PPP 2.1.2 中是在 <tt>/usr/sbin</tt> 而在 PPP 2.2 里是在 <tt>/etc/ppp/scripts</tt>.这些是 <p> 在 PPP-2.1.2 <tscreen><verb> ppp-on ppp-off </verb></tscreen> <p> 而在 PPP-2.2 <tscreen><verb> ppp-off ppp-on ppp-on-dialer </verb></tscreen> <p> 现在,如果你正在使用 PPP 2.1.2,我强烈建议你删除这些□例档案. 它们有潜在的问题 - 不要告诉我它们工作得很好 - 我也用了很长一段时间(而且还在这份 HOWTO 的第一版中推荐它们)! <p> 为了 ppp 2.1.2 使用者的权益,这里有比较好的样板档案,这些是从 ppp 2.2 发行套件里拿来的. 我建议你拷贝并使用这些指令稿<bf/而不要/再用旧的 PPP-2.1.2 指令稿. <sect1><tt/ppp-on/ 指令稿 <p> 这是实际启动连线的一对指令稿中的第一个. <code> #!/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 </code> <p> 而这是 <tt/ppp-on-dialer/ 指令稿:- <code> #!/bin/sh # # This is part 2 of the ppp-on script. It will perform the connection # protocol for the desired connection. # /usr/sbin/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 </code> <p> 在 PPP-2.2 中,<tt/ppp-off/ 指令稿看起来像:- <code> #!/bin/sh ###################################################################### # # Determine the device to be terminated. # if [ "$1" = "" ]; then DEVICE=ppp0 else DEVICE=$1 fi ###################################################################### # # If the ppp0 pid file is present then the program is running. Stop it. if [ -r /var/run/$DEVICE.pid ]; then kill -INT `cat /var/run/$DEVICE.pid` # # If the kill did not work then there is no process running for this # pid. It may also mean that the lock file will be left. You may wish # to delete the lock file at the same time. if [ ! "$?" = "0" ]; then rm -f /var/run/$DEVICE.pid echo "ERROR: Removed stale pid file" exit 1 fi # # Success. Let pppd clean up its own junk. echo "PPP link to $DEVICE terminated." exit 0 fi # # The ppp process is not running for ppp0 echo "ERROR: PPP link is not active on $DEVICE" exit 1 </code> <sect1>编辑这里所提供的起始指令稿 <p> 因为这份新的指令稿分成两部份,我们分别编辑它们. <sect2><tt/ppp-on/ 指令稿 <p> 你将得编辑这个指令稿以反映你在 ISP 的使用者名称,你在 ISP 的密码,你 ISP 的电话号码. <p> 每一行像是 <tt/TELEPHONE=/ 实际上设定了这个变数包含在等号右边的资讯 (当然不包括注解部份). 因此编辑每一行使它对你的 ISP 与连线是正确的. <p> 而且,如果你(需要)在 <tt>/etc/ppp/options</tt> 档案里设定了 IP 号码,删除这行 <code> $LOCAL_IP:$REMOTE_IP \ </code> <p> 还有,确定变数 <tt/DIALER_SCRIPT/ 指向你将要使用的拨号指令稿的全部路径名称. 因此,如果你移动或改变这个指令稿的名称,确定你正确地改变 <tt/ppp-on/ 指令稿里的这一行. <sect2><tt/ppp-on-dialer/ 指令稿 <p> 这是第二个指令稿实际建立起我们的 PPP 连结. <p> 注意: 一份 chat 指令稿一般全都放在同一行里.倒斜线是用来让一行可以跨过数行的实体行(便於人们阅读)而并不是指令稿本身组成的一部份. <p> 然而,仔细地看看它的细节部份以便让我们了解它实际(假设的)要做什麽是非常有用的! <sect1>一份 chat 指令稿其中的含意... <p> 一份 chat 指令稿是一系列<tt>“</tt>期待字串<tt>”</tt> <tt>“</tt>送出字串<tt>”</tt>的配对. 特别是,注意到我们<bf/总是/在送出某些讯息之前先期待<bf/某些讯息/出现. <p> 如果我们在<bf/没有/先接收到任何讯息的情况下要送出某些讯息的话,我们必须使用空的期待字串(藉由 <tt>“</tt><tt>”</tt> 指明)而在没有送出任何讯息的情况下要期待某些讯息作法也类似! 而且,如果字串包含好几个字(例如 NO CARRIER),你必须把字串用引号括住,这样 chat 会把字串当作是单一个项目. <p> 在我们样板里的 chat 指令行是: <code> exec /usr/sbin/chat -v </code> <p> 起动 chat ,<tt/-v/ 告诉 chat 将其所有的输出/入拷贝到系统记录里(通常是 /var/log/messages). 一旦你觉得 chat 指令稿的运作稳定而可靠,编辑这一行把 <tt/-v/ 移除以便减少你系统记录的混杂. <code> TIMEOUT 3 </code> 这设定接收所期待的输入逾时时限为三秒.如果你使用真的是很慢的数据机那麽你可能得要增加这个设定到五秒或是十秒! <code> ABORT '\nBUSY\r' </code> <p> 如果接收到 BUSY 字串,中止执行. <code> ABORT '\nNO ANSWER\r' </code> <p> 如果接收到 NO ANSWER 字串,中止执行. <code> ABORT '\nRINGING\r\n\r\nRINGING\r' </code> <p> 如果接收到(重复的)RINGRING 字串,中止执行.这是因为某人正打电话给你! <code> “ \rAT </code> <p> 不期待数据机传送任何讯息并且送出 AT 字串. <code> OK-+++\c-OK ATH0 </code> <p> 这一个比较复杂一点,因为它使用了某些 chat 的错误回复功能. <p> 它所代表的是...期待 OK ,如果没有收到(因为数据机并不在指令模式下)那麽送出 +++ (使数据机返回指令模式的标准 Hayes 相容数据机字串)并且期待 OK;接著送出 ATH0 (数据机挂断字串). 这让你的指令稿可以应付你的数据机黏在线上无法断线的情况. <code> TIMEOUT 30 </code> <p> 设定指令稿其馀部份执行的逾时时限为 30 秒.如果你曾经因为逾时而经验过 chat 指令稿被终止的问题,把它增加为 45 秒或更久. <code> OK ATDT$TELEPHONE </code> <p> 期待 OK (数据机对 ATH0 指令的回应)并且拨接到我们想要呼叫的号码. <code> CONNECT ” </code> <p> 期待 CONNECT 字串(当远端数据机有回应时我们的数据机送出的)并且不送出任回覆讯息. <code> ogin:--ogin: $ACCOUNT </code> <p> 再一次,这里面我们有一些错误回复设定.期待签入提示(...ogin:),但是如果我们在逾时前没有接收到,送出一个返回字元(return)然後再次找寻签入提示. 当接收到提示时,送出使用者名称(存放在使用者界面的 $ACCOUNT 环境变数里). <code> assword: $PASSWORD </code> <p> 期待密码提示并且送出密码(再一次,存放在使用者界面的一个环境变数里). <p> 这个 chat 指令稿有合理的错误回复功能. Chat 还有许多重要的特色,比这里所展示还要更多. 更详细的资讯请参阅 chat 的线上使用手册(<tt/man 8 chat/). <sect2>在伺服器端启动 PPP <p> 虽然这份 <tt/ppp-on-dialer/ 指令稿对於在你签入後会自动启动 pppd 的伺服器来说非常的好用,然而某些伺服器需要你明白地在伺服器上启动 PPP. <p> 如果你需要在伺服器上下指令以启动 PPP,你必须要编辑 <tt/ppp-on-dialer/ 指令稿. <p> 在这指令稿的尾端(在 password 这行後面)加上 <bf/期待 送出/ 字串对 - 这是寻找你的 shell 提示符号 (特别小心对 Bourne shell 有特殊意义的字元 - 像是 $ 与 [ 或 ] 左右方括号等). <p> 一旦 chat 找到了 shell 提示符号,chat 必须下指令以启动你 ISP 的 PPP 伺服器. <p> 以我的例子而言,我的 PPP 伺服器使用标准的 Linux Bash 提示符号 <code> [hartr@kepler hartr]$ </code> <p> 而且需要我打 <code> ppp </code> <p> 以启动伺服器上的 PPP. <p> 在此允许一点错误回复是个好主意,所以在我的例子中我用 <code> hartr--hartr ppp </code> <p> 这就是说,如果我在逾时前没收到提示符号,送出 return 并且再次等待提示符号. <p> 一旦收到提示符号,就送出 <tt/ppp/ 字串. <p> 注意: 别忘了在前一行结束前加上 \ 以便让 chat 认为这整个指令稿是在一行里! <p> 不幸的是,某些伺服器会产生非常多变的提示符号! 你可能必须使用 minicom 多签入几次以便了解什麽可以用来做为确定的“期待”字串. <sect1>使用於 PAP/CHAP 验认连线的 chat 指令稿 <p> 如果你的 ISP 使用 PAP/CHAP 验认,那麽你的 chat 指令稿会简单得多. 你的 chat 指令稿所要做的全部只是拨接电话,等待接上线,然後就让 pppd 去处理签入事宜! <code> #!/bin/sh # # This is part 2 of the ppp-on script. It will perform the connection # protocol for the desired connection. # exec /usr/sbin/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 '' \ </code> <sect1>pppd 的 <tt/debug/ 与 <tt/file option_file/ 选项 <p> 就像我们已经看过的,你可以对 pppd 使用 <tt/-d/ 选项打开侦错讯息记录. '<tt/debug/' 选项和这个是一样的. <p> 因为我们正在使用新的指令稿建立新的连线,先放著此选项不管. (警告: 如果你的磁碟空间不大够,记录 pppd 的讯息可能会大量增加你的系统记录档大小并使你遇到麻烦 - 不过在此你必定会连线失败并尝试许久). <p> 一旦你高兴地认为一切工作正常,你可以除去此选项. <p> 如果你不是从 <tt>/etc/ppp/options</tt> 或 <tt>/etc/ppp/options.ttySx</tt> 档案中叫出 ppp 选项, 可以在 pppd 上用 <tt/file/ 选项指定档案名称 - 例如 <code> exec /usr/sbin/pppd debug file options.myserver /dev/ttyS0 38400 \ </code> <sect>测试你的连线指令稿 <p> 开启一个新的 Xterm(如果你在 X 底下)或开启一个新的虚拟主控台并且以 root 签入. <p> 在这个新的阶段作业中,发出这个指令 <tscreen><verb> tail -f /var/log/messages </verb></tscreen> <p> (或是你系统记录档案的任何名称). <p> 在第一个视窗(或是虚拟主控台中)发出这个命令 <tscreen><verb> ppp-on & </verb></tscreen> <p> (或是任何你所编辑的 <tt>/usr/sbin/ppp-on</tt> 版本之名称). 如果你没有藉由在这个指令的尾端指定 & 使得指令稿进入背景执行的话,那麽在 ppp 结束(当连线结束时)之前你都不能回到终端机提示下 <p> 现在切换到追踪系统记录档的视窗. <p> 你将会见到某些像下列的东西(假定你对 chat 指定 <tt/-v/ 并且对 pppd 指定 <tt/-d/ 选项).... 这是紧跟在 pppd 起动资讯之後记录到系统记录档案里的 chat 指令稿及其回应: <code> 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: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: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 </code> <p> (注意 - 我使用静态的 IP 号码 - 因此我的机器送这些东西到 PPP 伺服器去 - 如果你使用动态的 IP 号码那麽你将不会看见这些.) 还有,这个伺服器需要指定的命令来启动 PPP. <p> 这看起来没什麽问题 - 所以如同前面的测试般, ping 一些 IP 号码以及主机名称. <p> 起动你的全球资讯浏览器或是任何其它东东并且开始逛 - 你上线了! <sect>结束 PPP 连结<label id="off"> <p> 当你完成 PPP 连结之後,可以使用标准的 <tt/ppp-off/ 指令终止它(要记得 - 你得是 root 或者是 PPP 群组的组员! ) <p> 你将会在你的系统记录里看见一些像这样的的东西: <code> 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. </code> <p> 别担心那个 <tt/SIOCDELRT/ - 这不过是 pppd 表示要结束了而没什麽好担心的. <sect>侦错<label id="problems"> <p> 你的连线有各种可能的原因无法运作 - chat 无法正确地完成,你的线路杂讯很大等等. 所以,检查你的系统记录找寻线索. <sect1>我把 PPP 编译进去但是 Linux 说我没有... <p> 一个非常常见的问题是人们已经将 PPP 编译到核心之中并且尝试执行 pppd,但核心仍然抱怨说它不支援 PPP! 有许多原因可能导致此事发生. <sect2>你启动的是正确的核心吗? <p> 虽然你<bf/已经/重新编译核心以支援 PPP,你却没有启动新的核心. 这可能是因为你没有更新 <tt>/etc/lilo.conf</tt> 并重跑 lilo. <p> 检查的方法是下这个指令 <tt/uname -a/,将产生像这样的结果 <code> Linux archenland 2.0.28 #2 Thu Feb 13 12:31:37 EST 1997 i586 </code> <p> 它给出了核心的版本及核心编译的日期 - 这样你就知道到底发生了什麽事. <sect2>你将 PPP 核心支援编译为模组吗? <p> 如果你将 PPP 核心支援编译为模组,但却没有编译及安装模组,你就会得到这个错误. 看一下 <htmlurl url="Kernel-HOWTO.html" name="Kernel-HOWTO"> 以及在 <tt>/usr/src/linux</tt> 下的 <tt/README/ 档案! <p> 另一个模组连结的可能问题是你期望需要的模组自动地被载入,但却没有执行 <tt/kerneld/ (会自动载入并移除模组的工具). 看一下 <htmlurl url="mini/Kerneld.html" name="kerneld mini-HOWTO"> 里的资讯说明如何设定 <tt/kerneld/. <sect2>你是否你用正确的 PPP 版本配合你的核心? <p> 你<bf/必须/使用 ppp-2.2 以配合核心 2.0.X. 你可以在核心 1.2.X 使用 ppp-2.2 (如果你修补过核心)否则你必须使用 ppp-2.1.2. <sect2>你是否以 root 身份执行 pppd? <p> 如果你不是以 root 身份执行 pppd (并且 pppd 并未设定为以 root 身份执行),你就会收到此讯息. <sect1>我的数据机连上了但 PPP 并未启动 <p> 同样也有许不尽的原因(参考一下 comp.os.linux...). <p> 一个<bf/最常见/的错误是在你的指令稿里你少打了某些东西. 这里唯一可做的是你将 Linux PC 与伺服器的对话记到你的系统记录中(<tt>/var/log/messages</tt>)然後<em/一行一行地/看个仔细. 你可能还需要再次以手动方法拨入伺服器检查一遍. <p> 你得要从头到尾小心地检查 - 而且心里要记得我们人类有种倾向,阅读的是我们认为我们键入的 - 而不是真的在那里的! <sect1>系统记录说 “<tt/serial line is not 8 bit clean/...” <p> 这也有许多的类似情形 - 像是 <tt/serial line looped back/ 等等,导致的原因可能是许多事情中的一件(或一系列). <p> 要知道到底发生了什麽,必须对 pppd 背後做了些什麽有点了解. <p> 当 pppd 启动後,它会送出连结控制协定(link control protocol)封包到远端机器. 如果它收到合法的回应才会走到下一阶段(使用 IPCP - IP 控制封包)而且只有在这协商完成之後实际的 IP 层才会建立因此你才能使用 PPP 连结. <p> 如果当你的 PC 送出协商封包时在远端没有 PPP 伺服器在运作,这些封包在远端签入过程中将被弹回来. 因为这些封包是使用 8 bits,弹回来时会将第八个位元截掉(记任,ASCII 是七位元的码). PPP 因此而抱怨此讯息. <p> 有许多原因会造成协商封包被弹回. <sect2>你没有正确地签入伺服器 <p> 当你的 chat 指令稿完成後,你的 PC 会启动 pppd.然而,如果你并未完成在伺服器的签入过程(包括送出任何必要在伺服器上启动 PPP 的指令),PPP 就不会开始. <p> 因此连结控制协定封包被弹回你也因此收到这个错误. <p> 你必须小心地检查并修正(必要的话)你的 chat 指令稿(参见上面说明). <sect2>你并未启动伺服器上的 PPP <p> 某些 PPP 伺服器在你完成签入过程後需要你输入指令或按下 <tt/RETURN/ 才会在远端启动 PPP. <p> 检查你的 chat 指令稿(参见上面说明). <p> 如果你以手动方式签入时发现你必须送出 <tt/RETURN/ 才会在远端启动 PPP,简单地在你的 chat 指令稿尾端加上空白的期待/送出字串对(空的送出字串实际上会送出 <tt/RETURN/). <sect2>远端的 PPP 过程启动很慢 <p> 这有点儿技巧! <p> 预设的情况下你的 Linux pppd 被编译成最多送出十个连线控制要求封包. 如果伺服器启动有点慢,十个连线封包可能在远端 PPP 准备好接收前就全部送出了. <p> 於是在你的机器上,pppd 看到十个封包被弹回(第八位元被截去)而结束. <p> 有两个方法可以解决此事:- <p> 在你的 PPP 选项中加上 <tt/lcp-max-configure 30/. 这增加 pppd 在放弃前送出的连线封包的最大数目.对一个真的很慢的伺服器来说,你可能还需要更多. <p> 或者,你可以回过来用一些技巧.你或许会注意到当你以手动签入 PPP 伺服器并让 PPP 启动时,收到的垃圾的<bf/第一个/字完总是 tilde(˜) 字元. <p> 利用此点我们可以在 chat 指令稿尾端加上新的期待/送出字串对,期待 tilde 字元并不送出任何东西. 这看起来像这样:- <code> \~ '' </code> <p> 注意: 因为 tilde 字元对 shell 来说有特殊意义,必须加逸出符号(就是前面的倒斜线). <sect1>不能设立预设递送路径 <p> 如果 pppd 拒绝建立预设递送路径,这是因为(应该没错)它拒绝移除或取代已有的预设递送路径. <p> 通常的原因是因为某些套件将你的乙太网路卡设为预设递送路径而不是设为指定的网路递送. <p> 参见 Linux NAG 与 Net2/3 HOWTOs 里的资讯以正确地设定你的乙太网路卡及相关的递送. <p> 另一可能原因是你的区域网路已使用了闸道器或路由器而且你的递送表格已设定为将预设递送路径指向这里. <p> 要修正这种情况需要更多的网路知识而已经超出此份 HOWTO 的□围了. 建议你取得一些专家的意见(经由新闻组群或你周围可以问的人). <sect1>其它问题 <p> 还有许多原因导致 PPP 无法连接或是无法正确运作. <p> 现在仔细看看 PPP FAQ (这真的是一系列的问题与回答).这是一份非常详实的文件而且答案就在里面! 以我自己(很烂)的经验,如果你的问题答案不在其中,那麽该问题就不是 PPP 的错! 以我为例我使用 ELF 核心而且没有升级适当的核心模组.在曙光出现之前我仅仅浪费了大概两天(以及一个晚上的大部分时间)诅咒去那个事实上已非常良好的 PPP 伺服器. <sect>当完全陷於胶著时如何取得帮助 <p> 如果你不能使你的 PPP 连结运作,回头重新阅读这份文件并检查每一件事 - 同时配合 "chat -v..." 以及 "pppd -d" 在你的系统记录里建立的输出作为参考. <p> 也要参考 PPP 本身的文件以及 FAQ 并加上在此曾经提及的文件! <p> 如果你仍然陷於胶著状态的话,那麽有些能够在 PPP 这方面帮你的人会合理的、有规律的扫描 comp.os.linux.misc 与 comp.os.linux.networking 新闻讨论群,以及 comp.protocols.ppp. <p> 你可以尝试寄个人的电子邮件给我,但我真的有自己的工作(和生活)而且我不保证会很快地回覆(即使不完全会这样)因为这得视我目前的工作负担以及我私人的生活状态而定! <p> 特别是 - <bf>不要张贴剪下来的错误侦测输出到新闻讨论群上也不要藉由电子邮件寄给我</bf> - 前者浪费大量的网路频宽而後者将转给 <tt>/dev/null</tt> (除非我特别要求将它寄给我!) <sect>连结运作之後的普遍问题 <p> 一个问题是你将会发现许多服务提供者只支援他们给新帐号的套装连线软体. 这(典型)是给微软视窗环境的 :-( - 而且许多服务提供者的支援处看来一点都不了解 Unix (or Linux). 所以要有准备,从他们那得不到太多协助! <p> 你当然可以帮他们一个忙并且教育他们关於 Linux 的知识(任何 ISP 的协助人员在网际网路用语中都应该 "知道它" 而这意味著他们在家里应该要有台 Linux 机器 - 当然是这样)! <sect1>我无法看见我连线的 PPP 伺服器以外的世界 <p> 好的 - 你的 PPP 连线已建立并执行中而且你可以藉由该 PPP 伺服器的 IP 号码(藉由 <tt/ifconfig ppp0/ 指令所显示的第二个或 "远端" 的 IP 号码) ping 该伺服器,但是你不能触及其後的任何地方. <p> 首先,尝试 ping 你在 <tt>/etc/resolv.conf</tt> 里指定作为名称伺服器那台机器的 IP 号码. 如果可以的话,那麽你就<bf/可以/见到在你 PPP 伺服器之外的东西(除非这个 IP 号码跟你连线的 "远端" IP 号码相同). 所以现在来试试 ping 你的服务提供者的完整网际网路名称 - 例如 <tscreen><verb> ping my.provider.net.au </verb></tscreen> <p> 如果这样无法成功,那麽你有个名称解析上的问题.这可能是因为在你的 <tt>/etc/resolv.conf</tt> 档案里有打字错误. 打电话给你的服务提供者对照所得的资讯并且小心地检查这个档案.如果看起来全都没问题,再打电话给服务提供者确定你写下正确的 IP 号码〉 <p> 如果它仍然无法运作(而且你的服务提供者确认他的名称伺服器有开机并且正在执行),那麽你的问题在其它的地方 - 而且我建议你小心地从头到尾检查你安装的 Linux(特别注意档案权限). <p> 如果你仍然不能藉由 IP 号码 ping 你服务提供者的名称伺服器,那麽不是他们关掉机器(打个电话给他们确定一下)就是有个递送问题发生在你的服务提供者那边. 再一次,打电话给他们查问看看. <p> 有个可能是 "远端" 是一台 Linux PPP 伺服器而在其核心里没有指定 IP forwarding 选项! <p> 一个良好的测试方法是使用大多提供给(一整套) Microsoft Windows 的软体尝试进入你的服务提供者. 如果完全相同的帐号在另外一套作业系统下一切正常,那麽问题是在你的 Linux 系统上而不是在你的服务提供者那边. <sect1>我可以寄送电子邮件,但不能接收 <p> 如果你使用动态的 IP 号码,这是很正常的.参阅下面的 "<ref id="dynamic-server" name="设立服务">" 一节. <sect1>为什麽人们不能来我的机器 finger, WWW, gopher, talk 等等? <p> 同样地,如果你使用动态的 IP 号码,这是非常正常的. 参阅下面的 "<ref id="dynamic-server" name="设立服务">"该节. <sect>以动态 IP 提供网际网路服务<label id="dynamic-server"> <p> 如果你使用动态的 IP 号码(许多服务提供者也只提供动态的 IP 号码除非你为你的连线付出更多代价),那麽你必须认识这隐含的限制. <p> 首先,外送服务请求将不会有问题.这是说你可以使用 sendmail 送出电子邮件,从远端节点传输(ftp)档案, 调查(finger)在其它机器上的使用者,浏览全球资讯网等等. <p> 特别是,虽然你不在线上但你可以回覆带回你机器上的电子邮件.邮件将单纯地丢在你的邮递伫列中直到你拨回你的 ISP 再行送出. <p> 然而,你的机器并非一天 24 小时都连接在网际网路上,它每次连线也不会拥有相同的 IP 号码. 所以你不可能接得到直接寄到你机器的电子邮件,并且很难设立一台全球资讯伺服器或档案传输伺服器! 因为网际网路与你的机器不存在一种唯一的,永久可以联系的关系,因为你的机器并没有唯一的 IP 号码(记住 - 其它的机器也会使用这些 IP 号码,当它们拨上线时). <p> 如果你设立一台 WWW(或任何其它伺服器),在网际网路上的任何人都完全不会知道除非他们知道你的机器现在正在线上以及它确实(目前)的 IP 号码. 他们有许多管道可以得到这项资讯,包括由你打电话给他们,寄发电子邮件告诉他们或者是在你服务提供者的帐号上巧妙地使用 ".plan" 档案(假设你的提供者允许 shell 及 finger 存取). <p> 现在,对大部分的使用者而言,这不是个问题 - 大部分人们所想要做的全部只是寄送与接收电子邮件(使用在你服务提供者上的帐号)以及连线到全球资讯网,传输档案以及其它网际网路上的服务. 如果你必须拥有由外往内的连线服务,你真的应该取得静态的 IP 号码.另外一种方法是研究前面提示过的方法... <sect1>设定电子邮件 <p> 即使是动态的 IP 号码,你的确可以配置你机器上的 sendmail 来送出你在本地端写好的任何电子邮件. 有关 sendmail 的配置可能会是很含糊而且很困难的 - 所以这份文件不会试图告诉你该怎麽做. 然而,你可能应该配置你的 sendmail 以便你的网际网路服务提供者能授命你作为 "smart relay" 主机(在 <tt/sendmail.cf/ 的 <bf/DS/ 选项).(更为详细的配置资讯请参阅 sendmail 的文件 - 并详阅随附於 sendmail 的 m4 配置巨集.几乎可以确定里面一定有一个能符合你的需要). <p> 也有一本非常好的书在讲 Sendmail(O'Reilly and Associates 称它为 '圣经'),但对大部份的使用者来说实在太过困难了! <p> 一旦你配置好 sendmail 後,你可能想在 PPP 连线刚一起动的时候就要 sendmail 赶快送出任何待在邮件伫列里的讯息. 要这麽做的话,加入这行指令 <tscreen><verb> sendmail -q & </verb></tscreen> <p> 到你的 <tt>/etc/ppp/ip-up</tt> 指令稿中(参见下面说明). <p> 由外往内的电子邮件对动态的 IP 号码而言是个问题.处理这个问题的方法是: <itemize> <item>配置你的使用者邮递程式让所有送出去的邮件在 "reply to" 表头中有个在你的网际网路服务提供者上的电子邮递位址.<newline> 如果可以的话,你也应该将你的 FROM 地址设为你 ISP 提供的电子邮递位址. <item>使用 popclient 程式从你的服务提供者那边撷取你的电子邮件.或者,如果你的 ISP 使用 IMAP,使用支援 IMAP 的使用者邮递程式(例如 pine). </itemize> <p> 你可以藉由在 <tt>/etc/ppp/ip-up</tt> 指令稿中放入必要的指令以便在拨接时将这个过程自动化(参见下面说明). <sect1>设定本地的名称伺服器 <p> 虽然你大可使用在你 ISP 那里的领域名称伺服器,你也可以设立一台本地的暂存专用(次要)名称伺服器,并藉由 <tt/ip-up/ 指令稿启动. 跑本地(暂存专用)名称伺服器的好处是如果你在连线期间常常联系相同的节点那麽它可以节省你的时间(以及频宽). <p> 暂存专用名称伺服器(在 <tt/named.boot/ 档案里使用一行 'forwarders' 指向你 ISPs 的 DNS)的名称伺服器配置比较简单. O'Reilly book (DNS and Bind) 解释所有你需要知道的东西. <p> 也有一份 <htmlurl url="DNS-HOWTO.html" name="DNS-HOWTO"> 可以取得. <p> 如果你有一小型区域网路经由你的 Linux PC 取用网际网路(例如使用 IP 伪装), 在本地端执行名称伺服器(使用 forwarders 导向)会是个好主意,因为它会降低由名称解析所占用的网路频宽及延迟时间. <p> 网路作业的一个要点: 当你要在你 ISP 的领域里开始启用一台次要的,暂存专用的名称伺服器之前先询问你的 ISP 相关的权限. 正确配置它,你的 DNS 一点都不会造成你 ISP 的困扰,但是如果你做错了些什麽,它可能会引起麻烦... <sect>使用 PPP 连结两个网路<label id="WAN"> <p> 基本上连结单一台 Linux PC 到 PPP 伺服器以及使用 PPP 连结两个区域网路没有什麽差别.记得,PPP 是一种<bf/点对点/的协定. <p> 然而,你<bf/的确/得了解关於递送路径如何建立的问题.阅读 NET-2 howto 以及 Linux Network Administrator Guide (NAG). 你也将发现这本书 "TCP/IP Network Administration" (by O'Reilly and Assoc - ISBN 0-937175-82-X)会有极佳的帮助. <p> 如果你想在连结的某一边使用一个网路号码的次网路分割,你会发现 Linux (draft) sub networking mini-howto 满有用的. 这可在 <url url="http://www.interweft.com.au/other/" name="Linux Sub networking mini-HOWTO"> 找到. <p> 为了连结两个区域网路,你使用的<bf/必须/是不同的 IP 网路编号(或是同样网路编号的次网路)而且你将得使用静态的 IP 号码 - 或使用 IP 伪装. 如果你想要使用 IP 伪装的话,参阅 IP masquerade mini-howto 有关它的设定介绍. <sect1>设定 IP 号码 <p> 与其它区域网路的网路管理者协商两端的 PPP 界面使用的 IP 号码. 如果你使用静态的 IP 号码,这可能也会要求你拨接特定的电话号码. <p> 现在编辑适当的 <tt>/etc/ppp/options[.ttyXX]</tt> 档案 - 对於此连线在你这一端使用特定的数据机及串列埠是个好主意. 你可能也得要去变更你的 <tt>/etc/ppp/options</tt> 档案 - 并且也要为任何其它的连线建立适当的 <tt/options.ttyXX/ 档案! <p> 在适当的选项档案里指定 PPP 连接中你这端的 IP 号码,这与前面所展示使用静态 IP 号码拨接的方式完全相同. <sect1>设定递送路径 <p> 你必须安排你区域网路上的封包经过 PPP 连结所建立的界面递送出去.这是个两阶段的过程. <p> 首先,你必须建立从执行 PPP 连结的机器到连结的远方网路去的递送路径. 如果该连结通往网际网路,那麽这可以藉由 pppd 的选项 'defaultroute' 由它自己建立的预设递送路径来处理而你不必做任何事. <p> 然而如果该连结只是连结两个区域网路,那麽必须加入一个指定的网路递送路径. 这是在 <tt>/etc/ppp/ip-up</tt> 指令稿中使用 'route' 指令执行的(参阅连线起动之後... 该节里有关如何执行的介绍). <p> 你得做的第二件事是告诉在你区域网路上的其它电脑这台 Linux 电脑实际上是该 ppp 连结中通往远方网路的'闸道'. <p> 当然,这些工作该连结另一端的网路管理者也全都得做! 然而,因为她/他必须将封包递送到你的网路,一个<bf/指定的网路递送路径/是必要的,而不是预设递送路径(除非远端的区域网路是连上你去取用网际网路的). <sect1>网路安全 <p> 如果你使用 PPP 连结你的区域网路到网际网路上去 - 或甚至只是到一个“外面的”区域网路上去,你都必须考虑安全性的问题. 我强烈鼓励你考虑设立一台防火墙! <p> 你还应该在以此方式连到外面的区域网路或网际网路<bf/之前/先告诉你的区域网路管理者. 没有这样做的话可能使你惹上严重的麻烦! <sect>建立连结之後 - <tt>/etc/ppp/ip-up</tt> 指令稿<label id="ip-up"> <p> 一旦 PPP 连结建立後, pppd 会找寻 <tt>/etc/ppp/ip-up</tt> 指令稿. 如果这个指令稿存在并且可以执行的话,那麽 PPP 伺服程式就会执行这个指令稿. 这允许你自动执行任何可能有必要的特殊递送路径指令及任何你想在每次 PPP 连结启动时执行的动作. <p> 这不过就是一般普通的 shell 指令稿,可以做任何指令稿能做的事(也就是,任何你想做的事). <p> 例如,你可能想要 sendmail 赶快处理在邮件伫列中等待外送的讯息. <p> 类似地,你可以在 <tt/ip-up/ 里插入一些指令取得(使用 POP)在你的 ISP 那边等著你的任何电子邮件. <p> 不过在 <tt>/etc/ppp/ip-up</tt> 也有些限制:- <itemize> <item>它以局限的环境变数以增加安全性.这也就是说你必须给出执行档的全部路径名称等. <item>技术上来说,<tt>/etc/ppp/ip-up</tt> 是一个<em/程式/而非指令稿. 这是说它可以被直接执行 - 也因此它在第一行开始必须具有标准的 file magic (<tt>#!/bin/bash</tt>) 并且能被 root 读取及执行. </itemize> <sect1>特殊递送路径 <p> 如果你连结的是两个区域网路,你将得设立一个到 '外面的' 区域网路的指定递送路径. 这可以很容易的使用 <tt>/etc/ppp/ip-up</tt> 指令稿达成.唯一的困难发生在你的机器有多个 PPP 连结时. <p> 这是因为 <tt>/etc/ppp/ip-up</tt> 这个指令稿是由每一个起动的 ppp 连线所执行的,所以你得要小心地为每一个起动的连结执行正确的递送指令! <sect1>处理电子邮件伫列 <p> 当两个区域网路的连结建立之後,你可能想要确定放在伫列中的电子邮件被<em/清出/ - 送到它的目的地. 这可以用适当的呼叫 <tt/sendmail/ 来达成. <p> 在 pppd 传递给指令稿的特定参数上使用 bash 的 `case' 叙述来完成这个工作. 例如,这是我用来处理我们的广域网路连结及通往我家乙太网路的(也是由相同的 PPP 伺服器处理)<tt>/etc/ppp/ip-up</tt> 指令稿. <sect1>一个 <tt>/etc/ppp/ip-up</tt> 指令稿的例子 <p> 下面的例子提供不同的使用□例. <code> #!/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 (e.g. 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</code> <p> 起动通往我们 Newman 校园的 ppp 连结以及这个指令稿的结果,我们最後得到下面这个递送表格记录(这台机器也是我们通常用的 PPP 伺服器并且处理我们的网际网路连结). 我已经在这个输出里加入一些注解以解释每个项目是什麽: <code> [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 loop back 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 </code> <sect1>处理电子邮件 <p> 上一节提及如何处理外送的邮件 - 一旦连线建立之後简单地藉由清出邮件伫列达成. <p> 如果你执行连往广域网路的连结,你可以跟远端区域网路的网路管理者协调请它们执行完全相同的动作. 例如,在我们的广域网路连结中 Newman 校园那一端的 <tt>/etc/ppp/ip-up</tt> 指令稿看起来像: <code> #!/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 script is called with the following # parameters # $1 the interface name used by pppd (e.g. 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 </code> <p> 然而如果你只能使用动态 IP 号码方式的 PPP 连线连往你的 ISP,你得从在你 ISP 机器上的帐号取得你的电子邮件. 这通常是使用 POP(Post Office Protocol)协定来达成的.可以使用 `popclient' 程式处理这个程序 - 而 <tt/ip-up/ 指令稿也可以为你自动化这个程序. <p> 简单地建立一个 <tt>/etc/ppp/ip-up</tt> 指令稿,其中包含有起动 popclient 程式的适当指令. 在我执行 Red Hat Linux 的膝上型电脑上(任何旅行时我都带著它)是这样的 <code> popclient -3 -c -u hartr -p <password> kepler.hedland.edu.au |formail -s procmail </code> <p> 你可以使用 slurp 或其它软体以相同的方式取得网路新闻,以及诸如此类的服务. 记得,ip-up 这个指令稿只是个标准的 bash 指令稿因此可以用来自动化当每次适当的 PPP 连结建立时需要完成的任何功能. <sect>使用 <tt>/etc/ppp/ip-down</tt> <p> 你可以建立一指令稿在连接一旦结束之後执行.这存放在 <tt>/etc/ppp/ip-down</tt> 里. 这可以用来还原任何对应你在 <tt>/etc/ppp/ip-up</tt> 指令稿中做的特殊动作. <sect>区域网路上的递送问题 <p> 如果你已经连接在某个区域网路上但是仍然想要使用在你个人的 Linux 机器上的 pppd 的话,你得要应付某些递送封包的问题,从你的机器到你的区域网路(经过你的乙太网路界面)以及到远端的 PPP 伺服器和更外面的世界. <p> 这一节并不尝试教你有关封包递送的机制 - 它只处理一个简单的,特定的递送情况(静态的)! <p> 如果你不熟悉递送机制的话,那麽我强烈地鼓励你阅读 Linux Network Administrator Guide (NAG). 同时 O'Reilly 的书 "TCP/IP Network Administration" 也以非常容易了解的方式涵盖了这个主题. <p> 静态递送路径的基本规则是预设递送路径应该是指向网路位址号码最多的那一个. 对於其它的网路则在递送表格中输入指定递送路径. <p> 我唯一打算在这里介绍的情况是你的 Linux 机器在一个没有连上网际网路的区域网路上 - 而你想要在仍然连接著区域网路的情况下拨接到网际网路上供自己使用. <p> 首先,确定你的乙太网路递送路径是设往能够通过你的区域网路的指定网路位址 - 不是设往预设递送路径! <p> 藉由发出 route 指令检查之,你应该会看见如下的讯息: <tscreen><verb> [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 </verb></tscreen> <p> 如果你的乙太网路界面 (eth0) 指向预设递送路径,(在 eth0 该行的第一列上会显示 "default" 字样)那麽你得要变更你的乙太网路起始指令稿使它指向特定的网路号码而非预设递送路径(参照 Net2 HOWTO 以及 NAG). <p> 这将允许 pppd 设立你的预设递送路径,如下所示: <tscreen><verb> [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 </verb></tscreen> <p> 如同你所见到的,我们拥有经由 ppp0 到 PPP 伺服器(10.144.153.51)的主机递送设定而且也拥有使用 PPP 伺服器作为闸道的预设网路递送设定. <p> 如果你的设定得要比此更复杂 - 阅读已经提过有关递送的文件并请教在你身旁的专家! <p> 如果你的区域网路上已经有路由器,那麽在你那里已经建立了通往宽广网路世界的闸道. 你仍应把你的预设递送路径指往 PPP 界面 - 并且使其它的递送路径指定到由路由器服务的网路. <sect1>安全上的注意事项 <p> 当你在现有的区域网路上设定一台 Linux 机器连结到网际网路上,你在不知不觉中已经对网际网路 - 以及在那里的骇客们 - 开放了你的整个区域网路. 在你这样做之前,我强烈地鼓励你请教你的网路管理者并参考该处的安全策略. 如果你的 PPP 连线被成功地用来攻击你的站台的话,那麽你最少也会招致同夥的使用者,网路及系统的管理者强烈的愤怒. 你也可能会发现你自己置身於非常严重的麻烦! <p> 在你连接区域网路到网际网路上去之前,甚至是动态的连线你都应该要考虑安全的隐忧 - 因此早点参考 O'Reilly 的 "Building Internet Firewalls"! <sect>建立 PPP 伺服器<label id="ppp-server"> <p> 如同前面提过的,这件工作有许多方法可以可以达成. 我在这里所介绍的是我怎麽做的方法(使用 Cyclades 多埠串列卡)以及一组自动转接的电话线路. <p> 如果你不喜欢我在这里介绍的方法,请自由地使用你自己的方法. 不过,我很乐意在这份使用说明未来的版本中包含额外的方式.所以,请把你的评论跟方法寄给我! <p> 请注意,这一节只跟如何设定 Linux 作为 PPP 伺服器有关.我不想(不曾)包含有关设定特殊终端机伺服器及这一类的资讯. <p> 而且,我尚未实验过配合 shadow 密码使用(但应该会做).因此目前介绍的资讯并不包含任何 shadow 需要的设定. <sect1>编译核心 <p> 所有早先提过关於编译核心以及核心与 pppd 版本的说明都适用.这节假设你已经读过这份文件前面的章节! <p> 对於 PPP 伺服器,你必须在你的核心中包含 IP forwarding 的功能. 你也可能会希望包含其它的功能(像是 IP firewalls, accounting 等等). <p> 如果你使用多埠串列卡,那麽你也必须明确地在你的核心中包含必要的驱动程式! <sect1>伺服器系统的概观 <p> 我们使用相同的使用者名称/密码配对提供拨接 PPP (and SLIP) 帐号以及 shell 帐号. 这样做的好处(对我们而言)是使用者只需要一个帐号就可以使用所有种类的连线. <p> 因为我们是教育组织,我们并不对职员以及学生的使用收费,所以不必担心计算与收费的问题. <p> 在我们的节点与网际网路之间我们设置有一台防火墙,而这会限制某些使用者的存取,因为拨接线路是在我们的(网际网路)防火墙内(理由很明显,其他网际网路防火墙的细节也不会在此出现而且在任何情况下都没有关系). <p> 使用者建立连往我们节点之 PPP 连结的程序(当然是在他们拥有有效的帐号後)是: <itemize> <item>拨入我们的自动转接拨号器(这是连结一堆数据机的单一电话号码 - 第一台空□的数据机会接起拨入的电话). <item>使用一对有效的使用者名称以及密码签入. <item>在 shell 提示符号下,发出 <tt/ppp/ 指令以启动伺服器上的 PPP 程序. <item>启动他们机器上的 PPP(可以是执行 Windows, DOS, Linux, MAC OS 或任何作业系统的机器 - 这是他们的问题). </itemize> <p> 这台伺服器为每个拨入的埠使用个别的 <tt>/etc/ppp/options.ttyXX</tt> 档案,而这为动态的 IP 分配设定远端的 IP 号码. 伺服器为远地的客户端使用代理位址解析协定(proxyarp)来递送封包(经由适当的 pppd 选项加以设定). 这避免了使用 routed 或是 gated 的需求. <p> 当使用者从他们那端挂断时,pppd 会侦测出来并告诉数据机要它挂断,同时停掉 PPP 连结. <sect1>所需的全部软体 <p> 你将会需要下列的软体:- <itemize> <item>Linux,适当地编译以包含必要的选项. <item>适合於你核心的 pppd 版本. <item>一套能够聪明地处理数据机通讯的 'getty' 程式.<newline> 在这里我们使用的是 getty_ps2.0.7h ,但积极考虑 mgetty. 我了解 mgetty 可以侦测出使用 pap/chap 的呼叫( pap 是 Windows 95 使用的标准)并自动地起动 pppd,但是我尚未研究过它. <item>你的拨接使用者能够存取的一台领域名称伺服器 (DNS).<newline> 如果有可能的话你真的应该执行你自己的领域名称伺服器... </itemize> <sect1>设定标准的拨接(shell access) <p> 在你可以设立你的 PPP 伺服器之前,你的 Linux 机器必须能够处理标准的拨接存取. <p> <bf>这份使用说明并不涵盖这项设定方法.请参阅你选择之 getty 的文件以及 <htmlurl url="Serial-HOWTO.html" name="Serial HOWTO"> 里有关这项设定的资讯.</bf> <sect1>设立 PPP 选项档案 <p> 你将得为所有拨接埠设立一个全体的 <tt>/etc/ppp/options</tt> 档案,其中是通用的选项. 我们使用的选项是: <code> asyncmap 0 netmask 255.255.254.0 proxyarp lock crtscts modem </code> <p> 注意 - 我们没有使用任何(明显的)递送设定 - 特别是这里没有 <tt/defaultroute/ 选项. 这理由是因为所有你(做为 PPP 伺服器)所要做的就是将封包<bf/从/ PPP 客户端递送到你的区域网路或网际网路并且将封包由你的区域网路递送<bf/到/你的客户端. <p> 全部所需的只是到客户机器的主机递送,而使用 pppd 的 '<tt/proxyarp/' 选项达成. <p> 这个 '<tt/proxyarp/' 选项设立一个代理位址解析协定的项目於 PPP 伺服器的位址解析协定(ARP)表格中,那基本上就是说 '将所有要给 PPP 客户端的封包送给我'. 这是建立单一 PPP 客户端的递送路径最简单的一个方式 - 但你不能用这种方式在两个区域网路之间递送封包 - 你必须加入适当的网路递送而不能使用代理位址解析协定. <p> 你几乎一定会希望提供动态分配的 IP 号码给你的拨接使用者.你可以藉由分配 IP 号码给每个拨接埠来达成目的. 现在,为你的每个拨接埠建立一个 <tt>/etc/ppp/options.ttyXX</tt> 档案. <p> 在这里面,只要简单地放入本地(伺服器)的 IP 号码及该埠所要使用的 IP 号码.例如 <code> kepler:slip01 </code> 特别注意,在这个档案里你可以使用合法的主机名称(我发现我只记得在我网路上重要机器与设备的 IP 号码 - 名称会更有意义才对)! <sect1>设定 pppd 以便让使用者(成功地)执行它 <p> 因为起动 ppp 连结隐含著配置核心设备(网路界面)及操控核心递送表格的动作,所以需要特别的权限 - 事实上需要完整的 root 权限. <p> 幸运的是, pppd 已经设计成可以安全地设定为以 root 的身分执行.所以你必须 <code> chmod u+s /usr/sbin/pppd </code> <p> 当你列出这个档案时,它应该会如同这样 <code> -rwsr-xr-x 1 root root 74224 Apr 28 07:17 /usr/sbin/pppd </code> <p> 如果你没有这样做,使用者将不能设立他们的 PPP 连结. <sect1>为 pppd 设定一个全域的别名(alias) <p> 为了简化我们拨接 PPP 使用者的连线程序,我们建立一个全域的别名(放在 <tt>/etc/bashrc</tt>)如此一旦他们签入之後只要一个简单的指令就能起动伺服端的 ppp. <p> 这看起来像 <code> alias ppp="exec /usr/sbin/pppd -detach" </code> <p> 它所作的是 <itemize> <item>exec : 意指以这个指令所执行的程式替换正在执行的程式(在这个例子中是 shell). <item>pppd -detach : 起动 pppd 并且不要把产生的程序放入背景执行.这确保当 pppd 结束时不会留下任何程序. </itemize> 当一个使用者像这样签入时,他们在 'w' 的输出中看起来会像这样 <code> 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 - </code> <p> 就这样... 我告诉过你这是一个很简单的,基本的 PPP 伺服系统! <sect>在 null modem (直接连线)上使用 PPP<label id="direct"> <p> 这非常地简单 - 因为没有数据机所以事情变得更容易. <p> 首先,选择其中一部机器做为'伺服器',在串列埠上设立 getty 以便让你可以从'客户端'使用 minicom 去取用此串列埠以测试连接性. <p> 一旦你成功了,你可以除去这个 getty,除非你想用使用者名称/密码来确认连线. 因为你有两部机器的'实体控制权',我假设你并不想如此做. <p> 现在,在伺服器端除去 getty 并确认你已在两部机器上正确地使用 'setserial' 来设定串列埠. <p> 所有你要做的就是在两个系统上启动 pppd. 我假设你在两台机器上都使用 <tt>/dev/ttyS3</tt> 建立连线. 因此,在两部机器上执行指令:- <code> pppd -detach crtscts lock <local IP>:<remote IP> /dev/ttyS3 38400 & </code> <p> 这将会建立起连结 - 但目前为止你还未指定递送路径. 你可以在每部机器上用 ping 指令来测试连结.如果这样可以的话,终止其中一个 pppd 程序以结束连结. <p> 你需要的递送路径实际上看你究竟想做什麽而定. 一般来说,其中一部机器会连上乙太网路(其及後的网路)因此所需的递送完全和 PPP 伺服器与客户端一样. <p> 因此在具有乙太网路的机器上,pppd 的指令应该是 <code> pppd -detach crtscts lock proxyarp <local IP>:<remote IP> /dev/ttyS3 38400 & </code> <p> 而另一部机器上是 <code> pppd -detach crtscts lock defaultroute <local IP>:<remote IP> /dev/ttyS3 38400 & </code> <p> 如果你连接两个网路(使用串列连结!)或有更复杂的递送需求,你可以完全按照这份文件前面所提的方法来使用 <tt>/etc/ppp/ip-up</tt>. <p> <bf/Robert Hart/<newline> Port Hedland, Western Australia<newline> Melbourne, Victoria, Australia August/October 1996 January/March 1997 </article>