CiscoルータでのPAT(NAT)環境で配下のPCからNTPを使おうとしたらハマったのでそのメモです。
PAT(NAT)環境でのポート変換でなぜかウェルノウンポートにして外に通信してしまう事象が発生しました。
構成
NTPサーバ(NICTやmfeedなど)ーーインターネットーーCiscoルーターーーークライアント(PCなど)複数台
- NTPサーバのIP : 1.1.1.1(仮)
- GlobalIP(NAT後のIP) : 2.2.2.2(仮)
- クライアントのIP : 10.0.0.1-100
グローバルIPは1つしかないのでクライアントからNTPサーバ宛のアクセスは全てマスカレードしています。
普通のPAT(NAT)の挙動
show ip nat translationsで確認
Inside global | Inside local | 備考 |
---|---|---|
1.1.1.1:47289 | 10.0.0.1:47289 | ポートが空いていれば内部ローカルと同じポート番号で外に出ていく |
1.1.1.1:47290 | 10.0.0.2:47289 | ポートが埋まっている場合は別のポート番号(ウェルノウンポート以外)で出ていく |
NTPアクセス時の挙動
show ip nat translationsで確認
Inside global | Inside local | 備考 |
---|---|---|
1.1.1.1:123 | 10.0.0.1:123 | ポートが空いていれば内部ローカルと同じポート番号で外に出ていく |
1.1.1.1:20 | 10.0.0.2:123 | ポートが埋まっている場合は別のポート番号(ウェルノウンポート)で出ていってしまう |
問題点
クライアントの送信元ポートが123(NTP)の場合なぜかウェルノウンポートに変換されます。
このウェルノウンポートを使って出ていくのが結構やっかいで、場所によっては時間を取らせてくれません。
今回の例で20番ポートに変換されてしまったクライアントはNATテーブルが空くまでひたすらエラーを繰り返します。
結論
Ciscoルータの動作仕様とのことです。
これの対策はStatic NATを使用するしかないため、PAT環境では対処ができません。
ワークアラウンド
NATテーブルの保持時間がデフォルトで10分(6000秒)なので、これを10秒など極端に短くすることでクライアント同士のNTP取得タイミングがかぶる確率を減らすくらいしかなさそうです。