
まえが き
systemdが
ダイソン球のsystemd-politicsd
)、systemd-economyd
)、systemd-cultured
)など、
そのように
- フレッツ光
(IPv6 IPoE) + v6プラス(IPv4 over IPv6 / MAP-E)に 接続し - 下流に
NTTのホームゲートウェイを 置いて ひかり電話を 使う
環境を
背景
とは
なぜ 自前ルータ?
すでに
- HGWを
ルータと して 使う 場合:/56の うち、/64の プレフィックスが SLAACで 利用される - HGWの
下流に 自前ルータを 置く 場合:/56の うち、/60の プレフィックスが DHCPv6-PDで 自前ルータに 払い 出される
つまり
その
なぜLinux?
ところが
- DHCPv4で
フレッツ網からグローバルIPv4アドレス(/30)を 受け取る こと - DHCPv6オプション
(ひかり電話関連情報)を 受け取る こと
この
方 法1: 選手交代
一つ
- ひかり電話対応ルータしか
使えない - NVR500、
NVR510、 NVR700Wなど
- NVR500、
- HGW特有の
機能 (例:SIPサーバ機能)を 捨てることに なる - そこまで
自由度は 増えない 優等生すぎて面白くない
方 法2: IPv4ブリッジ
もう
ざっくりいえば、
- フレッツ網-HGW間の
IPv4を ブリッジし - 同じく
IPv6は ルーティングし - ひかり電話関連情報は別途手に
入れて、 HGWに 配る
と
- IPv4ブリッジに
対応した ルータしか 使えない2 - UNIVERGE IXシリーズなど
- 別途DHCPv6サーバが
必要 - 別途外部から
パケットキャプチャが 必要
特に
しかし
環境
使用した
回線契約
- フレッツ光ネクスト相当の
契約 (光コラボ) - IPv6 IPoE
- ひかり電話オプション付き
(HGWの 貸与 あり、 DHCPv6-PD) - VDSL方
式 (モデムの 貸与 あり)4
- v6プラス
- IPv4 over IPv6
(MAP-E方 式) - 固定
(≒専有) IPではない - フレッツ・ジョイントを
利用
- IPv4 over IPv6
事情あって
例示の3fff:0:0:ab00::/56
と
IPv4 over IPv6の
項目 | 値 |
---|---|
CE | 3fff:0:0:ab00::ce |
IPv4アドレス | 192.0.2.1 |
PS | 171 (10進)ab (16進) |
option peeraddr | 2001:db8::1/64 |
機器
項目 | 機種 | 用途・ |
---|---|---|
ミニPC | GMKtec NucBox M6 | ルータ用。 |
L2スイッチ | TP-Link TL-SG105PE | ポート数を |
HGW | 沖電気 RX-600KI | ひかり電話ルータ |
VDSLモデム | 住友電工 VH100-4ES | FTTH回線で |
ルータ用には、
ネットワーク設計
今回自作ルータが
- 基本的な
ルータの 機能 - DHCPv6クライアントを
動かし、 フレッツ網から IPv6プレフィックスを 受け取る - 同時に、
ひかり電話関連情報 (DHCPv6オプション)も 受け取る
- 同時に、
- IPv4 over IPv6の
トンネルを 通す - VLANで
宅内機器側の セグメントを 作り、 IPv6・IPv4を 配る - その他、
ファイアウォールなども 設定
- DHCPv6クライアントを
- ひかり電話ルータ
(HGW)の 世話 - VLANで
HGW側の セグメントを 分離する - フレッツ網-HGW間の
IPv4パケットを ブリッジする - DHCPv6-PDサーバを
動かし、 HGW向けに フレッツ網に 似た IPv6環境を 整える - IPv6プレフィックスの
一部を HGWに 再委譲する - ひかり電話関連情報を
HGWに 配布する
- IPv6プレフィックスの
- VLANで
このうち太字の
DHCPv6クライアントを 動かすインターフェースに ついて
ルータの
IPv4 over IPv6の ポート振り分けに ついて
IPv4 over IPv6
執筆時点では、tc
を
ひかり電話関連情報の 取得・配布に ついて
ひかり電話関連情報の
理想と
鍵と
- DHCPv6リースを
受けた 際の D-Busシグナルを 検知 - D-Busを
叩き、 リース情報を 取得 - リース情報を
元に、 Keaの APIを 叩いて 設定を 更新
な
ネットワーク構成
以上を
物理接続
青色は
論理接続
黒色は
補足
ルータの
wan0
(MAC:de:ad:be:ef:00:01
と仮定) lan0
(MAC:de:ad:be:ef:00:02
と仮定)
これに
br0
:ブリッジデバイス( wan0
+hgw
)兼 DHCPv6クライアント - ブリッジは、
wan0
-hgw
間のIPv4を 透過し、 IPv6を ルーティングする
- ブリッジは、
mape0@br0
:IPv4 over IPv6のトンネルデバイス home@lan0
:VLAN用サブインターフェース(ID = 10) - 宅内機器側セグメントの
デフォルトゲートウェイ
- 宅内機器側セグメントの
hgw@lan0
:VLAN用サブインターフェース(ID = 100) - HGW側セグメントの
デフォルトゲートウェイ (IPv6のみ)
- HGW側セグメントの
L2スイッチ側でも、
手順1:環境構築
免責
手元では、
#ArchLinuxInstallBattle
まず、
使用する
あらかじめ、
pacman -S ethtool nftables iptables-nft ndisc6 kea jqparu -S python-sdbus
NICの チューニング
続いて
使用するr8169
)で
そこで
デフォルトの
# (前略)_pkgname=r8125pkgname=${_pkgname}-dkmspkgname=${_pkgname}-rss-dkmspkgver=9.016.00# (中略)package() {# (中略) sed -e "s/@_PKGNAME@/${_pkgname}/g" \ -e "s/@PKGVER@/${pkgver}/g" \ -i "${pkgdir}/usr/src/${dir_name}/dkms.conf"
sed -e 's/ENABLE_RSS_SUPPORT = n/ENABLE_RSS_SUPPORT = y/' \ -e 's/ENABLE_MULTIPLE_TX_QUEUE = n/ENABLE_MULTIPLE_TX_QUEUE = y/' \ -e 's/CONFIG_ASPM = y/CONFIG_ASPM = n/' \ -i "${pkgdir}/usr/src/${dir_name}/Makefile"}
そして
blacklist r8169
次回のr8125
ドライバが
> ethtool -i wan0driver: r8125version: 9.016.00-NAPI-RSSfirmware-version:expansion-rom-version:bus-info: 0000:03:00.0supports-statistics: yessupports-test: nosupports-eeprom-access: nosupports-register-dump: yessupports-priv-flags: no
> ethtool -l wan0Channel parameters for wan0:Pre-set maximums:RX: 4TX: 2Other: n/aCombined: n/aCurrent hardware settings:RX: 3TX: 2Other: n/aCombined: n/a
せっかく
pacman -S irqbalancesystemctl enable --now irqbalance
ついでに
[Match]PermanentMACAddress=de:ad:be:ef:00:01
[Link]Name=wan0RxBufferSize=512TxBufferSize=1024# MACアドレスのランダム化MACAddressPolicy=random
[Match]PermanentMACAddress=de:ad:be:ef:00:02
[Link]Name=lan0RxBufferSize=512TxBufferSize=1024
> ethtool -g wan0Ring parameters for wan0:Pre-set maximums:RX: 1024RX Mini: n/aRX Jumbo: n/aTX: 1024TX push buff len: n/aCurrent hardware settings:RX: 512RX Mini: n/aRX Jumbo: n/aTX: 1024RX Buf Len: n/aCQE Size: n/aTX Push: offRX Push: offTX push buff len: n/aTCP data split: n/a
カーネルパラメータの チューニング
ArchWikiの
net.ipv4.tcp_slow_start_after_idle = 0net.core.default_qdisc = cakenet.ipv4.tcp_congestion_control = bbrnet.core.netdev_max_backlog = 16384net.core.rmem_default = 1048576net.core.rmem_max = 16777216net.core.wmem_default = 1048576net.core.wmem_max = 16777216net.core.optmem_max = 65536net.ipv4.tcp_rmem = 4096 1048576 2097152net.ipv4.tcp_wmem = 4096 65536 16777216net.ipv4.udp_rmem_min = 8192net.ipv4.udp_wmem_min = 8192net.ipv4.tcp_fastopen = 3net.ipv4.tcp_mtu_probing = 1
もちろんルータと
net.ipv4.ip_forward = 1net.ipv4.conf.all.forwarding = 1net.ipv6.conf.all.forwarding = 1
あとでip6tnl0
)が
net.core.fb_tunnels_only_for_init_net = 2
ここまでで
-
もちろん、
これでも アドレス数は 十分なのだが、 せっかく 与えられた ものが 無駄に なるのは 気に入らない ↩ -
とは
いえIPv4の ブリッジ程度で あれば、 他社の ルータでも 実現できるかもしれない ↩ -
詳しくは
第三部で 述べるが、 DHCPv6リクエストに 適切な オプション (Option 16, Vendor Class)を 含めれば、 ルータで 直接 ひかり電話関連情報を 受信できる。 しかし これに 対応した 市販ルータは (おそらく) 少ないし、 よしんば 受信できたとして、 その 情報を 下流に 送信できるとは 思えない ↩ -
この
記事では、 VDSLモデム (ないしONU)と HGWが 独立している ことを 暗黙の 前提と している。 両者が 一体 化している タイプの HGWの 場合、 いわゆる 「UNI出し」を すると この 状態に できる。 小型ONUの 場合は、 Linuxルータに 別途SFP+ポートが 必要に なる ↩ -
VLANを
駆使すれば、 ポートが 一つでも なんとか なるかもしれない ↩ -
なんとRyzen 5 6600H(6C12T)と16GBの
DDR5が 載っている。 本来は もっと 省電力な 機種を 使うべきだ ↩ -
MACVLANで
WAN側インターフェースを 二つの 仮想インターフェースに 分割し、 片方を ブリッジに 組み込む構成も 試したが、 うまく 機能しなかった (下りの パケットを 適切に 処理できなかった) ↩ -
systemd-networkdにはDHCPv6サーバ機能が
ないため、 併用が 必要 ↩ -
な
お、 もう 一つ VLANを 切って HGWの LAN側と 接続しておくと、 ルータ経由で HGWの Web設定画面に アクセスできて 便利だが、 今回は 省略した ↩ -
OpenWrtではデフォルトで
マルチキューが 有効化されているため、 それに 倣った ↩