web-dev-qa-db-ja.com

シンプルな自己ホスト型ダイナミックDNSサーバーをセットアップする方法

ハイパーバイザーを実行している物理マシンの小さな内部ネットワークがあり、ハイパーバイザーがいくつかのKVM Ubuntu仮想マシンを実行しています。内部の動的DNSサーバーをセットアップして、スクリプトを実行して新しい仮想マシン、そのVMはそれ自体をDNSサーバーに自動的に登録できますか?

Bind はLinuxの標準DNSサーバーのようですが、より「静的な」DNSモデル用に設計されているようです。これを動的に更新するには、DNSサーバーにSSHで接続し、構成ファイルを編集してサーバーを再起動する必要がある複雑なスクリプトが必要になります。これは非常にエレガントなソリューションのようには見えません。より良いオプションはありますか?

同様の質問 を見ましたが、Amazonのパブリック設定の解決策を求めています。私のサーバーは完全にプライベートで、外部のVMホストまたはダイナミックDNSプロバイダーに依存したくありません。

8
Cerin

実際、BindはRFC 2136標準メッセージを介して動的DNS更新を行うことができます。 nsupdateツールと適切な構成を使用する(それほど難しくはありませんが、完全に簡単ではありません)。

これらの更新メッセージを認証するためのオプションは、1)特定のIPのみが更新メッセージを送信できるようにする2a)TSIG対称暗号化2b)SIG(0)ベースの公開鍵暗号方式、または1と2 *の組み合わせです。他の場所の中で命令が見つかります ここ

これを個人的に実装する場合、最大の問題は、/ var/namedでnamedに十分な書き込み権限を与えることでした。ディレクトリにファイルを作成できるだけでなく、動的ゾーンのファイルへの書き込み権限も必要です。

Sig(0)キーは、nametype Hostおよびkeytype KEYを指定したdnssec-keygenユーティリティで生成されます。例(正確でない場合があります)(RSAMD5はほぼすべてのバインドパッケージをカバーします):

dnssec-keygen -a RSAMD5 -b 1024 -n Host -f Key Host.domain.tld

結果の.keyファイルはゾーンファイルに追加され、.privateはコマンドラインでnsupdateを使用して指定されます。

8
CarbonLifeForm

(CarbonLifeFormが説明するように)nsupdateを介して動的更新でバインドをセットアップし、これを、暗号化されたHTTPS REST-Requestを介して呼び出される単純なPerlスクリプトと組み合わせ、サブドメイン/パスワードの組み合わせを確認してから、リクエストのIPでnsupdateを呼び出します。

任意のクライアントからのUpdate-Callの例(適切なサブドメインをそのクライアントのパブリック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";
}
4
Jan Kechel

サーバーはすべてプライベートなので、IPアドレスをより大きなインターネットに公開したくないと思います。これは実際に物事を簡素化します。

私の小規模なネットワークでは、シンプルなDNSおよびDHCPサーバーである dnsmasq で成功したことがわかっています。 DHCPリースを取得したときに、クライアントがDNSサーバーに自分自身を追加できるようにする必要があります。

さらに読む: https://superuser.com/questions/312515/dnsmasq-without-altering-etc-hosts-file-manually

3
TheLQ

VMにIPアドレスはどのように割り当てられますか? DHCPを想定して、BINDを動的に更新するように構成できます。これがdhcpd.confのセットアップに関するUbuntuのドキュメントです。

http://manpages.ubuntu.com/manpages/lucid/man5/dhcpd.conf.5.html#contenttoc14

BIND側では、named.confは動的に更新されるローカルゾーンを指定します。 user115014で概説されているように、キーを使用します。

1
cjc

一般的に(およびWindows中心):

  1. 動的DNSをサポートするDNSサーバーをインストールする

  2. サーバーで適切なDNSゾーンを構成する

  3. ゾーンの安全なDNS更新と安全でないDNS更新を許可するようにDNSサーバーを構成する

  4. DNSゾーンと一致するDNSサフィックスでDNSクライアントを構成する

  5. 名前解決にDNSサーバーを使用するようにDNSクライアントを構成する

  6. DNSに登録するようにDNSクライアントを構成する

0
joeqwerty