VM経由でWiFiを使う実験(その1: lagg)

wifiboxを使えば、VM上のalpine linux経由でWiFiに接続できますが、現状のwifibox経由ではWiFiのIPアドレスがEthernetとは別セグメントになってしまうという大きな欠点があります。
そのため、何とか現状のアドレスのままVM経由でWiFiを使えないか実験してみました。実験する際は、いろいろなツールがすぐに使えるubuntu 22.04LTSで行いました。まずはIPv4だけを対象とします。
最初は、laggを使えないか実験しました。ubuntu側がbridge動作できれば簡単なのですが、WiFiはAPモード以外はbridgeできないため、parproutedを入れてproxy arpを使うことにしました。なお、vm-publicは使わないので、vm switch createは不要です。

freebsd% cat /etc/rc.conf
(snip)
ifconfig_re0="ether XX:XX:XX:XX:XX:XX up" # XX:XX:XX:XX:XX:XX はWiFi cardのmacアドレス
cloned_interfaces="lagg0"
ifconfig_lagg0="laggproto failover laggport re0 xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"

rebootした後に、

freebsd# vm start ubuntu
(vm-ubuntuにログインして以下を実施)
WiFiは固定アドレス(freebsdマシンの属するセグメントの空きアドレス)でもDHCPでもどちらでも可
vm-ubuntu# sysctl net.ipv4.ip_forward=1
vm-ubuntu# apt install parprouted
vm-ubuntu# /usr/sbin/ip link set def wlp0sX promisc on # WiFi cardをpromisc modeにする
vm-ubuntu# /usr/sbin/ip addr add xxx.xxx.xxx.yyy/32 dev enp0sY
               # 仮想ethernetに/32でアドレスを割り当てる。
               # アドレスはfreebsdマシンの属するセグメントの空きアドレス
                 (WiFiに割り当てた物とは異なるものにすること)
vm-ubuntu# /usr/sbin/parprouted enp0sY wlp0sX

vmを起動したことで、freebsd側にtap0が現れるので、laggのメンバーに追加する

freebsd# ifconfig lagg0 laggport tap0

これで一応動きますが、freebsdのarp tableがlagg0に対してcacheされるため、arp -adを行わないとlaggのmember切替で旨く通信できません。arp cacheをlagg0ではなくre0/tap0で行ってくれれば動作する筈なのですが、ここら辺は大昔にbugzillaで議論されて結局解決しないまま立ち消えになった経緯があります。ということで、この方法はあまり現実的ではありません。

その2へ続く