用非固定的拨号连接创建你的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 <[email protected]>, 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&domain=$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------------------
发布人:netbull 来自:Linux公报