Linux的ppp连接方法

PPP是点对点的连接协议。这种连接建立之后,将给两点分别分配IP地址,使用这个IP可以进行两点之间的通讯。互联网最初的“拨号上网”方式说的就是它。因为现在最流行的互联网连接方式是Ethernet,所以PPP大都被很多人遗忘。还有就是PPP出来一个“变种”,被叫做PPPoE,也就是PPP on Ethernet,这又增加了一个PPP被遗忘的理由,所以,我刚刚开始试图在我的ubuntu@x61上试图建立PPP连接的时候,竟然Google不到什么现成的资料。最近终于解决这个问题,所以写下这篇“备忘录”。

先说说PPP连接互联网的一种比较常见的方式。
PC—-Modem—-PPP—–RemoteHost—-Internet
PC可以通过某种方式连接到调制解调器,调制解调器负责将数字信号转换成电信号(这个说法有点模糊,可能是音频或者脉冲),用过一组“AT”命令与远程的一台主机通讯,这台主机是接入互联网的,主要负责将你的PC发过来包再次转发。下行流程于上面说的这个过程正好相反。从这个过程来看,PC的配置主要问题集中在

  • 如何配置调制解调器Modem
  • 如何配置那一组AT命令通讯脚本

正好这两个问题在Linux中有两个简单的工具一一对应,调制解调器的配置可以用过pppd完成,而AT命令的通讯脚本可以交给chat。这里插一句话,我之所以折腾这个玩意儿,是因为用了E-mobile的移动网络。E-mobile提供的这个服务使用一个PC-card插接到PC上,这个卡片之中安放了一个SIM——也就是我们平时用来打移动电话的那个SIM,给SIM分配一个移动电话号码,通过这个号码就可以跟远程通讯了。比较值得一提的是,E-mobile购买了华为公司的设备和技术来做日本市场,号称世界上最快速的移动拨号连接,带宽7.2Mb。猛点这里瞻仰华为为我们带来的D02NE

华为是个为国争光的好同学,但是他也有小毛病,这孩子只给Windows写了连接Utility,却没有给Linux也配上,这是典型的歧视少数派用户群的行为,严重鄙视之!没条件创造条件吧。好在华为同学也没怎么多做创新,使用的协议都是标准协议,使用的工具都是标准工具,所以,我查看了一下他的Utility的配置,照猫画虎的移动到Linux上,测试一下居然成功。从Modem的配置说起:

#file: /etc/ppp/peer/emobile
lock
nodetach
modem
noauth
usepeerdns
name "emobile"
crtscts
ttyACM0
115200
noipdefault
defaultroute
connect '/usr/sbin/chat -v -f /etc/ppp/emobile_chat'

上面这个脚本看字面意思就能看懂吧,目的是配置一个不需要认证的串口通讯连接,设备的node是/dev/ttyACM0,通讯速度是115200也就是8N1,最后配置了一个通讯时采用的脚本,也就是Modem初始化成功之后,PC将使用这个脚本和远程通讯。chat脚本中采用的主要是AT命令,比较常用的有

AT 命令前缀或者标注会话开始 ATZ 重置 AT&F 将Modem回复出厂状态

详细的AT命令一览可以参照这里 。另外,有些地方把这个东西称为初始化字符串,比如gnome-ppp,这个只是名词变换而已,通讯序列并没有改变。华为在我的D02NE里面内嵌了通信信息,所以,PC在建立连接的之前必须将Modem回复到出厂状态以得到这些信息。于是,我的chat脚本就变成下面这个样子。

ECHO ON
TIMEOUT 10
ABORT "NO CARRIER"
ABORT "NO DIALTONE"
ABORT "ERROR"
ABORT "NO ANSWER"
ABORT "DELAYED"
ABORT "BUSY"
"" "n"
"" "AT"
OK "ATZ"
OK "AT&F"
OK "ATDT*99**2#"
TIMEOUT 60
CONNECT ""

这个脚本中似乎不能使用注释。为了调试方便,在最初使用ECHO ON将通讯的信息显示在屏幕上。ABORT标志表示,当远程返回”NO CARRIER”,”NO DIALTONE”,”NO ANSWER”等等这些错误时,就终止连接。正常的通讯序列从最后一个ABORT之后开始,左边是远端返回的字符串消息,右边是得到这样的字符川之后PC应该给予什么相应,顺序从上到下。”””n”表示,最初远端给空串的时候PC给一个换行符,这个是为了把通讯序列重置。再次得到””空串的时候给出AT开始新会话,AT期待的返回值是OK,如果得到OK,再给”ATZ”将Modem重置,如果再次得到OK,使用AT&F回复出厂设置,如果这个也OK,就使用ATDT进行拨号,ATDT后面跟的是远端的号码。这个过程超过60秒的话,就断开连接并且提示TIMEOUT,否则,远端给CONNECT的话,PC一直给出””空字串保持连接。如果一切正常,就可以通过移动电话上网了。

本来事情可以更简单一点,如果Linux的NetworkManager支持PPP连接的话,配置就更加容易了,但到NetworkManager的0.6版本为止,PPP居然还没有被写进去,0.7版本开始有了PPP的配置,但是那个UI的提示总是让我看不懂,给出的就是CDMA连接之类的,跟现有概念map不上去,搞了半天也没搞定。这样的话就不能使用D-Bus,从而让其他应用程序知道系统的连接状态了,有点麻烦。最ft的是firefox使用的时候一直显示offline,解决办法是把/etc/里面的dbus配置去掉,让Firefox之间按照系统的HAL的消息给出在线状态。

Linux就是这样,也许配置麻烦了点,但是在这个过程中却能逼迫你搞清楚一下基础概念和基本方法,很多工具都是万变不离其宗,只要搞清楚这些最基础的东西遇到新的情况就不至于被纸老虎喝住了。我喜欢Linux。