ソフトウェアエンジニア現役続行

雑多なことを綴ります

仮想マシンのGuestOSでルータを構築する

仮想マシンを使って、GuestOS(ゲストOS)をルータとして使うことができます。複数のインタフェースを設定できる仮想マシンであれば構築できます。

ユースケースとしては、Linuxルータを作って仕組みを理解したいが、物理的なマシンや追加NICを用意するのが面倒なときに、仮想マシンを使って仮想ルータを手軽に構築することができます。

ネットワーク構成は次のようになります。

┌───────┐       ┌──────────────┐
│ ホストOS │ <───> │ ゲストOS(仮想ルータ) │ <───> (インターネット)
└───────┘       └──────────────┘

例として、以下のような環境で構築しました。

HostOS:Mac
GuestOS:Linux(fedora12)
仮想マシンVirtualBox

手順

GuestOSでVirtualBoxの設定

VirtualBoxコンソール」→「設定」→「ネットワーク」で、2つのネットワークアダプタを有効します。「割り当て」のところを、1つは「ブリッジ」(または、「NAT」)、もう1つは「ホストオンリーアダプタ」にします。

HostOSでルータの設定

VirtualBoxのネットワークアダプタを設定してHostOS(ホストOS)を起動すると、HostOSに2つのIPアドレスが付与されています。この例では、eth0にはブリッジで、eth1にはホストオンリーアダプタで、IPアドレスが付与されています。

[root@fedora ~]# ip addr show
1: lo:  mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff (← MACアドレスは隠してあります)
    inet Y.Y.Y.Y/24 brd Y.Y.Y.255 scope global eth0 (← IPアドレスは隠してあります)
       valid_lft forever preferred_lft forever
3: eth1:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether ZZ:ZZ:ZZ:ZZ:ZZ:ZZ brd ff:ff:ff:ff:ff:ff (← MACアドレスは隠してあります)
    inet 192.168.56.101/24 brd 192.168.56.255 scope global eth1
       valid_lft forever preferred_lft forever

NATルータとして機能するようにiptablesを設定します。ホストオンリーアダプタが192.168.56.101/24だと分かったので、「192.168.56.0/24」からのパケットにはNAT(MASQUERADE)をかけます。例えば以下のように設定します。

[root@fedora ~]# cat /etc/sysconfig/iptables
*nat

PREROUTING ACCEPT [1
84]
POSTROUTING ACCEPT [0
0]
OUTPUT ACCEPT [0
0]

-A POSTROUTING -s 192.168.56.0/24 -j MASQUERADE
COMMIT
*filter

INPUT DROP [0
0]
FORWARD DROP [0
0]
OUTPUT ACCEPT [0
0]

-A INPUT -i lo -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth1 -j ACCEPT
COMMIT

HostOSでデフォルトゲートウェイの設定

HostOSでインターネットに出るときはGuestOSを経由するように、デフォルトゲートウェイを設定します。HostOSがMacなので、次のように設定しました。

[Oswald@macbook ~]$ sudo route delete default (←既にデフォルトゲートウェイが設定されていたら削除)
[Oswald@macbook ~]$ sudo route add default 192.168.56.101

完成図

これで仮想ルータを使ったネットワークが構築できました。

┌───────┐       ┌──────────────┐
│ ホストOS │ <───> │ ゲストOS(仮想ルータ) │ <───> (インターネット)
└───────┘       └──────────────┘
    vboxnet0       eth1             eth0
    192.168.56.1     192.168.56.101        Y.Y.Y.Y