分类: LINUX
2009-12-24 21:53:55
目录
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