本文以step by step的方式介绍了linux下如何拨出和拨入,就是如何让linux机器做ppp的客户端和服务器,并且介绍了回拨服务器的设置。本文尽力做到由浅入深,条理清楚。如果你对linux的拨号一窍不通,通过阅读本文,再加上你的实践和努力,精通linux拨号并非难事。
——————————————————————————–
版权声明:
本文版权属于胡晓峰。本文件可以在非商业目的下自由传播,但必须保持本文的完整,并包含本版权声明。如果要将本文的全部或部分用于商业目的,需要得到本人同意。
目录
linux的拨号设置(拨出与拨入) *
目录 *
1. linux下如何拨出(客户) *
1.1编译内核使其支持ppp *
1.2设置串行端口和调制解调器 *
串口设备文件 *
设置中断号和i/o地址 *
设置调制解调器 *
1.3掌握你的isp的信息 *
1.4安装拨号所需软件 *
1.5手动方式建立ppp连接 *
用minicom测试拨号 *
用pppd建立ppp连接 *
断开连接 *
1.6使ppp连接自动化 *
pppd脚本ppp-on *
chat脚本ppp-on-dialer *
拨号上网 *
断开连接 *
1.7设置域名解析(dns) *
设置域名服务器 *
自动化 *
1.8其他问题 *
2. linux下如何拨入(服务器) *
2.1设置基本的拨号服务器 *
使linux能够接受电话拨入 *
启动pppd与客户建立ppp连接 *
针对win95客户的特殊设置 *
2.2回拨(callback) *
服务器端设置 *
客户端设置 *
2.3小结 *
linux下如何拨出(客户)
本节的目的是在linux下设置ppp,使其能拨号并连接到你的isp,从而将你的机器与internet相连,进而你就可以在网上为所欲为了,呵呵。
我喜欢条理清晰的文章,所以我写的东西也尽量做到有条理。下面就是linux ppp客户端设置的一般步骤:
编译内核使其支持ppp。
设置串行端口和调制解调器。
掌握你的isp的信息。
安装拨号所需软件并进行设置。
手动方式建立ppp连接。
使ppp连接自动化。
设置域名解析(dns)。
其他问题。
1.1编译内核使其支持ppp
要实现ppp客户,一是需要内核支持ppp,另外就是需要ppp的软件pppd(ppp daemon)。编译内核虽然不难,但也并非简单的一塌糊涂,庆幸的是,在大多数情况下,你不用重新编译你的内核。我使用的是redhat 6.0,它带的内核就已经支持ppp了。其他各种发布版本的linux内核也是支持ppp的。如果你在使用自己编译的内核,你就要注意这个内核是否支持ppp。编译内核并不是本文的范围,如果你确实要自己重新编译内核,请查阅相关文档。
1.2设置串行端口和调制解调器
串口设备文件
调制解调器是串行设备,外置的需要连到一个串口上,内置自己有一个串口。大家知道,unix系统对外设的操作都是通过特定的设备文件完成的,linux下串口设备文件的命名和dos的关系如下:
* dos com1 = linux /dev/cua0 (and /dev/ttys0)
* dos com2 = linux /dev/cua1 (and /dev/ttys1)
等等
一般来说/dev/cua*是用来拨出的,/dev/ttys*是用来拨入的,但现在好像已经不加以区分了,统统用的是/dev/ttys*。如果你的机器上没有/dev/ttys*,你需要用mknod来自己建立这些设备文件,但有个脚本程序makedev可以简化这个工作:
# cd /dev
# ./makedev ttys0
设置中断号和i/o地址
你不需要阅读这一节,除非你想要使用三个或更多的串行设备,比如一个串行鼠标,三个modem。
一般来讲com1和com3共用irq3,com2和com4共用irq4,一个设备必须唯一对应一个irq号才行,如果有三个以上的串行设备,就要把别处没用的中断号拿过来用了。使用如下命令设置中断号:
/sbin/setserial /dev/ttys0 irq 3 #串行鼠标
/sbin/setserial /dev/ttys1 irq 4 # modem 1
/sbin/setserial /dev/ttys2 irq 5 # modem 2
/sbin/setserial /dev/ttys3 irq 9 # modem 3
你有必要将这些命令放在/etc/rc.d/rc.local中,使其在linux启动时运行。你可以使用
cat /proc/interrupts
来察看系统的中断设置,以确保没有中断冲突。
i/o地址与中断一样,必须唯一。你可以设置硬件跳线来改变i/o地址。一般串行口的i/o地址是这样的:
ttys0 address 0x3f8
ttys1 address 0x2f8
ttys2 address 0x3e8
ttys3 address 0x2e8
一般情况下,你没有必要改变串行口的i/o地址。可以使用命令
cat /proc/ioports
来察看系统的i/o地址设置,以确保没有冲突。
设置调制解调器
一般情况下,调制解调器的出厂设置就很合适了,不用改变什么。但如果你把调制解调器搞得一塌糊涂,就需要对它进行从新设置。由于我这方面没有实践经验,如果你真的不幸遇到这种情况,就去看看调制解调器的说明吧。
需要说明的是,linux不支持所谓winmodem,这种modem需要特殊的windows驱动程序才能使用,目前还没有linux下的驱动。据说这种winmodem就是所谓的“软猫”,我看有点像。
1.3掌握你的isp的信息
由于你是通过isp与internet连接的,所以掌握isp的信息对于你拨号是很重要的,下面列出了你应该知道的基本信息:
拨号服务的电话号码
服务器使用动态ip地址分配还是静态的ip?
isp 的域名服务器(dns)ip地址是什么?
登录服务器时都要回答什么问题?
如果服务器是windows nt,它是否使用微软的pap/chap系统?
这里可能会有一个问题.windows 95系列的拨号设置允许让dns的地址在连线过程中传到客户端。因此你的isp可能会告诉你不需要知道dns服务器的ip地址。对于linux来说,它不允许在连线之时动态地指定dns的ip地址。所以你需要知道dns地址并自己设置dns。
对于第5点,由于我没有实践经验,并且实际应用比较少见,就不做讨论了。请参阅相关文档。
1.4安装拨号所需软件
ppp客户所需的程序有chat和pppd,如果你的机器上还没有这两个程序,就要安装它们。在redhat中,使用如下命令:
rpm -uvh ppp-2.3.7-2.i386.rpm
另外还有一个终端通讯程序minicom,在我们这里是用来测试拨号用的,也要安装上。
rpm -uvh minicom-1.82-5.i386.rpm
chat程序的用途是拨号并等待提示,根据提示输入用户名和密码等登录信息。pppd的用途是建立并维持与服务器的ppp连接,传输数据。
1.5手动方式建立ppp连接
在进行了上面4项内容后,我们就要进行拨号了!这一节介绍的是一种手动的方法,目的是用来测试的。不管是手动还是后面要讲的自动方式,整个ppp连接很明显的分成两个步骤:
拨通isp的电话,建立物理线路的连接,并启动isp端的pppd程序。
启动本机的pppd程序与服务器端的pppd进行握手,建立ppp连接。
你会在以后的叙述中很清楚的看到这两个步骤。
如果你想节约时间,可以越过本节,直接配置自动ppp。但是作为step by step的建议,你还是应该阅读本节,虽然你并不一定要实际的操作它。
用minicom测试拨号
首先我们用minicom测试一下,看看能否拨通isp。我使用的是redhat6.0自带的minicom,其他版本的minicom可能热键不同。在运行minicom之前,需要建立/dev/modem这个设备文件,比如我的modem接在com2上,使用如下命令建立/dev/modem:
ln /dev/ttys1 /dev/modem
运行minicom,输入ctrl-a,再敲z就可以看到帮助,此时按d,就是拨号,会出现一个界面,此时选择manual(手动),并输入isp的电话号码,调制解调器一阵乱响之后,会有几声音乐响,并在屏幕上提示按任意键继续,按任意一个键,就会出现你isp的信息,并提示输入username,password,有可能还要提示你选择ppp连接还是slip连接等等。现在服务器端的pppd应该被启动,表现就是会出现如下的垃圾字符:
}8}!}$}%u}”}&} } } } }%}& …}}”}(}”} .~~y}
至此,说明你的机器拨号正常,可以与你的isp正常连接。在这一步,你需要记录下拨号服务器的提问,以及你的回答,以便今后实现自动拨号。
用pppd建立ppp连接
上面只是测试拨号能否成功,下面就是要建立ppp连接。
还是用minicom,如前所示进行拨号,直到出现垃圾字符,此时退出minicom(ctrl-a,q),注意:不是reset,只是退出。然后执行pppd程序如下:
pppd debug lock modem crtscts defaultroute /dev/ttys1 115200&
debug是说要在/var/log/messages留下调试信息。lock是说锁定串口设备。modem是说用调制解调器的控制信号。crtscts是说使用硬件数据流控制,defaultroute 是说在本机路由表中加入一项缺省路由,它使你不仅能连到拨号服务器,还能通过它连接整个internet。/dev/ttys1是说modem在com2口上,115200是串口的速率。&是说这个程序在后台执行。
等一段时间,ppp连接建立之后,运行ifconfig,这是你就会看到ppp0的网络接口,并能看出你被分配的ip地址和对端服务器的ip地址。运行route,你会看到对端服务器的ip地址也被加入了路由表。好了!你的拨号成功了!此时可以ping一下internet上的某个主机的ip地址,因该是没问题的。
现在还不能使用域名,因为还没配(废话)。
如果你的机器本身是连在局域网上的,你要确保在拨号之前没有缺省路由,就是在route命令中看不到default或0.0.0.0。原因很简单,拨号会产生一个缺省路由,如果原来就有一个,拨号产生的缺省路由就不起作用,你就不能连到internet上,而还是在局域网里。可以用命令
route del -net default
删除以前的缺省路由,再进行拨号,从而使拨号产生的缺省路由有效。
怎样才能知道ppp连接建立了呢?在一个单独的虚拟控制台上运行
tail -f /var/log/messages
你就可以动态的观察各种日志信息,包括pppd的调试信息。当你看到:
jun 23 16:10:31 hxf pppd[1234]: local ip address 210.78.131.151
jun 23 16:10:31 hxf pppd[1234]: remote ip address 192.168.10.21
这样的信息就说明ppp连接成功了,服务器已经给你分配了地址,接着你就可以运行ifconfig、route、ping等程序来测试你的拨号网络了!当然,如果没有成功,你也可以根据pppd的调试信息判断错误原因,以便进行改正。
断开连接
当测试通过后,需要把连接断掉,使用如下命令:
killall pppd
1.6使ppp连接自动化
在经过手动连接测试之后,我们就要把这些变成自动的,我们的目的是只用一个命令就能实现拨号连接。
前面我们说过,要使拨号自动化需要两个程序chat 和pppd。在redhat6里,它们包含在ppp-2.3.7-2.i386.rpm这个包里面,安装这个软件包,就会生成/etc/ppp目录和/usr/doc/ppp-2.3.7目录,在/etc/ppp目录中是几个pppd的配置文件,在/usr/doc/ppp-2.3.7中是pppd的文档,在scripts子目录里有如下几个文件:
/usr/doc/ppp-2.3.7/scripts/ppp-on # pppd程序的脚本文件
/usr/doc/ppp-2.3.7/scripts/ppp-on-dialer # chat程序的脚本文件
/usr/doc/ppp-2.3.7/scripts/ppp-off #断线脚本文件
这就是我们要讨论的几个文件。我们需要修改的是前两个文件。
ppp-on-dialer的功能是完成拨打电话,并输入所需登录信息完成登录,并启动服务器端的pppd,就是我们曾经看到的垃圾字符。ppp-on-dialer实际上就是完成我们在测试时用minicom拨号所实现的那部分功能。
ppp-on的功能就是测试时pppd程序完成的功能,它启动本机的pppd,与服务器端的pppd进行对话,实现端对端(ppp)的连接。
我们的目的是把这两部分连接起来,用一个命令就能完成整个拨号连接的过程,这是通过pppd程序的一个参数connect完成的,你会在下面看到它的用法。下面就详细介绍这两个脚本文件:
pppd脚本ppp-on
下面就是ppp-on的内容,我们先来看看有什么东西:
———————————————————————————-
#!/bin/sh
#
# script to initiate a ppp connection. this is the first part of the
# pair of scripts. this is not a secure pair of scripts as the codes
# are visible with the ps command. however, it is simple.
#
# these are the parameters. change as needed.
telephone=555-1212 # the telephone number for the connection
account=george # the account name for logon (as in george burns)
password=gracie # the password for this account (and gracie allen)
local_ip=0.0.0.0 # local ip address if known. dynamic = 0.0.0.0
remote_ip=0.0.0.0 # remote ip address if desired. normally 0.0.0.0
netmask=255.255.255.0 # the proper netmask if needed
#
# export them so that they will be available at ppp-on-dialer time.
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 oot account would be
# a security hole so don ask.)
#
dialer_script=/etc/ppp/ppp-on-dialer
#
# initiate the connection
#
# i put most of the common options on this command. please, don
# forget the lock option or some programs such as mgetty will not
# work. the asyncmap and escape will permit the ppp link to work with
# a telnet or rlogin connection. you are welcome to make any changes
# as desired. don use the defaultroute option if you currently
# have a default route to an ethernet gateway.
#
exec /usr/sbin/pppd debug lock modem crtscts /dev/ttys0 38400
asyncmap 20a0000 escape ff kdebug 0 $local_ip:$remote_ip
noipdefault netmask $netmask defaultroute connect $dialer_script
———————————————————————————–
带#的行是注释,蓝颜色的地方是你应该注意并根据实际情况修改的。
文件的前一部分定义了isp的电话和用户信息,并用export命令将这几个变量输出到当前运行的环境中,使它们可以在其他文件中被使用,一会儿我们将看到在ppp-on-dialer文件中使用了这几个变量。
在文件的中间部分定义了变量dialer_script,它的值是ppp-on-dialer的完整路径,你要根据你的具体情况加以修改。
文件尾部就是我们曾经见过的pppd和它一大堆的参数,exec是执行的意思,每一行末尾有一个“”,表示这一行没有结束,下一行的内容是这一行的继续,不算两行。这里我们需要修改的是modem的串行口设备文件和速率,串口速率我一般都写成115200,不要认为这是modem的速率,这只是串口速率,修改这个值不能提高你的modem速率。其他参数有些我们已经做过说明,connect $dialer_script的意思是通过执行dialer_script所指的拨号脚本,实现拨号。通过connect参数,把ppp-on和ppp-on-dialer两个脚本联系起来,实现整个拨号连接过程。
chat脚本ppp-on-dialer
现在你应该明白ppp-on和ppp-on-dialer的关系了,下面就看看ppp-on-dialer是怎么实现自动拨号的:
———————————————————————————–
#!/bin/sh
#
# this is part 2 of the ppp-on script. it will perform the connection
# protocol for the desired connection.
#
exec chat -v
timeout 3
abort busyr
abort no answerr
abort ringingrnrnringingr
rat
ok-+++c-ok ath0
timeout 30
ok atdt$telephone
connect
ogin:–ogin: $account
assword: $password
———————————————————————————–
整个脚本就是一个程序chat和它的一堆参数。
-v是说把调试信息写入/var/log/messages。timeout 3是说以下操作的超时时间为3秒。3个abort是说如果收到服务器的busy等消息就退出chat程序。“”是什么都不等,直接发出“at”指令,开始与服务器对话。当收到ok-+++c-ok字符串后发出ath0指令。然后timeout 30将超时时间设成30秒。在收到ok字符后,发出atdt$telephone指令,atdt的意思是拨电话,号码就是在ppp-on脚本中定义的那个telephone。电话拨通后会收到connect字符,发出一个空串“”。下面就是收到验证用户的提示并发出用户信息了。这里要改成你的isp的具体提示,比如有的提示用户名不是用login:而是用username:,你需要根据实际情况修改。还有的isp在问完用户名和密码后还有别的提示,比如263就会问你
please select protocol:
1:ppp;
2:slip;
3:exit;
please select(1~3):
根据263的提问修改后的最后几行就像下面这样:
username: $account
assword: $password
” select(1~3):” 1
注意不要落掉password行最后的“”。因为在select(1~3):中有~等特殊字符,所以要把整个字符串加上引号表示是一个整体。
现在我们明白了整个过程:
由pppd调用chat程序
chat程序负责拨号登录,启动服务器端的pppd,然后chat结束
由pppd继续chat的工作,与服务器端的pppd进行握手,建立ppp连接
拨号上网
上面我们说明了原理,下面就来试一试。
我们将/usr/doc/ppp-2.3.7/scripts/的几个文件拷到自己喜欢的地方,比如/etc/ppp/,按照上面所说的进行修改。然后将这三个脚本文件改成可执行的,用如下命令:
chmod +x ppp-o*
在脚本所在目录运行
./ppp-on
你将会听到modem拨号的声音。与此同时,你应该对这个过程进行监视,在另外一个虚拟终端上(alt+f1~f6可以切换6个虚拟控制台,x-windows就运行另一个终端程序就可以了)运行:
tail -f /var/log/messages
来监视chat和pppd程序的运行情况,你会看到chat程序与拨号服务器的对话过程,并将看到pppd的连接过程,最后pppd报告说本机和远端机器的ip被分配好了,就像我们在测试的时候看到的那样,这时ppp连接就建立好了。接着你就可以用ifconfig和route命令察看网络接口和路由,ping网上的其他ip地址。你的拨号成功了!
断开连接
断开连接就用ppp-off脚本,运行
./ppp-off
在执行tail -f /var/log/messages的那个终端上你就会看到断开连接的信息,告诉你这次连接持续了多长时间,发送接收了多少字节等。
至此,ppp的自动化就完成了。有关pppd和chat的其他参数的意思请查阅man手册,这里就不再解释了。
1.7设置域名解析(dns)
到这里我们已经可以像win95一样方便的使用拨号网络了。但是还有一个域名服务器问题没有解决。win95上拨号时,域名服务器的地址是服务器传过来的,但linux下就没有这么方便,域名服务器需要自己设定。
设置域名服务器
/etc/resolv.conf文件是存放域名服务器地址的地方,它的内容看起来是这样的:
————————————————————-
domain your.isp.domain.name
nameserver 202.96.0.133
nameserver 202.96.1.133
————————————————————-
你所需做的就是把你的isp的域名服务器地址填到这个文件里。如果你连在一个局域网里,并设置了局域网的域名服务器地址,不要担心,就把你的isp的域名服务器地址加在下面好了,查找域名时是按先后顺序的。
现在你的域名也设好了,你可以ping某个域名了。从此你将享受完整的网络功能!
自动化
你也许想只在拨号才加上域名服务器地址,别的时间不想要,除了手动之外,还可以让这个过程自动化。你可以建立/etc/ppp/ip-up.local和/etc/ppp/ip-down.local两个可执行的脚本文件,pppd启动之后,会执行/etc/ppp/ip-up.local里的命令,而pppd结束时,会执行/etc/ppp/ip-down.local里的命令。你可以先生成一个包含域名服务器的文件,在ip-up.local中将这个文件改成/etc/resolv.conf,并将/etc/resolv.conf保存下来。在ip-down.local中再将保存的/etc/resolv.conf恢复回来。这样就可以实现添加域名服务器的自动化了。
1.8其他问题
至此,linux下如何拨出(客户)就介绍完了。我想不出还有什么问题了。呵呵。如果你还有什么问题,可以与我联系,希望我能会(我也并非全能呀,呵呵)。
linux下如何拨入(服务器)
这一节我们的目的是将自己的linux设置成跟isp一样的拨号服务器。我们假设你在公司用linux设置了拨号服务器,然后在家里通过拨号连到公司的拨号服务器上,进而访问公司的局域网,如此就可以实现“家庭办公”了。如果公司是连在internet上的,你就可以浏览internet了。 “设置基本的拨号服务器”这一节就告诉你怎样实现这一功能。“回拨(callback)”这一节讲述怎样节省联网所需的电话费。
因为我们已经讲过如何用linux做ppp客户,所以这一节我们用win95做客户来配合讲述linux的服务器,因为毕竟win95做客户还是多数么。
2.1设置基本的拨号服务器
在这一节里,我们一步一步的建立拨号服务器,力求做到条理清楚。做拨号服务器的方法很多,这里讲的只是其中一种方法而已。
我们首先要确保linux的内核支持ppp,并且支持ip转发(ip forwording),这个功能让你通过linux拨号服务器访问局域网上其他的机器,进而访问internet,而不只是拨号服务器本身。幸好现在的linux发布版本所带的内核都支持这些功能,如果你使用自己编译的内核,你就要注意这个问题了。
在内核支持ip转发之后,还要激活ip转发这个功能。使用如下命令:
echo “1”>/proc/sys/net/ipv4/ip_forward
如果使用redhat,可以将/etc/sysconfig/network文件里的forward_ipv4=false改成true就行了。之后需要重启动以激活ip转发。
使linux能够接受电话拨入
要实现这个功能,要用到一个叫getty的程序,它的功能就是向用户显示login:和password:这样的登录提示,并调用login程序实现登录。我们平时在局域网里用telnet登录某台unix主机时,也是这个过程。只不过现在我们走的物理线路不同,我们走的是电话线—〉modem—〉串口,而telnet程序走的是网线和网卡。
目前linux上有三种getty:getty_ps,agetty,mgetty。getty_ps就是所说的getty,另外两种也都实现了getty的功能。其中mgetty的功能比较强大,我们决定就用mgetty了。
redhat6包含了mgetty的四个软件包,mgetty-1.1.14-8.i386.rpm是必须安装的,如果你要用回拨功能,就要安装mgetty-sendfax-1.1.14-8.i386.rpm,callback程序包含在这个包里(不明白为什么在这个包里)。我反正不管那么多,rpm -uvh mgetty*,全安装上算了。
我们现在要做的就是使modem所接的那个串口可以接受外来连接。打开/etc/inittab,你会看到这样的几行:
# run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
在这几行之后,加上如下一行:
7:2345:respawn:/sbin/mgetty ttys1
它的意思就是让mgetty在串口ttys1上监听,等待连接,如果有连接请求,mgetty就向用户提示用户名和密码。mgetty也有好多参数,预知详情,请看mgetty的手册页。注意:程序的名字是megtty而不是上面几行写的mingetty。mingetty是redhat自己的终端程序,它不支持modem连接。我的一个同学曾经把mgetty错敲成mingetty,结果怎么拨电话,linux也不接。另外,这行开头的数字“7”并不是一定的,只要是在文件中没有重的,唯一的就行了,可以是两个字符或数字。
改好之后,要使修改有效,运行:
init q
为了从远端登录,我们要有一个账号,用useradd命令加一个叫ppp的用户,并用passwd命令为它设置口令。
下面我们就用win95的客户来试一试,我们在win95下新建一个连接,电话号码当然要填对,然后右键单击这个连接,依次选择属性-〉常规-〉设置-〉选项,将“拨号后出现终端窗口”打上勾,再按两次确定关闭对话框。现在双击这个连接,用户名和密码不用填,直接按“连接”,你会听到拨号声和一阵乱叫,接着会弹出一个黑底白字的窗口,这就是登录的终端窗口了!你会看到这与你登录linux时是一样的,输入用户名ppp和密码,你看到的是shell提示符,你通过modem登录到linux主机上了!但这种终端的形式上网,并不是ppp连接,相信你一定不会满意,你需要的是有www,ftp等丰富功能的网络。我们下面就来看看怎么实现ppp连接,现在在shell提示符下输入exit退出。
启动pppd与客户建立ppp连接
上面一小节已经实现跟telnet差不多的终端联网,但还很不够,现在我们要用pppd实现端对端的连接,实现真正的联网。
为了给客户分配ip地址,我们要编辑一个新文件:/etc/ppp/options.ttyxx。文件名中的ttyxx就是你所用到的串口设备文件,我的就是/etc/ppp/options.ttys1。在这个文件中给出一个ip地址对,就像这样:
10.39.1.1:10.39.1.123
冒号前面的的拨号服务器的ip地址,后面的是要分配给客户的ip地址。
在前面讲述ppp客户时我们已经清楚,pppd程序要在服务器和客户机分别启动,并进行握手,实现连接。客户的pppd程序现在是用win95的拨号网络,我们就不管了,服务器端的pppd怎么启动呢?诚然,你可以登录后手工输入下面命令来启动pppd:
pppd debug proxyarp asyncmap 0 lock modem crtscts
但这似乎太过麻烦,我们需要pppd能自动启动,下面就来看看怎么搞!
打开/etc/passwd文件,找到用户ppp的哪一行,差不多是这样的:
ppp:x:500:500::/home/ppp: /bin/bash
你可以看出用户ppp使用的shell程序是bash,我们现在要做的就是用pppd换掉这个bash,这样当用ppp登录时,就不会执行bash,而是执行pppd,如此,pppd就在服务器端启动了。
具体我们可以这样做:在/etc/ppp建立一个ppplogin文件,内容如下:
#!/bin/sh
exec /usr/sbin/pppd debug passive asyncmap 0 proxyarp lock modem crtscts
pppd的参数大多都见过,其中proxyarp的意思就是让ppp客户通过ppp服务器访问网上其他机器,而不只是ppp服务器一台。将ppplogin设成可执行的:
chmod +x ppplogin
用ppplogin替换用户ppp的登录shell,就像这样:
ppp:x:500:500::/home/ppp:/etc/ppp/ppplogin
由于pppd执行必须要root权限,还要将pppd设成以root权限执行:
chmod u+s /usr/sbin/pppd
替换了登录shell和修改pppd属性之后,我们来试一试。与上一小节一样的进行拨号,在输入了用户名和密码之后,你是否看到pppd所特有垃圾字符?并且一行一行的没完?如果看到的话,恭喜你!服务器端pppd已经启动了!你接着点继续按钮,也就是启动客户的pppd,与服务器的pppd进行握手,一会儿,你就会看到登录网络成功,那个熟悉的绿色小电脑又出现了!你是不是意识到什么?对了!你可以上网了!如果你使用linux做客户的话,工作就完成了。但是由于win95的一些特殊要求,我们还要针对win95做一些特殊设置。
针对win95客户的特殊设置
前面谈到了win95与linux做客户,对域名服务器的要求是不一样的。win95要求域名服务器在连接的时候传给它,这在linux拨号服务器上怎么做呢?
如果你看过pppd的手册页,你可能已经看到pppd有个参数ms-dns,它就是用来传dns给客户的。在你的ppplogin里加上这个参数就可以了,比如:
#!/bin/sh
exec /usr/sbin/pppd debug passive asyncmap 0 proxyarp lock
modem crtscts ms-dns 10.39.0.133 ms-dns 10.39.1.133
两个dns第一个是主,第二个是辅。
在前面讲win95拨号时,我们使用“拨号后出现终端窗口”,然后手工输入才登录上的,而别的isp却不是这样。我们把“拨号后出现终端窗口”选项去掉,按照常规在拨号对话框里填入用户名和密码,但这样会出错,怎样才能按照常规那样拨号不用弹出终端窗口呢?
mgetty有几个配置文件在/etc/mgetty+sendfax,其中login.config是比较重要的。在login.config中有下面这样一行:
#/autoppp/ – a_ppp /usr/sbin/pppd auth -chap +pap login debug modem crtscts proxyarp lock
我们把行首的注释#去掉就行了。由于拨号连接可以是ppp也可以是slip,win95客户与拨号服务器对话的时候,要求自动使用ppp,win95客户向拨号服务器发出某种信号,让拨号服务器自动启动ppp。我们这里所做的就是让mgetty响应这个信号并启动pppd实现autoppp。我们看到这里的pppd程序的参数多了几个:auth -chap +pap login,我们只要知道这些跟win95的安全认证有关系就行了,具体含义请看pppd的手册页。为了支持这几个参数,需要编辑/etc/ppp/pap-secrets文件。这个文件是pap认证用的,我们不做研究,在里面填上一行最通用的就行了,如果你要对用户进行安全认证,请参阅pppd所带的例子和相关的文档。这个文件的内容就像这样:
# secrets for authentication using pap
# client server secret ip addresses
* * “” *
现在我们用win95建立一个新的拨号连接,就像连接别的isp一样输入用户名和口令,也可以在“保存口令”上打上勾,好了,连接吧!你会看到你的linux拨号服务器工作的像别的isp一样好!
2.2回拨(callback)
callback就是当用户拨号连到拨号服务器时,服务器先断掉连接,然后再拨回给用户,用户的modem接收这个呼叫,从而建立拨号连接。如此,电话费就是拨号服务器来付了,这样就给所谓“家庭办公”创造了有利条件,你可以在家里用回拨的方式连到公司进行办公,而不必担心电话费了。
服务器端设置
在设置之前,你应该确保mgetty的callback程序安装好了。
将下面这行内容加到/etc/mgetty+sendfax/login.config中:
call_hxf – – /usr/sbin/callback -d -l ttys1 -s 115200 -s 62345678
前面的call_hxf是指为mgetty增加一个叫call_hxf的用户入口。这个用户只是mgetty用来启动callback程序的,不是linux系统中的用户,不要真的用useradd添加一个call_hxf用户,这个call_hxf用户名只是mgetty用的,不是系统的。当用户通过modem连到linux上,mgetty向用户提示输入用户名时,如果输入的是call_hxf,mgetty就调用/usr/sbin/callback程序来处理回拨。参数-d是指在/var/log/mgetty.ttys1留下调试信息,-l ttys1是指使用ttys1为拨出设备,-s 115200是串口速率,-s 62345678是指定的回拨电话号码,如果没有-s参数,mgetty就会提示你输入回拨的目的电话号码。基于安全的考虑,建议在这里指定回拨的目的号码,不然的话,别人用call_hxf登录同样也可以使用回拨了。关于callback的详细信息请察看手册页。
现在我们来试一试,在win95,还是使用那个“拨号后出现终端窗口”的拨号连接,当出现终端窗口并提示login时,输入call_hxf,如果你在login.config中没有指定回拨号码,现在就有提示问你回拨的电话号码了,输入现在你使用的号码,此时服务器断开电话准备回拨,但是win95会认为服务器断了,弹出一个对话框告诉你服务器断开连接,请稍候在试。一会儿,你就会惊喜的听到你的电话在震铃,服务器正在回拨,但是win95已经不理会了,看来win95上还要搞一搞才能协调起来。现在你还是把linux服务器上的那个callback进程kill了吧,要不然它会一直播下去的,呵呵。
客户端设置
服务器准备回拨的时候要把电话先断掉,我们现在的目的是让win95检测不到这个变化,这样win95就不会退出拨号程序了。我们打开所使用的拨号连接的属性-〉常规-〉设置-〉连接-〉高级-〉附加设置,将at&c这个命令写在附加设置里。这个命令的意思就是让串口的载波检测(carrier detect)那根线保持有效,这样win95就会认为电话一直是通的,服务器回拨时断掉电话win95就检测不出来了,这样win95的拨号客户程序就可以继续与服务器对话并建立连接了。
下面的工作就是使win95能接听服务器回拨的电话,并通过服务器的用户认证。我们建立一个脚本文件callback.scp如下:
proc main
waitfor “ogin: ”
transmit “call_hxf^m”
waitfor “number for callback: ”
transmit “62345678^m”
waitfor “ring”
transmit “ata^m”
waitfor “ogin: ”
transmit $userid
transmit “^m”
waitfor “assword: ”
transmit $password
transmit “^m”
endproc
我们在所使用的拨号连接的属性-〉制作脚本里填上这个文件的全路径和文件名。你需要根据你的情况修改蓝色的地方
这个脚本很简单,它由一个一个的waitfor–transmit对组成,收到登录提示符login:,就发送callback的用户名call_hxf。(这里login没有第一个字母l,这是因为字母l有可能是大写的l,就像这样:login:,为了不出错,干脆就不要字母l了。同样,下面的password也没有字母p。)如果在服务器没有指定回拨的电话号码,现在就要问你了,在收到number for callback:这样的字符串后,发送自己的电话号码。如果服务器指定了号码,这两行就不要了。当你给了回拨号码后(或服务器已经指定),服务器就挂断电话,进行回拨。客户端的modem检测到一个震铃,就向串口发送一个ring字符串,win95从串口读到这个字符串,就会向modem发出ata命令,让modem接听这个电话。这样连接就建立了。之后,mgetty向客户提示输入用户名和密码,这里的$userid和$password,就是引用你在拨号的那个对话框里填入的用户名和密码。“拨号后出现终端窗口”那个选项在这里就不需要了。那个“^m”可以理解成回车的意思。
现在我们来试一试,双击刚修改过“at&c”的拨号连接,在用户名和密码填入ppp和它的密码,这个ppp用户的登录shell是我们曾经改成ppplogin的。连接后你首先听到你的modem在拨出,并与服务器对话,一会儿,你就听到你的电话响了起来,这是服务器在回拨,你的modem立刻接起这个电话,并与服务器对话,安全认证通过之后,你熟悉的那个绿色小电脑又出现了!你的回拨成功了!在这个过程中,win95的拨号程序一直告诉你正在验证用户名和口令,因为它不知道我们在做回拨,所以只好认为是在验证口令了。在整个回拨过程中,不要随便按“取消”,因为服务器端的callback程序并不知道你取消了,它会一直拨你的电话的。这个callback程序的反应速度不是很快,在服务器断掉电话到你听到回拨的电话铃声,可能要等20秒到30秒的样子,需要耐心等待。在回拨过程中,你会发现有一个被最小化的终端窗口,它就是你的callback.scp脚本文件执行时的窗口,你会在这里看到“no carrier”,这是说没有载波,因为你的设置了“at&c”,所以没有载波拨号程序也不会退出。在你听到回拨的电话铃声时,你会在这个窗口里看到“ring”,这表示modem收到一个震铃。接着你的callback.scp就会发出“ata”接听这个电话,如此这般,你的ppp就通了。
我们只讲述了win95的客户怎么配置回拨,linux下不准备说了,但是linux的pppd软件包还带了几个脚本文件是用来支持回拨的。我们在搞清楚回拨的工作过程之后,参考这些脚本程序,就不难配置linux客户的来支持回拨了。
2.3小结
至此,linux拨号服务器以及回拨服务器的配置就讲完了。大概你可能觉得做服务器不如做客户条理清楚,头绪比较繁杂。的确,linux配置拨号服务器细碎的地方比较多,下面就把服务器的配置过程整理一下:
使ip转发有效echo “1”>/proc/sys/net/ipv4/ip_forward,redhat可以修改/etc/sysconfig/network
安装mgetty。编辑/etc/inittab文件,加入7:2345:respawn:/sbin/mgetty ttys1这一行。init q使修改有效。
编辑拨号登录文件ppplogin,内容就是执行pppd程序。将ppplogin设置成可执行chmod +x ppplogin。将pppd程序设置成以root权限执行chmod u+s /usr/sbin/pppd。
用useradd加一个拨号用户,比如ppp。用passwd为这个用户设置密码。编辑/etc/passwd文件,修改此用户的登录shell为ppplogin。
为客户分配ip地址,编辑文件:/etc/ppp/options.ttyxx,填入ip地址对。
为支持autoppp,修改/etc/mgetty+sendfax/login.config文件,把autoppp前的#去掉。再编辑/etc/ppp/pap-secrets文件,加入一行* * “” *,以支持autoppp。
以上是设置基本的拨号服务器的步骤,完成这些设置后,就可以进一步设置回拨服务器了,下面是设置回拨服务器的步骤。
linux服务器:编辑/etc/mgetty+sendfax/login.config,加入一个回拨用户,就是类似这样的一行:call_hxf – – /usr/sbin/callback -d -l ttys1 -s 115200
win95客户:打开所使用的拨号连接的属性-〉常规-〉设置-〉连接-〉高级-〉附加设置,将at&c这个命令写在附加设置里。
win95客户:编辑并使用回拨脚本,如本文所述的callback.scp。
现在,你可以按照这些步骤来轻松的配置你的拨号服务器甚至是回拨服务器了!
至此,linux下的拨出和拨入就全部介绍完了。本文是以实用为目的,介绍我的一些经验,并没有讲述很多理论。如果有错误或是不足还请指出,也让我提高提高。希望这篇文章对你有所帮助。谢谢。
作者:胡晓峰 huxiaofeng@263.net