浅析linux下脚本拨号上网
owlbird
既然是拨号上网,就不能不提到ppp(point-to-point protocol)协议.ppp协议提供了一种通过串行点对点联接传输数据报的方式.它由三部份组成:一种在串行封装数据报的方式,扩展联接控制协议LCP,和用来建立和配置不同网络层协议的家族网络控制协议NCP.封装方案由内核驱动代码来提供.pppd(ppp daemon)提供基本的LCP,认证支持,和建立和配置IP的网络控制协议NCP.一个ppp会话分为四个步骤:连接建立、连接质量控制、网络层协议配置、连接终止;提供了密码认证协议(PAP)或者邀请握手认证协议(CHAP)来保证连接安全.使用PPP你可以把你的 Linux PC连接到一台ppp服务器上并存取该服务器所连接的网络资源就如同你是直接连接在该网络上一般。你也可以把你的Linux PC设为一台ppp服务器,这样一来其它电脑就可以拨入你的电脑并且存取在你区域网络里的资源。
当然,对于我们最终用户来讲,它是一个server/client模型的应用。本文主要讨论客户端怎样拨号上网,毕竟对于桌面系统的用户,ppp是日常生活的一个重要组成部分。在这里我想大家可能对windows下的拨号适配器的简单易用深表""敬佩"",在这里我不想对其进行具体讨论,微软公司提供的TAPI可以让每一个windows下的程序员编写一个拨号程序不是一件困难的事,而在linux下呢?无论是gnome下的wvdial还是kde下的kppp,他们与纯脚本ppp-on相比不过是更直接,更易操作,称他们为图形化的拨号脚本并不为过,因为他们最终都是调用pppd这个功能强大大却不好驾驭的程序。有人告诉我kppp与windows下的拨号适配器功能差不多,不过我要告诉你kppp对pppd程序的依赖程度大过kppp作为一个独立的拨号程序,甚至/etc/ppp/options下的选项值对kppp的影响也是不可忽视的。
关于linux下脚本拨号的过程其实可适用于linux下所有的拨号过程,当然实际过程没有这么简单,如果有兴趣,请阅读源码)
1.由pppd程序调用chat会话程序
2.chat会话程序负责拨号,启动服务器端的pppd程序,验证身份,然后chat会话程序结束
3.由pppd程序继续chat会话程序的工作,与服务器端的pppd程序进行握手,建立ppp连接
ppp-on脚本包含有pppd程序,而ppp-on-dialer脚本含有chat会话程序,如果说pppd程序完成 的是连接建立、连接质量控制、网络层协议配置、连接终止,那么chat程序完成的是明文(textword)的验证,如果是拨入的服务器端需要密码认证协议(PAP)或者邀请握手认证协议(CHAP)来保证连接安全,那么还须在/etc/ppp目录下配置pap-secrets或chap-secrets文件。
关于ppp-on,ppp-on-dialer纯脚本拨号的配置
一个完整的ppp-on文件如下:(这里的实例及ppp-on-dialer文件均以163直通车为例)
TELEPHONE=163 # ISP提供的上网电话号码
ACCOUNT=163 # 账号名称
PASSWORD=163 # 登录密码
LOCAL_IP=0.0.0.0 # 本地IP地址,0.0.0.0表示由ISP动态分配
REMOTE_IP=0.0.0.0 # 远端IP地址,一般为0.0.0.0
NETMASK=255.255.255.0 # 子网掩码
export TELEPHONE ACCOUNT PASSWORD
DIALER_SCRIPT=/etc/ppp/ppp-on-dialer
exec /usr/sbin/pppd lock modem crtscts /dev/ttyS0 115200
asyncmap 0 kdebug 4
$LOCAL_IP:$REMOTE_IP noipdefault netmask $NETMASK defaultroute
connect $DIALER_SCRIPT&
这个文件需要注意的地方:
a.注意""""表示一行完整的结束。
b.尽量把kdebug的级别设置高一些,因为根据kdebug的级别来确定文件/var/log/messages的详细程度。
一个完整的ppp-on-dialer文件如下:
exec chat -v
TIMEOUT 3
ABORT ''
BUSY
''
ABORT ''
NO ANSWER
''
ABORT ''
RINGING
RINGING
''
ABORT ''
Username/Password Incorrect
'' 此行可缩短由于账号密码不正确的验证时间
''''
AT
''OK-+++c-OK'' ATH0
TIMEOUT 30
OK ATDT163
sername:--sername: 163
assword: 163
大家说以上配置对吗?文件配置是对的,但是问题不少。我还是以实际问题来做具体分析吧(前提:无论外猫内猫均已装好,检查命令:echo ""echo ATDT 163"">/dev/modem),在/etc/ppp目录下键入了./ppp-on命令后,出现如下错误:
1.TR的亮,无拨号音。
解决办法:
首先检查ppp-on-dialer文件的权限,设为chmod 7 ppp-on-dialer
然后查看ppp-on-dialer文件,每行后面的 """"是否存在
最后查看倒数第三行ok ATDT$TELEPHONE的电话号码是否设置正确,注意这里需设为实际电话号码,不是变量
2.在/var/log/messages文件中出现如下提示:
21:13:32 ken pppd[657]: CCP terminated by peer
21:13:32 ken pppd[657]: Compression disabled by peer.
或直接出现connect scripts fail提示(反复N次均为如下提示)
注意:在ppp-on-dialer文件的chat -v表示通过syslogd将客户端与服务器端建立连结的会话信息写入了/var/log/messages文件,如果你要查看这个会话信息,请键入tail -f /var/log/messages或者tailf /var/log/messages,这些信息对于正确配置拨号脚本文件很有用.
解决办法:
首先检查账号密码是否正确
然后就可能是chat会话程序本身的问题,大家看一下面一个例子:
成都天府热线163在minicom下的提示:
***********************************************
*Quidway A8010 Internet Server
*welcome!!
***********************************************
please input username:
please input password:
成都天府热线169在minicom下的提示:
*** Welcome To TianFu Online EeYing01-11 ! ***
login:
password:
大家可能注意到有什么不同了吧!也就是不同拨号服务器对于账号密码输入提示的不同,用过windows拨号终端的朋友可能会知道,那么windows拨号为什么没有这个问题,因为这是chat程序本身的问题:不能根据拨号服务器对于账号密码的提示不同而send账号和密码,解决办法:用minicom去得到正确的提示,根具提示修改ppp-on-dialer文件最后两行的配置,这里以成都天府热线163,169在minicom下的提示为例:
163:
sername:--sername: 163
assword: 163
169:
ogin:--ogin: liujien
assword: liujien
这样就完了吗,没有,这里的配置还要根据你的isp的要求(hint),用minicom N次去得到正确的提示,不过你还要冒着你的isp修改账号密码提示的风险,所以我劝你放弃chat会话程序吧。因为kppp,wvdial都不存在这个问题.chat会话程序是force,而wvdial,kppp却是guess.带着这个问题我读了ppp-2.4.1源码的说明文件,其实作者已在ppp-2.3.11版就已提供了PLUGINS PASSPROMPT(注:ppp-2.3.10版已提供插件支持,大家用redhat6.2自带了ppp-2.3.11的RPM包,至于插件一般的国内的LINUX网站上提供的ppp源码包都附带有),这个插件提供给第三方程序将账号密码发送给你的isp的调用功能。相关内容的英文如下:
A new ``passprompt'' plugin is included, thanks to Alan Curry, which makes it possible for pppd to call an external program to get the PAP password to send to the peer.
那么到底如何使用这个plugin呢?在包含pppd.h头文件的目录下编译passprompt.c文件
gcc -c -O passprompt.c
gcc -shared -o passprompt.o
大家就可得到一个passprompt.so的共享链接文件,将之拷贝到/etc/ppp/plugins目录下,修改/etc/ppp/options文件,加入一行plugin /etc/ppp/plugins/passprompt.so,然后你就可修改ppp-on文件的将DIALER_SCRIPT指向你所要指定的脚本文件,可自编程序或者在网上去下载一个第三方程序。
我给大家提供了一个简单方法,大家可安装wvdial拨号程序,然后在gnome下将/etc/wvdial.conf文件配置好,在/etc/ppp目录下新建一个脚本,命名为wvdial,内容如下wvdial 163 (163是你所要拨号的电话号码),然后chmod 7 wvdial,修改ppp-on文件,如:DIALER_SCRIPT=/etc/ppp/wvdial
3.客户端已得到一个ip地址(用ifconfig 命令即可看到),通过域名无法浏览网页,通过ip地址可以。
解决办法:
一般的办法:去查isp给你提供的手册,得到域名服务器的ip地址,修改/etc/resolv.conf文件如下:nameserver 61.139.2.69(我以成都163为例),还可以在windows下用ipconfig /all命令也能得到dns服务器地址,因为windows的拨号程序默认设置为:自动获得dns服务器地址。
软件作者给我们提供的办法:
what was new in ppp-2.3.6.
**************************
Added new option ``usepeerdns'', thanks to Nick Walker . If the peer supplies DNS addresses, these will be written to /etc/ppp/resolv.conf. The ip-up script can then be used to add these addresses to /etc/resolv.conf if desired (see the ip-up.local.add and ip-down.local.add files in the scripts directory).
软件作者在ppp-2.3.6版即提供了类似于windows 拨号程序的选项:usepeerdns,如果你的isp提供dns服务器地址,将在/etc/ppp/resolv.conf文件及/etc/resolv.conf文件中写入主要域名服务器地址和辅助域名服务器地址,如下:
nameserver 61.139.2.69
nameserver 202.103.4.5
如何设置:修改/etc/ppp/options文件,添加一行""usepeerdns""
后记:
在这里笔者抛砖引玉,对linux脚本拨号上网并没有作太多深入的探讨,只是就围绕几个常见的问题进行了分析并提供了比较简单的解决办法.希望大家能够多读一些软件作者给我们提供的英文说明文件,因为国内的有些资料太过陈旧,不要没有耐心去读man pages,他们很有用,不过去读一读某些网站的文章是一个不错的选择。如果大家对我的文章有不同的看法,请给我写信不吝赐教,谢谢.