脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

AWSでpingは通るのに実際に接続しようとすると「No route to host」って言われる原因

pingは通ってパケットロスも無いのに、実際にtelnetやTCPSocketで繋ごうとすると「No route to host」って怒られる場合の対処法です。

試してみてダメだったこと

  • /etc/hostsに色々書いてみた
  • portとかも変更して色々試してみた
  • AWSに関してはパブリックDNS、パブリックID、LAN ID全部試した
  • elastic IPを関連付けさせてそれでも試した

何も得られなかった・・・

原因

結局最終的にはiptablesの以下の行が原因っぽい

REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

これはiptableを色々設定して、最終的に設定した以外のアクセスをRejectするよって設定で、AWSGUI上のセキュリティグループからFirewall設定をするとデフォルトでついているものなのだが、これがあると何故かうまくいかない
(上で許可しているにも関わらずに)

対応策

"REJECT all -- anywhere anywhere reject-with icmp-host-prohibited"を使わない。

とはいえ、全部開放するのは危険なので、デフォルトでINPUTポリシーがACCEPTになっているのをDROPに変えることで対応する

Chain INPUT (policy DROP) # AWSでは通常ここはACCEPTになっている
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:telnet
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http
#(REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited) 
  # ⇒デフォルトでDROPにしてあるので、この行は不要となる

iptablesの設定方法は過去のブログ参照portaltan.hatenablog.com

これで繋がるようになりました