Closed25

R86Sのセットアップ

koyashirokoyashiro

AliExpress で購入した R86S U2 Black セットアップの記録。

開封時は Open WRT が入っていた。

3つあるRJ45の1つを使って自宅ネットワークに繋ぎ、セットアップをする。

まずは Ubuntu 22.04 を USB メモリ経由でインストールして apt update && apt upgrade -y を実行。

koyashirokoyashiro

未使用のネットワークインターフェイスがあるとシステム起動時に以下のメッセージが表示される。

a start job is running for wait for network to be configured.

ネットワークが確立されるかタイムアウトの120秒が経過する待たされるので、インターフェイスの設定を変更しておく。

/etc/netplan/00-installer-config.yaml
# 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

参考

koyashirokoyashiro

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
/etc/resolv.conf
nameserver 1.1.1.1
nameserver 1.0.0.1
nameserver 2606:4700:4700::1111
nameserver 2606:4700:4700::1001
koyashirokoyashiro

今のうちに必要になりそうなパッケージをインストールしておく。

sudo apt install -y dnsmasq radvd

dnsmasq はインストールしただけでサービスが勝手に起動してしまうので、手動で止めておく。

sudo systemctl disable --now dnsmasq.service
koyashirokoyashiro

DHCPv4 を無効にして ONU に直結する。

/etc/netplan/00-installer-config.yaml
# 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
koyashirokoyashiro

Ubuntu 22.04 のデフォルト設定では systemd-networkd の DUID が DUID-EN になっていた。

$ systemctl status enp4s0d1 | grep DUID
           DHCP6 Client DUID: DUID-EN/Vendor:XXXXXXXXXXXX

NTTのフレッツ光では DUID-LL である必要があるようなので、設定を書き換える。

/etc/systemd/networkd.conf
[DHCPv6]
+ DUIDType=link-layer

systemd-networkd を再起動して変更を反映。

sudo systemctl restart systemd-networkd

DUID-LL に変わった。

$ systemctl status enp4s0d1 | grep DUID
           DHCP6 Client DUID: DUID-LL:0001XXXXXXXXXXXX

参考

koyashirokoyashiro

Ubuntu 22.04 の systemd-networkd では solicit で IA_PD を飛ばすことができなかったので dhcpcd で DHCPv6-PD によるプレフィックスの取得を試みる。

Request を送るところまではできたが、 Reply が帰ってこない。
このへんと関係ある?

dhcpcd のメモ

  1. /var/lib/dhcpcd/duid に DUID-LL 形式の DUID を記述する
    /var/lib/dhcpcd/duid
    00:03:00:01:XX:XX:XX:XX:XX:XX
    
    • /etc/dhcpcd.confclientid を指定してもだめだった
    • hardware type は 1 (Ethernet (10Mb)) でないとだめらしい
  2. /etc/dhcpcd.conf に以下の設定を書く
    /etc/dhcpcd.conf
    noipv6only
    noipv6rs
    waitip 6
    
    interface enp4s0d1
      duid
      ipv6rs
      iaid 1
      ia_pd 1 enp1s0
    
koyashirokoyashiro

以下の設定で/56のプレフィックスが取得できた。

/etc/dhcpcd.conf
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_rtinf_max_rtnooption が効いていない?
プレフィックス取得には影響なかったので一旦無視。

参考

koyashirokoyashiro

Arch Linux の systemd-networkd 253 では以下の設定で DHCPv6-PD でプレフィックス取得ができた。

/etc/systemd/network/enp4s0d1.network
[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
koyashirokoyashiro

DHCPv6-PD でプレフィックスを受け取ってクライアントに IPv6 アドレスを配るための systemd-networkd の設定メモ。
WAN 側はひかり電話契約ありのフレッツ光 ONU に直結。

wan.network
[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
lan.network
[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
koyashirokoyashiro

このままだとクライアントからインターネットに 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 で設定できたので追記しておく。

/etc/systemd/network/lan.newtork
 [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
koyashirokoyashiro

DHCPv4 サーバーを有効化する。

/etc/systemd/network/lan.network
 [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
koyashirokoyashiro

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 マスカレードを設定。

/etc/fntables.conf
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 で設定する場合は以下。

/etc/systemd/wan.network
 [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
/etc/systemd/ipip0.netdev
+[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
/etc/systemd/ipip0.network
+[Match]
+Name=ipip0
+
+[Network]
+IPForward=ipv4
+Address=203.0.113.10/32 # IPv4固定IP
+
+[Route]
+Destination=0.0.0.0/0
koyashirokoyashiro

クライアントから 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 関係のトラブルっぽい?

koyashirokoyashiro

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 が正常に動いてなさそう。

koyashirokoyashiro

nftables.conf に以下のルールを追加して、 IPIP トンネルから入ってくるパケットの MSS がルーティングテーブルの MTU に合わせて調整されるようにする。

/etc/nftables.conf
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

参考

koyashirokoyashiro

ブリッジインターフェイスを作って enp1s0, enp2s0, enp3s0, enp4s0 を同一セグメントの L2 スイッチとして使えるようにする。

/etc/systemd/network/br0.netdev
[NetDev]
Name=br0
Kind=bridge
/etc/systemd/network/br0.network
[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
/etc/systemd/network/lan-enp1s0.network
[Match]
Name=enp1s0

[Network]
Bridge=br0
/etc/systemd/network/lan-enp2s0.network
[Match]
Name=enp2s0

[Network]
Bridge=br0
/etc/systemd/network/lan-enp3s0.network
[Match]
Name=enp3s0

[Network]
Bridge=br0
/etc/systemd/network/lan-enp4s0.network
[Match]
Name=enp4s0

[Network]
Bridge=br0
MissingMissing

こんにちは、
お忙しいところ失礼いたします。UbuntuでWANインターフェースにIPv6アドレスを割り当てる方法について質問があります。現在、PrefixDelegationは取得できるのですが、具体的にIPv6アドレスを割り当てる方法が分かりません。この問題に関して、何かアドバイスをいただけないでしょうか?
お手数をおかけしますが、よろしくお願いいたします。
https://github.com/systemd/systemd/issues/31820

koyashirokoyashiro

こんにちは!

現在、PrefixDelegationは取得できるのですが、具体的にIPv6アドレスを割り当てる方法が分かりません。

こちらはルーターのIPv6アドレスのことでしょうか?

私の環境では IPv4 over IPv6 のトンネルを作成するために、プロバイダから提示されたインターフェースIDを使う必要がありました。
そこで [DHCPPrefixDelegation]Token でインターフェイスIDを指定しています

[DHCPPrefixDelegation]
Token=::1234:5678:9a00:0 # インターフェイスID
MissingMissing

ご返信ありがとうございます!私は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

何かアドバイスをいただけますでしょうか?お手数をおかけしますが、ご教示いただければ幸いです。

koyashirokoyashiro

少し調べてみましたが、直接の原因はわかりませんでした。お力になれず申し訳ないのです。

原因究明のために以下の手順が役立つかもしれませんので、参考までに共有しておきます。

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つのパケットが確認できるはずですので、まずはどこで止まっているかを調査するのが良いと思います。

MissingMissing

私のログには「enp4s0: DHCP-PD address......」の記録が見当たりません。お手数ですが、お使いのUbuntuとsystemdのバージョンを教えていただけますか?よろしくお願いいたします。

koyashirokoyashiro

私はUbuntu 22.04 (systemd 250) でできなかったので、現在は Debian 12 (systemd 252) を使っています

より正確には

  1. Ubuntu 22.04 (systemd 250) で接続を試みる -> Prefix を取得できず
  2. systemd-networkd の conf に書いた設定のいくつかが動作していなかった[1]ため、問題の切り分けのために Arch Linux (systemd 253) で接続を試みる -> ここではじめて Prefix 取得に成功
  3. さらに Debian 12 (systemd 252) で接続を試みる -> Arch Linux 同様に Prefix 取得に成功

という経緯です。

もともと Ubuntu 22.04 で構築しようとしていましたが、上記の経緯を経て最終的には Debian 12 に落ち着きました。

脚注
  1. DHCP: received delegated prefix 2001:db8:1234:5600::/56DHCP-PD address 2001:db8:1234:5600:ce9:df58:42bd:67e9:0/64 (valid for 3h 59min 59s, preferred for 3h 29min 59s) のログが出ていなかった ↩︎

MissingMissing

私もDebian12を試してみました。確かにuplinkにはIPv6が割り当てられたのですが、それがすぐに消えてしまいました。Ubuntu22.04でsystemdを252にアップグレードしてみる価値はあるかもしれませんね。ご指導いただき、本当にありがとうございました!

このスクラップは2023/08/19にクローズされました