何がしたかったか
大前提
以前、こんな記事を書きました。
この時は Vultrから振り出される/64のアドレスブロックを/78で切り出して使用 していましたが、構成要件の変更やVPSの追加などがあり、 GUAをNAT66して背後ではULAで処理した方が楽になった ので一旦この構成はボツになりました。
駄菓子菓子
一応技術でメシ食うてる身の人間として、「このままではいけないのではないか」「実は ちゃんと/64で収容できるのではないか 」という謎の焦燥感がありましたので、色々悩んだ末に少し余裕が出来たり、改めて/64で収容できる環境の構築を一度はやっておく必要が出てきたので (※進まない仕事からの現実逃避とも言う) 、再チャレンジすることになりました。
ネットワーク(完成系)
非常に大雑把ですが、大体自宅ネットワークとVultrはこのように接続されています。
実際には LACP on VXLAN on WireGuard VPN が自宅ルーターとVultrの間に張られていますが、Plantumlで表現するのが困難だと感じたので図からは割愛しています。
Vultr側の実装
Netplan
Netplanで一括管理大好き人間 なので、基本的なネットワーク設定は全部Netplan頼みでやっています。
今回、WireGuard VPNは既に張られていましたので、そこにもう1つずつVXLANを重畳させてもらう形でGUAネットワーク空間用のVXLANを張らせてもらい、それをボンドインターフェイスにまとめて、openvswitchでよしなにLACPにしてもらいます(UFWの設定例は省略させていただきます)。
# 99-network-init.yaml
network:
renderer: networkd
version: 2
bonds:
bond4GUA:
accept-ra: false
dhcp4: false
dhcp6: false
interfaces:
- native6e
- native6o
- native6r
mtu: 1280
openvswitch:
lacp: active
optional: true
parameters:
lacp-rate: fast
mii-monitor-interval: 1s
mode: balance-slb
transmit-hash-policy: layer2+3
bridges:
nativebridge: # GUA用ブリッジインターフェイス
accept-ra: false
addresses:
- '(Vultrインスタンスに振られたプレフィックス)::1/64'
dhcp4: false
dhcp6: false
interfaces:
- bond4GUA
mtu: 1280
ipv6-mtu: 1280
optional: true
routes:
- to: '(Vultrインスタンスに振られたプレフィックス)::/64'
metric: 2
ethernets:
enp1s0:
accept-ra: true
addresses:
- '(Vultrインスタンスに振られたプレフィックスから切り出したアドレス)/64'
dhcp4: true
dhcp6: true
match:
macaddress: (VultrインスタンスのMACアドレス)
set-name: enp1s0
WireGuardとVXLANの設定については特に真新しい内容はありませんので割愛させていただきます (それを言うならボンドインターフェイスもだろ) 。
DHCP
DHCPはKea-DHCPで担います。"nativeBridge"がGUA空間用ブリッジインターフェイス名で、おおよそこんな具合。
{
"Dhcp6": {
"valid-lifetime": 86400,
"renew-timer": 3600,
"rebind-timer": 7200,
"preferred-lifetime": 54000,
"decline-probation-period": 3600,
"interfaces-config": {
"interfaces": [
"(ULA空間用ブリッジインターフェイス名)",
"nativeBridge"
]
},
//"lease-database": {
//"type": "memfile",
//"persist": true,
//"name": "/var/lib/kea/dhcp6.leases"
//},
"subnet6": [
{
"subnet": "(ULAアドレスブロック)::/64",
"pools": [
{
"pool": "(ULAアドレスブロック)ffff::1 - (ULAアドレスブロック):ffff:ffff:ffff:ffff"
}
],
"id": 1,
"interface": "(ULA空間用ブリッジインターフェイス名)",
"option-data": [
{
"name": "dns-servers",
"code": 23,
"data": "(ULAアドレスブロック)::254"
}
]
},
{
"subnet": "(Vultrに振られたプレフィックス)::/64",
"pools": [
{
"pool": "(Vultrに振られたプレフィックス)::2 - (Vultrに振られたプレフィックス):ffff:ffff:ffff:ffff"
}
],
"id": 2,
"interface": "nativeBridge",
"option-data": [
{
"name": "dns-servers",
"code": 23,
"data": "2606:4700:4700::1111, 2606:4700:4700::1001"
}
]
}
]
}
}
RA(Router Advertize)
RA(Router Advertize)の広報はradvdにやってもらいます。弊環境ではおよそこんな感じ。
interface (ULA空間用ブリッジインターフェイス名)
{
AdvSendAdvert on;
AdvManagedFlag on;
prefix (ULAアドレスブロック)::/64
{
AdvAutonomous on;
AdvOnLink on;
AdvRouterAddr on;
};
};
interface nativeBridge
{
AdvSendAdvert on;
prefix (Vultrに振られたプレフィックス)::/64
{
AdvAutonomous on;
AdvOnLink on;
};
};
ND Proxy
ND Proxyはndppdにやってもらいます。弊環境ではおよそこんな感じ。
proxy enp1s0 {
router no
autowire yes
promiscuous no
rule (Vultrに振られたプリフィックス)::/64 {
iface nativeBridge
autovia yes
}
}
UFW
DHCPに必要なポートを開けておきます。例えばこんな感じ。
root@VultrFront:~$ ufw allow in on nativeBridge from ::/0 port 546:547 to any port 546:547 proto udp
root@VultrFront:~$ ufw status numbered
Status: active
To Action From
-- ------ ----
[57] 546:547/udp (v6) on nativeBridge ALLOW IN 546:547/udp (v6)
その他
GUA空間用ブリッジ内にIPv4も通したい場合は適宜その設定を行なって、UFWなどでNATの設定も入れてください。
その他、通信で許可したいものだけを適宜UFWなどで許可してください。
本稿では割愛いたします。
設定の適用
ここまで設定が終わったら、設定を適用していきます。
root@VultrFront:~$ netplan try --timeout 20
nativeBond: reverting custom parameters for bridges and bonds is not supported
vxbond0: reverting custom parameters for bridges and bonds is not supported
Please carefully review the configuration and use 'netplan apply' directly.
root@VultrFront:~$ netplan apply
root@VultrFront:~$ systemctl restart radvd.service && systemctl enable radvd.service --now
root@VultrFront:~$ systemctl enable ndppd.service --now
root@VultrFront:~$ systemctl enable kea-dhcp6-server.service --now
対向側(自宅ルーター側)の設定
Netplan
深く考えずにUFWでVXLAN用のポート開けてVXLANを足してボンディングしてブリッジインターフェイスに繋ぎこむだけなので割愛します。
その他設定
同上。
正常に対向側(自宅ルーター側)でVultrのIPv6を使ってGUAで通信できるか確認
QEMU/KVMの仮想マシンで確認
適当なQEMU/KVM仮想マシンを作って、接続する仮想ネットワークインターフェースのネットワークソースに、GUA用のブリッジデバイスを指定します。
その際、XMLを編集して次のような形にします。
<interface type="bridge">
<mac address="(仮想マシンのMACアドレス)"/>
<source bridge="nativeBridge"/>
<virtualport type="openvswitch">
</virtualport>
<model type="virtio"/>
</interface>
あとはQEMU/KVMがよしなに取り計らってくれます(多分)。
ちゃんと通信できていますね。ヨシ!