diff --git a/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml b/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml index a250b533ef..35ada57c60 100644 --- a/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/ppp-and-slip/chapter.sgml @@ -1,2780 +1,2781 @@ Jim Mock Restructured, reorganized, and updated by PPP 和 SLIP 概述 PPP SLIP FreeBSD 有很多方法可以将计算机与计算机连接起来。 通过使用拨号 modem 来建立网络或 Internet 连接, 或允许其他人通过您的机器来连上网络, 这些都要求使用 PPP 或 SLIP。 这章将详细介绍设置这些基于 modem 的通信服务的方法。 读完这一章,您将会了解到: 如何设置用户级PPP. 如何设置内核级PPP. 如何设置 PPPoE (PPP over Ethernet). 如何设置 PPPoA (PPP over ATM). 如何配置和安装SLIP客户端和服务器. PPP 用户级PPP PPP 内核级PPP PPP PPPOE 在阅读这章之前,您应当: 熟悉基本的网络术语. 理解拨号连接和PPP,SLIP的基础知识. 您可能想知道用户级PPP与内核级PPP不同之处.回答很简单: 用户级PPP处理用户级的输入和输出数据,而不是内核级. 在内核与用户区之间复制数据的花费要大一些,但它能提供具有更多特性的PPP实现 . 用户级PPP使用 tun设备与外界通信而内核级PPP使用 ppp设备. 除非需要与其它PPP软件(比如pppd)相区别,在这一章中 用户级PPP就简称为ppp.另外,若没有额外的注明,本章所介绍 的所有命令都需要root权限. . Tom Rhodes Updated and enhanced by Brian Somers Originally contributed by Nik Clayton With input from Dirk Frömberg Peter Childs 使用用户级PPP 用户级PPP 前提条件 本章假定您具备如下条件: ISP PPP 您有一个ISP提供的用于连接使用PPP的帐号. 您需要一个连接到您的系统并做了正确配置的modem或其它设备,使您能连接到ISP. ISP的拨号号码. PAP CHAP UNIX login name password?/primary> 您的登录名称和密码(可能是一般的UNIX风格的登录名和密码对, 也可能是PAP或CHAP登录名和密码对.) nameserver 一个或多个域名服务器IP地址. 通常,您会从ISP处得到两个这样的IP地址. 如果您至少得到了一个, 就可以 在文件ppp.conf中加入enable dns命令 使ppp设置域名服务.这个功能取决于ISP对支持DNS协商的具体实现. 下面的信息由您的ISP提供,但不是必需的: ISP的网关IP地址. 网关是您要连接的且要被设为默认路由的主机. 如果您没有这个信息,您可以虚构一个,在连接时ISP的PPP服务器会自动告诉您正确的值. 这个虚构的IP号被ppp称为 HISADDR. 需要使用的子网掩码.如果ISP没有提供,您可以安全地使用 255.255.255.255. static IP address 如果ISP提供了一个静态的IP地址和主机名,可以输入它们.否则,让对方主机指定它 认为合适的IP地址. 如果您不知道这些信息,请与您的ISP联系. 在这节中,所有作为样例显示的配置文件信息都对行进行了编号. 这些行号只是为了使解释和讨论变得方便,在真实当地用tab键和sp文件中并不存在. 缩进是必需的. 创建PPP设备节点 PPPcreating device nodes 一般情况下,大多数用户只需要一个tun设备 (/dev/tun0),提及tun0时, 即指tunN,N是您系统中具体的号码. 若的FreeBSD(FreeBSD 4.X 及早前版本)没有启用&man.devfs.5;,应当先检查 是否存在tun0设备,如果已经启用了&man.devfs.5;,这一步就没必要了 (因为&man.devfs.5;会根据需要创建设备). 为了确保tun0配置正确, 最简单的方式是重新创建它。 按照以下步骤可以重新创建设备: &prompt.root; cd /dev &prompt.root; sh MAKEDEV tun0 如果您的内核要有16个tunnel设备,您必须创建它们.可以通过执行以下命令完成: &prompt.root; cd /dev &prompt.root; sh MAKEDEV tun15 <application>PPP</application>自动化配置 PPPconfiguration ppppppd(PPP的内核级实现) 都使用/etc/ppp目录中的配置文件.用户级PPP的例子能 在/usr/share/examples/ppp/中找到. 配置ppp要求根据您的需要编辑几个文件.编辑哪几个文件取决于您的 IP是静态分配还是动态分配的. PPP和静态IP地址 PPPwith static IP addresses 您需要编辑配置文件/etc/ppp/ppp.conf.如下所示. 以冒号:结尾的行从第一列 (行首)开始, 其它所有的行都要使用空格或制表符 (Tab) 来缩进。 1 default: 2 set log Phase Chat LCP IPCP CCP tun command 3 ident user-ppp VERSION (built COMPILATIONDATE) 4 set device /dev/cuaa0 5 set speed 115200 6 set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \ 7 \"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT" 8 set timeout 180 9 enable dns 10 11 provider: 12 set phone "(123) 456 7890" 13 set authname foo 14 set authkey bar 15 set login "TIMEOUT 10 \"\" \"\" gin:--gin: \\U word: \\P col: ppp" 16 set timeout 300 17 set ifaddr x.x.x.x y.y.y.y 255.255.255.255 0.0.0.0 18 add default HISADDR 行1 : 指定默认的项.当PPP运行时这个项中的命令将自动执行. 行2: 启用登录参数.工作正常后,为避免产生过多的日志文件,这行应该简化为: set log phase tun. 行 3: 告诉PPP怎样向对方自我标识. 如果在建立或使用连接时遇到任何麻烦,PPP就会向对方主机自我标识.对方主机管理员 在处理这个问题时,这些信息会有用. 行 4: 标明modem要连接的端口号.COM1/dev/cuaa0, COM2/dev/cuaa1. 行 5: 设置连接的速度.如果115200 不能工作,试试 38400. 行6 和7: PPPuser PPP 拨号字符串. 用户级PPP使用一种与&man.chat.8;程序相似的语法. 请参考联机手册了解这种语言的相关信息. 注意,为了便于阅读此命令进行了换行.任何ppp.conf里的 命令都可以这样做,前提是行的最后一个字符必须是\. 行 8: 设置连接的时间间隔.默认是180秒,所以这一行是多余的. 行 9: 告诉PPP向对方主机确认本地域名解析设置.如果您运行了本地的域名服务器,要注释或删除掉这一行. 行 10: 为了可读性的需要设置一个空行.空行会被PPP忽略. 行 11: provider指定一个项.可以改成 ISP的名字.这样您以后就可以使用 开启连接. 行 12: 设置提供商的电话号码. 多个电话号码可以使用冒号(:) 或管道符号(|)隔开.这两个字符的区别在&man.ppp.8;的联机手册中有介绍. 总的来讲,如果您要循环使用这些号码,可以使用冒号.如果您想使用第一个号码, 当第一个号码失败了再用第二个号码,就使用管道符号。 如所示的那样, 要给整个电话号码加上引号(")。 如果电话号码里有空格,必须用引号(")将其括起来. 否则会造成简单却难以察觉的错误. 行13和14: 指定用户名和密码.当使用一个&unix;风格的命令提示符登录时,这些值可以用带有\U \P参数 的set login命令进行修改.当使用PAP或CHAP进行连接时, 这些值在验证使用. 行 15: PAP CHAP 如果您使用的是PAP或者CHAP,在这里就不会有登录.要注释或删除掉这一行. 请参考 PAP和CHAP认证 以获取更多细节. 登录命令是的语法是chat类型的.在这个例子中,是这样的: J. Random Provider login: foo password: bar protocol: ppp 您需要改变这个脚本以适合您自己的需要.当您第一次写这个脚本时, 应当确保已经启用chat并处于登录状态,这样您才能确认通信是否 正在按计划进行. 行16: timeout 设置默认的超时时间.这里,连接若在300秒内无响应将被断开.如果您不想设置成超时, 将这个值设置成0,或在命令行使用选项. 行 17: ISP 设置接口地址. 字符串 x.x.x.x需要用ISP提供给您的IP地址替换. 字符串 y.y.y.y要用ISP的网关IP地址替换(即您要连接的主机). 如果ISP没有给您网关地址,可以使用10.0.0.2/0. 如果您需要使用一个猜到的地址,请确保在/etc/ppp/ppp.linkup 中为每个PPP和动态IP地址指令创建了项. 如果没有这一行,ppp 将无法运行模式. 第18行: 添加一个到ISP网关的默认路由。 HISADDR这个关键字会被第17行所指定的网关地址替换。 这行必须出现在第17行之后,以免在 HISADDR 初始化之前使用它的值。 如果您不想使用 的 PPP,则这行应挪到, ppp.linkup 文件中。 若您有一个静态IP地址,且使用 模式运行ppp(因为在连接之前已经正确设置了路由表项),那就不需要再向ppp.linkup 添加项.您可能希望在连接以后创建一个项来调用程序.这在以后的sendmail的例子中会解释. . 示例配置文件可以在目录/usr/share/examples/ppp/中找到. PPP和动态IP地址 PPPwith dynamic IP addresses IPCP 如果ISP没给您指定静态的IP地址,ppp要被配置成能够与对方协商确定本地和远程地址. 要完成这项工作,先要一个IP地址,然后允许 ppp在连接后使用IP配置协议(IPCP)进行正确配置. ppp.conf的配置是与 PPP和静态IP地址一样的,除了以下的改变: 17 set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.255 再次强调,不要包括行号,它只是一个引用标记.缩排一个空格是必须的. 行17: /字符以后是PPP所要求的地址位码. 您可以根据需要使用不同IP号码,但以上的例子永远是可行的. 最后的参数(0.0.0.0)告诉 PPP从0.0.0.0 而不是 10.0.0.1 开始协商地址,对于有些ISP, 这是必需的.不要将 0.0.0.0 作为 set ifaddr的第一个参数,因为这使得PPP在 模式时不能设置初始路由. 如果您不运行模式, 就需要在/etc/ppp/ppp.linkup中创建一个项. 连接建立之后,ppp.linkup被启用. 这时候, ppp将指派接口地址,接着再添加路由表项: 1 provider: 2 add default HISADDR Line 1: 为了建立连接, ppp 会按按照如下规则在 ppp.linkup寻找项:首先,试图寻找相同的标签 (如同在ppp.conf一样).如果失败了,寻找作为网关 IP地址的项,此项是四个八位字节的风格.如果依旧没有找到,就寻找MYADDR 行 2: 这行告诉 ppp添加指向 HISADDR的默认路由. HISADDR由通过IPCP协商得到的IP号替换. 参考/usr/share/examples/ppp/ppp.conf.sample/usr/share/examples/ppp/ppp.linkup.sample 中的pmdemand项以获取细节化的例子. 接收拨入 PPPreceiving incoming calls 当要配置 ppp接受来自LAN上的 拨入时,您需要决定是否将包转给LAN.如果是的话,您就必须从LAN子网中 给对方分配一个IP, 需要在文件/etc/ppp/ppp.conf 中使用命令enable proxy .您还应该确定文件 /etc/rc.conf中包含以下内容: gateway_enable="YES" 使用哪个ggtty? 配置FreeBSD的拨号服务描述了怎么使用命令 &man.getty.8;启动拨号服务. 除了getty 还有 mgetty, 它是getty的智能版本,是按照拨号线的思想设计的. 使用mgetty的好处是它能积极地与modems进行 talks , 这就意味着如果在/etc/ttys中的端口被关闭, 您的moderm就不会回应拨入. 最新版本的mgetty (from 0.99beta onwards)也支持自动侦测PPP数据流,允许客户端不使用脚本就可以访问服务器 . 参考Mgetty 和 AutoPPP的联机手册了解更多信息. <application>PPP</application> 权限 ppp命令通常必须作为root用户运行. 但如果想让一个普通用户将ppp运行于服务器模式(就像下面描述的那样) ,您必须要把此用户加入network组以使其获得运行 ppp 的权限. 您还需要使用allow命令使用户能访问配置文 件的一个或多个部分: allow users fred mary 如果这个命令被用在 default 部分中,您可以让指定的用户访问任何东西. 动态IP用户的PPP Shell PPP shells 创建一个名为/etc/ppp/ppp-shell文件,加入以下内容: #!/bin/sh IDENT=`echo $0 | sed -e 's/^.*-\(.*\)$/\1/'` CALLEDAS="$IDENT" TTY=`tty` if [ x$IDENT = xdialup ]; then IDENT=`basename $TTY` fi echo "PPP for $CALLEDAS on $TTY" echo "Starting PPP for $IDENT" exec /usr/sbin/ppp -direct $IDENT 这个脚本要有可执行属性. 然后通过如下命令创建一个指向此脚本且名为 ppp-dialup的符号链接: &prompt.root; ln -s ppp-shell /etc/ppp/ppp-dialup 您应该将这个脚本作为所有拨入用户的shell. 以下是在文件/etc/password中关于一个PPP用户的例子,用户名为 pchilds (切记不要直接修改这个密码文件, 而是使用vipw命令). pchilds:*:1011:300:Peter Childs PPP:/home/ppp:/etc/ppp/ppp-dialup 创建一个名为 /home/ppp的目录作为拨入用户的主目录, 包含以下这些空文件: -r--r--r-- 1 root wheel 0 May 27 02:23 .hushlogin -r--r--r-- 1 root wheel 0 May 27 02:22 .rhosts 这样就可以防止/etc/motd被显示出来. 静态IP用户的Shell PPP shells 像上面那样创建ppp-shell文件, 为每个静态分配IP用户创建一个到 ppp-shell的 符号链接. 例如,如果您有三个拨号用户, fred,sam,和 mary,您为他们路由C类网络,您需要键入以下内容: &prompt.root; ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-fred &prompt.root; ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-sam &prompt.root; ln -s /etc/ppp/ppp-shell /etc/ppp/ppp-mary 每个用户的Shell必须被设成一个符号链接(例如用户 mary的Shell应该是/etc/ppp/ppp-mary). 为动态IP用户设置<filename>ppp.conf</filename> /etc/ppp/ppp.conf文件应该包含下面 这些行: default: set debug phase lcp chat set timeout 0 ttyd0: set ifaddr 203.14.100.1 203.14.100.20 255.255.255.255 enable proxy ttyd1: set ifaddr 203.14.100.1 203.14.100.21 255.255.255.255 enable proxy 缩进得必须的. default:项在每次会话时都会加载.每个在 /etc/ttys中启用的行都必须为其创建一个相似于 ttyd0: 的项.每一行应该从动态IP 地址池中取得 唯一的IP地址. 为静态IP用户配置<filename>ppp.conf</filename> 根据上面/usr/share/examples/ppp/ppp.conf文件的内容, 您必须为每个静态拨号用户添加一个项.我们继续以fred, sam, 和mary为例. fred: set ifaddr 203.14.100.1 203.14.101.1 255.255.255.255 sam: set ifaddr 203.14.100.1 203.14.102.1 255.255.255.255 mary: set ifaddr 203.14.100.1 203.14.103.1 255.255.255.255 如果需要,/etc/ppp/ppp.linkup 也应该包括每个静态IP用户的的路由信息.下面这一行为客户连接添加了 203.14.101.0C类路由. fred: add 203.14.101.0 netmask 255.255.255.0 HISADDR sam: add 203.14.102.0 netmask 255.255.255.0 HISADDR mary: add 203.14.103.0 netmask 255.255.255.0 HISADDR <command>mgetty</command>和AutoPPP mgetty AutoPPP LCP 在配置和编译mgetty 时启用 AUTO_PPP选项 使mgetty能够探测PPP连接的的LCP状态 并自动产生PPP Shell. 但如果默认的login/password队列没有出现, 那就必须使用PAP或CHAP来验证用户. 这节假定您已经为用户成功地配置,编译了带有AUTO_PPP选项的 mgetty. 确认钅件/usr/local/etc/mgetty+sendfax/login.config 包含以下内容: /AutoPPP/ - - /etc/ppp/ppp-pap-dialup 这行告诉mgetty运行 ppp-pap-dialup脚本来侦听PPP连接. 创建/etc/ppp/ppp-pap-dialup文件写入以下内容 (此文件应该是可执行的): #!/bin/sh exec /usr/sbin/ppp -direct pap$IDENT 对应于每个在/etc/ttys的启用行,都要在/etc/ppp/ppp.conf 中创建相应的项. 这和上面的定义是相同的. pap: enable pap set ifaddr 203.14.100.1 203.14.100.20-203.14.100.40 enable proxy 每个通过这种方式登录的用户必须在 /etc/ppp/ppp.secret文件中有一个username/password项,或者加入 以下选项以使服务器通过PAP方式用/etc/password文件验证用户. enable passwdauth 如果您想为某些用户分配静态IP, 可以在/etc/ppp/ppp.secret中将IP号作为第三个参数指定. 参看 /usr/share/examples/ppp/ppp.secret.sample 中的例子. MS Extensions DNS NetBIOS PPPMicrosoft extensions 可以配置PPP以提供DNS和NetBIOS域名服务器地址. 要在PPP版本 1.x中启用这些扩展,必须向 /etc/ppp/ppp.conf的相关项加入以下行: enable msext set ns 203.14.100.1 203.14.100.2 set nbns 203.14.100.5 PPP版本2及以上 : accept dns set dns 203.14.100.1 203.14.100.2 set nbns 203.14.100.5 这将告诉客户端首选域名服务器和备用域名服务器. 在版本2及以上版本中, 如果省略了 set dns, PPP会使用 /etc/resolv.conf中的值. PAP 和CHAP验证 PAP CHAP 一些ISP将系统设置成使用PAP或CHAP机制来完成连接的验证部分. . 如果是这样,在您连接时ISP就不会给出login:提示符而是立即开始PPP对话. PAP安全性要比CHAP差一些,但在这里安全性并不是问题,因为密码(即使用明文传送)只是通过串行线传送. 黑客没有太多机会窃听. 参考PPP 和静态IP地址 或 PPP 和动态IP地址 节,必须做以下修改: 13 set authname MyUserName 14 set authkey MyPassword 15 set login 第 13 行: 这一行指明您的PAP/CHAP用户名. 您需要为MyUserName输入正确的值. 第 14 行: password 这一行指明您的 PAP/CHAP password密码。 您需要为 MyPassword 输入正确的值。 另外,您可能希望加入一些额外的选项,例如: 16 accept PAP 16 accept CHAP 以明确您的意图,但PAP和CHAP都是被默认接受的. Line 15: Your ISP will not normally require that you log into the server if you are using PAP or CHAP. You must therefore disable your set login string. 即时改变您的<command>ppp</command> 配置 与后台运行的ppp程序进行对话是可能的, 前提是设置了一个合适的诊断端口. 做到这一点,需要把下面的行加入到您的配置中: set server /var/run/ppp-tun%d DiagnosticPassword 0177 这行告诉 PPP在指定的&unix;域socket中侦听,当用户连接时需要给出指定的密码. %dtun设备号替换. 一旦启用了socket, 就可以在脚本中调用程序&man.pppctl.8;来处理正在运行的 的PPP. 使用PPP网络地址翻译 PPPNAT PPP可以使用内建的NAT,而不需内核支持. 这个功能可以通过在/etc/ppp/ppp.conf中的 以下行启用: nat enable yes PPP NAT也可以使用命令行选项 -nat启动. 在文件 /etc/rc.conf中也有 ppp_nat项,且是默认启用的. 如果您使用了这个特性, 您还会发现在 /etc/ppp/ppp.conf中以下 选项对于启用incoming connections forwarding是有用的: nat port tcp 10.0.0.2:ftp ftp nat port tcp 10.0.0.2:http http or do not trust the outside at all nat deny_incoming yes 最后的系统配置 PPPconfiguration 现在您已配置了ppp,但在真正工作之前还有一些事情要做.它们都与编辑 /etc/rc.conf有关. 从上依次往下看,确认设置了 hostname= 行, e.g.: hostname="foo.example.com" 如果您的ISP提供给您一个静态的IP和名字,将这个名字设为hostname是最合适的. 寻找 network_interfaces 变量. 如果要配置系统通过拨号连入ISP, 一定要将tun0设备加入这个列表,否则就删除它. network_interfaces="lo0 tun0" ifconfig_tun0= ifconfig_tun0变量应该是空的,且要创建一个名为 /etc/start_if.tun0的文件. 这个文件应该包含这一行: ppp -auto mysystem 此脚本在网络配置时被执行,开启PPP守护进程进入自动模式.如果这台机子充当一个LAN的网关, 您可能希望使用.参考相关联机手册了解更多细节. 务必在 /etc/rc.conf 中, 把路由程序设置为 NO router_enable="NO" routed 不启动 routed 服务程序非常重要, 因为 routed 总会删掉由 ppp 所建立的默认路由。 此外, 还应该确保 sendmail_flags 这一行没有 参数, 否则 sendmail 将会不断地尝试查找网络, 而这样做将会导致机器不断地进行拨号。 可以考虑: sendmail_flags="-bd" sendmail 替代的作法是当每次PPP连接建立时您必须通过键入以下命令强制 sendmail重新检查邮件队列: &prompt.root; /usr/sbin/sendmail -q 您也可以在ppp.linkup使用!bg命令自动完成这些工作: 1 provider: 2 delete ALL 3 add 0 0 HISADDR 4 !bg sendmail -bd -q30m SMTP 如果您不喜欢这样做, 可以设立一个 dfilter 以阻止 SMTP传输.参考相关文件了解更多细节 . 现在您唯一要做的事是重新启动计算机。 重起之后,可以输入: &prompt.root; ppp 然后是dial provider以开启 PPP会话. 或者如果您想让ppp自动建立会话 ,因为您有一个广域连接(且没有创建 start_if.tun0 脚本),键入: &prompt.root; ppp -auto provider 总结 当第一次设置PPP时,下面几步是必须的: 客户端: 确保 tun编译进了进核. 确保tunN 设备文件在 /dev 目录中是可用的. /etc/ppp/ppp.conf中创建一个项. pmdemand示例应该适合于绝大多数ISP. 如果您使用动态IP地址,在/etc/ppp/ppp.linkup创建一个项. 更新/etc/rc.conf 文件. 如果您要求按需拨号,创建一个start_if.tun0脚本. 服务器端: 确保tun设备已编译入内核. 确保tunN设备文件在 /dev目录中是可用的. /etc/passwd中创建一个项 (使用&man.vipw.8;程序). 在用户的home目录创建一个运行 ppp -direct direct-server或相似命令的profile. /etc/ppp/ppp.conf中创建一个项. direct-server示例应该能满足要求. /etc/ppp/ppp.linkup中创建一个项. 更新 /etc/rc.conf 文件. Gennady B. Sorokopud Parts originally contributed by Robert Huff 使用内核级PPP 设立内核级PPP PPPkernel PPP 在开始设置内核级PPP时, 需要确信pppd已经被定位在/usr/sbin 中 且存在/etc/ppp目录 . pppd能在两种模式下工作: 作为一个客户 — 您要通过PPP串行线或modem线把您的机器连接到互联网上 . PPPserver 作为服务器 —计算机已经位于网络上,且被用于通过PPP与其它计算机连接. 两种情况您都需要设立一个选项文件, (/etc/ppp/options 或者是 ~/.ppprc 如果您的计算机有多个用户使用PPP). 您还需要一些modem/serial软件(comms/kermit就很适合), 使您能够拨号并与远程主机建立连接. Trev Roydhouse Based on information provided by 使用<command>pppd</command>作为客户端 PPPclient Cisco 下面这个 /etc/ppp/options选项文件能够被用来与CISCO终端服务器的 PPP线连接. crtscts # enable hardware flow control modem # modem control line noipdefault # remote PPP server must supply your IP address # if the remote host does not send your IP during IPCP # negotiation, remove this option passive # wait for LCP packets domain ppp.foo.com # put your domain name here :<remote_ip> # put the IP of remote PPP host here # it will be used to route packets via PPP link # if you didn't specified the noipdefault option # change this line to <local_ip>:<remote_ip> defaultroute # put this if you want that PPP server will be your # default router 连接: Kermit modem 使用 Kermit (或其他 modem 程序来拨号), 然后输入您的用户名和口令 (或在远程主机上启用 PPP 所需的其他信息)。 退出 Kermit (并不挂断连接)。 键入下面这行: &prompt.root; /usr/src/usr.sbin/pppd.new/pppd /dev/tty01 19200 一定要使用正确的速度和设备名. 现在您的计算机已经用PPP连接. 如果连接失败 , 您可在文件/etc/ppp/options中添加 选项,察看控制台信息以跟踪问题. 下面这个/etc/ppp/pppup脚本能自动完成这三个步骤: #!/bin/sh ps ax |grep pppd |grep -v grep pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'` if [ "X${pid}" != "X" ] ; then echo 'killing pppd, PID=' ${pid} kill ${pid} fi ps ax |grep kermit |grep -v grep pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'` if [ "X${pid}" != "X" ] ; then echo 'killing kermit, PID=' ${pid} kill -9 ${pid} fi ifconfig ppp0 down ifconfig ppp0 delete kermit -y /etc/ppp/kermit.dial pppd /dev/tty01 19200 Kermit /etc/ppp/kermit.dial 是一个 Kermit 脚本, 它会完成拨号, 并在远程主机上完成所有需要的身份验证过程 (这份文档的最后有一个脚本实例)。 使用下面这个脚本/etc/ppp/pppdown断开PPP连线: #!/bin/sh pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'` if [ X${pid} != "X" ] ; then echo 'killing pppd, PID=' ${pid} kill -TERM ${pid} fi ps ax |grep kermit |grep -v grep pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'` if [ "X${pid}" != "X" ] ; then echo 'killing kermit, PID=' ${pid} kill -9 ${pid} fi /sbin/ifconfig ppp0 down /sbin/ifconfig ppp0 delete kermit -y /etc/ppp/kermit.hup /etc/ppp/ppptest 通过执行/usr/etc/ppp/ppptest,看看pppd 是否仍在运行: #!/bin/sh pid=`ps ax| grep pppd |grep -v grep|awk '{print $1;}'` if [ X${pid} != "X" ] ; then echo 'pppd running: PID=' ${pid-NONE} else echo 'No pppd running.' fi set -x netstat -n -I ppp0 ifconfig ppp0 执行脚本 /etc/ppp/kermit.hup以挂起moderm,这个文件包含: set line /dev/tty01 ; put your modem device here set speed 19200 set file type binary set file names literal set win 8 set rec pack 1024 set send pack 1024 set block 3 set term bytesize 8 set command bytesize 8 set flow none pau 1 out +++ inp 5 OK out ATH0\13 echo \13 exit 也可以用chat 代替kermit: 以下两个文件用以建立pppd连接. /etc/ppp/options: /dev/cuaa1 115200 crtscts # enable hardware flow control modem # modem control line connect "/usr/bin/chat -f /etc/ppp/login.chat.script" noipdefault # remote PPP serve must supply your IP address # if the remote host doesn't send your IP during # IPCP negotiation, remove this option passive # wait for LCP packets domain <your.domain> # put your domain name here : # put the IP of remote PPP host here # it will be used to route packets via PPP link # if you didn't specified the noipdefault option # change this line to <local_ip>:<remote_ip> defaultroute # put this if you want that PPP server will be # your default router /etc/ppp/login.chat.script: 以下的内容应该放在一行内. ABORT BUSY ABORT 'NO CARRIER' "" AT OK ATDT<phone.number> CONNECT "" TIMEOUT 10 ogin:-\\r-ogin: <login-id> TIMEOUT 5 sword: <password> 一旦这些被安装且修改正确,您所要做的就是运行pppd,就像这样: &prompt.root; pppd 使用<command>pppd</command>作为服务器 /etc/ppp/options要包括下面这些内容: crtscts # Hardware flow control netmask 255.255.255.0 # netmask (not required) 192.114.208.20:192.114.208.165 # IP's of local and remote hosts # local ip must be different from one # you assigned to the Ethernet (or other) # interface on your machine. # remote IP is IP address that will be # assigned to the remote machine domain ppp.foo.com # your domain passive # wait for LCP modem # modem line 下面这个脚本/etc/ppp/pppserv 使pppd以服务器方式启动: #!/bin/sh ps ax |grep pppd |grep -v grep pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'` if [ "X${pid}" != "X" ] ; then echo 'killing pppd, PID=' ${pid} kill ${pid} fi ps ax |grep kermit |grep -v grep pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'` if [ "X${pid}" != "X" ] ; then echo 'killing kermit, PID=' ${pid} kill -9 ${pid} fi # reset ppp interface ifconfig ppp0 down ifconfig ppp0 delete # enable autoanswer mode kermit -y /etc/ppp/kermit.ans # run ppp pppd /dev/tty01 19200 使用脚本/etc/ppp/pppservdown停止服务器: #!/bin/sh ps ax |grep pppd |grep -v grep pid=`ps ax |grep pppd |grep -v grep|awk '{print $1;}'` if [ "X${pid}" != "X" ] ; then echo 'killing pppd, PID=' ${pid} kill ${pid} fi ps ax |grep kermit |grep -v grep pid=`ps ax |grep kermit |grep -v grep|awk '{print $1;}'` if [ "X${pid}" != "X" ] ; then echo 'killing kermit, PID=' ${pid} kill -9 ${pid} fi ifconfig ppp0 down ifconfig ppp0 delete kermit -y /etc/ppp/kermit.noans The following Kermit script (/etc/ppp/kermit.ans) will enable/disable autoanswer mode on your modem. It should look like this: set line /dev/tty01 set speed 19200 set file type binary set file names literal set win 8 set rec pack 1024 set send pack 1024 set block 3 set term bytesize 8 set command bytesize 8 set flow none pau 1 out +++ inp 5 OK out ATH0\13 inp 5 OK echo \13 out ATS0=1\13 ; change this to out ATS0=0\13 if you want to disable ; autoanswer mode inp 5 OK echo \13 exit 一个名为/etc/ppp/kermit.dial的脚本用于向远程主机 进行拨号和验证.您要根据需要定制它.要加入您的登寻名和密码.您还要根据modem 和远程主机的反应更改输入语句. ; ; put the com line attached to the modem here: ; set line /dev/tty01 ; ; put the modem speed here: ; set speed 19200 set file type binary ; full 8 bit file xfer set file names literal set win 8 set rec pack 1024 set send pack 1024 set block 3 set term bytesize 8 set command bytesize 8 set flow none set modem hayes set dial hangup off set carrier auto ; Then SET CARRIER if necessary, set dial display on ; Then SET DIAL if necessary, set input echo on set input timeout proceed set input case ignore def \%x 0 ; login prompt counter goto slhup :slcmd ; put the modem in command mode echo Put the modem in command mode. clear ; Clear unread characters from input buffer pause 1 output +++ ; hayes escape sequence input 1 OK\13\10 ; wait for OK if success goto slhup output \13 pause 1 output at\13 input 1 OK\13\10 if fail goto slcmd ; if modem doesn't answer OK, try again :slhup ; hang up the phone clear ; Clear unread characters from input buffer pause 1 echo Hanging up the phone. output ath0\13 ; hayes command for on hook input 2 OK\13\10 if fail goto slcmd ; if no OK answer, put modem in command mode :sldial ; dial the number pause 1 echo Dialing. output atdt9,550311\13\10 ; put phone number here assign \%x 0 ; zero the time counter :look clear ; Clear unread characters from input buffer increment \%x ; Count the seconds input 1 {CONNECT } if success goto sllogin reinput 1 {NO CARRIER\13\10} if success goto sldial reinput 1 {NO DIALTONE\13\10} if success goto slnodial reinput 1 {\255} if success goto slhup reinput 1 {\127} if success goto slhup if < \%x 60 goto look else goto slhup :sllogin ; login assign \%x 0 ; zero the time counter pause 1 echo Looking for login prompt. :slloop increment \%x ; Count the seconds clear ; Clear unread characters from input buffer output \13 ; ; put your expected login prompt here: ; input 1 {Username: } if success goto sluid reinput 1 {\255} if success goto slhup reinput 1 {\127} if success goto slhup if < \%x 10 goto slloop ; try 10 times to get a login prompt else goto slhup ; hang up and start again if 10 failures :sluid ; ; put your userid here: ; output ppp-login\13 input 1 {Password: } ; ; put your password here: ; output ppp-password\13 input 1 {Entering SLIP mode.} echo quit :slnodial echo \7No dialtone. Check the telephone line!\7 exit 1 ; local variables: ; mode: csh ; comment-start: "; " ; comment-start-skip: "; " ; end: Tom Rhodes Contributed by <acronym>PPP</acronym> 连接故障排除 PPPtroubleshooting 本节将讲述通过modem连接使用PPP时可能出现的问题 . 例如,您可能需要确切地知道您拨入的系统会出现一个怎样的命令行提示符.有些ISP会提供 ssword提示符,而其它的可能会出现 password; 如果没有根据情况的不同相应地编写ppp 脚本,登录就会失败.诊断ppp最常用的方法是手动进行连接 . 以下的信息会一步一步地带您完成手动连接. 检查设备节点 如果您的内核是经过重新配置的,那么就需要检查sio设备. 如果没有配置过内核, 就没什么可担心的了.只要查看 dmesg的输出以找到modem设备: &prompt.root; dmesg | grep sio 您应该找到与sio设备有关的输出. 这些就是我们需要的COM端口. 如果您的modem按照标准串行端口工作,您能在sio1COM2找到它. 如果是这样, 您只需创建serial设备,而不必重建内核. cd到/dev目录,然后运行 MAKEDEV脚本 : &prompt.root; sh MAKEDEV cuaa0 cuaa1 cuaa2 cuaa3 它会为您的系统创建串行(serial)设备. 如果modem设备连接在sio1接口(在DOS中称为COM2),那么您的modem将会是 /dev/cuaa1 手动连接 通过手动控制ppp来连接Internet 是诊断连接及获知ISP处理PPP客户端方式的一个快速,简单的方法. .让我们从PPP 命令行开始.在所有的例子中我们使用 example作为运行PPP主机的主机名.键入ppp 命令打开ppp : &prompt.root; ppp 现在我们已经打开了ppp. ppp ON example> set device /dev/cuaa1 设置modem设备,在本例子中是 cuaa1. ppp ON example> set speed 115200 设置连接速度,在本例中我们使用15,200 kbps. ppp ON example> enable dns 使ppp配置域名服务, 在文件/etc/resolv.conf中添加域名服务器行. .如果 ppp不能确定我们的主机名,可以在稍后设置. ppp ON example> term 切换到 终端样我们就能手动地控制模式,这modem. deflink: Entering terminal mode on /dev/cuaa1 type '~h' for help at OK atdt123456789 使用命令at初始化modem, 然后使用atdtISP给您的号码进行拨号. CONNECT 连接配置,如果我们遇到了与硬件无关的连接问题,可以在这里尝试解决. ISP Login:myusername 这里提示您输入用户名,输入ISP提供的用户名然后按回车. ISP Pass:mypassword 这时提示我们输入密码,输入 ISP提供的密码. 如同登录入&os;,密码不会显示. Shell or PPP:ppp 由于ISP的不同,这个提示符可能不会出现.这里我们被问及:是使用 一个运行于提供商端的Shell还是启动ppp. 这本例中,我们选择使用ppp因为我 们想得到Internet连接. Ppp ON example> 注意在这个例子中,第一个 已经大写. 这显示我们已经成功地连接上了ISP. PPp ON example> 我们已经成功通过了 ISP的验证,正在等待分配IP地址. PPP ON example> 我们得到了一个 IP 地址,成功地完成了连接. PPP ON example>add default HISADDR 这里,我们添加默认路由.在能与外界通信之前我们需要这样做,因为现在我们 只与服务器端建立了连接.如果由于已存在的路由而导致操作失败, 您可以在前加!号. 作为另外一种方式,您也可以在真正连接之前设置这些(指add default HISADDR),ppp会根据这项设定协商取 得一个新的路由. 如果一切顺利,现在我们应该能得到一个活动的Internet连接,可以使用CTRL z使其转入后台.如果您发现 PPP重新变为 ppp,那代表我们失去了连接.. 大写的P表明我们有到ISP的连接 而小写的p表明由于某种原因我们失去了连接.这便于我们了解连接状态. ppp 只有这两个状态. 诊断排错 如果您有一根直连线且似乎不能建立连接,要使用以关闭字节流的CTS/RTS.这种情况一般发 生在连接兼容PPP的终端服务器时. 当它向通信连接写入数据时,PPP就会挂起, 一直等待一个CTS, 或者一个不可能出现的Clear to Send信号。 如果使用了这个选项, 您还应使用 选项, 某些存在缺陷的硬件在完成端对端发送特定字符, 特别是 XON/XOFF 时可能会遇到困难。 请参见 &man.ppp.8; 联机手册以了解关于可用选项的更多细节, 以及如何使用它们。 如果您有一个比较旧的modem, 您要用 。 奇偶校验的默认设置是 none, 但在旧式的 (当流量大量增加时) 调制解调器和某些 ISP 被用来纠错。 您需要使用这个选项才能使用 Compuserve ISP PPP 可能并不返回命令模式, 这通常是 ISP 等待您这一端发起协商时发生了错误。 此时, 使用 ~p 命令将强制 ppp 开始发送配置信息。 如果您没有看到登陆提示, 则很可能需要使用 PAPCHAP 验证来代替前面例子中的 &unix; 风格验证。 要使用 PAPCHAP 只需在进入终端模式之前把下面的选项加入 PPP ppp ON example> set authname myusername 此处 myusername 应改为您的 ISP 分配给您的用户名。 ppp ON example> set authkey mypassword 此处 mypassword 应该为您的 ISP 分配给您的口令。 如果连接正常, 但无法查找域名, 请尝试 &man.ping.8; 某个 IP 地址来看看是否返回了信息。 如果您发现百分之百 (100%) 丢包, 那么您很可能没有分配默认路由。 请仔细检查选项 是否在连接时被设置了。 如果您能连接到远程的 IP 地址则有可能域名解析服务器的地址没有被加入到 /etc/resolv.conf。 这个文件应该是下面的样子: domain example.com nameserver x.x.x.x nameserver y.y.y.y 此处 x.x.x.xy.y.y.y 应该改为您的 ISP 的 DNS 服务器的 IP 地址。 这一信息在您注册时可能会提供给您, 不过通常只需给 ISP 打个电话就能知道了。 您还可以让 &man.syslog.3; 为您的 PPP 连接提供日志。 只需增加: !ppp *.* /var/log/ppp.log /etc/syslog.conf 中。 绝大多数情况下, 这个功能默认已经打开了。 Jim Mock Contributed (from http://node.to/freebsd/how-tos/how-to-freebsd-pppoe.html) by 使用基于以太网的PPP(PPPoE) PPPover Ethernet PPPoE PPP, over Ethernet 本节将介绍如何建立基于以太网的PPP (PPPoE). 配置内核 对于PPPOE,并没有必须的内核配置. 如果必需的netgraph支持没有编译入内核 ,它可以由 ppp动态加载. 设置<filename>ppp.conf</filename> 以下是一个ppp.conf的例子: default: set log Phase tun command # you can add more detailed logging if you wish set ifaddr 10.0.0.1/0 10.0.0.2/0 name_of_service_provider: set device PPPoE:xl1 # replace xl1 with your Ethernet device set authname YOURLOGINNAME set authkey YOURPASSWORD set dial set login add default HISADDR 运行<application>ppp</application> 作为root,您可以执行: &prompt.root; ppp -ddial name_of_service_provider 启动时运行<application>ppp</application> 在文件/etc/rc.conf加入以下内容: ppp_enable="YES" ppp_mode="ddial" ppp_nat="YES" # if you want to enable nat for your local network, otherwise NO ppp_profile="name_of_service_provider" 使用 PPPoE 服务标签 在某些时候,有必要使用一个服务标签来建立您的连接.服务标签用于区分同一网络中的不同服务器. 您可以在ISP提供的文档中找到必要的服务标签信息.若不能找到,向您的ISP询求技术支持. 作为最后的方法, 您可以试试 Roaring Penguin PPPoE, 它可以在 Ports Collection 中找到。 然而需要注意的是, 它可能会清楚 modem 的固件, 并使其无法正常工作, 因此一定要仔细考虑之后再做这个操作。 简单地安装由服务提供商随 modem 提供的程序。 随后, 选择 System 菜单。 您的配置文件应该会在这里列出。 一般来说它的名字应该是 ISP 配置文件名 (service tag, 服务标签) 将被用于 PPPoE 在 ppp.conf 中的配置项, 作为服务商 set device 命令的一部分 (参见 &man.ppp.8; 联机手册以了解更多细节)。 它应该类似下面的样子: set device PPPoE:xl1:ISP 记住将xl1换成实际的以太网设备. 记住将 ISP 换成您刚刚找到的profile名. 获得更多的信息,请参考: Cheaper Broadband with FreeBSD on DSL by Renaud Waldura. Nutzung von T-DSL und T-Online mit FreeBSD by Udo Erdelhoff (in German). 带有一个&tm.3com; <trademark class="registered">HomeConnect</trademark>ADSL Modem的PPPOE双重连接 这个modem不遵循RFC 2516 (A Method for transmitting PPP over Ethernet (PPPoE), written by L. Mamakos, K. Lidl, J. Evarts, D. Carrel, D. Simone, and R. Wheeler). 而是使用不同的数据包格式作为以太网的框架.请向 3Com抱怨,如果您认为它应该遵守PPPOE的规范. 为了让FreeBSD能够与这个设备通信,必须设置sysctl.通过更改/etc/sysctl.conf,这一步 可以在启动时自动完成: net.graph.nonstandard_pppoe=1 或直接执行命令: sysctl net.graph.nonstandard_pppoe=1. 很不幸,由于这是系统全局设置,无法同时与正常的PPP客户端(或服务器) 和&tm.3com;HomeConnect ADSL Modem通信 . Using <application>PPP</application> over ATM (PPPoA) PPPover ATM PPPoA 基于ATM的PPP 以下将介绍如何设置基于ATM的PPP(PPPoA). PPPoA是欧洲DSL提供商的普遍选择 . 使用带有一个Alcatel &speedtouch;USB的PPPoA 针对这一设备的 PPPoA 支持, 在 FreeBSD 中是作为 port 提供的, 因为其固件使用了 阿尔卡特许可协议, 因而不能与 FreeBSD 的基本系统一起免费地再发布。 使用 Ports Collection 可以非常方便地安装 net/pppoa port, 之后按照它提供的指使操作就可以了。 和许多 USB 设备类似, 阿尔卡特的 &speedtouch; USB 需要从主机上下载固件才能够正常工作。 您可以在 &os; 中将此操作自动化, 这样当设备插到某个 USB 口的时候就会自动下载固件了。 可以在 /etc/usbd.conf 文件中加入下面的信息来让它自动完成固件的传送。 注意, 必须以 root 用户的身份编辑它。 device "Alcatel SpeedTouch USB" devname "ugen[0-9]+" vendor 0x06b9 product 0x4061 attach "/usr/local/sbin/modem_run -f /usr/local/libdata/mgmt.o" 要启动USB守护进程usbd, 在/etc/rc.conf加入以下行: usbd_enable="YES" 也可以将ppp设置成启动时拨号. 向 /etc/rc.conf加入以下这几行. 同样地您需要以root用户登录. ppp_enable="YES" ppp_mode="ddial" ppp_profile="adsl" 为了使其正常工作,您需要使用net/pppoa port提供的ppp.conf样例. 使用mpd 可以使用 mpd 来连接多种类型的服务, 特别是 PPTP 服务。 您可以在 Ports Collection 中找到 mpd, 它的位置是 net/mpd。 许多 ADSL modem 需要在 modem 和计算机之间建立一条 PPTP 隧道, 而阿尔卡特 &speedtouch; Home 正是其中的一种。 首先需要从 port 完成安装, 然后才能配置 mpd 来满足您的需要, 并完成服务商的配置。 port 会把一系列包括了详细注解的配置文件实例放到 PREFIX/etc/mpd/。 注意, 这里的 PREFIX 表示 ports 安装的目录, 默认情况下, 应该是 /usr/local/。 关于配置 mpd 的完整说明, 会以 HTML 格式随 port 一起安装。 这些文件将放在 PREFIX/share/doc/mpd/。 下面是通过 mpd 连接 ADSL 服务的一个简单例子。 配置被分别放到了两个文件中, 第一个是 mpd.conf default: load adsl adsl: new -i ng0 adsl adsl set bundle authname username set bundle password password set bundle disable multilink set link no pap acfcomp protocomp set link disable chap set link accept chap set link keep-alive 30 10 set ipcp no vjcomp set ipcp ranges 0.0.0.0/0 0.0.0.0/0 set iface route default set iface disable on-demand set iface enable proxy-arp set iface idle 0 open username用来向您的ISP进行验证. password用来向您的ISP进行验证. mpd.links包含连接的信息: adsl: set link type pptp set pptp mode active set pptp enable originate outcall set pptp self 10.0.0.1 set pptp peer 10.0.0.138 运行mpd的主机的IP地址. ADSL modem的IP地址.Alcatel &speedtouch; Home 默认的是 10.0.0.138. 初始化连接: &prompt.root; mpd -b adsl 您可以通过以下命令查看连接状态: &prompt.user; ifconfig ng0 ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> mtu 1500 inet 216.136.204.117 --> 204.152.186.171 netmask 0xffffffff 使用mpd连接ADSL服务是推荐的方式. 使用pptpclient 也可以使用net/pptpclient连接其它的 PPPoA. 为了使用net/pptpclient连接 DSL服务,需要安装port或package并编辑/etc/ppp/ppp.conf.您需要有 root权限以进行这两项操作.以下是ppp.conf中的一个示例项. 参考ppp的联机手册&man.ppp.8;,以获取更多有关ppp.conf 选项的信息. adsl: set log phase chat lcp ipcp ccp tun command set timeout 0 enable dns set authname username set authkey password set ifaddr 0 0 add default HISADDR The username of your account with the DSL provider. The password for your account. 由于您必须将帐号密码以明文的方式放入ppp.conf 您应该确保没有任何人能看到此文件的内容.以下一系列命令将会确保此文件只对 root用户可读.参考&man.chmod.1;和&man.chown.8; 的联机手册以获得更多信息. &prompt.root; chown root:wheel /etc/ppp/ppp.conf &prompt.root; chmod 600 /etc/ppp/ppp.conf 以下将为到DSL路由器的会话打开一个tunnel. 以太网DSL modem有一个设置的局域网IP地址. 以Alcatel &speedtouch; Home为例,这个地址是 10.0.0.138.路由器的文档应该会告诉您它使用地址.执行以下命令 以打开tunnel并开始会话: &prompt.root; pptp address adsl 您应该在命令的最后加上(&)号,否则 pptp 无法返回到命令行提示符. 要创建一个 tun虚拟设备用于进程pptpppp 之间的交互.一旦您返回到了命令行,或者 pptp 进程确认了一个连接,您可以这样检查tunnel设备: &prompt.user; ifconfig tun0 tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500 inet 216.136.204.21 --> 204.152.186.171 netmask 0xffffff00 Opened by PID 918 如果您无法连接,一般可以通过telnet或者web浏览器检查路由器(modem)的配置. 如果依旧无法连接,您应该检查pptp的输出及ppp的日志文件 /var/log/ppp.log 以获得线索. Satoshi Asami Originally contributed by Guy Helmer With input from Piero Serini 使用SLIP SLIP 设置SLIP客户端 SLIPclient 下面是一个在静态主机网络上设置FreeBSD机器的方法.对于动态主机名分配(您的地址在每次拨号时都会改变), 您可能还需要更复杂的设置. 首先,确定您的modem连接的串行口. 许多人会设置符号连接, 比如/dev/modem指向真实的设备名 /dev/cuaaN.这充许您抽像真实的设备名. 当您需 要在/etc.kermrc文件中修复整个系统上的许多文件时, 这是一件非常麻烦的事情! /dev/cuaa0 is COM1, cuaa1 is COM2, etc. 确保您的内核文件包含以下内容: pseudo-device sl 1 在 &os; 5.X 中, 则应使用: device sl 这包含在GENERIC内核,所以这应该不会是个问题,除非您 已经删除了它。 只需做一次的事情 把您本地网络上的机器、 网关以及域名服务器, 都加入到 /etc/hosts 文件中。 我们的是下面这个样子: 127.0.0.1 localhost loghost 136.152.64.181 water.CS.Example.EDU water.CS water 136.152.64.1 inr-3.CS.Example.EDU inr-3 slip-gateway 128.32.136.9 ns1.Example.EDU ns1 128.32.136.12 ns2.Example.EDU ns2 在 FreeBSD 5.0 之前的版本中, 请务必确保 /etc/host.conf 中的 hostsbind 之前出现。 从 FreeBSD 5.0 开始, 系统转而使用 /etc/nsswitch.conf 文件, 请确认在这个文件中 一行里, files 出现在 dns 之前。 如果没有这些参数, 可能会发生很奇怪的事情。 编辑/etc/rc.conf. 编辑以下这行设置主机名(hostname): hostname="myname.my.domain" 应该用您主机的Internet全名代替. 改变以下这些行将sl0添加到网络接口 列表中: network_interfaces="lo0" 改为: network_interfaces="lo0 sl0" 加入以下这一行设置sl0的启动标志: ifconfig_sl0="inet ${hostname} slip-gateway netmask 0xffffff00 up" default route 改变这一行以指明默认的路由: defaultrouter="NO" 改为: defaultrouter="slip-gateway" 创建文件/etc/resolv.conf,写入以下内容: domain CS.Example.EDU nameserver 128.32.136.9 nameserver 128.32.136.12 nameserver domain name 正如您看到的, 这些行设置了域名服务器.当然,实际的域名和IP地址取决于您的环境. 设置roottoor的密码(其它任何没有密码的帐号). 重启计算机,然后确认使用了正确的主机名. 创建一个SLIP连接 SLIPconnecting with 在命令提示符之后输入 slip 进行拨号, 输入您的机器名和口令。 具体需要输入什么, 与您的环境密切相关。 如果使用 Kermit, 则可以使用类似下面的脚本: # kermit setup set modem hayes set line /dev/modem set speed 115200 set parity none set flow rts/cts set terminal bytesize 8 set file type binary # The next macro will dial up and login define slip dial 643-9600, input 10 =>, if failure stop, - output slip\x0d, input 10 Username:, if failure stop, - output silvia\x0d, input 10 Password:, if failure stop, - output ***\x0d, echo \x0aCONNECTED\x0a 当然, 您还需要修改用户名和口令来满足实际需要。 完成这些操作之后, 只需在 Kermit 提示符之后输入 slip 就可以连接了。 将密码以纯文本的形式存放在文件系统无论如何都是个 主意。 请考虑这样做的风险。 在这里退出 Kermit (也可以用 Ctrl z 将其挂起), 以 root 用户键入: &prompt.root; slattach -h -c -s 115200 /dev/modem 如果您能ping通路由器另一端的主机,就是连接好了! 如果不行, 您可以使用选项代替 作为slattach的参数. 关闭连接 按下面的步骤做: &prompt.root; kill -INT `cat /var/run/slattach.modem.pid` 来杀掉 slattach。 切记上述操作只有以 root 身份才能完成。 接下来回到 kermit (如果之前是将它挂起了, 则使用 fg) 并退出 (q)。 在 &man.slattach.8; 联机手册中提到, 必须使用 ifconfig sl0 down 才能将接口标记为关闭, 但和这样做似乎没有什么区别。 (ifconfig sl0 仍然报告同样的东西。) 有时, 您的 modem 可能会拒绝挂断。 这种情况下, 只需重新启动 kermit 并再次退出它就可以了。 一般来说试二次就可以了。 问题解答 如果还不行, 尽管发邮件到 &a.net.name; 邮件列表来提问。 常见的问题包括: 执行slattach时不使用选项 (这应该不是关键的,但有些用户报告这样做解决了问题.) 使用替换 (在一些字体下很难看出不同). 试试ifconfig sl0来查看您的接口状态.例如,您可以这样做: &prompt.root; ifconfig sl0 sl0: flags=10<POINTOPOINT> inet 136.152.64.181 --> 136.152.64.1 netmask ffffff00 - 如果在ping时得到一条no route to host - 信息,您的路由表可能有问题.可以使用 netstat -r - 命令显示当前路由: + 如果在使用 &man.ping.8; 时得到了 + no route to host 这样的提示, + 则说明您的路由表可能有问题。 可以用 netstat -r + 命令来显示当前的路由: &prompt.root; netstat -r Routing tables Destination Gateway Flags Refs Use IfaceMTU Rtt Netmasks: (root node) (root node) Route Tree for Protocol Family inet: (root node) => default inr-3.Example.EDU UG 8 224515 sl0 - - localhost.Exampl localhost.Example. UH 5 42127 lo0 - 0.438 inr-3.Example.ED water.CS.Example.E UH 1 0 sl0 - - water.CS.Example localhost.Example. UGH 34 47641234 lo0 - 0.438 (root node) 前述的例子来自于一个非常繁忙的系统. 您系统上的这些数字会因网络活动的不同而改变. 设置SLIP服务器 SLIPserver 本文提供了在FreeBSD上设置SLIP服务的建议,主要是指配置您的系统使其能根据远程SLIP客户端的 登录自动地开启连接. 前提条件 TCP/IP networking 这一节本身就是非常技术性的, 所以要求有一定的背景知识.本节假定您熟悉TCP/IP网络协议,特别是网络和和结点寻址 ,网络地址掩网, 划分子网, 路由, 路由协议(比如RIP).在一个拨号服务器上配置SLIP需要这些概念性的知识. 如果您不熟悉它们,请先阅读Craig Hunt的 TCP/IP 网络管理 由O'Reilly & Associates, Inc.出版(ISBN号为0-937175-82-X),或者Douglas Comer有关TCP/IP 协议的书籍. modem 另外还假定您已经设置好了您的modem并配置了相应的文件允许通过modem登录. 如果您还没有准备好您的系统,请 参考拨号服务的配置指南; 如果您能使用网页浏览器,也可以浏览 http://www.FreeBSD.org/docs.html上的指南列表. 您还需要参考&man.sio.4;以获取串行端口设备驱动的信息, &man.ttys.5;,&man.gettytab.5;, &man.getty.8;, & &man.init.8;以获取配置系统以接受modem登录的 相关信息,也许还有 &man.stty.1;以获取有关串行口参数设置的信息(比如clocal指直线串行 接口). 快速浏览 使用FreeBSD作为SLIP服务器,在典型配置时,它是这样工作的: 一个SLIP客户拨号并以专用的login ID登录到FreeBSD SLIP服务器系统.这个用户使用/usr/sbin/sliplogin 作为shell.sliplogin程序在文件/etc/sliphome/slip.hosts中查找这个用户的项, 如果找到了匹配项,就将串行线连接到一个可用的SLIP接口,然后运行shell脚本/etc/sliphome/slip.login 以配置SLIP接口. 一个SLIP服务器登录的例子 例如,如果一个SLIP用户的ID是Shelmerg, 在/etc/master.passwdShelmerg的项如下的所示: Shelmerg:password:1964:89::0:0:Guy Helmer - SLIP:/usr/users/Shelmerg:/usr/sbin/sliplogin Shelmerg登录时, sliplogin在文件 /etc/sliphome/slip.hosts中搜索与用户ID匹配的行;如下所示: Shelmerg dc-slip sl-helmer 0xfffffc00 autocomp sliplogin找到这条区配行, 并将串行线与另一个可用的SLIP接口连起来, 然后执行/etc/sliphome/slip.login脚本: /etc/sliphome/slip.login 0 19200 Shelmerg dc-slip sl-helmer 0xfffffc00 autocomp 如果一切顺利, /etc/sliphome/slip.loginsliplogin )绑定的接口(在上面的例子中,是slip.login参数列表的第一个参数)运行 ifconfig以设置SLIP接口的本地IP地址(dc-slip),远程IP地址(sl-helmer), 掩码(0xfffffc00),及其它附加的标志(autocomp). 如果出现错误 ,sliplogin 通常会使用syslog守护进程将有用的信息写入 /var/log/messages 参考&man.syslogd.8;和&man.syslog.conf.5;联机手册及/etc/syslog.conf, 以获知syslogd是如何工作的). 好了,让我们开始设置系统 . 内核配置 kernelconfiguration FreeBSD默认的内核一般定义了两个SLIP接口:(sl0sl1); 您可以使用 netstat -i命令查看您的内核是否定义了这些接口. netstat -i样例输出: Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll ed0 1500 <Link>0.0.c0.2c.5f.4a 291311 0 174209 0 133 ed0 1500 138.247.224 ivory 291311 0 174209 0 133 lo0 65535 <Link> 79 0 79 0 0 lo0 65535 loop localhost 79 0 79 0 0 sl0* 296 <Link> 0 0 0 0 0 sl1* 296 <Link> 0 0 0 0 0 netstat -i显示的sl0 sl1接口表明您的内核内建了两个SLIP接口. ( sl0sl1 之后的星号表明 这两个接口是关闭的.) 然而,FreeBSD默认的内核并没有配置额外的包 (默认的,您的FreeBSD不会被作为一个路由器) 因为Internet RFC对Internet主机有特殊要求(参考 RFCs 1009 [Requirements for Internet Gateways], 1122 [Requirements for Internet Hosts — Communication Layers], 还有 1127 [A Perspective on the Host Requirements RFCs]). 如果您想让FreeBSD SLIP服务器成为一个路由器,就必须编辑 /etc/rc.conf,将gateway_enable变量设为. 然后您要重新启动使新的设置生效. 您会发现靠近默认内核配置文件(/sys/i386/conf/GENERIC)的最后, 有这么一行: pseudo-device sl 2 SLIP 这一行定义内核中可用的SLIP设备个数;行末尾的数字表示同时进行操作的SLIP连接的最大个数. 请参考FreeBSD内核配置这一章以获取配置内核的帮助. Sliplogin配置 正如先前所提到的, /etc/sliphome目录有三个文件构成/usr/sbin/sliplogin的配置 (参考sliplogin的联机手册&man.sliplogin.8;): slip.hosts, 定义SLIP用户及有关IP地址; slip.login,一般只配置SLIP接口; 文件 slip.logout(可选的),串行连接终止时,撤消slip.login所做的修改. <filename>slip.hosts</filename> Configuration /etc/sliphome/slip.hosts里的每行包含至少四个元素,元素之间由空格隔开: SLIP用户的登录ID SLIP连接的本地地址(指SLIP服务器) SLIP连接的远程地址 网络掩网 本地和远程地址可以是主机名 (通过文件/etc/hosts或者域名服务解析为IP地址, 在FreeBSD 5.X上这取决于文件/etc/nsswitch.conf的设置 在FreeBSD 4.X里,则是/etc/host.conf),网络掩网可以是一个 能通过文件/etc/networks解析的名字.在一个样例系统中, /etc/sliphome/slip.hosts是这样的: # # login local-addr remote-addr mask opt1 opt2 # (normal,compress,noicmp) # Shelmerg dc-slip sl-helmerg 0xfffffc00 autocomp 在这行的末尾是一个或多个选项. —不压缩报头 — 压缩报头 —如果远程端允许,压缩报头 —禁用ICMP数据包 (这样就会丢弃所有的ping数据包,不占用您的带宽) SLIP TCP/IP networking 对SLIP连接的本地及远程地址的选择取决是您是准备在SLIP服务器上使用 TCP/IP 子网还是使用ARP代理 (它并不是真正的ARP代理,而是我们在本节用于介绍的术语). 如果您不能确定选择何种方式或者如何分配地址,请参考"前提条件"()里列出的TCP/IP书籍 或者向您的IP网络管理员请教. 如果您准备为您的SLIP客户使用一个独立的子网 , 您需要先从分配得到的网络号中取出一个子网号然后再在这个子网里给每个SLIP客户分配IP地址. 然后您还需要通过SLIP服务器在最近的IP路由器上配置一个指向SLIP子网的静态路由. Ethernet 如果您要使用 代理 ARP的方式,您需要从SLIP服务器的以太子网中为每个SLIP客户分配IP地址, 还必须修改/etc/sliphome/slip.login/etc/sliphome/slip.logout脚本以使用 &man.arp.8;来管理proxy-ARP在服务器ARP表中的项. <filename>slip.login</filename> Configuration 典型的/etc/sliphome/slip.login 如下所示: #!/bin/sh - # # @(#)slip.login 5.1 (Berkeley) 7/1/90 # # generic login file for a slip line. sliplogin invokes this with # the parameters: # 1 2 3 4 5 6 7-n # slipunit ttyspeed loginname local-addr remote-addr mask opt-args # /sbin/ifconfig sl$1 inet $4 $5 netmask $6 这个slip.login脚本仅仅为带有相应本地及远程地址和掩码的SLIP接口执行 ifconfig . 如果您决定使用ARP代理 方式(而非为您的SLIP客户使用独立的子网),您的/etc/sliphome/slip.login 应该是这样: #!/bin/sh - # # @(#)slip.login 5.1 (Berkeley) 7/1/90 # # generic login file for a slip line. sliplogin invokes this with # the parameters: # 1 2 3 4 5 6 7-n # slipunit ttyspeed loginname local-addr remote-addr mask opt-args # /sbin/ifconfig sl$1 inet $4 $5 netmask $6 # Answer ARP requests for the SLIP client with our Ethernet addr /usr/sbin/arp -s $5 00:11:22:33:44:55 pub slip.login新加的行arp -s $5 00:11:22:33:44:55 pub在SLIP服务器的ARP表中加入了一个表项.这个ARP项使得 每当这个以太网上的其它IP节点对SLIP客户端IP地址进行ARP请求时,SLIP服务器会以自已的以太网MAC地址作为回应 . EthernetMAC address 当使用以上的例子时, 一定要将 以太网MAC地址(00:11:22:33:44:55)替换成您系统网卡的MAC地址,否则ARP代理将 完全无法工作!您可以查看netstat -i输出结果以取得以太网MAC地址; 输出的第二行应该是这样: ed0 1500 <Link>0.2.c1.28.5f.4a 191923 0 129457 0 116 这行表明这个系统的以太网MAC地址是00:02:c1:28:5f:4anetstat -i输出的以太网MAC地址必须改成用冒号隔开,并且要单个十六进数前加上. 这是&man.arp.8;要求的格式; 参考&man.arp.8; 的联机手册以获取完整的使用方法. 创建 /etc/sliphome/slip.login/etc/sliphome/slip.logout时,一定要设置 执行(execute)位 (chmod 755 /etc/sliphome/slip.login /etc/sliphome/slip.logout) ,否则 sliplogin将无法执行它. <filename>slip.logout</filename>配置 /etc/sliphome/slip.logout并不是必需的 (除非您使用了ARP代理),如果您准备创建它,这里有一个基本的 slip.logout 脚本的例子 : #!/bin/sh - # # slip.logout # # logout file for a slip line. sliplogin invokes this with # the parameters: # 1 2 3 4 5 6 7-n # slipunit ttyspeed loginname local-addr remote-addr mask opt-args # /sbin/ifconfig sl$1 down If you are using proxy ARP, you will want to have /etc/sliphome/slip.logout remove the ARP entry for the SLIP client: #!/bin/sh - # # @(#)slip.logout # # logout file for a slip line. sliplogin invokes this with # the parameters: # 1 2 3 4 5 6 7-n # slipunit ttyspeed loginname local-addr remote-addr mask opt-args # /sbin/ifconfig sl$1 down # Quit answering ARP requests for the SLIP client /usr/sbin/arp -d $5 命令arp -d $5 删除slip.login在SLIP客户登录时添加的ARP项 . 再次强调:确保您创建/etc/sliphome/slip.logout时设置了执行位 (ie, chmod 755 /etc/sliphome/slip.logout). 路由考虑 SLIP routing 如果没有使用 代理 ARP 的方法来在您的 SLIP 客户机和网络的其余部分 (也可能是 Internet) 之间路由数据包, 您可能需要增加离您最近的默认路由器的静态路由, 以便通过 SLIP 服务器来在 SLIP 客户机子网上进行路由。 静态路由 static routes 向您最近的默认路由添加一个静态路由可以说是很麻烦 (或者说是不可能,如果您没有权限这么做)。 如果在您的组织中使用多路由器网络, 有些路由器 (比如 Cisco 和 Proteon 生产的) 不但要配置指向 SLIP 子网的路由, 而且还需要配置将哪些静态路由传给其它的路由器。 所以一些专家意见和问题解答对于使基于静态路由表的路由正常工作很有必要。 运行<application>&gated;</application> &gated; &gated;现在是一个私有软件,无法取得它的源代码 ( &gated;上有更多的信息 ).This section only exists to ensure backwards compatibility for those that are still using an older version. 另一种避免静态路由所造成的头疼的方法, 是在您的 FreeBSD SLIP 服务器上安装 &gated;, 并配置它使用合适的路由协议 (RIP/OSPF/BGP/EGP) 来告诉其他路由器您的 SLIP 子网的存在。 您需要编写一个 /etc/gated.conf 文件来配置 &gated;; 这里是 FreeBSD SLIP 服务器作者编写的一个例子: # # gated configuration file for dc.dsu.edu; for gated version 3.5alpha5 # Only broadcast RIP information for xxx.xxx.yy out the ed Ethernet interface # # # tracing options # traceoptions "/var/tmp/gated.output" replace size 100k files 2 general ; rip yes { interface sl noripout noripin ; interface ed ripin ripout version 1 ; traceoptions route ; } ; # # Turn on a bunch of tracing info for the interface to the kernel: kernel { traceoptions remnants request routes info interface ; } ; # # Propagate the route to xxx.xxx.yy out the Ethernet interface via RIP # export proto rip interface ed { proto direct { xxx.xxx.yy mask 255.255.252.0 metric 1; # SLIP connections } ; } ; # # Accept routes from RIP via ed Ethernet interfaces import proto rip interface ed { all ; } ; RIP 上面这个 gated.conf 示例文件, 将把关于 SLIP 子网 xxx.xxx.yy 的信息, 通过 RIP 广播到 Ethernet 上; 如果您使用了的 Ethernet 驱动不是 ed, 则需要把 ed 改为相应的网络接口。 这个例子也配置了将跟踪信息写到 /var/tmp/gated.output 以提供调试 &gated; 活动的信息; 当然, 如果 &gated; 工作正常, 就可以关闭这些跟踪信息了。 您需要把 xxx.xxx.yy 改成您自己的 SLIP 子网 (一定要同时修改 proto direct 小节)。 一旦在系统中安装并配置了 &gated;, 就可以告诉 FreeBSD 启动脚本来运行 &gated; 而不是 routed 了。 最简单的办法,是配置 routerrouter_flags 两个 /etc/rc.conf 变量。 请参见 &gated; 的联机手册, 以了解更多关于命令行参数的信息。