2012-09-27

[linux] ping は通るのに No route to host と言われる

ping による疎通は確認できるのに、いざ ssh などで繋ごうとすると No route to host というエラーで即座に接続失敗し途方に暮れる場合、おそらく原因は接続先のホストの iptables によりパケットがブロックされ、到達不能を意味する ICMP パケットが返ってきたことによります。

以下のコマンドで INPUT ポリシーをチェックします。上から順にマッチさせていき、マッチし次第ジャンプして終わるので、デフォルト条件の設定されていそうな一番下の行が肝心です。

# /sbin/iptables -L

--verbose を追加してブロックしているポリシーのカウンタを見ながらブロック状況を観察できます。

# /sbin/iptables -L --verbose

おそらく問題となっているのは INPUT ポリシー最下行で全てのパケットにマッチするこういう行です

... -j REJECT --reject-with icmp-host-prohibited

追加の説明
ファイアウォールの良くある動作として、不都合なパケットの受信を単に無視する動作ならタイムアウトとなります。しかしクライアントから見て TCP や UDP でパケットを送信した後、ICMP で Destination Unreachable Message が届いたときは親切にも No route to host と案内してくれるようです。

ちなみに icmp-host-prohibited は ICMP Unreachable Message の コード10 であり、経路上の障害などを調査するためのコマンド traceroute の結果に !X や !10 と表示されるようです。

参考
Man page of IPTABLES
traceroute - Wikipedia
Internet Control Message Protocol (ICMP) - Wikipedia