VirtualBoxで仮想マシンのサーバを使っていたときのトラブルの話です。
2017年7月28日にリリースされたVirtualBox 5.1.26で修正されました(Fig1)。
Linux hosts: properly bring up host-only network interfaces with iproute (5.1.24 regression; bug #16911)
修正された問題ですが、一応書き残しておきます。
【teratailへ投稿した質問】
VirtualBoxの仮想マシンを作りなおしてSSHで接続したいです
環境・ソフトウェアなど
ホストOS:Ubuntu Desktop 16.04(64bit)
ゲストOS:UbuntuServer 16.04(64bit)
ブラウザ:Vivaldi 1.10
SSH接続:Ubuntu標準のターミナル
VirtualBox 5.1.24
何が起きたか
仮想マシンにはWordPressをインストールして、テーマや投稿のテスト環境を構築していました。
SSHでログインすることでサーバを操作でき、ブラウザでアクセスすることでWordPressを表示できていました。
ところが、ある日突然、仮想マシンのサーバにアクセスできなくなってしまいました。
SSHやブラウザからのアクセスはタイムアウトし、Pingも届かない状況に陥ったのです(Fig2)(Fig3)。
どうやって対処したか
心当たり2つありました。
一つは、仮想マシンを異常終了させてしまったこと。
二つめは、VirtualBoxのアップデートです。
異常終了は、仮想がシャットダウンする前にVirtualBox本体を終了させてしまった操作ミスです。
冷静になって振り返ってみれば、VirtualBoxのバージョンを疑うことは当然なのですが、当時の私には余裕がありませんでした。
レンタルサーバの契約を控え、テーマの微調整や記事の準備に頭がいっぱいだったのです。
なので、仮想マシンの設定疑うところから始めて、触ったことのないファイアウォールやDNSの設定など、多くのページを読み漁り漁りました。
今回のバグの前ではどの対策も意味がなかったのですが、新しく知ったコマンドもあり書き残すに値する体験になったと思います。
結局、修正版がリリースされたことで原因が判明し、問題も解決しました。
もっと早く古いバージョンを試していれば、と思うこともあります。
ググっても何の情報もなく、解説の通りにやってもできない。
3日ほど、この問題に付きっきりだったときは心を病みそうでした。
「以前できていたこと」が「なぜかできない」。
これほど納得のいかないことはありません。
次にこのようなトラブルに遭遇したら、ちゃんとバージョンを確認するようにします。
【番外】メモ
図を用意しろ
このトラブルに遭遇するもっと前から、「解説記事には図を用意する」と考えていました。
今回の出来事は、その決意を固くしました。
当時はホストOSとゲストOSとの接続(NICなど)の理解が足りていなかったので、これは自分自身を助けることになりました。
例えば、利用している仮想マシンとのネットワークの状況は以下のようになります(Fig4)。
以下のページを参考にしました。
(パソコンやルータの画像が使えればよかっけど、著作権を放棄したものが見つからなかったので、それっぽく図にしました。
【参考】
3.VirtualBoxのインストール(Windows) _ ローカル開発環境の構築手順
【いまさら聞けない!エンジニアの基本シリーズ】 第2回 VirtualBox基本動作編 | システムや業務のプロデュースカンパニー | 株式会社アドックインターナショナル
Pingを飛ばす
接続のテストで有名なのはPingを飛ばすことです。
外部への接続テストの場合、だいたいGoogleが選ばれます。
使い方を忘れていたので、メモしておきます。
【PingをGoogle.comに飛ばすコマンド】
$ ping -c 5 www.google.com
Mac・Linuxでは「-c」オプションをつけることで、パケットの送信回数を指定します。
ファイアウォールの設定について
セキュリティの上ではファイアウォールを重要です。
恥ずかしい話、以前作成した仮想マシンではまったく触っていませんでした。
非公開のサーバでしたし、設定しなくてもWordPressのテスト環境は実現できてしまったからです。
【ファイアウォールの状態を確認するコマンド】
$ sudo ufw status
「inactive(無活動)」と返ってきたので、ファイアウォールは動いておらず、「ファイアウォールがICMP(Pingなど)を阻害しているとは言えない」という結果になります。
iptablesがインストールされているかどうか
触らずに出来ていたものを、不具合を解説するために触るのは、非常に消極的でした。
ソレに加えて、解説も難しく「iptablesはインストールされてなかったわー」で終了しました。
【iptablesがインストールされているか確認するコマンド】
$ witch iptables
SSHがインストールされているかどうか
解決の道筋が見えない中では、すべてを疑いたくなりました。
taskselでインストール済みのSSHを「実はインストールできていないんじゃないか」と疑うくらいです。
ソフトウェアがインストールされているかどうか確認しました(Fig5)。
【SSHがインストールされているか確認するコマンド】
$ dpkg -l | grep openSSH
SSH起動しているかどうか
おおよそ、こういったソフトはインストールしたら勝手に起動するか、サーバを再起動するので気にならないのですが、すべてが疑わしい。
【SSHを起動するコマンド】
$ sudo /etc/init.d/ssh start
(デーモンは「sshd」。ここは「ssh」。)
DNSの逆引きを無効にする
SSHでの接続が遅い場合に有効だそうです。
「/etc/ssh/sshd_config」に設定を書き込みますが、今回のバグには無意味でした。
UseDNS=no
AddressFamily inet
GSSAPIAuthentication no
編集した場合、SSHの再起動を忘れずに。
$ sudo /etc/init.d/ssh restart
【参考】
SSHサーバへ接続出来ない・遅い時の原因と対処法 _ 俺的備忘録 〜なんかいろいろ〜
ルーティングを確認する
ページを読み漁ったとき、「route」コマンドは割りと紹介されていましたが、「どうやって活用するのか」を解説しているページはありませんでした。
コマンドで結果を表示しても、何がどうなっているのかわかりません(Fig6)。
【ルーティングを表示するコマンド】
$ route
NICを再起動する
IPアドレスの更新に使います。
多く紹介されているのはnetworkのリスタートですが、指定したNICだけを再起動させる方法も重要だそうです。
【NICを再起動するコマンド】
$ sudo /etc/init.d/networking restart
または、
$ sudo ifup enp0s8
「ifup」の仲間で、NICを停止させる「ifdown」コマンドが存在する。
【参考】
ネットワーク管理の基本Tips:NICの無効化/有効化、再起動を行うには? ifdown/ifupコマンド – @IT
SSHの情報を削除する
仮想マシンには、SSHでアクセスします。
その情報は、Ubuntuであれば、ホームディレクトリに隠しファイルとして存在します。
当時の私は、「前回作成した仮想マシンの情報が残っているのが問題なのでは」と疑いました。
結果的には、関係ありませんでした。
【SSHの公開鍵を削除するコマンド】
$ssh -keygen -R (remote_host_name)
ホスト名というが、ホストOSのユーザ名でもなく、ゲストOSのアカウントでもない。
この仮想マシンでは、正解は192.168.56.101でした。
……ホストとは。意味がわからない。
ちなみに、「known_hostsファイル」は、homeディレクトリの隠しファイルの中に「.ssh」ディレクトリがあり、その中にあります。
【参考】
SSH接続エラー回避方法:.ssh_known_hostsから特定のホストを削除する_削除しないで対処する3つの方法 – Qiita