Linuxでssh接続が拒否された場合に何を疑えばいいのか?
CentOSやUbuntuなどのLinuxサーバーを初期設定する際、ssh接続がうまくいかずに困ることがある。
しかし connection refused
だけでは原因はわからない。
そこで今回はLinuxでssh接続が拒否された場合に疑うことを紹介する。
この記事を書いている人
記事を読むメリット
Linuxでssh接続が拒否された場合に疑うことがわかる
ssh接続が拒否される現象
まずssh接続が拒否される現象は何なのか。
現象としてはLinuxにTera Termなどのアプリからssh接続をしようとした際に「接続が拒否されました」や「connection refused」などのメッセージが出て接続できない事が起こっている。
実際に遭遇した人の嘆き
実際にLinuxでssh接続が拒否されて困っている人は多い。
Twitter上でピックアップしてみると、以下のようなつぶやきが確認できた。
ssh: connection refused
あーもう嫌い
— KSM (@ksmreto) March 6, 2017
自宅のサーバーにDNSを介してsshしたいんだけど、connection refusedが解決できない🤣
①ssh 192.168.0.10(内部IP)ならsshできる
②光BBユニットのポートフォワードの設定をした
③光BBユニットのセキュリティレベルを低にした(すべてのアドレス、ポートからのパケットが通過できるらしい)なぜ🤣
— 硬派なストーカー@尿スプと婚約エンジニア (@mgmgmpmgd) April 19, 2021
eduroamから自宅にsshしたらConnection refusedされたんだけど何故だ
テザリングで携帯回線からだといけるのに— 毎日きょむきょむ🍆 (@noisyeggplant) January 9, 2020
皆ssh接続を試みたところ connection refused
が発生し、困っていることがわかる。
ssh接続が拒否された場合に確認すること
ssh接続が拒否された場合には以下の点を確認する。
サーバー側のチェック内容
クライアント側のチェック内容
ssh接続を受け入れるソフトウェアをインストールしているか
ssh接続を受け入れるソフトウェアとしては openssh-server
があるので、 apt-get install
でインストールしてしまうと良いだろう。
$ sudo apt-get install openssh-server
インストール後に
$ ssh -V
を入力して
OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.6, OpenSSL 1.0.1f6 Jan 2014
と表示されたら正常にインストールされています。
Ubuntu 14.04 でSSHを有効にする方法 - wide_snow’s blog
ssh接続を受け入れるソフトウェアが起動しているか
openssh-server
が起動しているか確かめる方法の一つとして、サーバー上でサーバー自身に対してssh接続を試みると良い。
ログインできれば openssh-server
は動作している。
$ ssh (サーバーのIPアドレス)
サーバーのIPをネットワークに周知できているか
サーバーに設定されたIPを確認するのであれば ifconfig
のコマンドでIPを確認できる。
ip a
コマンドでも確認できる。
しかしサーバーに設定されたIPがネットワーク上に周知されているかどうかは ifconfig
のコマンドではわからない。
もし他のマシンも同じIPを使っていた場合、ネットワーク上では別のマシンにIPの優先権が発生しているかも知れない。
そこで nmap
コマンドでネットワーク(LAN)内に周知されているIPとMACアドレスを調べる。
まずは apt install
で nmap
を利用できるようにする。
$ sudo apt install nmap
その後、ネットワーク(以下の例では192.168.0.xxx系)を指定してIPとMACアドレスを調べる。
$ sudo nmap 192.168.0.0/24 -sP
そして表示されたIPに対応するMACアドレスが、 ifconfig
で確認したMACアドレスと一致しなければ、サーバーで使おうとしていたIPは別のマシンで使われている事がわかる。
ssh 接続したら port Connection refused と出る時 | TOMMY NOTES
nmapをインストール
外部からの接続を拒否していないか
/etc/hosts.deny
で接続を拒否していないか確認する。
クライアント側からの接続を拒否する設定が書かれていたら消すなりコメント化するなりする。
$ sudo nano /etc/hosts.deny $ sudo reboot
設定ファイル(/etc/hosts.allow、/etc/hosts.deny)の編集
ネットワーク - hosts.allow hosts.denyの反映方法について|teratail
「hosts」ファイルでアクセス制限をする方法 - renoji.com
FWで接続を弾いていないか
ufw status
でFWで許可や拒否している通信を確認する。
$ sudo ufw status
もしssh接続に使う22番ポートが許可されていない場合は許可をする。
$ sudo ufw allow ssh
Ubuntuのポート開放方法(ファイアウォールを設定する) - Qiita
サーバーに対してネットワーク経路が確保できているか
クライアント側からサーバー側に対してネットワーク経路が確保できているかどうかは ping
で確認する。
レスポンスが確認できれば経路は確保できている。
$ ping (サーバーのIPアドレス)
実際の事例
私もLinuxサーバーを立ち上げたがリモート接続できない問題に当たったことがある。
サーバーマシンからはインターネットも繋がるし、リモート接続をしようとしているクライアントマシンもsshコマンドでIP自体は認識している。
しかしssh接続しようとすると
「接続が拒否されました」
というメッセージが返ってくる。
そこで先に述べた調査をしたところ、
同じIPが別のマシンで使われている
ということがわかり、サーバーマシンには別のIPを設定することで解決した。
この問題の気づきにくいところは
IPが競合していてもサーバーマシン側からはネットワークに接続できる
ということだ。
サーバーには接続できなくてもサーバー側からはネットワークを認識しているので、IPが競合している可能性に気付きにくい。
このような気付きにくい原因を取りこぼさないためにも、トラブル時は体系的に調査を行い、可能性のある原因をひとつひとつ検証していく必要がある。
まとめ
今回はLinuxでssh接続が拒否された場合に疑うことについて説明した。
ssh接続が拒否された場合には以下の点を踏まえて、ssh接続ソフト、接続経路、IP衝突を疑ってみるべし。
サーバー側のチェック内容
クライアント側のチェック内容
この記事を読んでいる方は既にLinuxマシンを所持しているかと思う。
しかしLinuxマシンの用途によっては小型PCで運用する方が消費電力的にもリーズナブルなこともある。
小型PCのオススメ機種について書いた記事があるので、是非そちらも見てほしい。
あわせて読みたい