【VirtualBox】固定IPを設定すると不具合が出る場合の対策
CentOSやUbuntuといったLinux系OSの一部バージョンでは、
- 「NAT」「ホストオンリーアダプター」を有効化
- 「ホストネットワークマネージャー」のDHCPサーバー機能を無効化
すると、
- ゲストOS側からインターネットに接続できない
- ホスト側からのssh接続がタイムアウトする
といった意味不明な事象に見舞われることがあります。
これの解決策が(今のところ)判明しましたので、掲載しておきます。
再現するOS
私の方でこの問題を確認したのは、以下のOSです。
- CentOS 7.3
- Ubuntu 16.04
- Ubuntu 17.10
CentOS、Ubuntuともこの時点で最新のバージョンでは発生しませんでした。
そもそもの原因は何なのか
システムで自動生成されるルーティングテーブルがおかしいことにあります。
問題となっているマシンのルーティングテーブルを route
コマンドで確認します。
すると「gateway」という項目が2つあることが分かります。
これは何を意味しているかというと、「自力で解決できないアドレスがきたらここに問い合わせてね」の場所が複数あるということです。実際その場合は「Metric」という値が小さい方が選ばれます。
今回の場合は 100(enp0s8) < 101(enp0s3)となるのでenp0s8に問い合わせることになるのですが、これがホストオンリーアダプターのゲートウェイに接続しているものですからパケットが外に出られず、sshセッションもこの辺りで無限ループしている、ということでしょうかね。
デフォルトゲートウェイはNICが複数あってもただ1つであるべきなのが本来の姿ですから、これを目指していきます。
解決策
設定は基本的にroot権限で行ってください。
CentOSの場合
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
# ifcfg-enp0s0 のような名前のファイルの中から
# ホストオンリーアダプターの設定を探す
[root@localhost ~]# ls -al
[root@localhost ~]# vi ifcfg-enp0s8
-----
# 設定変更
DEFROUTE=no
-----
# プロセス再起動
[root@localhost ~]# systemctl restart NetworkManager
[root@localhost ~]# systemctl restart network
するとどうでしょう。
無事ホストオンリーアダプターのデフォゲが消えていることが確認できました。
試しにネットやssh接続をしてみても問題ないことが分かると思います。
Ubuntuの場合
ネットを漁るとインタフェースごと定義するやり方とスタティックルートだけ起動時に呼び出す方法があるようなのですが今回は後者でやります。
# なければ新規作成でOK
root@minato-VirtualBox:~# vi /etc/network/if-up.d/static-routes
-----
#!/bin/sh
# routeコマンドで調べてから、以下のように記述する
# /sbin.route del -net [受信先サイト] gw [ゲートウェイ] netmask [ネットマスク] [インタフェース]
/sbin/route del -net default gw gateway netmask 0.0.0.0 enp0s8
-----
# 実行権限を付与
root@minato-VirtualBox:~# chmod +x /etc/network/if-up.d/static-routes
# 再読込
root@minato-VirtualBox:~# /etc/network/if-up.d/static-routes
こちらも、問題なくデフォルトゲートウェイが1つになっています。
個人的には結構キツいハマりどころでしたね。