この記事 の2021年のソフトウェアを用いた書き直しです。IPv4通信をするときにPPPOEを使うと遅いですが、IPv4通信をIPv6通信に包んで送ると速くなります。IPv4通信をIPv6で包むやり方には幾つがありますが、Biglobe, OCNバーチャルコネクト, v6プラスなどで使われているMAP-E方式を提供するISPのために、家庭内のIPv4通信をIPv6に変換して高速化するルーターをLinux・systemd・nftablesのみを用いて作る手順を示します。Debian 11 BullseyeやUbuntu 21.04 Hirsuteで使えます。systemd
バージョン247以降が必要です。(自宅のラズパイで Debian 12 Bookwormで以下の方針でルーター作って問題なく運用できています(2024年7月))
前提と目標
- Linux機器には一つだけネットワークインターフェースがありその名前は
eth0
で、そのIPv4アドレスは192.168.1.2
に固定して設定する - IPv6パケットをISPとやり取りするIPv6ルーター(普通はNTTのレンタルルーター(HGW))がLinux機器とは別にあり、家庭内の機器にIPv6アドレスをIPv6 RAやDHCPv6で配布する。家庭内のIPv6デフォルトルートはIPv6ルーターになっている。
IPv6ルーターのIPv4アドレスは192.168.1.1
に固定されている - フレッツ・ジョイント を 使っていない
- IPv4デフォルトルートをLinux機器に設定し、家庭内のIPv4パケットをLinux機器に集めて、Linux機器はIPv4パケットとIPv6パケットを相互に変換する
- この変換を行う仮想ネットワークの名前を
ip6tnl1
に設定する - Linux機器の上でDNSキャッシュサーバーを稼働させてDNS問い合わせをv6アドレスを持つDNSサーバーに送らせる。これはNAT変換ポートの枯渇を避けるためである (いわゆるニチバン対策の一種)
- Linux機器はDHCPv4サーバーを稼働させ、eth0に接続された機器のIPv4デフォルトルーターとDNSサーバーとしてLinux機器を設定させる
- それ以外のDHCPv4サーバーは停止する
- NTTレンタルルーターのPPPoE接続は残してもよいし、すべて解除してもどちらでもいいです
systemd-networkd によるネットワークの設定
ネットワーク設定を行う他のソフトウェアのアンインストール
apt-get --autoremove remove dhcpcd5 ifupdown network-manager netplan.io networkd-dispatcher
eth0 の設定
[Match]
Name=eth0
[Link]
RequiredForOnline=routable
[Network]
Tunnel=ip6tnl1
IPForward=ipv4
LinkLocalAddressing=ipv6
IPv6AcceptRA=yes
DHCP=ipv6
DHCPServer=yes
[Address]
Address=192.168.1.2/24
[Address]
Address=$CE/64
[DHCPServer]
EmitDNS=yes
DNS=192.168.1.2
EmitRouter=yes
PoolOffset=129
PoolSize=40
[PFIFOHeadDrop]
PacketLimit=1024
ip6tnl1 の設定
$BR
は前述の $CE
と同じ手順で調べて以下に記入する
[NetDev]
Name=ip6tnl1
Kind=ip6tnl
[Tunnel]
Mode=ipip6
Local=$CE
Remote=$BR
DiscoverPathMTU=yes
EncapsulationLimit=none
$IP4
を前述の $CE
, $BR
と同じ手順で調べて以下に記入する
[Match]
Name=ip6tnl1
[Link]
RequiredForOnline=routable
[Network]
BindCarrier=eth0
DefaultRouteOnDevice=yes
DHCP=no
IPv6AcceptRA=no
LinkLocalAddressing=no
MulticastDNS=no
LLMNR=no
[Address]
Address=$IP4/32
systemd-networkd の自動起動
systemctl enable systemd-networkd
DNS キャッシュサーバーの設定
systemd でDoT (DNS over TLS) と DNSSEC に対応したDNSキャッシュサーバーを作る を参照してほしい。 DNSとDHCPが一体になっている dnsmasq などを用いてもよいが、その場合上記 eth0.network
の DHCPServer=
を no
に変える。
nftables の設定
-
https://qiita.com/kakinaguru_zo/items/2764dd8e83e54a6605f2#%E3%81%8A%E3%81%BE%E3%81%91%EF%BC%91-systemd-%E3%81%A8-nftables--usrsbinnft%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89-%E3%81%AB%E4%B8%8A%E8%A8%98%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E5%88%9D%E6%9C%9F%E5%8C%96%E3%82%92%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E3%82%84%E3%82%89%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95 に従って
nftables.conf
を作成し/etc
に置く apt-get install nftables
systemctl enable nftables
再起動する
これで上手くいくはず