Linux 版 (精华区)
发信人: howdoit (教练让我上场!!!), 信区: Linux
标 题: 用非固定的拨号连接创建你的INTERNET域
发信站: 哈工大紫丁香 (Tue May 18 08:56:17 1999), 转信
《Linux公报》……让Linux更富魅力!
用非固定的拨号连接创建你的
INTERNET域
By Joe Merlino
翻译:li3p
你喜欢你的LINUX系统。你喜欢它的强大的功能;你喜欢它的灵活
性;你喜欢他的自由性。最重要的是它绝对的非MICROSOFT本质。但是
深入其中,你发觉还缺少一些东西。这些东西成为你心里的渴望,每
每逼迫得你只能以呼喊抱怨方能发泄一二。
但是你的一些朋友拥有这些东西:他们或者有到INTERNET的24小
时以太网连接;或者你的这个朋友十分的富有,富有到拉一条T1电路
到家里作INTERNET接入。他们可以随心所欲的登录到他们的LINUX机器
上,他们拥有自己的INTERNET域名。你可能还有一个到他们其中的一
个机器的帐号。但是看看你是如何连接上你的机器上的:的确你的
MODEM相当的快,但是他只能在你亲自的控制下才能进行拨号,而你在
没有登录到你的机器上时你根本无法控制你的MODEM!即使你把拨号脚
本加到你的CRON任务队列中,你也无法进行远程登录,因为每次拨号
你的ISP都会给你一个不同的IP地址,而你是无法确定这个地址的,因
而也就无从登起了。
那么你怎么才能实现你的远程控制呢?
别担心,现在有一种方法。只用花一个PPP拨号帐号的钱,你就能
实现远程控制。而且如果你愿意支付INTERNIC的注册费用的话(你能
够攒够70块钱的,不是吗?),你甚至可以拥有你自己的域。方法如
下:
第一步-设置PPP
有关在LINUX下设置PPP连接的文档随处可见,所以我也就不再赘
述;值得强调的一点是你应该能通过在命令行上键入非交互式的命令
来实现你的PPP连接。象EZPPP和REDHAT自带的NETCFG等图形界面的程
序是不能用的。因为你要创建一个加入到CRON任务队列中的脚本,你
的PPP连接脚本还要在这个脚本中被调用。
在本文中,我所使用的PPP连接脚本是指/etc/ppp/ppp-on,断开
连接所用的节脚本是/etc/ppp/ppp-off。你可以在相关的WEB上找到此
类脚本的样例。
第二步-动态DNS服务
你可能是通过你的ISP使用域名服务(DNS)的,但是你的ISP无法
跟踪你的域名和IP关系,因为你每次拨入都会得到不同的IP地址,因
而这中对应关系也是随时变化的。之所以如此是因为它所拥有的IP地
址比实际的用户数量要少,好在绝大多数的用户的连接服务通常很短
-最多几个小时。你也可以从你的ISP申请到一个静态的IP地址,并用
拨号的方式每天24小时在线,但这通常是相当昂贵的。
关键是,你确实没有必要为了得到一个固定的域名而申请静态的
IP地址。只要能够实现你的域名解析的DNS服务器在你任何想登录的时
候,能够提供正确的IP地址就行了。而且这个DNS服务器也完全没有必
要非得是你的ISP所提供那个服务器。
我使用的是由Dyndns公司 (www.dyndns.com)所提供的动态域名服
务。Dyndns有偿的为你在他的数据库中维护你的域名。这个域名可以
是从Dyndns 申请的子域名(例如: yourdomain.dyndns.com),这样
比较便宜;也可以是你所专有的域名(例如:yourdomain.com),这
样比较贵。而且如果你想得到一个专有的域名,首先,你要到
INTERNIC去注册(www.internic.net)。Dyndns也能有偿的替你去作
这些事情,只是这些也很容易,你完全可以替你自己省点钱-自己去
作。在INTERNIC注册时,你必须提供一主一从共2个DNS服务器IP地
址。这些地址在Dyndns的主页上可以得到。一旦这些都完成了(注
意:是有偿的),你就可以继续进行了。
接下来的事情就是到Dyndns的WEB站点上下载一个客户端程序。他
们有多种不同的的客户程序可供下载(一种C语言的,一种PERL语言
的),你要做些试验,以确定到底哪种客户程序更适合你(尽管如
此,我还是在一位的帮助下,修改了一下那个PERL客户程序才使得它
正确运行的)。
当你登陆到你的ISP时,你可以运行这个客户程序。它从IFCONFIG
命令的输出中得到你当前的IP地址,并把这个地址发送给Dyndns的DNS
服务器。现在你的域名和IP地址的对应关系就建立了。
[注意:在这一节中,我无意为Dyndns作宣传和广告。我以他们的
服务为例子,只是因为我用到了他们的服务,我得使用一个我所熟悉
的例子。]
第三步-使连接自动化
你已经得到了你域名、实现了DNS解析、并且已经使客户端程序工
作了。那么接下来你所要作的就是让你机器在你不干预的情况下,能
够通过上述步骤自己登录到ISP上。哈!这就是LINUX的强项了!只用
一个简单的脚本就可以办到。以下是我所使用的脚本:
#!/bin/bash
# This is a script that attempts to log into a remote dialup and
# establish a PPP connection. If it is sucessful, it runs 'ntpdate'
# (network clock set), NamedControl.pl (a perl script to update
# the dynamic DNS), and fetchmail for all accounts. If it fails, it
# makes two more attempts, and then exits.
# This script is released under the GNU General Public Licence. No
# warrenty whatsoever is expressed or implied.
# Original version was written by Joe Merlino <joe@negia.net>, November,
# 1997.
# If you have an idea for an improvement to this script, please let me
# know.
# set iteration counter at 1
i=1
while [ $i -le 3 ]
do
# This part tests for the availability of the modem. If the modem
# is available, it runs /etc/ppp/ppp-on. If not, it reports and
# exits.
(
if (test -e /var/lock/LCK..modem)
then
echo modem not available # for some reason this didn't work.
exit 0
else
/etc/ppp/ppp-on
sleep 45
fi
)
# This part tests for the modem lock file, and if it exists, runs
# the various programs needed to update the system from the network.
# if the lock file is not found, it reports and exits.
(
#!/bin/bash
if (test -e /var/lock/LCK..modem)
then
/etc/ppp/netpack #invoke 'netpack' script
echo done
else
echo no connection
fi
)
sleep 60
# This part again tests for the lock file, and if it finds it, sets
# the iteration counter to 4 (so the script will exit). If the lock
# file is not found, it incriments the counter by one.
if (test -e /var/lock/LCK..modem)
then
i=3
fi
i=`expr $i + 1`
echo $i
done
你可能注意到了,在上面的脚本中还调用了另外一个脚本
'netpack'。因为我在我的机器登录上以后,有一些事情要作。至少
'netpack'应该包括你的动态DNS客户程序。我还建议包含一些下载你
的邮件的程序(象'fetchmail' 或 'popclient' 等等)。你也可以
在调用'netpack'的地方,用调用相应程序的命令来替代。但是我比较
喜欢这种模块化的设计,这样一来我就可以单独编辑'netpack'就可以
了。
我将上面的脚本(我起的名字是'auto-up')和 'netpack'都放在
/etc/ppp/下。
当所有的设置都完成后,最好手工运行一下以确定能够正常工
作。(不要忘了给你自己执行的权限)。确认无误,你就可以通过使
用crontab -e命令来将这个脚本编入命令队列,设置相关的时间参
数,使这个脚本在任何想远程访问你的LINUX机器的时候运行。还有别
忘记在远程访问完成后使用/etc/ppp/ppp-off命令来关断连接。
[注意:有些ISP对你的空闲在线时间可能有限制。这是为了防止
一些人登录以后就离开了他的计算机,浪费资源。你最好查询一下你
的ISP所对此所采用的策略。]
以上就是全部的过程了,你现在已经可以在特定的时间远程访问
你的机器了。而且现在你可以开始眼馋一个全天24小时的连接了,
(只是不知道有没有用? ;-))
附录:在我完成这篇文章、这一期的LINUX公报发稿时,DynDNS增
加了一个基于WEB的更新方式:这意味着你可以通过你的浏览器,来手
工的更新你的动态DNS解析。
这也给了我们一个机会,使得我们写出另外一个更为简洁、与平
台无关的的PERL客户程序--只要简单的修改以下与帐号相关的信息
即可使用。
如果你想使用这个程序,只要简单的将---CUT--- 以下的行复制
到一个新的文件里,赋给执行的权限,在调用原客户程序的地方调用
即可:
---------------CUT------------------
#!/usr/bin/perl
#
# Client script for HTTP update of DynDNS's Dynamic Domain service.
# Written by Joe Merlino 12/31/98
# Licence: GNU GPL
#
use IO::Socket;
# Replace the values below with your information as indicated
$host = "master.dyndns.com";
$myhost = "myhost"; #replace with your hostname
$myname = "postmaster";
$mypass = "mypass"; #replace with your password
# This part opens a connection to DynDNS's web server.
$remote = IO::Socket::INET->new(
Proto => "tcp",
PeerAddr => "$host",
PeerPort => "http(80)"
)
or die "couldn't open $host";
# This part sends an HTTP request containing your information.
print $remote "GET /dyndns/cgi/DynDNSWeb.cgi?name=$myname&passwd=$mypass&do
main=$myhost&IP=AUTO HTTP/1.0\n\n";
#This part extracts and prints DynDNS's response.
while ($hrm = <$remote>) {
if ($hrm =~ /UPDATE/) {
$message = $hrm
}
if ($line =~ /THERE/) {
$message = $hrm
}
}
print "DynDNS: $message";
-close $remote;
---------------CUT------------------
版权所有 (C) 1999 NJLUG
出版于第36期《Linux公报》1999年1月 中文版第三期
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bin@mtlab.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.088毫秒