我有一个运行虚拟机pipe理程序的物理机器的小型内部networking,而虚拟机pipe理程序又运行着多个KVM Ubuntu虚拟机。 我将如何设置一个内部dynamicDNS服务器,以便当我运行一个脚本来创build一个新的虚拟机,该虚拟机可以自动注册自己的DNS服务器?
绑定似乎是Linux的标准DNS服务器,但它似乎devise了一个更“静态”的DNS模型。 dynamic更新这将需要一个复杂的脚本,必须SSH到DNS服务器,编辑configuration文件,然后重新启动服务器。 这似乎不是一个非常优雅的解决scheme。 有更好的select吗?
我看到一个类似的问题 ,虽然他们正在寻求一个解决scheme,在亚马逊公开设置。 我的服务器是完全私人的,我不想依赖外部VM主机或dynamicDNS提供商。
实际上,绑定能够通过RFC 2136标准消息进行dynamicDNS更新。 使用nsupdate工具和正确的configuration(不是非常困难,但不是完全微不足道的)。
用于validation这些更新消息的选项是1)仅允许某些IP发送更新消息2a)TSIG对称encryption2b)基于SIG(0)的公钥密码术或1和2 *的组合。 其他地方的说明可以在这里find
在实现这个个人时,我发现最大的问题是在/ var / named中给予足够的写入权限。 它需要能够在目录中创build文件以及对dynamic区域的文件具有写入权限。
使用带有nametype HOST和keytype KEY的dnssec-keygen实用程序生成Sig(0)密钥。 例如(可能不是确切的)(RSAMD5几乎涵盖每个绑定包):
dnssec-keygen -a RSAMD5 -b 1024 -n HOST -f密钥host.domain.tld
生成的.key文件将被添加到您的zonefile中,.private将在命令行中使用nsupdate指定。
我通过nsupdate(如CarbonLifeForm所述)设置了dynamic更新绑定,并将其与通过encryption的HTTPS REST-Request调用的简单Perl-Script结合,检查子域/密码组合,然后使用请求的IP调用nsupdate。
示例更新 – 来自任何客户端的呼叫(将自动将相应的子域设置为该客户端的公共IP)
只要访问任何浏览器(在这个例子中,通过端口12345可以使用https):
https://ddns.YOURDOMAIN.net:12345/update-my-ip.pl?subdomain=***&password=***
或通过命令行(例如,通过cronjob每15分钟更新一次):
www-browser -dump 'https://ddns.YOURDOMAIN.net:12345/update-my-ip.pl?subdomain=***&password=***'
这里是perl脚本update-my-ip.pl:
#!/usr/bin/perl use strict; use CGI; use Digest::SHA1 qw(sha1_hex); my %accounts = ( # create via: sha1sum, then type password, then press Ctrl-D to calculate checksum (echo with pipe gives wrong result!) # update via: www-browser -dump 'https://ddns.YOURDOMAIN.net:12345/update-my-ip.pl? subdomain=***&password=***' 'YOURSUBDOMAIN1' => '93485720985720394853452345235-fake-sha1-checksum1', 'YOURSUBDOMAIN2' => '93485720985720394853452345235-fake-sha1-checksum2', 'YOURSUBDOMAIN3' => '93485720985720394853452345235-fake-sha1-checksum3', ); my $cgi = new CGI; print "Content-type: text/html\n\n"; my $subdomain = $cgi->param('subdomain'); my $password = $cgi->param('password'); if( !$password || !$subdomain || length($password) <= 3 || length($subdomain) <= 1) { print "ERROR\n"; exit 0; } my $sha1 = sha1_hex($password); my $ip = $ENV{'REMOTE_ADDR'}; my $should_be_sha1 = $accounts{$subdomain}; if( $sha1 && length($sha1) > 10 && $sha1 eq $should_be_sha1) { print "START: ddns.YOURDOMAIN.net DNS updating <a href=\"http://$subdomain.YOURDOMAIN.net\">http://$subdomain.YOURDOMAIN.net</a> (<a href=\"https://$subdomain.YOURDOMAIN.net\">SSL</a>) to IP <a href=\"http://$ip\">$ip</a>.<br/>\n"; my $out = `echo "update delete $subdomain.YOURDOMAIN.net A\n\n" | nsupdate 2>&1`; print "STEP1 $out<br/>\n"; $out = `echo "update add $subdomain.YOURDOMAIN.net 60 A $ip\n\n" | nsupdate 2>&1`; print "STEP2 $out<br/>\n"; print "DONE<br/>\n"; } else { print "ERROR\n"; }
由于你的服务器都是私人的,我假设你不想将IP地址发布到更大的互联网。 这实际上简化了事情。
我知道我的小networking我已经成功地使用了dnsmasq ,一个简单的DNS和DHCP服务器。 它应该允许客户在获得DHCP租约时将自己添加到DNS服务器。
进一步阅读: https : //superuser.com/questions/312515/dnsmasq-without-altering-etc-hosts-file-manually
IP地址如何分配给您的虚拟机? 假设DHCP,您可以将其configuration为dynamic更新BIND。 这是dhcpd.conf安装的Ubuntu文档。
http://manpages.ubuntu.com/manpages/lucid/man5/dhcpd.conf.5.html#contenttoc14
在BIND方面,named.conf将指定要dynamic更新的本地区域。 您将使用键,如user115014所述。
一般(和Windows为中心):
安装支持dynamicDNS的DNS服务器
在服务器上configuration适当的DNS区域
configurationDNS服务器以允许区域的安全和不安全的DNS更新
使用与DNS区域匹配的DNS后缀来configurationDNS客户端
configurationDNS客户端以使用DNS服务器进行名称parsing
configurationDNS客户端在DNS中注册