🍔

1つのNICにmacvlanで複数の仮想NICを作成する!

2024/09/01に公開

はじめに

今回、とある目的のためにRaspberryPiに複数のネットワークを割り当てたくなりました。
しかしながら、RaspberryPiには一つのNICしかなく、複数のネットワークを持つためには、物理NICを別途購入するか仮想的にNICを作成するしかありません。
そのときに、macvlanを用いて仮想NICを作成する方法があることを知り、その備忘録を残すために本記事を作成しました。間違っている点や気になる点があれば、コメントの方へお願いします。

構築

ネットワーク構成

設定投入

今回は、検証用に一時的にipコマンドを用いて設定する方法と永続化のためにsystemd-networkを用いた場合の2パータンを示します。

[一時的]ipコマンドを用いる場合

  1. 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
  1. VLAN1とVLAN2用のインターフェイスのリンクアップ
sudo ip link set eth0 up
sudo ip link set eth0.1 up
sudo ip link set eth0.2 up
  1. 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
  1. macvlan用のインターフェイスのリンクアップ
sudo ip link set veth0 up
sudo ip link set veth1 up
  1. ipアドレスの割り当て
sudo ip addr add <ip_addr>/<cidr> dev veth0
sudo ip addr add <ip_addr>/>cidr> dev veth1
  1. デフォルトゲートウェイの割り当て
sudo ip route add default via <gateway_address> dev veth0

上記の設定を行うことで通信ができます。ただし、この場合再起動すると設定が飛んでしまうため、永続的に設定したい場合はsystemdを用います。

[永続的]systemd-networkを用いる場合

  1. 作業ディレクトリの変更
cd /etc/systemd/network
  1. ファイルの作成
sudo touch 10-eth0.network
sudo touch 10-eth0.{1..2}.{network,netdev}
sudo touch 10-veth{0..1}.{network,netdev}
  1. 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
  1. 適用
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