在Linux or FreeBSD平台下,用Perl脚本实现3322.org动态DNS的功能
基本情况描述
先看一下拓扑
在Linux or FreeBSD的平台下在上面的拓扑的时候可能回出现 从3322.org下的软件不能用的情况。
具体情况如下。
上面的路由器向SP 通过PPPoE的拨号后,得到一个公网的IP地址。并且配置NAT使下面的LAN上网。这样下面的这个服务器是没有公网IP地址的。
但是这个时候可能需要这个服务器来提供一个3322.org的动态DNS的更新。
但是在 ez-ipupdate 的配置文件里面一定要制订一个interface的参数。如果在配置文件中,制定一个接口,那么在 3322.org上看到的就是一个Private的IP。
思路
看了3322.org上面关于DDNS的协议标准(http://www.3322.org/dyndnspage/protocol.html),然后有看了google上一些人的一些文章。
其实,他就是通过访问members.3322.org的web服务器,然后通过URL来传递一些参数来实现DDNS的更新。并且,
==================================================================================
myip=ipaddr System:All Optional: Yes
域名对应的IP。如果不指定,则服务器将选择最佳的IP(一些Proxy会传递客户端的IP,
这会被服务器检测到)。如果传递的地址格式错误,则忽略这个参数,而用服务器检测
到的IP。
==================================================================================
这个部分和有用。原来的程序是通过在配置文件中指定interface来拿到这个myip的参数的。其实,我现在不想让他拿到这个IPaddr。
很久以前还在大学的时候看过一些Perl的东西,可以通过Perl来实现 DDNS的更新。
由于编程水平有限,下面的script是没有一点错误处理的。毕竟是想自己用么。不想形成一个Perl的软件。(也没有必要写的太完美)。
Perl的脚本如下:
#!/usr/bin/perl
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$ua->agent("MyApp/0.1 ");
# Create a request
my $req = HTTP::Request->new(POST => 'http://username:password\@members.3322.org/dyndns/update');
$req->content_type('application/x-www-form-urlencoded');
$req->content('system=dyndns&hostname=host.3322.org&myip=abc&wildcard=OFF');
# Pass request to the user agent and get a response back
my $res = $ua->request($req);
# Check the outcome of the response
if ($res->is_suclearcase/" target="_blank" >ccess) {
print $res->content;
}
else {
print $res->status_line, "\n";
}
脚本里面的username and password 还有host.3322.org可以根据你自己的情况来修改。
着先写到这里,以后要用到就可以用了。