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毫秒