🙌
VirtualBox上で異なるサブネット間で通信する
条件
構成するネットワークは3つのIP-subet で構成され、A, B, Cとする。
- AとCは直接通信出来きない
- BはAとCと通信できる(同じIP-subnetに属するIFを持つ)
手順
- Virtual boxを使用し、ホストA, B, Cを構築する
- AB間、BC間にそれぞれInternal Networkを構築する (AとB, BとCを接続)
環境
- VirtualBox: 6.1.16
- Ubuntu: 18.04.5 LTS
1. Virtual Boxを使用しホストを構築する
-
PC上で環境を構築するのでまずはVirtual Boxインストールします
Ubuntu18.04以降ではAPTレポジトリからインストールが可能なので、ターミナル上で下記のコマンドを実行します:sudo apt install virtualbox
-
Virtual Box上にVM A, B, Cを構築
- 新たに構築するVMをAとし、適当なストレージ、メモリの容量を割り当てます
- ここではUbuntu 20.04.1のisoイメージを使用します
- 詳しいVMの起動方法に関してはこちらのリンクを参照
- Aが正常に起動するかどうかを確認し一度シャットダウンします
- シャットダウンが完了し次第、Aの設定から独立したクローンを二つ作成し、B, Cとします
- 新たに構築するVMをAとし、適当なストレージ、メモリの容量を割り当てます
2. AB間、BC間にそれぞれ内部ネットワークを構築する
IPアドレスは下図のように設定することにします。
- 条件よりAはBと直接通信ができます。よってそのためのIFの構築が必要になります
設定の手順は以下の通りです。- VirtualBox上でA→Settings→Networkを選択
- Adapter2上のEnable Network Adapterを有効にする
- Attached toをInternal Networkを選択
- Nameに
intnet-1
と入力する (ネットワーク名) - Advancedセクション内のPromiscous ModeをAllow VMsに変更し設定を完了する
- BはA, Cと直接的な通信が可能なので二つのIFが必要です
- Adapter2を有効にし、Aと同様の設定をする
- Adapter3を有効にし、Nameに
intnet-2
と入力する
- Cにおいても同様の設定をし、VitrualBox上でA, B, Cを起動します
- 次に、hostnameを変更します
A上で、/etc/hostname
の内容をに変更し、router-a
/etc/hosts
を以下のように書き換えます。B, C上でも同様に、それぞれに対応するホストネームに変更し、再起動します。127.0.0.1 localhost 127.0.0.1 router-a
- 上記の設定で追加されているはずのIFを確認してみます
各ホスト上でを実行すると、デフォルトのIFifconfig -a
enp0s3
の他に、AとC上ではenp0s8
、Bではenp0s8
とenp0s9
がリストされます。この時点ではまだ追加されたIFにIPアドレスの割当はされていないはずです。 - 続いて、各IFに静的なIPアドレスを設定します。Ubuntu18.04ではnetplanと呼ばれるユーティリティを使用しIPアドレスやルーティングの設定ができます。各ホスト上の
etc/netplan/00-installer-config.yaml
というファイルに永続的な設定の記述が可能です(環境によってファイル名が異なることがあるので注意してください)。- Aこれは「enp0s8のIPアドレスを
# etc/netplan/00-installer-config.yaml # This is the network config written by 'subiquity' network: ethernets: enp0s3: dhcp4: true enp0s8: dhcp4: false addresses: [192.168.1.1/24] routes: - to: 0.0.0.0/0 via: 10.0.2.2 metric: 100 - to: 192.168.2.0/24 via: 192.168.1.2 metric: 100 version: 2
192.168.1.1
、サブネットマスクを255.255.255.0
に設定し、192.168.2.0
宛てのパケットは192.168.1.2
に、さもなくば10.10.2.2
に転送する」を意味します。 - BBでは特定のアドレスに対するルーティングを規定する必要がないので
# etc/netplan/00-installer-config.yaml # This is the network config written by 'subiquity' network: ethernets: enp0s3: dhcp4: true enp0s8: dhcp4: false addresses: [192.168.1.2/24] gateway4: 10.0.2.2 enp0s9: dhcp4: false addresses: [192.168.2.2/24] gateway4: 10.0.2.2 version: 2
enp0s8
とenp0s9
に対応するIPアドレスの設定のみを行います。 - C
# etc/netplan/00-installer-config.yaml # This is the network config written by 'subiquity' network: ethernets: enp0s3: dhcp4: true enp0s8: dhcp4: false addresses: [192.168.2.1/24] routes: - to: 0.0.0.0/0 via: 10.0.2.2 metric: 100 - to: 192.168.1.0/24 via: 192.168.2.2 metric: 100 version: 2
- 上記の設定が反映されているか確認してみましょう
- A → B:
A上でping -c 5 192.168.1.2
を実行します。--- 192.168.1.2 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4095ms rtt min/avg/max/mdev = 0.296/0.384/0.502/0.077 ms
- C → B:
B上でping -c 5 192.168.2.2
を実行します。--- 192.168.2.2 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4086ms rtt min/avg/max/mdev = 0.337/0.522/0.812/0.180 ms
- A → C:
A上でping -c 5 192.168.2.1
を実行します。パケットが届いてないようです。これは、Linuxのデフォルト設定でIP Forwardingが無効になっているからのようです。B上でパケットが放棄されています。--- 192.168.2.1 ping statistics --- 5 packets transmitted, 0 received, 100% packet loss, time 4071ms
B上でPacket Forwardingを有効にするには、/etc/sysctl.conf
の、この行をアンコメントするだけです。# net.ipv4.ip_forward=1
Bを再起動し、再度A上でping -c 5 192.168.2.1
を実行します。無事AC間のパケットのやり取りが確認できました。--- 192.168.2.1 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4025ms rtt min/avg/max/mdev = 0.619/1.171/1.935/0.434 ms
- A → B:
- A
Discussion