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.allow
がALL:ALL
となっており、/etc/hosts.deny
は無記述だったのでOK。
参考:Turbolinux 11 Server: ユーザーガイド