🍔
1つのNICにmacvlanで複数の仮想NICを作成する!
はじめに
今回、とある目的のためにRaspberryPiに複数のネットワークを割り当てたくなりました。
しかしながら、RaspberryPiには一つのNICしかなく、複数のネットワークを持つためには、物理NICを別途購入するか仮想的にNICを作成するしかありません。
そのときに、macvlanを用いて仮想NICを作成する方法があることを知り、その備忘録を残すために本記事を作成しました。間違っている点や気になる点があれば、コメントの方へお願いします。
構築
ネットワーク構成
設定投入
今回は、検証用に一時的にip
コマンドを用いて設定する方法と永続化のためにsystemd-network
を用いた場合の2パータンを示します。
ip
コマンドを用いる場合
[一時的]- eth0インターフェイスにVLAN1とVLAN2用のインターフェイスを作成
sudo ip link add link eth0 name eth0.1 type vlan id 1
sudo ip link add link eth0 name eth0.2 type vlan id 2
- VLAN1とVLAN2用のインターフェイスのリンクアップ
sudo ip link set eth0 up
sudo ip link set eth0.1 up
sudo ip link set eth0.2 up
- macvlan用のインターフェイスを作成
sudo ip link add veth0 link eth0.1 type macvlan mode bridge
sudo ip link add veth1 link eth0.2 type macvlan mode bridge
- macvlan用のインターフェイスのリンクアップ
sudo ip link set veth0 up
sudo ip link set veth1 up
- ipアドレスの割り当て
sudo ip addr add <ip_addr>/<cidr> dev veth0
sudo ip addr add <ip_addr>/>cidr> dev veth1
- デフォルトゲートウェイの割り当て
sudo ip route add default via <gateway_address> dev veth0
上記の設定を行うことで通信ができます。ただし、この場合再起動すると設定が飛んでしまうため、永続的に設定したい場合はsystemdを用います。
systemd-network
を用いる場合
[永続的]- 作業ディレクトリの変更
cd /etc/systemd/network
- ファイルの作成
sudo touch 10-eth0.network
sudo touch 10-eth0.{1..2}.{network,netdev}
sudo touch 10-veth{0..1}.{network,netdev}
- systemd-network用の設定ファイルを作成
- 10-eth0.1.netdev
[NetDev]
Name=eth0.1
Kind=vlan
[VLAN]
Id=1
- 10-eth0.1.network
[Match]
Name=eth0.1
[Network]
MACVLAN=veth0
LinkLocalAddressing=no
- 10-eth0.2.netdev
[NetDev]
Name=eth0.2
Kind=vlan
[VLAN]
Id=2
- 10-eth0.2.network
[Match]
Name=eth0.2
[Network]
MACVLAN=veth1
LinkLocalAddressing=no
- 10-eth0.network
[Match]
Name=eth0
[Network]
VLAN=eth0.1
VLAN=eth0.2
- 10-veth0.netdev
[NetDev]
Name=veth0
Kind=macvlan
[MACVLAN]
Mode=bridge
- 10-veth0.network
[Match]
Name=veth0
[Network]
DHCP=no
Address=192.168.150.222/24
Gateway=192.168.150.254
DNS=1.1.1.1
LinkLocalAddressing=no
- 10-veth1.netdev
[NetDev]
Name=veth1
Kind=macvlan
[MACVLAN]
Mode=bridge
- 10-veth1.network
[Match]
Name=veth1
[Network]
DHCP=no
Address=192.168.200.222/24
LinkLocalAddressing=no
- 適用
sudo netplan --debug generate
sudo netplan --debug apply
sudo systemctl restart systemd-network.service
検証
Internetに出れるかということで、pingをしましたが問題なく外に出れていそうです。
ping 1.1 -c 3
PING 1.1 (1.0.0.1) 56(84) bytes of data.
64 bytes from 1.0.0.1: icmp_seq=1 ttl=56 time=29.3 ms
64 bytes from 1.0.0.1: icmp_seq=2 ttl=56 time=5.47 ms
64 bytes from 1.0.0.1: icmp_seq=3 ttl=56 time=6.69 ms
--- 1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 5.469/13.821/29.308/10.962 ms
また、今回は載せていませんが、ローカルのネットワーク(VLAN1とVLAN2)のGWに対してそれぞれがGWを経由せずに直接接続できたため、成功できたと思います。
おわりに
macvlanを用いると、vlanの時と異なりMACアドレスも分けることができるためトラブルシューティングのしやすさが上がり、利便性が向上すると思います。わからない点等ありましたら、コメントにお願いします。最後まで読んでいただきありがとうございました。
Discussion