tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【VirtualBox】CentOS@VirtualBoxでホストOSとゲストOSでsshするときのネットワーク設定メモ - NAT、ホストオンリーアダプターを設定してeth0、eth1を有効にする

はじめに

VirtualBoxを久しぶりに使ったら全然覚えてない...
特にネットワークまわり。

やりたいことは単純でおおざっぱに言うと以下2点だけ

  • 前提
  • 1.ホストOSからゲストOSにターミナルでsshしたい
    • 外からゲストOSにはアクセスできなくて良い
  • 2.ゲストOSからホストOSを経由して外のネットワークにつなぎたい
    • ゲストOSからgit pullやらpushできればok

そんな時の自分メモ

f:id:tweeeety:20180622000833p:plain

アジェンダ

  1. 今回の環境
  2. やりたいこと
  3. 何をすれば良いか
  4. どうやるか
  5. ネットワークを確認してみる

1. 今回の環境

ホストOS情報

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.13.5
BuildVersion:   17F77
$ VBoxManage -v
5.2.12r122591

ゲストOS情報

$ cat /etc/redhat-release
CentOS release 6.5 (Final)

2. やりたいこと

はじめにに記載したことがやりたい事ですが再掲です。

  • 前提
  • 1.ホストOSからゲストOSにターミナルでsshしたい
    • 外からゲストOSにはアクセスできなくて良い
  • 2.ゲストOSからホストOSを経由して外のネットワークにつなぎたい
    • ゲストOSからgit pullやらpushできればok

3. 何をすれば良いか

2. やりたいことを実現するために
VirtualBox何をすれば良いかを文章的にまとめるとこんな感じです。

  1. ホストOSからゲストOSにターミナルでsshしたい
    • ホストオンリーアダプタを設定する
  2. ゲストOSからホストOSを経由して外のネットワークにつなぎたい
    • NAT(DHCP)の設定をする

また、これを図にするとこんなイメージになります。
f:id:tweeeety:20180622001154p:plain

4. どうやるか

何をすれば良いか を実現するために具体的にやることは以下の4stepです。

VirtualBoxマネージャはこのGUIツールです

f:id:tweeeety:20180622002208p:plain

①. VirtualBoxマネージャでネットワークアダプタを作成&設定する

  • グローバルツール(G)を開きます。

f:id:tweeeety:20180622002227p:plain

  • 作成(C)を押します。
    vboxnet0というアダプタが作成されます。

f:id:tweeeety:20180622002239p:plain

  • vboxnet0を選択した状態でアダプタータブを開き
    アダプターを手動で設定にチェックが入っている事を確認します。

f:id:tweeeety:20180622002416p:plain

  • DHCPサーバタブを開きサーバを有効化にチェックします。
    設定値はそのままで大丈夫です。

f:id:tweeeety:20180622002505p:plain

②. VirtualBoxマネージャで仮想マシンのネットワーク設定をする

f:id:tweeeety:20180622002524p:plain

  • ネットワークを開いてアダプター1にNATが設定されている事を確認します。

f:id:tweeeety:20180622002539p:plain

  • アダプター2を選択してネットワークアダプターを有効化にチェックをします。

f:id:tweeeety:20180622002551p:plain

  • 割り当て:ホストオンンリーアダプターを選択して
    名前にさきほど作成したvboxnet0を選びます。
    (デフォルトvboxnet0になってる)

f:id:tweeeety:20180622002551p:plain

また、高度を押すと設定がさらに開くのでMACアドレスをメモっておきます。

f:id:tweeeety:20180622002655p:plain

今回の例でいうとMACアドレスは以下です

080027588378

最後にOKを押して設定を保存します。

③. ゲストOSでネットワークの設定をする

仮想マシンを起動するか、すでに起動していた場合は再起動します。

起動したら仮想マシンのターミナルで設定を行います。

rulesをcleanにする

MACアドレスeth*の対応づけを行なっているrulesの設定を綺麗にしておきます。
reboot後にeth0、eth1を元に自動で作成されるので大丈夫です。

$ rm /etc/udev/rules.d/70-persistent-net.rules

この辺のファイルが何かは以下をご参考ください

ifcfg-eth*を設定

vim/etc/sysconfig/network-scripts/ifcfg-eth0を設定します。
ファイルを開くともともと書かれてる場合がありますが、
他の行はコメントアウトしました。

DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=dhcp
PEERDNS=no

vim/etc/sysconfig/network-scripts/ifcfg-eth1を設定します。
ファイルがない場合は作成します。

DEVICE=eth1
HWADDR=08:00:27:58:83:78
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
PEERDNS=no
IPADDR=192.168.56.3
NETMASK=255.255.255.0

BOOTPROTOについては気になったので簡単に調べてみました。

再起動する
$ reboot
確認する

以下を確認します。

  • /etc/udev/rules.d/70-persistent-net.rulesが作成されている
  • ifconfigでeth0eth1が設定されている

このように表示されれば設定がされているはずです。

# 確認
# rulesが新しくできている
$ cat /etc/udev/rules.d/70-persistent-net.rules
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:82:03:24", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x8086:0x100e (e1000) (custom name provided by external tool)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:58:83:78", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

# ネットワークインターフェースの確認
$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:82:03:24
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe82:324/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1470 (1.4 KiB)  TX bytes:2262 (2.2 KiB)

eth1      Link encap:Ethernet  HWaddr 08:00:27:58:83:78
          inet addr:192.168.56.3  Bcast:192.168.56.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe58:8378/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:505 errors:0 dropped:0 overruns:0 frame:0
          TX packets:318 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:48536 (47.3 KiB)  TX bytes:73614 (71.8 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
疎通確認をする

次に、pingで外向けに通信してNAT(ゲストOS->ホストOSの通信)を確かめます。
packet lossがなければ成功です。

# Google Public DNS(8.8.8.8)に疎通確認
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=63 time=4.17 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=63 time=5.32 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=63 time=5.54 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=63 time=4.29 ms
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3155ms
rtt min/avg/max/mdev = 4.179/4.837/5.548/0.611 ms

# googleに疎通確認
$ ping google.com
PING google.com (172.217.24.142) 56(84) bytes of data.
64 bytes from nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=1 ttl=63 time=2.25 ms
64 bytes from nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=2 ttl=63 time=2.35 ms
64 bytes from nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=3 ttl=63 time=3.61 ms
64 bytes from nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=4 ttl=63 time=2.55 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3895ms
rtt min/avg/max/mdev = 2.259/2.695/3.612/0.540 ms

④. ホストOSからSSHしてみる

ここまでくればmacsshしてみます。
sshできればホストオンリーアダプタ(ホストOS->ゲストOSの通信)が成功です。

$ ssh root@192.168.65.3
root@192.168.56.3's password:
Last login: Thu Jun 21 22:30:49 2018 from 192.168.56.1

5. ネットワークを確認してみる

念のためもう少しネットワークを確認してみます。

ゲストOS

ゲストOS側でroute、netstat、tracerouteでネットワーク設定を確認します。
外に出れていれば以下のようになります。

route

routeコマンドでルーティングテーブルを確認します

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.2.0        *               255.255.255.0   U     0      0        0 eth0
192.168.56.0    *               255.255.255.0   U     0      0        0 eth1
link-local      *               255.255.0.0     U     1002   0        0 eth0
link-local      *               255.255.0.0     U     1003   0        0 eth1
default         10.0.2.2        0.0.0.0         UG    0      0        0 eth0
$ route 
netstat

netstatでネットワークインターフェース(NIC)の状態を確認します

# netstat
$ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.0.2.0        0.0.0.0         255.255.255.0   U         0 0          0 eth0
192.168.56.0    0.0.0.0         255.255.255.0   U         0 0          0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth1
0.0.0.0         10.0.2.2        0.0.0.0         UG        0 0          0 eth0
traceroute

tracerouteでネットワークの経路を確認してみます。

# traceroute
$ traceroute -T -q 1 -w 1 google.com
traceroute to google.com (172.217.24.142), 30 hops max, 60 byte packets
 1  10.0.2.2 (10.0.2.2)  0.127 ms
 2  syd09s06-in-f14.1e100.net (172.217.24.142)  24.941 ms

今回利用しているオプションは以下の通りです

  • -T: TCP SYNパケットを用いる。デフォルトのポート番号は80
  • -q: 1つのホップにおける試行回数を指定する
  • -w: タイムアウト時間を指定する。単位は秒

ホストOSでifconfig

また、ホストOS側でifconfigを行うと、
仮想NICvboxnet0に付与されたIPアドレスを確認できます。

$ ifconfig | grep vboxnet0 -A 3 -B 3
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active
vboxnet0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    ether 0a:00:27:00:00:00
    inet 192.168.56.1 netmask 0xffffff00 broadcast 192.168.56.255

補足

10.0.2.2はどこで設定されてるか気になり別途調べてみました。

参考

おわり

\(^o^)/