Netbirdで同一ネットワークセグメント実現
「Netbirdとは」と検索、下記回答が適切と感じられた。
NetBirdは、モダンなVPNプロトコルであるWireGuardをベースに、P2P(Peer-to-Peer)のメッシュネットワークを自動構築するオーバーレイネットワーク・ソリューションです。 ポート開放が不要: ICE/STUN/TURNといったNAT越え技術により、二重ルーター環境でも設定なしで繋がります。
ここでは、NetbirdをインストールしたNAT内側の機器どうしをメッシュネットワークとして接続し、それら機器のLAN側に同一ネットワークを実現する(L2提供)。
参考URL
- 本家サイト
- 5分で開通。NetBirdを導入してPCと自宅サーバーをセキュアに繋ぐ(第2回:導入編)
- VPN不可のデバイスも救済。NetBirdを「踏み台ルーター」にする方法(第3回:Network Routes編)
環境
なお、”Netbird Cloud”は、本記事で使う名称。
- 3拠点をNetbirdでメッシュネットワーク化
- 各サイトにはNetbirdをインストールした機器(上図では四角の図形)とそれに接続されたPCとが存在
- いずれのサイトもNAT配下
- Netbird機器のOSはLinux
- PCはLinux上のNetwork Namespaceに配置
- 100.120.x.y/16はNetbird Cloudから配布されるIPアドレス
- 各サイトのPCどうしが同じネットワーク(L2; 192.168.10.x/24)に所属
- Wireguard上にVXLANを構築
- VXLAN I/FとNetwork NamespaceのI/Fとをブリッジ化
Netbirdインストール
本家サイトの記載のとおりに進める。
$ curl -fsSL https://pkgs.netbird.io/install.sh | sh
...
NetBird service has been started
Installation has been finished. To connect, you need to run NetBird by executing the following command:
netbird up
$ netbird up
Please do the SSO login in your browser.
If your browser didn't open automatically, use this URL to log in:
https://login.netbird.io/authorize?audience=https ....
通常、ここでブラウザが起動する。
IDとパスワードを入力(または、新規作成やSSO)すると
ログインが成功し、ターミナルには下記が表示される。
Connected
Netbird Cloudから割り当てられるIPアドレスは下記となる。
$ netbird status | grep IP
Netbird IP: 100.120.177.89/16
なお、アカウントごとに、100.120.x.y/16のネットワークが割り当てられるようだ。
設定
Network Namespace、VXLAN、ブリッジの設定を行うスクリプトである。ある1つの機器の記載であるが、他の2つの機器では、IPアドレスが異なるのみ。sudoにて実行。コメントを参考されたし。
# Network Namespace作成
ip netns add ns0
# I/Fペアの作成およびNamespaceへの配置
ip link add veth0 type veth peer name ns0-veth0
ip link set ns0-veth0 netns ns0
# Namespace側設定
ip netns exec ns0 ip link set lo up
ip netns exec ns0 ip link set ns0-veth0 up
ip netns exec ns0 ip addr add 192.168.10.1/24 dev ns0-veth0
# VXLAN作成(VLAN10)
ip link add vxlan10 type vxlan id 10 dev wt0 dstport 4789
ip link set vxlan10 up
# wt0: Wireguard I/F
# Remote,Localの指定不要(後述)
# Bridge作成
ip link add br0 type bridge
ip link set br0 up
# 末端LANをブリッジへ追加
ip link set veth0 master br0
ip link set veth0 up
# VXLANをブリッジへ追加
ip link set vxlan10 master br0
# Unknown MACアドレスデータを対向Netbird機器(IPアドレス指定)へ送信
bridge fdb append 00:00:00:00:00:00 dev vxlan10 dst 100.120.179.162
bridge fdb append 00:00:00:00:00:00 dev vxlan10 dst 100.120.177.89
下記がポイント
- VXLANをWireguard上に作成
- VXLAN上にL2フレームを流す
- VXLANをブリッジ化
なお、ここではMTUの設定はしていない。
検証
あるNetbird機器上のNamespaceからpingするのみ。
$ sudo ip netns exec ns0 ping 192.168.10.2 -c 2
PING 192.168.10.2 (192.168.10.2) 56(84) bytes of data.
64 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=48.4 ms
64 bytes from 192.168.10.2: icmp_seq=2 ttl=64 time=67.1 ms
Netbirdステータス
”netbird status --detail”により、アカウントに紐づいた機器の情報が確認できる。
$ netbird status --detail
Peers detail:
...
zagreb.netbird.cloud:
NetBird IP: 100.120.177.89
Public key: 30PzbJz++ItNFsgNbwRA74SxNqn+OiIk9bCkIT09UEk=
Status: Connected
-- detail --
Connection type: P2P
ICE candidate (Local/Remote): srflx/prflx
ICE candidate endpoints (Local/Remote): 223.xxx.yyy.87:37145/192.168.10.112:51820
Relay server address: rels://streamline-vl-nrt-1.relay.netbird.io:443
Last connection update: 1 minute, 55 seconds ago
Last WireGuard handshake: 1 minute, 56 seconds ago
Transfer status (received/sent) 1.6 KiB/484 B
Quantum resistance: false
Networks: -
Latency: 6.682857ms
arlanda.netbird.cloud:
NetBird IP: 100.120.179.162
Public key: /UagahN10WpWdxXUhYWS5k2KSgvs4487+NDiqZcQl1w=
Status: Connected
-- detail --
Connection type: Relayed
ICE candidate (Local/Remote): -/-
ICE candidate endpoints (Local/Remote): -/-
Relay server address: rels://streamline-vl-nrt-1.relay.netbird.io:443
Last connection update: 9 minutes, 6 seconds ago
Last WireGuard handshake: 1 minute, 46 seconds ago
Transfer status (received/sent) 4.2 KiB/2.7 KiB
Quantum resistance: false
Networks: 172.16.2.0/24
Latency: 0s
Events:
[INFO] SYSTEM (7e765ca5-762a-42ce-931d-97a24dc94ca7)
Message: Network map updated
Time: 1 hour, 4 minutes ago
OS: linux/amd64
Daemon version: 0.65.0
CLI version: 0.65.0
Profile: default
Management: Connected to https://api.netbird.io:443
Signal: Connected to https://signal.netbird.io:443
Relays:
[stun:stun.netbird.io:443] is Available
[stun:stun.netbird.io:5555] is Available
[turns:turn.netbird.io:443?transport=tcp] is Available
[rels://streamline-vl-nrt-1.relay.netbird.io:443] is Available
Nameservers:
FQDN: aspero.netbird.cloud
NetBird IP: 100.120.227.241/16
Interface type: Kernel
Quantum resistance: false
Lazy connection: false
SSH Server: Disabled
Networks: 172.16.1.0/24
Peers count: 3/4 Connected
対向機との接続方式(P2Pかリレーか)も見える。
Connection type: P2P
Connection type: Relayed
なお、
https://app.netbird.io
にアクセスしてログインしても、アカウントに紐づいた機器の情報などが確認できる。
ネットワークI/F状況
$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
prog/xdp id 54
2: enp3s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether ac:87:a3:ZZ:YY:b8 brd ff:ff:ff:ff:ff:ff
3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DORMANT group default qlen 1000
link/ether 6c:40:08:YY:c4:TT brd ff:ff:ff:ff:ff:ff
4: wt0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1280 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/none
6: veth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP mode DEFAULT group default qlen 1000
link/ether 92:bd:6f:e5:2e:d0 brd ff:ff:ff:ff:ff:ff link-netns ns0
7: vxlan10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1230 qdisc noqueue master br0 state UNKNOWN mode DEFAULT group default qlen 1000
link/ether ea:93:48:48:3f:5b brd ff:ff:ff:ff:ff:ff
8: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1230 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 82:db:44:7e:c9:9e brd ff:ff:ff:ff:ff:ff
Wireguard I/F(wt0)のMTUが1280、VXLAN(vxlan10)のMTUが1230。
IPアドレス
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric/id:54 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp3s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether ac:87:a3:PP:QQ:b8 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.2/24 brd 192.168.2.255 scope global dynamic noprefixroute enp3s0f0
valid_lft 3437sec preferred_lft 3437sec
3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 6c:40:08:KK:c4:LL brd ff:ff:ff:ff:ff:ff
inet 192.168.10.108/24 brd 192.168.10.255 scope global dynamic noprefixroute wlp2s0
valid_lft 82458sec preferred_lft 82458sec
inet6 2XX8:2XX1:7ee:9400:1024:UUUU:DSSS:a3ef/64 scope global temporary dynamic
valid_lft 276sec preferred_lft 276sec
inet6 2XX8:2XX1:7ee:9400:e252:UXUI:8HH9:2646/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 276sec preferred_lft 276sec
inet6 fe80::17df:b463:71e:YTHY/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4: wt0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1280 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 100.120.227.241/16 brd 100.120.255.255 scope global wt0
valid_lft forever preferred_lft forever
6: veth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP group default qlen 1000
link/ether 92:bd:6f:e5:2e:d0 brd ff:ff:ff:ff:ff:ff link-netns ns0
inet6 fe80::90bd:6fff:KKKK:2PP0/64 scope link
valid_lft forever preferred_lft forever
7: vxlan10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1230 qdisc noqueue master br0 state UNKNOWN group default qlen 1000
link/ether ea:93:48:48:3f:5b brd ff:ff:ff:ff:ff:ff
8: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1230 qdisc noqueue state UP group default qlen 1000
link/ether 82:db:44:7e:c9:9e brd ff:ff:ff:ff:ff:ff
Wireguard設定ファイル
下記ファイルが存在。
$ sudo ls /var/lib/netbird
active_profile.json default.json state.json HIMITU
Wireguard I/F名やMTUが見える。
$ sudo cat /var/lib/netbird/default.json | jq '.WgIface'
"wt0"
$ sudo cat /var/lib/netbird/default.json | jq '.MTU'
1280
ついでに(末端L3の疎通設定)
こちらの方が通常の利用方法であろう。外出先から自宅サーバーへのアクセスなどでの利用が挙げられる。GUIのみで設定可能。
https://app.netbird.io/
にアクセスし、Peerリストを表示する。
該当機器を選択し、Network Routesにて、”Add Route”をクリック。
ルーティングする自機のネットワークを入力。
対象とする対向機(ここでは全て)を選択。
名称入力。
あとはそのまま続ける。
追加完了。
追加されたルーティング情報は、Network Routesで確認できる。
なお、Wireguardやルーティングへ必要な情報を自動的に追加してくれるようだ。検証は自明のため、省略。
EOF











