Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
*Backtrace*(2001-11-18)
[go: Go Back, main page]

書いてる人: 高橋カヲル | [mixi] | [PGP] | [TETRiS DS] | [portscout] | [RSS]

トップ «前の日記(2001-11-17) 最新 次の日記(2001-11-19)» 編集

*Backtrace*

1999|12|
2000|01|02|03|04|05|06|07|08|09|10|11|12|
2001|01|02|03|04|05|06|07|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|

2001-11-18

_ djbdns (tinydns) で Dynamic DNS

落ち着いたんでメモ。ベースはねぎ支障の SSH アクセス方式。 dynamic DNS だけならこれで十分やね。もちろん BIND がすでに動いているホストなら BIND を使うけど。 tinydns がすでに動いていたホストだったから tinydns を使っただけなんです。

  • dyndns ユーザ権限で /var/dyndns 以下で動いています。
  • /service は気持悪いので /var/service で妥協しました。
  • /var/service/dyndns は symlink で。

* authorized_keys

利用者には SSH の公開鍵を提出してもらう。アカウントを作る必要はない。 ~dyndns/.ssh/authorized_keys に鍵を追加する。ここで command オプションを使ってホスト名を与えておく。

command="/var/dyndns/root/dnsupdate --host=kaoru --ttl=60 --verbose" 1024 35 (以下略)

ホストと公開鍵を一対一対応させている。この例だと、ある秘密鍵を持っている人だけが --host=kaoru で dnsupdate を実行できるようになっている。

* dnsupdate

やんごとなき理由により、利用者が IP を指定したい場合に対応しておくことにした。 command= を使って制限した場合、利用者が実行しようと目論んだコマンドが SSH_ORIGINAL_COMMAND に入る。ここを使って IP アドレスを陽に指定することができるようにしてある。もちろん、利用者が信用できない環境では SSH_CLIENT だけを使おう。信用できる利用者にだけ許すように、コマンドラインオプションを追加しておくといいかもしれない。(今気づいた) SSH_ORIGINAL_COMMAND で渡すなんて使い方は邪道なのでむやみに使うな>カヲル。

use strict qw(vars subs refs);
use Getopt::Long;
GetOptions("help", "version", "verbose", "host=s", "ip=s", "ttl=i");
if ($main::opt_help) {
    print STDOUT << "END_USAGE" ;
Usage: dnsupdate [OPTION]
Startup:
  --version                display the version of dnsupdate and exit.
  --help                   print this help.
  --verbose                be verbose.
  --host=HOST              set hostname
  --ip=IP		   set IP address
  --ttl=TTL                set TTL
END_USAGE
    exit 0;
}
my $DYNDNSDIR='/var/dyndns/root';
my @DOMAINS = ( 'dyn.example.com',
		'dyn.example.org',
		'dyn.example.net' );
my $COMMAND = "cd ${DYNDNSDIR} && /usr/bin/make ";
my $TTL = $main::opt_ttl || 60;
my $HOST = $main::opt_host || die;
my $IP = $main::opt_ip
  || (split(/\s/, $ENV{SSH_ORIGINAL_COMMAND}))[0]
  || (split(/\s/, $ENV{SSH_CLIENT}))[0]
  || die "Can't detect IP address";
unless ($IP =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) {
    die 'Invalid IP adderss';
}
open(HOSTFILE, ">${DYNDNSDIR}/${HOST}.data") or die;
foreach (@DOMAINS) {
    print HOSTFILE "=${HOST}.$_:${IP}:${TTL}\n";
    print STDERR "=${HOST}.$_:${IP}:${TTL}\n" if $main::opt_verbose;
}
close HOSTFILE;
if ($main::opt_verbose) {
    system("$COMMAND");
} else {
    system("$COMMAND > /dev/null");
}

* Makefile

これは普通に。

data.cdb: data
	/usr/local/bin/tinydns-data
data: *.data ns.data
	cat $> | sort -u > $@

* ns.data

ns.data には静的な部分を入れてある。

.dyn.example.com:192.168.170.84:ns.dyn.example.com:3600
.dyn.example.net:192.168.170.84:ns.dyn.example.net:3600
.dyn.example.org:192.168.170.84:ns.dyn.example.org:3600

* 利用者

利用者は ssh dyndns@ns.dyn.example.com するだけ。 ssh dyndns@ns.dyn.example.com 10.0.0.2 のように IP アドレスを指定することも可能だが、それは routeing が不安定な謎環境でのスクリプト中での使用を目的にしたもの。 known_hosts 問題を除けば、利用者のコマンドラインは変更しないで済むように設計したつもり。他の名前でなく、ns.dyn.example.com である理由はそれ。 SSH_ORIGINAL_COMMAND で IP アドレスを渡す機能は不必要なら必ず切ること。念のため。

* References

お名前:
E-mail:
コメント:
本日のリンク元
その他のリンク元
検索

トップ «前の日記(2001-11-17) 最新 次の日記(2001-11-19)» 編集

謎 queue & status

Powered by 早起き生活
[Powered by OpenBSD] [Powered by たん清] [やる気のないサイト] Valid HTML 4.01 Strict Page Rank Checker [VALID RSS!] RSS feed meter for http://triaez.kaisei.org/~kaoru/diary/