/etc/hostsにダミー設定を追加して通信遮断・セパレーション
投稿者:しんさん 2016/03/30

/etc/hostsによる通信遮断
正直なところバッドノウハウかもしれませんが、シンプルな方法なので紹介します。
たくさんのサーバを運用していると、
「サーバAとサーバBの間で通信をさせたくない」
というシチュエーションが結構あります。
- 本番機とテスト機の間で通信させたくない
- カットオーバ前のサーバを現行機と通信させたくない
などが例として挙げられます。
こういった場合、通常であれば
「ファイヤーウォールで通信を遮断する」
というのがセオリーかと思います。
しかし一方で、例えば
- ネットワーク担当とサーバ担当が分かれており、サーバ担当者のコントロールの元で遮断を行いたい
- 「BCPテスト期間中だけ、本番サーバとBCPサーバ間の通信を遮断したいor許可したい」といった期間限定のコントロールを行いたいが、ファイヤーウォールを設定変更するのはリスクが…
- サーバのリプレース期間中などに、「間違ってリプレース前のサーバにつながる」といったリスクを無くしておきたい。
といったようなケースでは、/etc/hostsを使ったセパレーションが有効かもしれません。
TCPやUDPのポートレベルで制御はできませんが、もっとシンプルに「IPレベルで疎通が取れなくなればそれで良い」というようなケースも多いことでしょう。
/etc/hostsにダミー設定を追加する
シンプルに言うと「hostsにダミーのIPアドレスを登録してしまう」というやり方です。
「サーバAからサーバBに通信させたくない」
のであればサーバAの/ets/hostsに
169.254.254.254 サーバB
といった形でhosts登録をして、到達性の無いIPアドレスに名前解決させてしまうわけです。
(そのため、通信遮断というと語弊があるかもしれませんね。)
ダミーのIPアドレスとしてはAPIPA用に予約されているリンクローカルアドレスのレンジ(169.254.0.0/16)の中からIPを選んで使用することがオススメです。
UNIXだけではなくて、Windowsでもhostsを使って同じことができるかと思います。
hostsを使ってダミーIPアドレスで名前解決をさせておけば、
「気づかないところに間違った設定が残ってしまっていた」
などという場合に間違って通信がされてしまうリスクを軽減できます。
ダミーアドレスについての補足
ダミー用のアドレスについて補足しておきます。
DHCPサーバの存在しない閉じたネットワークにて、IPアドレッシングを行うためにAPIPAやリンクローカルアドレスは存在しています。
- DHCPでのIP取得を試みる
- 失敗した場合、169.254.0.0/16の中から1つアドレスを選ぶ
- 選んだアドレスに対してG-Arpを投げて、IPの重複が起きていないか検査
- 重複がなければ、選んだアドレスをインタフェースに適用する
というような流れで使われるものと理解しています。
「DHCPサーバのいない環境で、IP自動取得の端末同士がネットワーク通信できるようにするためのもの」
というような理解でOKだと思います。
APIPAはArpを前提としたプロトコルのため、単一セグメントでのネットワークのみをターゲットとしています。
そのため、ルータはAPIPAで使われるリンクローカルアドレス宛のパケットを転送しないルールになっています。(実際の製品が正しくそのような実装になっているかどうかはわかりませんが)
サーバでリンクローカルアドレスを実運用で使う例はまずあり得ないと考えられますし、まかり間違っても外のセグメントに対して通信が飛んで行くようなことも起きにくい。
というのが169.254.0.0/16のレンジをダミーIPとしてオススメする理由です。
169.254.254.254を例で使用しているのは
「なんとなく後ろのレンジの方が使われる可能性がより低そう」
という気分的なもので、あまり深い理由はありません。
以上、およそスマートとは言えない方法ですが、選択肢の一つとしてご紹介でした。
他にも
「OSのローカルルーティングで個別IPアドレスへのルートをループバックアドレスに流してしまう」
という方法もあります。
これについては以下の記事にまとめましたのでこちらをぜひご覧下さい。