🙌

VirtualBox上で異なるサブネット間で通信する

2020/11/24に公開

条件

構成するネットワークは3つのIP-subet で構成され、A, B, Cとする。

  1. AとCは直接通信出来きない
  2. BはAとCと通信できる(同じIP-subnetに属するIFを持つ)

手順

  1. Virtual boxを使用し、ホストA, B, Cを構築する
  2. AB間、BC間にそれぞれInternal Networkを構築する (AとB, BとCを接続)

環境

  • VirtualBox: 6.1.16
  • Ubuntu: 18.04.5 LTS

1. Virtual Boxを使用しホストを構築する

  1. PC上で環境を構築するのでまずはVirtual Boxインストールします
    Ubuntu18.04以降ではAPTレポジトリからインストールが可能なので、ターミナル上で下記のコマンドを実行します:

    sudo apt install virtualbox
    

    その他の環境でのインストールはこちらを参照

  2. Virtual Box上にVM A, B, Cを構築

    • 新たに構築するVMをAとし、適当なストレージ、メモリの容量を割り当てます
    • Aが正常に起動するかどうかを確認し一度シャットダウンします
    • シャットダウンが完了し次第、Aの設定から独立したクローンを二つ作成し、B, Cとします

2. AB間、BC間にそれぞれ内部ネットワークを構築する

IPアドレスは下図のように設定することにします。

  • 条件よりAはBと直接通信ができます。よってそのためのIFの構築が必要になります
    設定の手順は以下の通りです。
    1. VirtualBox上でA→Settings→Networkを選択
    2. Adapter2上のEnable Network Adapterを有効にする
    3. Attached toをInternal Networkを選択
    4. Nameにintnet-1と入力する (ネットワーク名)
    5. 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を以下のように書き換えます。
    127.0.0.1 localhost
    127.0.0.1 router-a
    
    B, C上でも同様に、それぞれに対応するホストネームに変更し、再起動します。
  • 上記の設定で追加されているはずのIFを確認してみます
    各ホスト上で
    ifconfig -a
    
    を実行すると、デフォルトのIFenp0s3の他に、AとC上ではenp0s8、Bではenp0s8enp0s9がリストされます。この時点ではまだ追加されたIFにIPアドレスの割当はされていないはずです。
  • 続いて、各IFに静的なIPアドレスを設定します。Ubuntu18.04ではnetplanと呼ばれるユーティリティを使用しIPアドレスやルーティングの設定ができます。各ホスト上のetc/netplan/00-installer-config.yamlというファイルに永続的な設定の記述が可能です(環境によってファイル名が異なることがあるので注意してください)。
    • A
      # 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
      
      これは「enp0s8のIPアドレスを192.168.1.1、サブネットマスクを255.255.255.0に設定し、192.168.2.0宛てのパケットは192.168.1.2に、さもなくば10.10.2.2に転送する」を意味します。
    • B
      # 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
      
      Bでは特定のアドレスに対するルーティングを規定する必要がないのでenp0s8enp0s9に対応する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
        
      AB間、BC間は問題なさそうです。
      • A → C:
        A上でping -c 5 192.168.2.1を実行します。
        --- 192.168.2.1 ping statistics ---
        5 packets transmitted, 0 received, 100% packet loss, time 4071ms
        
        パケットが届いてないようです。これは、Linuxのデフォルト設定でIP Forwardingが無効になっているからのようです。B上でパケットが放棄されています。
        B上でPacket Forwardingを有効にするには、/etc/sysctl.confの、
        # net.ipv4.ip_forward=1
        
        この行をアンコメントするだけです。
        Bを再起動し、再度A上でping -c 5 192.168.2.1を実行します。
        --- 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
        
        無事AC間のパケットのやり取りが確認できました。

Discussion