R86Sのセットアップ
AliExpress で購入した R86S U2 Black セットアップの記録。
開封時は Open WRT が入っていた。
3つあるRJ45の1つを使って自宅ネットワークに繋ぎ、セットアップをする。
まずは Ubuntu 22.04 を USB メモリ経由でインストールして apt update && apt upgrade -y
を実行。
未使用のネットワークインターフェイスがあるとシステム起動時に以下のメッセージが表示される。
a start job is running for wait for network to be configured.
ネットワークが確立されるかタイムアウトの120秒が経過する待たされるので、インターフェイスの設定を変更しておく。
# This is the network config written by 'subiquity'
network:
ethernets:
enp1s0:
dhcp4: true
+ optional: true
enp2s0:
dhcp4: true
+ optional: true
enp3s0:
dhcp4: true
+ optional: true
enp4s0:
dhcp4: true
+ optional: true
enp4s0d1:
dhcp4: true
+ optional: true
version: 2
netplay apply
で変更を反映。
sudo netplan apply
参考
Ubuntu 22.04 はデフォルトで systemd-resolved が動いていたので停止する。
sudo systemctl disable --now systemd-resolved.service
systemd-resolved 環境化では /etc/resolv.conf
は /run/systemd/resolve/stub-resolv.conf
へのシンボリックリンクになっているため、 unlink してファイルを作成しておく。
$ ls -la /etc/resolv.conf
lrwxrwxrwx 1 root root 39 Feb 17 17:23 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
sudo unlink /etc/resolv.conf
sudo tee /etc/resolv.conf <<EOF
nameserver 1.1.1.1
nameserver 1.0.0.1
nameserver 2606:4700:4700::1111
nameserver 2606:4700:4700::1001
EOF
nameserver 1.1.1.1
nameserver 1.0.0.1
nameserver 2606:4700:4700::1111
nameserver 2606:4700:4700::1001
今のうちに必要になりそうなパッケージをインストールしておく。
sudo apt install -y dnsmasq radvd
dnsmasq はインストールしただけでサービスが勝手に起動してしまうので、手動で止めておく。
sudo systemctl disable --now dnsmasq.service
DHCPv4 を無効にして ONU に直結する。
# This is the network config written by 'subiquity'
network:
ethernets:
enp1s0:
- dhcp4: true
+ dhcp4: false
optional: true
enp2s0:
- dhcp4: true
+ dhcp4: false
optional: true
enp3s0:
- dhcp4: true
+ dhcp4: false
optional: true
enp4s0:
- dhcp4: true
+ dhcp4: false
optional: true
enp4s0d1:
- dhcp4: true
+ dhcp4: false
optional: true
version: 2
Ubuntu 22.04 のデフォルト設定では systemd-networkd の DUID が DUID-EN になっていた。
$ systemctl status enp4s0d1 | grep DUID
DHCP6 Client DUID: DUID-EN/Vendor:XXXXXXXXXXXX
NTTのフレッツ光では DUID-LL である必要があるようなので、設定を書き換える。
[DHCPv6]
+ DUIDType=link-layer
systemd-networkd を再起動して変更を反映。
sudo systemctl restart systemd-networkd
DUID-LL に変わった。
$ systemctl status enp4s0d1 | grep DUID
DHCP6 Client DUID: DUID-LL:0001XXXXXXXXXXXX
参考
Ubuntu 22.04 の systemd-networkd では solicit で IA_PD を飛ばすことができなかったので dhcpcd で DHCPv6-PD によるプレフィックスの取得を試みる。
Request を送るところまではできたが、 Reply が帰ってこない。
このへんと関係ある?
dhcpcd のメモ
-
/var/lib/dhcpcd/duid
に DUID-LL 形式の DUID を記述する/var/lib/dhcpcd/duid00:03:00:01:XX:XX:XX:XX:XX:XX
-
/etc/dhcpcd.conf
にclientid
を指定してもだめだった - hardware type は
1
(Ethernet (10Mb)
) でないとだめらしい
-
-
/etc/dhcpcd.conf
に以下の設定を書く/etc/dhcpcd.confnoipv6only noipv6rs waitip 6 interface enp4s0d1 duid ipv6rs iaid 1 ia_pd 1 enp1s0
以下の設定で/56のプレフィックスが取得できた。
ipv6only
noipv6rs
nohook resolv.conf
duid
option dhcp6_name_servers
option dhcp6_domain_search
option dhcp6_sntp_servers
option dhcp6_sip_servers_address
option dhcp6_vivso
nooption dhcp6_vivco
nooption dhcp6_sol_max_rt
nooption dhcp6_inf_max_rt
interface enp4s0d1
ipv6rs
ia_pd 0/::/56 enp1s0/0/64
sol_max_rt
と inf_max_rt
は nooption
が効いていない?
プレフィックス取得には影響なかったので一旦無視。
参考
Arch Linux の systemd-networkd 253 では以下の設定で DHCPv6-PD でプレフィックス取得ができた。
[Match]
Name=enp4s0d1
[Network]
DHCP=ipv6
IPv6AcceptRA=yes
DHCPPrefixDelegation=yes
[DHCPv6]
WithoutRA=solicit
DUIDType=link-layer
IAID=0
[DHCPPrefixDelegation]
UplinkInterface=:self
SubnetId=0
Announce=no
Debian 12 の systemd 252 でも PD できた。
Ubuntu 22.04 (systemd 250) が原因?
DHCPv6-PD でプレフィックスを受け取ってクライアントに IPv6 アドレスを配るための systemd-networkd の設定メモ。
WAN 側はひかり電話契約ありのフレッツ光 ONU に直結。
[Match]
Name=enp4s0d1
[Network]
IPv6AcceptRA=yes
DHCP=ipv6
IPForward=ipv6
DHCPPrefixDelegation=yes
[DHCPv6]
WithoutRA=solicit
DUIDType=link-layer
IAID=0
[DHCPPrefixDelegation]
UplinkInterface=:self
SubnetId=0
Announce=no
[Match]
Name=enp1s0
[Network]
IPv6SendRA=yes
DHCPPrefixDelegation=yes
[IPv6SendRA]
EmitDNS=yes
DNS=2606:4700:4700::1111 2606:4700:4700::1001 # Cloudflare DNS
[DHCPPrefixDelegation]
UplinkInterface=enp4s0d1
SubnetId=0
Announce=yes
このままだとクライアントからインターネットに ping が通らない。
$ ping6 2606:4700:4700::1111
PING6(56=40+8+8 bytes) 2001:db8:1234:5600:ce9:df58:42bd:67e9 --> 2606:4700:4700::1111
--- 2606:4700:4700::1111 ping6 statistics ---
29 packets transmitted, 0 packets received, 100.0% packet loss
WAN(enp4s0d1) と LAN(enp1s0) の metric が同値になっているため、これが原因っぽい。
$ ip -6 r
2001:db8:1234:5600::/64 dev enp4s0d1 proto kernel metric 256 expires 14239sec pref medium
2001:db8:1234:5600::/64 dev enp1s0 proto kernel metric 256 expires 14240sec pref medium
unreachable 2001:db8:1234:5600::/56 dev lo proto dhcp metric 1024 pref medium
fe80::/64 dev enp4s0d1 proto kernel metric 256 pref medium
fe80::/64 dev enp1s0 proto kernel metric 256 pref medium
default via fe80::1abc:2def:3456:789a dev enp4s0d1 proto ra metric 1024 expires 1639sec pref medium
LAN(enp1s0) の metric を255に変更する。
sudo ip -6 r del 2001:db8:1234:5600::/64 dev enp1s0
sudo ip -6 r add 2001:db8:1234:5600::/64 dev enp1s0 metric 255
$ ip -6 r
2001:db8:1234:5600::/64 dev enp1s0 metric 255 pref medium
2001:db8:1234:5600::/64 dev enp4s0d1 proto kernel metric 256 expires 13864sec pref medium
unreachable 2001:db8:1234:5600::/56 dev lo proto dhcp metric 1024 pref medium
fe80::/64 dev enp1s0 proto kernel metric 256 pref medium
fe80::/64 dev enp4s0d1 proto kernel metric 256 pref medium
default via fe80::1abc:2def:3456:789a dev enp4s0d1 proto ra metric 1024 expires 1505sec pref medium
クライアントからインターネットに出ていけるようになった。
$ ping6 2606:4700:4700::1111
PING6(56=40+8+8 bytes) 2001:db8:1234:5600:ce9:df58:42bd:67e9 --> 2606:4700:4700::1111
16 bytes from 2606:4700:4700::1111, icmp_seq=0 hlim=54 time=5.102 ms
16 bytes from 2606:4700:4700::1111, icmp_seq=1 hlim=54 time=4.674 ms
16 bytes from 2606:4700:4700::1111, icmp_seq=2 hlim=54 time=4.482 ms
16 bytes from 2606:4700:4700::1111, icmp_seq=3 hlim=54 time=4.836 ms
systemd-networkd で設定できたので追記しておく。
[Match]
Name=enp1s0
[Network]
IPv6SendRA=yes
DHCPPrefixDelegation=yes
[IPv6SendRA]
EmitDNS=yes
DNS=2606:4700:4700::1111 2606:4700:4700::1001 # Cloudflare DNS
[DHCPPrefixDelegation]
UplinkInterface=enp4s0d1
SubnetId=0
Announce=yes
+RouteMetric=255
DHCPv4 サーバーを有効化する。
[Match]
Name=enp1s0
[Network]
IPv6SendRA=yes
DHCPPrefixDelegation=yes
+DHCPServer=yes
+[Address]
+Address=192.168.1.1/24
+[DHCPServer]
+PoolOffset=0
+PoolSize=64
+EmitDNS=yes
+DNS=1.1.1.1 1.0.0.1 # Cloudflare DNS
[IPv6SendRA]
EmitDNS=yes
DNS=2606:4700:4700::1111 2606:4700:4700::1001 # Cloudflare DNS
[DHCPPrefixDelegation]
UplinkInterface=enp4s0d1
SubnetId=0
Announce=yes
RouteMetric=255
IPv4 通信をするためにv6プラス固定IPのIPIPトンネルを作成する。
ip -6 tunnel add ipip0 mode ipip6 remote $BR_ADDRESS local $IPV6_PREFIX:$INTERFACE_ID dev enp4s0d1
ip link set dev ipip0 up
ip route add default dev ipip0
ip -4 a add dev ipip0 IPV4_ADDRESS
これで R86S から IPv4 でインターネットに接続できるようになった。
$ ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=58 time=4.52 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=58 time=4.50 ms
64 bytes from 1.1.1.1: icmp_seq=3 ttl=58 time=4.95 ms
64 bytes from 1.1.1.1: icmp_seq=4 ttl=58 time=4.28 ms
クライアントからも接続するために NAPT する。
IPv4 フォワーディングを有効化。
sysctl -w net.ipv4.ip_forward=1
nftables で IP マスカレードを設定。
table ip nat {
chain postrouting {
type nat hook postrouting priority 0; policy accept;
oifname "ipip0" counter masquerade;
}
}
クライアントからも IPv4 インターネットに接続できるようになった。
$ ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=56 time=4.94 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=56 time=4.64 ms
64 bytes from 1.1.1.1: icmp_seq=3 ttl=56 time=4.93 ms
64 bytes from 1.1.1.1: icmp_seq=4 ttl=56 time=4.60 ms
参考
上記を systemd-networkd で設定する場合は以下。
[Match]
Name=enp4s0d1
[Network]
IPv6AcceptRA=yes
DHCP=ipv6
IPForward=ipv6
DHCPPrefixDelegation=yes
+Tunnel=ipip0
[DHCPv6]
WithoutRA=solicit
DUIDType=link-layer
IAID=0
[DHCPPrefixDelegation]
+Token=::1234:5678:9a00:0 # インターフェイスID
UplinkInterface=:self
SubnetId=0
Announce=no
+[NetDev]
+Name=ipip0
+Kind=ip6tnl
+
+[Tunnel]
+Mode=ipip6
+Local=2001:db8:1234:5600:1234:5678:9a00:0 # IPv6プレフィックス:インターフェイスID
+Remote=2001:db8:abcd:ef00::32 # BRアドレス
+DiscoverPathMTU=yes
+EncapsulationLimit=none
+[Match]
+Name=ipip0
+
+[Network]
+IPForward=ipv4
+Address=203.0.113.10/32 # IPv4固定IP
+
+[Route]
+Destination=0.0.0.0/0
クライアントから https://github.com/ にアクセスできない問題が発生。
どうやら TLS のハンドシェイクの Server Hello が帰ってきていないっぽい。
$ curl -v https://github.com/
* processing: https://github.com/
* Trying 20.27.177.113:443...
* Connected to github.com (20.27.177.113) port 443
* ALPN: offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: none
openssl で TLS 通信を試みる。
$ openssl s_client -connect 20.27.177.113:443
CONNECTED(00000003)
やはり Server Hello が帰ってこない。
RTX1200 に戻してパケットキャプチャしてみたところ、正常に Server Hello が帰ってきた。
Server Hello のパケットサイズは1474だった。
これは IPIP トンネルの MTU 1460 を超えているため MTU 関係のトラブルっぽい?
R86S からパケットサイズ 1470 で ping を送ると正常にレスポンスが返る。
$ ping -s 1470 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 1470(1498) bytes of data.
1478 bytes from 1.1.1.1: icmp_seq=1 ttl=58 time=4.44 ms
1478 bytes from 1.1.1.1: icmp_seq=2 ttl=58 time=4.33 ms
1478 bytes from 1.1.1.1: icmp_seq=3 ttl=58 time=4.84 ms
1478 bytes from 1.1.1.1: icmp_seq=4 ttl=58 time=4.97 ms
しかし R86S の LAN 下のクライアントからパケットサイズ 1470 で ping 送るとレスポンスが帰らない。
$ ping -s 1470 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 1470(1498) bytes of data.
From 192.168.58.1 icmp_seq=1 Frag needed and DF set (mtu = 1460)
R86S の LAN 下で Path MTU Discovery が正常に動いてなさそう。
nftables.conf
に以下のルールを追加して、 IPIP トンネルから入ってくるパケットの MSS がルーティングテーブルの MTU に合わせて調整されるようにする。
table ip filter {
chain forward {
type filter hook forward priority 0; policy accept;
oifname "ipip0" tcp flags syn tcp option maxseg size set rt mtu;
}
}
https://github.com/ に無事に接続できるようになった。
$ curl -s -o /dev/null -w '%{http_code}\n' https://github.com/
200
参考
ブリッジインターフェイスを作って enp1s0, enp2s0, enp3s0, enp4s0 を同一セグメントの L2 スイッチとして使えるようにする。
[NetDev]
Name=br0
Kind=bridge
[Match]
Name=br0
[Network]
IPForward=ipv6
IPv6SendRA=yes
DHCPPrefixDelegation=yes
DHCPServer=yes
[Address]
Address=192.168.1.1/24
[DHCPServer]
PoolOffset=0
PoolSize=64
EmitDNS=yes
DNS=_server_address
[IPv6SendRA]
EmitDNS=yes
DNS=_link_local
[DHCPPrefixDelegation]
Token=::1
UplinkInterface=enp4s0d1
SubnetId=0
Announce=yes
RouteMetric=255
[Match]
Name=enp1s0
[Network]
Bridge=br0
[Match]
Name=enp2s0
[Network]
Bridge=br0
[Match]
Name=enp3s0
[Network]
Bridge=br0
[Match]
Name=enp4s0
[Network]
Bridge=br0
こんにちは、
お忙しいところ失礼いたします。UbuntuでWANインターフェースにIPv6アドレスを割り当てる方法について質問があります。現在、PrefixDelegationは取得できるのですが、具体的にIPv6アドレスを割り当てる方法が分かりません。この問題に関して、何かアドバイスをいただけないでしょうか?
お手数をおかけしますが、よろしくお願いいたします。
こんにちは!
現在、PrefixDelegationは取得できるのですが、具体的にIPv6アドレスを割り当てる方法が分かりません。
こちらはルーターのIPv6アドレスのことでしょうか?
私の環境では IPv4 over IPv6 のトンネルを作成するために、プロバイダから提示されたインターフェースIDを使う必要がありました。
そこで [DHCPPrefixDelegation]
の Token
でインターフェイスIDを指定しています。
[DHCPPrefixDelegation]
Token=::1234:5678:9a00:0 # インターフェイスID
ご返信ありがとうございます!私はUbuntu Server 23.10を使用しており、systemdのバージョンは253です。PDプレフィックスを取得するインターフェイスの設定に[DHCPPrefixDelegation]を設定しようと試みましたが、うまくいきませんでした。
TokenとAssign=yesを指定しても、enp1s0にはIPv6アドレスが割り当てられていないです。
設定は以下の通りです:
[Match]
Name=enp1s0 # Uplink Interface
[Network]
DHCP=ipv6
IPv6AcceptRA=yes
DHCPPrefixDelegation=yes
DNS=2404:1a8:7f01:a::3
DNS=2404:1a8:7f01:b::3
[DHCPv6]
UseDelegatedPrefix=yes
WithoutRA=solicit
DUIDType=link-layer
IAID=0
[DHCPPrefixDelegation]
UplinkInterface=:self
SubnetId=0
Assign=yes
Token=インターフェイスID
何かアドバイスをいただけますでしょうか?お手数をおかけしますが、ご教示いただければ幸いです。
少し調べてみましたが、直接の原因はわかりませんでした。お力になれず申し訳ないのです。
原因究明のために以下の手順が役立つかもしれませんので、参考までに共有しておきます。
systemd-networkd のログを確認する
journalctl -xu systemd-networkd.service
で systemd-networkd のログが確認できます。
正常に IPv6 アドレスが取得できていれば以下のようなログが記録されているはずなので、ご自身の環境と比較してみてください。
Mar 04 15:45:45 r86s systemd-networkd[410]: enp4s0: Link
Mar 04 15:45:46 r86s systemd-networkd[410]: enp4s0: Gained carrier
Mar 04 15:45:48 r86s systemd-networkd[410]: enp4s0: Gained IPv6LL
Mar 04 15:45:49 r86s systemd-networkd[410]: enp4s0: DHCP: received delegated prefix 2001:db8:1234:5600::/56
Mar 04 15:45:49 r86s systemd-networkd[410]: enp4s0: DHCP-PD address 2001:db8:1234:5600:ce9:df58:42bd:67e9:0/64 (valid for 3h 59min 59s, preferred for 3h 29min 59s)
Wireshark でパケットキャプチャする
Wireshark を使うことで DHCPv6-PD のパケットを直接見ることができます。
正常に通信ができていれば Solicit
-> Advertise
-> Request
-> Reply
の4つのパケットが確認できるはずですので、まずはどこで止まっているかを調査するのが良いと思います。
私のログには「enp4s0: DHCP-PD address......」の記録が見当たりません。お手数ですが、お使いのUbuntuとsystemdのバージョンを教えていただけますか?よろしくお願いいたします。
私はUbuntu 22.04 (systemd 250) でできなかったので、現在は Debian 12 (systemd 252) を使っています。
より正確には
- Ubuntu 22.04 (systemd 250) で接続を試みる -> Prefix を取得できず
-
systemd-networkd
の conf に書いた設定のいくつかが動作していなかった[1]ため、問題の切り分けのために Arch Linux (systemd 253) で接続を試みる -> ここではじめて Prefix 取得に成功 - さらに Debian 12 (systemd 252) で接続を試みる -> Arch Linux 同様に Prefix 取得に成功
という経緯です。
もともと Ubuntu 22.04 で構築しようとしていましたが、上記の経緯を経て最終的には Debian 12 に落ち着きました。
-
DHCP: received delegated prefix 2001:db8:1234:5600::/56
とDHCP-PD address 2001:db8:1234:5600:ce9:df58:42bd:67e9:0/64 (valid for 3h 59min 59s, preferred for 3h 29min 59s)
のログが出ていなかった ↩︎
私もDebian12を試してみました。確かにuplinkにはIPv6が割り当てられたのですが、それがすぐに消えてしまいました。Ubuntu22.04でsystemdを252にアップグレードしてみる価値はあるかもしれませんね。ご指導いただき、本当にありがとうございました!