複数のインターフェースを持ったサーバーにpingすると、片側には通るけど反対側には通らない。サーバー側からpingすると問題なく通るのに。
複数のインターフェースを持ったサーバーの場合、pingコマンドによって飛んでいくパケットのソースアドレスはそのサーバーがもつ経路情報に依存します。複数のインターフェースを持つと言うことは複数のIPアドレスを持っている訳で、経路情報によって指定されたインターフェースに付いているアドレスが使われます。つまり、pingの相手によって同じサーバーからでもソースアドレスが変わると言う事です。
この同じ”箱”、同じCLIコンソールで操作しているにも関わらず使われるアドレスが異なると言うことは結構見落としがちです。
同じサーバーであってもpingを受信して応答パケットを出すときの挙動は異なります。まず、ソースIPアドレスはターゲットにされたアドレスに固定されます。他のソースアドレスで応答してもpingの応答とは解釈されないからです。その上で、応答すべき経路を探します。この時に別なインターフェースからの出力方向にデフォルト経路が設定されても使用しません。その経路を使う場合にはソースアドレスが該当インターフェースに設定されたものである原則があるからです。
結果としてパケットを出力するインターフェースが見つからず応答パケットは送信されず、pingは失敗に終わります。
IPv6では一つの論理インターフェースに複数のアドレスが設定できるのでこの問題がより顕著化する。今時アドレスで認証をするアプリケーションは無いとは思うが端末が複数のアドレスを持つことは混乱を生む。
インターフェースを一つだけ持っている端末がX、そのインターフェースに設定されているIPアドレスがX-A。二つのインターフェースを持っているサーバーがY、Y-AとY-Bのアドレスが設定されている。
ping | response | ||||
---|---|---|---|---|---|
source | destination | source | destination | ||
ping X to Y-A | X-A | Y-A | Y-A | X-A | OK |
ping X to Y-B | X-A | Y-B | Y-B | no route | NG |
ping Y to X-A | Y-A | X-A | X-A | Y-A | OK |
ping Y-B to X-A | Y-B | no route | NG |
cisco IOSだとextend ping、Linuxだと
$ ping [送信先IPアドレス] -I [送信元IPアドレス]
windowsのコマンドプロンプトでは指定できない。