VMware ESXi ホストに構築した OpenWRT 仮想ルータへの 仮想ネットワーク を構築して、他の仮想マシンやESXiホストが仮想ルータを通じてネットワークアクセスできるようにします。
ESXiホストの4つのI225ポート
VMware ESXi 8.0ホストを構築したJ4125ミニPCには4口のIntel I225 2.5GbEポートがあり、前回構築したOpenWRT仮想ルータへ提供しているのはいずれも、PCIデバイスパススルーとしてのI225ポート。
- vmnic0 : OpenWRTへPCIデバイスパススルー (WAN)
- vmnic1 : OpenWRTへPCIデバイスパススルー (LAN)
- vmnic2 : 〜空き〜
- vmnic3 : デフォルト管理ポート (vmk0)
ESXiホスト上のデフォルトの仮想スイッチ vSwitch0 は、ホスト管理用途のみ。
仮想マシン用仮想スイッチを追加
ESXiホスト内に今後増やす予定の仮想マシンがネットワークアクセスに使う、次のような仮想スイッチ vSwitch1 を追加しました。
そして物理ポートを設けないこのスイッチに、仮想マシン用 Home LAN 、ホスト管理用 Home Mgmt の2つのポートグループを作り、
管理用ポートグループに引き当てるvmkernel NIC vmk1 を作りました。
新規ポートグループをOpenWRT仮想ルータへアタッチ
作成したポートグループ Home LAN を前回作成したOpenWRT仮想ルータへ追加することで、仮想スイッチ vSwitch1 へのネットワークアクセスをOpenWRT仮想ルータに担ってもらいます。
先ほど設置した vSwitch1 に仮想ルータが現れました。
ところがここで仮想ルータを起動すると、困った現象に遭遇しました。
1 2 3 4 5 6 7 8 |
NIC追加前) eth0 (WAN) eth1 (LAN) NIC追加後) eth0 (Home LAN) eth1 (WAN) eth2 (LAN) |
追加したNICに命名順を割り込まれ、パススルーモードの2つの既存NIC名が変わってしまったのです。
OpenWRT起動時に自動NICリネーム
おそらく今後仮想NICを追加する度に、パススルーデバイスの前に割り込まれてしまうのは明らかなので、OpenWRT公式ユーザガイドに提示されていた例を元に、2つのパススルーデバイスをそれぞれ、 pth0 , pth1 へと起動時にリネームするような仕組みを構築します。
まず、 /etc/config/network にリネームしたいデバイスのMACアドレスをリネーム後のNIC名と共に登録します。また、 br-lan や wan の中にあるNIC名を書き換えることも忘れずに。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
config device option name 'br-lan' option type 'bridge' list ports 'pth1' list ports 'wlan0' list ports 'wlan1' option ipv6 '0' config interface 'wan' option device 'pth0' option proto 'dhcp' config device option name 'pth0' option mac '60:be:b4:XX:XX:XX' config device option name 'pth1' option mac '60:be:b4:YY:YY:YY' |
次に、起動時の自動実行スクリプト、 /etc/rc.local を開いて末尾の exit 0 よりも上にリネームスクリプトを以下の要領で加えます(公式ユーザガイドそのままではうまく動かなかったので、多少改変しています)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# Put your custom commands here that should be executed once # the system init finished. By default this file does nothing. # REPLACE NIC IFACE NAMES NET_DEVS="$(ls /sys/class/net/*/device/uevent | awk -F '/' '{print $5}')" for NET_DEV0 in ${NET_DEVS}; do NET_MAC0="$(cat /sys/class/net/"${NET_DEV0}"/address)" I="0" while uci -q get network.@device["${I}"] > /dev/null; do NET_DEV="$(uci -q get network.@device["${I}"].name)" NET_MAC="$(uci -q get network.@device["${I}"].mac)" if [ -n "${NET_DEV}" -a -n "${NET_MAC}" ] && \ [ "${NET_MAC0}" = "${NET_MAC}" ] && \ [ "${NET_DEV0}" != "${NET_DEV}" ] && \ [ "${NET_DEV0:0:3}" != "pth" ]; then ip link set "${NET_DEV0}" down ip link set "${NET_DEV0}" name "${NET_DEV}" fi I=$((I+1)) done done /etc/init.d/network restart exit 0 |
このスクリプトの動作はおおよそ次の通りです。
- OpenWRTの起動直後は、 eth0 , eth1 , eth2 が存在。
- /sys/class/net/*/device/uevent でOSの持つデバイス一覧を取得。
- uci でOpenWRTのネットワークデバイス定義を取得。
- ループを回して両者のMACアドレスを照合しマッチする場合は、インターフェイスダウンしてリネーム。
- 最後にネットワークサービスをリロードしてアップ。
- リネーム後、 eth0 , pth0 , pth1 という構成に。
再起動後、ブートログを確認してリネーム作業の痕跡を見つけました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
[ 6.792808] igc 0000:02:01.0: enabling device (0000 -> 0002) [ 6.795164] igc 0000:02:01.0: PCIe PTM not supported by PCIe bus/controller [ 6.840984] igc 0000:02:01.0 (unnamed net_device) (uninitialized): PHC added [ 6.865154] igc 0000:02:01.0: 128.000 Gb/s available PCIe bandwidth (5.0 GT/s PCIe x32 link) [ 6.869537] igc 0000:02:01.0 eth1: MAC: 60:be:b4:03:fe:4d [ 6.871112] igc 0000:02:02.0: enabling device (0000 -> 0002) [ 6.873263] igc 0000:02:02.0: PCIe PTM not supported by PCIe bus/controller [ 6.920517] igc 0000:02:02.0 (unnamed net_device) (uninitialized): PHC added [ 6.945151] igc 0000:02:02.0: 128.000 Gb/s available PCIe bandwidth (5.0 GT/s PCIe x32 link) [ 6.949617] igc 0000:02:02.0 eth2: MAC: 60:be:b4:03:fe:4e [ 6.962117] mt7915e 0000:02:03.0: enabling device (0000 -> 0002) [ 7.121410] mt7915e 0000:02:03.0: HW/SW Version: 0x8a108a10, Build Time: 20211222184017a [ 7.121410] [ 7.136867] mt7915e 0000:02:03.0: WM Firmware Version: ____000000, Build Time: 20211222184052 [ 7.157465] mt7915e 0000:02:03.0: WA Firmware Version: DEV_000000, Build Time: 20211222184111 [ 12.608738] PPP generic driver version 2.4.2 [ 12.613340] NET: Registered protocol family 24 [ 12.616054] kmodloader: done loading kernel modules from /etc/modules.d/* [ 13.387908] vmxnet3 0000:02:04.0 eth0: intr type 3, mode 0, 5 vectors allocated [ 13.393229] vmxnet3 0000:02:04.0 eth0: NIC Link is Up 10000 Mbps [ 13.394867] 8021q: adding VLAN 0 to HW filter on device eth0 [ 13.396550] br-lan: port 1(eth0) entered blocking state [ 13.397852] br-lan: port 1(eth0) entered disabled state [ 13.401618] device eth0 entered promiscuous mode [ 13.404572] br-lan: port 1(eth0) entered blocking state [ 13.405836] br-lan: port 1(eth0) entered forwarding state [ 13.545365] igc 0000:02:01.0 pth0: renamed from eth1 [ 13.610677] igc 0000:02:02.0 pth1: renamed from eth2 [ 13.708702] br-lan: port 1(eth0) entered disabled state [ 13.713888] device eth0 left promiscuous mode [ 13.717716] br-lan: port 1(eth0) entered disabled state [ 14.160503] br-lan: port 1(wlan1) entered blocking state [ 14.164781] br-lan: port 1(wlan1) entered disabled state [ 14.166129] device wlan1 entered promiscuous mode [ 14.752712] IPv6: ADDRCONF(NETDEV_CHANGE): wlan1: link becomes ready [ 15.003635] br-lan: port 2(wlan0) entered blocking state [ 15.007810] br-lan: port 2(wlan0) entered disabled state [ 15.009133] device wlan0 entered promiscuous mode [ 15.172503] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready [ 15.380889] device wlan0 left promiscuous mode [ 15.385030] br-lan: port 2(wlan0) entered disabled state [ 15.430469] device wlan1 left promiscuous mode [ 15.434631] br-lan: port 1(wlan1) entered disabled state [ 15.599792] vmxnet3 0000:02:04.0 eth0: intr type 3, mode 0, 5 vectors allocated [ 15.604894] vmxnet3 0000:02:04.0 eth0: NIC Link is Up 10000 Mbps [ 15.606441] 8021q: adding VLAN 0 to HW filter on device eth0 [ 15.607962] br-lan: port 1(eth0) entered blocking state [ 15.609185] br-lan: port 1(eth0) entered disabled state [ 15.610665] device eth0 entered promiscuous mode [ 15.615529] br-lan: port 1(eth0) entered blocking state [ 15.616727] br-lan: port 1(eth0) entered forwarding state [ 15.698117] br-lan: port 2(pth1) entered blocking state [ 15.702202] br-lan: port 2(pth1) entered disabled state [ 15.703461] device pth1 entered promiscuous mode [ 16.530366] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready [ 16.549652] br-lan: port 3(wlan0) entered blocking state [ 16.553826] br-lan: port 3(wlan0) entered disabled state [ 16.555094] device wlan0 entered promiscuous mode [ 16.556249] br-lan: port 3(wlan0) entered blocking state [ 16.557525] br-lan: port 3(wlan0) entered forwarding state [ 17.203738] br-lan: port 4(wlan1) entered blocking state [ 17.207731] br-lan: port 4(wlan1) entered disabled state [ 17.209013] device wlan1 entered promiscuous mode [ 17.210096] br-lan: port 4(wlan1) entered blocking state [ 17.211192] br-lan: port 4(wlan1) entered forwarding state [ 18.980627] igc 0000:02:02.0 pth1: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX/TX [ 18.985088] br-lan: port 2(pth1) entered blocking state [ 18.986168] br-lan: port 2(pth1) entered forwarding state [ 19.290633] igc 0000:02:01.0 pth0: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX/TX [ 19.294861] IPv6: ADDRCONF(NETDEV_CHANGE): pth0: link becomes ready |
LuCI上にもリネーム後のデバイス名が一覧に表示されています。
問題無く動作するのを確認したら、アップグレードの際などに /etc/rc.local が上書きされてしまう恐れに備えて、バックアップするなどしておきましょう。
ESXiホストのデフォルトゲートウェイ変更
最後にESXiホストのルーティングを確認し、OpenWRT仮想ルータをデフォルトゲートウェイに変更します。
1 2 3 4 5 6 |
[root@localhost:~] esxcli network ip route ipv4 list Network Netmask Gateway Interface Source ------------ ------------- ------------ --------- ------ default 0.0.0.0 10.96.28.254 vmk0 DHCP 10.96.28.0 255.255.255.0 0.0.0.0 vmk0 MANUAL 192.168.51.0 255.255.255.0 0.0.0.0 vmk1 MANUAL |
デフォルトゲートウェイは、デフォルトのTCP/IPスタックの中にあります。本当は、割り当てているVMKernel NICもvmk1へ変えたいところなのですが、それはエラーになります。
変更後、ルーティングテーブルは以下のようになりました。ちなみにゲートウェイの変更程度であればESXi Host Clientから編集可能なのですが、これ以上のルーティング操作は esxcli に頼らざるを得ないのだそう。
1 2 3 4 5 6 |
[root@localhost:~] esxcli network ip route ipv4 list Network Netmask Gateway Interface Source ------------ ------------- ------------ --------- ------ default 0.0.0.0 192.168.51.5 vmk1 MANUAL 10.96.28.0 255.255.255.0 0.0.0.0 vmk0 MANUAL 192.168.51.0 255.255.255.0 0.0.0.0 vmk1 MANUAL |
その後、 vmk0 をリンクダウンの状態にしてしまうと、これが何故か次のような状態になり、 192.168.51.0/24 以外の疎通が途絶えてしまいました。
1 2 3 4 5 6 7 8 9 |
[root@localhost:~] esxcli network ip route ipv4 list Network Netmask Gateway Interface Source ------------ ------------- ------- --------- ------ 169.254.0.0 255.255.0.0 0.0.0.0 vmk0 MANUAL 192.168.51.0 255.255.255.0 0.0.0.0 vmk1 MANUAL [root@localhost:~] ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8): 56 data bytes sendto() failed (No route to host) |
仕方がないので esxcli でデフォルトゲートウェイを設定することに。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[root@localhost:~] esxcli network ip route ipv4 add -n 0.0.0.0/0 -g 192.168.51.5 [root@localhost:~] esxcli network ip route ipv4 list Network Netmask Gateway Interface Source ------------ ------------- ------------ --------- ------ default 0.0.0.0 192.168.51.5 vmk1 MANUAL 169.254.0.0 255.255.0.0 0.0.0.0 vmk0 MANUAL 192.168.51.0 255.255.255.0 0.0.0.0 vmk1 MANUAL [root@localhost:~] ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8): 56 data bytes 64 bytes from 8.8.8.8: icmp_seq=0 ttl=59 time=3.839 ms 64 bytes from 8.8.8.8: icmp_seq=1 ttl=59 time=3.535 ms --- 8.8.8.8 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 3.535/3.687/3.839 ms |
なんだかだんだんと歪なルーティングになってきましたが、しばらくこれで運用することにします。
Home Lab仮想ネットワークの完成
今回までにJ4125産業用ミニPCを使って構築した、VMware ESXi 8.0ホストとその中のOpenWRT仮想ルータの論理的な構成を図示するとこのようになりました(関連記事はこちら)。
リソースは未だあるので、今後DNSサーバを立てたり、外からリモート操作可能なデスクトップ仮想マシンを作成するつもりです。