ntpdと仮想IP(IPエイリアス、サブインターフェース)の組み合わせ

投稿日: 2009年10月28月

  • 2009/11/10追記:この方法はあんまりよろしくない。対策含めた記事は後日書く予定。
  • 2009/11/11追記:書いた。<20091111#p01>

RHES4 update6な環境において、仮想IPとパッケージのntpdの組み合わせは正常に動作しない。

下記参照。

それぞれから引用する。

eth0 xxx.xxx.xxx.xxx “” eth1:1 yyy.yyy.yyy.yyy “” ““という設定で仮想アドレスのyyy.yyy.yyy.yyyに対してUDP通信を行うと戻りパケットのソースアドレスが、xxx.xxx.xxx.xxxになる

上記によって、特にntpdでは下記のような現象が起こる。

”“NTPサーバとなるマシンntp1がインターフェースeth0を持っている。このインターフェースにサブインターフェースeth0:1およびeth0:99を作成し、それぞれ192.168.1.1/24および192.168.1.99/24を割当てる。このとき、NTPクライアントとなる他の機器server1で、NTPサーバを192.168.1.99を指定すると、同期が取れない場合がある。特に、server1とntp1の間にファイアウォールがある場合などに問題になる。 “” ““この原因は判っていて、NTPサーバが192.168.1.99宛に届いた問合パケットに対して、応答パケットが192.168.1.1から出て行くからだ。つまり、こういうことだ。サーバserver1のアドレスを192.168.254.1としよう。さらに、ソースアドレスsとデスティネーションアドレスdを持つパケットを[s=>d]と表すとする。このケースでは、問合パケットは、[192.168.254.1=>192.168.1.99]になり、応答パケットには、ソースとデスティネーションを逆転させた[192.168.1.99=>192.168.254.1]が期待される。だが、これが何故か[192.168.1.1=>192.168.254.1]になってしまう。 “” >NTPクライアント側は、自分が送信先に指定したサーバからの応答があると期待しているので、それとは違うソースアドレスからのパケットは無視する。もしserver1とntp1の間にステートフルなファイアウォールが存在すれば、応答パケットが問合せパケットに対応するものだとは理解できないので、おそらく応答パケットは破棄されてしまう。

これらを解決する方法は簡単で、最新版のntpdをソースからインストールし、新しく追加された「-I」オプションで仮想IPのインターフェースを指定して起動してあげればいい。

手っ取り早くntpdだけ差し替え。

# wget http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2.4p7.tar.gz
# tar xvfz ntp-4.2.4p7.tar.gz
# cd ntp-4.2.4p7
# ./configure
# make
# cp ntpd/ntpd /usr/sbin/ntpd

/etc/sysconfig/ntpdを編集し、OPTIONS行に「-I eth0:1」を追記

OPTIONS="-I eth0:1 -u ntp:ntp -p /var/run/ntpd.pid"

これで、ntpdはeth0:1側で通信するようになる。

ちなみに、up2dateで入れたntpdのバージョンとオプションは下記。

# ./ntpd --version
./ntpd: ntpd 4.2.0a@1.1190-r Thu May 14 09:36:23 EDT 2009 (1)


# ./ntpd --help
usage: ./ntpd [ -abdgmnqx ] [ -c config_file ] [ -e e_delay ]
                [ -f freq_file ] [ -k key_file ] [ -l log_file ]
                [ -p pid_file ] [ -r broad_delay ] [ -s statdir ]
                [ -t trust_key ] [ -v sys_var ] [ -V default_sysvar ]
                [ -P fixed_process_priority ]
                [ -u user[:group] ] [ -i chrootdir ]

ソースから入れたntpdのバージョンとオプション(関係箇所を抜粋)は下記。

# ntpd --version
ntpd - NTP daemon program - Ver. 4.2.4p7


# ntpd --help
ntpd - NTP daemon program - Ver. 4.2.4p7
USAGE:  ntpd [ -<flag> [<val>] | --<name>[{=| }<val>] ]...
(...略...)
   -I Str interface      Listen on interface
                                - may appear multiple times
(...略...)
   -L no  novirtualips   Do not listen to virtual IPs
(...略...)

仮想IP(サブインターフェース、IPエイリアス、 IP alias)に対する対応が行われていることがわかる。

これ(複数のインターフェース持ってる環境での通信)って、OSじゃなくアプリ側で意識しないといけないもんなんだ。と改めて意識できた。

名前:宮内 はじめ

Code for Nagoya名誉代表

E2D3名古屋支部長

プログラマーです。GISやデータビズが好きです。このサイトは宮内の個人的なメモです。

プロフィール

お問い合わせ