DDNS(Dynamic Domain Name Server)是动态域名服务的缩写,DDNS是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务器程序负责提供DNS服务并实现动态域名解析。
提供DDNS的服务商有:花生壳、DynDNS。不少路由内置都有支持这两个DDNS的,注册个帐号配置一下就可以用了。
DynDNS提供的DDNS最稳定,但2年前突然邮费了。花生壳也有免费的DDNS,但是非常不稳定。
鉴于DNSPod提供有完善API(https://support.dnspod.cn/Support/api),可以直接写个脚本调用API更新地址。DNSPod API介绍页也提供了不少第三方写的DDNS脚本。不过没有PERL的,所以就自己写了一个。
#!/usr/bin/perl use strict; use warnings; require "/home/lemontv/ddns/Browser.pm"; use JSON; use Data::Dumper; my $login; $login->{"email"} = 'your@email.com'; $login->{"password"} = 'yourpassword'; $login->{"format"} = 'json'; my $domain; $domain->{"name"} = "yourdomain.com"; $domain->{"record"}->{"name"} = "home"; my $url; $url->{"domain_list"} = "https://dnsapi.cn/Domain.List"; $url->{"record_list"} = "https://dnsapi.cn/Record.List"; $url->{"record_ddns"} = "https://dnsapi.cn/Record.Ddns"; my $browser = new Browser(); my $json = JSON->new->allow_nonref; ### get params domain_id ### my $result = &post($url->{"domain_list"}); my $domains = $result->{"domains"}; foreach my $d (@$domains) { if($d->{"name"} eq $domain->{"name"}) { $domain->{"id"} = $d->{"id"}; last; } } ### get params record_id ### $result = &post($url->{"record_list"}, { "domain_id" => $domain->{"id"} }); my $records = $result->{"records"}; foreach my $r (@$records) { if($r->{"name"} eq $domain->{"record"}->{"name"}) { $domain->{"record"}->{"id"} = $r->{"id"}; } } ### update ddns ### $result = &post($url->{"record_ddns"}, { "domain_id" => $domain->{"id"}, "record_id" => $domain->{"record"}->{"id"}, "sub_domain" => $domain->{"record"}->{"name"}, "record_line" => "默认" } ); sub post { my ($u, $p) = @_; my $params = { "login_email" => $login->{"email"}, "login_password" => $login->{"password"}, "format" => $login->{"format"} }; if($p) { foreach my $k (keys$p) { $params->{$k} = $p->{$k}; } } my $response = $browser->post($u, $params); return $json->decode($response->content); }
丢到树莓pi上的主目录下,然后写条cron每10分钟定时执行一次。就算突然停电,只要来电,路由连网后就可以自动更新IP了。
*/10 * * * * root perl /home/lemontv/ddns/ddns.pl