schedule2019-10-29

【CentOS】SSHが繋がらなかったのでファイアウォールを設定し直した

ssh_exchange_identification: connection closed by remote hostとエラーがでて、とあるサーバにSSHできなかったので原因の究明と解消した方法についてです。

環境

  • クラウド:IIJ P2でロードバランサーを使った構成
  • OS:CentOS 7

原因の推測

私の居る拠点では直接つなぐことができませんでしたが、別の拠点からは繋がります。 よって、クラウドのファイアウォール(FW)かサーバでIP制限していることが原因だろうと考えていました。

IPをどこで制限しているか外側から順に確認していきます。

  • クラウドのFW → ロードバランサーの設定 → サーバのFW → TCP Wrapper

クラウドの設定は問題ないことを確認したため、サーバのFWの設定を確認していきます。

手元の環境の確認

その前に、ssh_exchange_identification: connection closed by remote hostはknown_hostsやサーバIPが違っていても出るようです。

  • known_hostsに目的のサーバIPはなし
  • 別拠点から同じコマンドで接続可能(IPやユーザ名はOK)

以上も確認しました。

サーバのFW iptables

iptablesコマンドでFWの設定が確認できます。

$ sudo iptables -t nat -L
...

Chain FORWARD_IN_ZONES_SOURCE (1 references)
target     prot opt source               destination
FWDI  all  --  別拠点のIP      anywhere            [goto]

...

Chainの中に別拠点のIPが書かれた箇所がありました。 私の拠点のIPは見つからなかったので、追加してあげればよさそうです。 (Chain名のFORWARD_IN_ZONES_SOURCEはクラウド側で設定されるものっぽいので、どこかで設定が反映されない事象が起きてそう。)

追加は以下のコマンドで出来ます。

iptables -I チェイン名 -p all -s ターゲットのIP -j ターゲット名

iptablesの使い方はこちらが網羅的です。

# 追加
$ sudo iptables -I FORWARD_IN_ZONES_SOURCE -p all -s 自分の拠点のIP -j FWDI

# 確認
$ iptables -L FORWARD_IN_ZONES_SOURCE --line-numbers
Chain FORWARD_IN_ZONES_SOURCE (1 references)
num  target     prot opt source               destination
1    FWDI  all  --  自分の拠点のIP  anywhere
2    FWDI  all  --  別拠点のIP      anywhere            [goto]

設定を変更したら再起動します。

$ sudo systemctl restart iptables

繋がるようになりました。

TCP Wrapper /etc/hosts.allow と /etc/hosts.deny

一応、こちらも確認してあるので載せておきます。

クライアントからのアクセスを制御するために TCP Wrappers が参照する設定ファイルです。 /etc/hosts.allowがアクセスできるホストを許可して、その内/etc/hosts.denyに書かれているホストを制限します。(両方に書かれていないホストは許可)

/etc/hosts.allowALL:ALLとなっており、/etc/hosts.denyは無記述だったのでOK。

参考:Turbolinux 11 Server: ユーザーガイド

参考