ラズパイ3B+ と さくらのVPS かつ ds-lite(IPv4 over IPv6ルータ) 通信エラーが発生していました -PS4 Pro 使ってみて-

2019年5月15日

タイトルが長くなるので・・・少し省略しています。。。

ds-lite(IPv4 over IPv6ルータ) を使用してみて、通信エラーが発生していることが解りました。
※小学生の観察日記になってしまうかもしれません。お許し下さい。

※PS4 Pro のブラウザ※
PS4 Pro のブラウザで “Radish Network Speed Testing Ver. 5.3.5.0 β” を使用してみた結果

上りのRTTの値が大きいことが判明しました。

ラズパイで “ifconfig” を出力してみた結果

eth0,eth1 では、RX(受信)通信でframeエラーが発生していました。
※ip6tnl1 で TX(送信)通信でdroppedエラーが発生しています。このことについては改めて書きたいと思います。

2つの結果から通信エラーが発生していました。
以上のことについて・・・自分なりに解決出来ないかと思い試してみました。
そのことについて書きたい思います。

【お願い】
今回の設定内容は自分なりの設定になり、『これが正しい』ということではありません。
内容を訂正する場合が確実にあります。
以下のやり方について、PC,その他のトラブルについては責任を負いかねます。
よろしくお願いします。

【目的】
“PS4 Pro” , “Raspberry Pi 3B+” , “さくらのVPS” の通信エラーが発生していたため、3つのネットワークインターフェースの設定を行う。

【使用機材】
・フレッツ 光ネクスト ファミリー・ハイスピードタイプ/ファミリータイプ 下り:200M/上り:100M (自分の住んでいる地域は・・・関東甲信越です。)
・Raspberry Pi 3B+ 本体 ※1
・USB専用のLANアダプター ※1
・スイッチングハブ ※1
・LANケーブル 3つ ※1
・ディスプレイ(HDMI対応)
・マウス
・キーボード
・PC(windows 7)
・PS4 Pro 一式
※1 製品・機器の規格によりインターネット速度が異なります。ご利用される機器情報を必ず把握をして下さい。

【開発環境】
・さくらのVPS 1G (東京) (サーバーOS: centOS7.5)
・Raspberry Pi 3B+ (OS:NOOBS ver2.8.2)

【IPv6のアドレス取得プロバイダー】
・au one net サービス名:IPv6:「フレッツ光」コース (日本ネットワークイネイブラー株式会社: JPNE)

【設定方法】
Raspberry Pi 3B+ と VPSサーバ で ds-lite(IPv4 over IPv6ルータ) の構築 -conohaサーバ編- 途中結果状態です。
Raspberry Pi 3B+ と VPSサーバ で ds-lite(IPv4 over IPv6ルータ) の構築 -さくらVPSサーバ編- 途中結果状態です。
2つのリンクについてですが、少し変更するところがあります。設定の順番も関係してきますので、改めて書き直します。
また、追加・変更箇所については印をいれています。

1. Raspberry Pi 3B+ の設定
Raspberry Pi 3B+ と Ipoe ds-lite 接続について” の 【設定方法】項目1~6までの設定を行う。

1.2 “eth1” のネットワークデバイスの設定ファイル作成
USB専用LANアダプター ネットワークデバイス “eth1” となります。
このデバイスでは “DHCPサーバ” 構築するための設定になります。

pi@raspberrypi:~ $ sudo vi /etc/network/interfaces.d/eth1

《ファイル内容》

auto eth1
iface eth1 inet static
address 192.168.88.254
netmask 255.255.255.248
mtu 1452

1.3 ネットワーク設定を更新する

pi@raspberrypi:~ $ sudo systemctl restart networking

または

pi@raspberrypi:~ $ sudo ip l set eth1 down
pi@raspberrypi:~ $ sudo ip l set eth1 up

を行う。
たまに、ネットワークデバイスの更新が出来なかったことがあったので、その場合はシステム再起動する。

pi@raspberrypi:~ $ reboot

1.4 DHCPサーバの設定をする
1.4.1 “isc-dhcp-server” のパッケージをインストールする。

pi@raspberrypi:~ $ sudo apt-get install isc-dhcp-server

1.4.2 設定ファイルを編集する。

pi@raspberrypi:~ $ sudo vi /etc/dhcp/dhcpd.conf

《ファイル内容》
最終行に追加する。

subnet 192.168.88.248 netmask 255.255.255.248 {
 option routers 192.168.88.254;
 option subnet-mask 255.255.255.248;
 option domain-name-servers 8.8.8.8;
 range 192.168.88.249 192.168.88.253;
}

1.4.3 更新する。

pi@raspberrypi:~ $ sudo systemctl restart isc-dhcp-server

1.4.4 isc-dhcp-serverのRouting設定

pi@raspberrypi:~ $ sudo ip route add 192.168.88.248/29 mtu lock 1424 dev eth1

※もし、自動的にルーティングの設定されている場合は1回削除してから、新たに1.4.4項目に設定する。
削除する方法

pi@raspberrypi:~ $ sudo ip route del 192.168.88.248/29 dev eth1

2. さくらのVPSサーバ 専用トンネル・ゲートウェイの設定
2.1 カーネルモジュールを設定する。

[user@localhost] sudo modprobe ip6_tunnel

2.2 トンネリングの接続設定をする。

[user@localhost] sudo ip -6 tunnel add ip6tnl mode ipip6 remote 【※5】local 【※6】

※5 Raspberry Pi 3B+ の取得されている IPv6アドレス【】は不要
※6 さくらのVPS の固定ipv6アドレス 【】は不要 ※7
※7 さくらのVPS ではipv6アドレスが 1個 用意されています。

2.3 トンネルインターフェースを有効化する。

[user@localhost] sudo ip link set dev ip6tnl up

2.4 ip6tnlのデバイスのipアドレス設定

[user@localhost] sudo ip addr add 192.0.0.1/30 dev ip6tnl

2.5 sysctl で カーネルパラメーターの設定

[user@localhost] sudo sysctl -w net.ipv4.ip_forward=1
[user@localhost] sudo sysctl -w net.ipv4.conf.all.forwarding=1
[user@localhost] sudo sysctl -w net.ipv4.conf.eth0.rp_filter=0
[user@localhost] sudo sysctl -w net.ipv4.conf.ip6tnl.rp_filter=0
[user@localhost] sudo sysctl -w net.nf_conntrack_max=65535

2.5 NAT設定
ファイアウォールを設定行います。
追加・更新を行います。

[user@localhost] firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv6" source address="【※8】" accept"
[user@localhost] firewall-cmd --reload

※8 Raspberry Pi 3B+ eth0 ipv6アドレス 【】は不要
Raspberry Pi 3B+ と VPSサーバーが通信を出来るよう設定します。

[user@localhost] sudo firewall-cmd --zone=trusted --change-interface=ip6tnl
[user@localhost] sudo firewall-cmd --zone=public --add-masquerade
[user@localhost] sudo firewall-cmd --zone=trusted --add-masquerade
[user@localhost] sudo firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE
[user@localhost] sudo firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i ip6tnl -o eth0 -j ACCEPT
[user@localhost] sudo firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i eth0 -o ip6tnl -m state --state RELATED,ESTABLISHED -j ACCEPT
[user@localhost] firewall-cmd --reload

2.6 Routing設定
さくらのVPS 側のプライベートネットワークのルート側でのルーティング設定

[user@localhost] route add -net 192.168.0.0/16 dev ip6tnl
[user@localhost] route add -net 192.0.0.1/30 dev ip6tnl

※この設定ですが・・・理解できていない部分で。。。一応設定をしています。

Raspberry Pi 3B+ 側のipv4アドレスの通信が出来るように設定します。

[user@localhost] ip route add 192.168.99.248/29 mtu lock 1424 dev ip6tnl

3. Raspberry Pi 3B+ 専用トンネルの設定
3.1 カーネルモジュールを設定する。

pi@raspberrypi:~ $ sudo modprobe ip6_tunnel

3.2 トンネリングの接続設定をする。

pi@raspberrypi:~ $ sudo ip -6 tunnel add ip6tnl1 mode ipip6 remote 【※9】 local 【※10】 dev eth0

※9 conoha VPSサーバ ipv6アドレス 【】は不要
※10 Raspberry Pi 3B+ eth0 ipv6アドレス 【】は不要

3.3 トンネルインターフェースを有効化

pi@raspberrypi:~ $ sudo ip link set dev ip6tnl1 up

3.4. ルーティングの設定をする。
3.4.1 構築したトンネルをデフォルトルートに追加する。

pi@raspberrypi:~ $ sudo route add default dev ip6tnl1

3.4.2 IPv4アドレスのフォワーディングの許可

pi@raspberrypi:~ $ sudo sysctl -w net.ipv4.ip_forward=1

4. PS4 Pro 設定
4.1 “設定” ⇒ ”ネットワーク” ⇒ “インターネット接続を設定する”。
4.1.1 “どのようにネットワークに接続しますか?” ⇒ 【LANケーブルを使う。】
4.1.2 “どちらの方法でインターネット接続を設定しますか?” ⇒ 【カスタム】
4.1.3 “IPアドレス設定” ⇒ 【自動】
4.1.4 “DHCPホスト名” ⇒ 【指定しない】
4.1.5 “DNS設定” ⇒ 【自動】
4.1.6 “MTU設定” ⇒ 【手動】⇒ “1424”
4.1.7 “プロキシーサーバー” ⇒ 【使わない】

以上、完了になります。

今回の原因は・・・
①各ネットワークインターフェース間のMTU値の統一をしていなかった。
②さらに、PS4側のMTU値は ①のMTU値を低い値にしなければならない。
という、確定ではないのですが、現時点の原因と考えています。

WEBサイトで色々と調べて “MTU” の関連がヒットしていました。

NTT東日本 IPv6 IPoE は MTU=1500byte が最大値になるそうです。
VPSとラズパイが ds-lite(IPv4 over IPv6ルータ) に通信が確立した場合は MTU=1452byte が自動的に設定されます。

ラズパイ側で “PINGコマンド” をMTU最適値を調べてみました。
◎IPv6 で ping最適値 を調べる場合

pi@raspberrypi:~ $ ping -c 4 -s 1452 -M do www.google.co.jp

◎IPv4 で ping最適値 を調べる場合

pi@raspberrypi:~ $ ping4 -c 4 -s 1452 -M do www.google.co.jp

【結果】
◎IPv6

PING www.google.co.jp(nrt20s09-in-x03.1e100.net (2404:6800:4004:80b::2003)) 1452 data bytes
72 bytes from nrt20s09-in-x03.1e100.net (2404:6800:4004:80b::2003): icmp_seq=1 ttl=54 (truncated)
72 bytes from nrt20s09-in-x03.1e100.net (2404:6800:4004:80b::2003): icmp_seq=2 ttl=54 (truncated)
72 bytes from nrt20s09-in-x03.1e100.net (2404:6800:4004:80b::2003): icmp_seq=3 ttl=54 (truncated)
72 bytes from nrt20s09-in-x03.1e100.net (2404:6800:4004:80b::2003): icmp_seq=4 ttl=54 (truncated)

--- www.google.co.jp ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 5.968/6.198/6.465/0.186 ms

◎IPv4

PING www.google.co.jp (172.217.161.67) 1452(1480) bytes of data.
ping: local error: Message too long, mtu=1452
ping: local error: Message too long, mtu=1452
ping: local error: Message too long, mtu=1452
ping: local error: Message too long, mtu=1452

--- www.google.co.jp ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3154ms

となります。
では、IPv4のMTU最大値を調べてみました。
結果は・・・“1424”byte となりました。
1452btye – 1424byte = 28byte
この 28byte は “IP ヘッダのサイズはデフォルト 20byte” と “ICMP ヘッダ 8byte” ではないかと。。。。

以上のことにより、MTU値を決まった値にしなければならないと、現時点の結論となりました。
現在の設定でエラーが起きていませんが、経過観察をしています。
ボソ)でも。。。他の問題もあるのでは・・・色々と調べています。

【参考文献】
ネットワークエンジニアとして さん -MTU / MSS / RWIN-
踊るびあほりっく さん -【MTU値】1500,1492,1454?モバイル回線や固定回線ごとのパケットサイズと通信最適化方法-
www.kichise.com さん -Windows7 MTU変更-
cloudpack.media さん -(超メモ)ping とか MTU とかよく解ってなかったのでメモ-
NTT東日本㈱ さん -IP通信網サービスのインタフェース -フレッツシリーズ--
@TD3P さん -ifconfigの出力結果に書いてあること-

【使用サービス情報】
IPv6 test – IPv6/4 connectivity and speed test さん -ipv6 test-
Radish Network Speed Testing さん
SAKURA Internet さん -さくらのVPS-
au さん -プロバイダ au one net-
speedguide.net さん -SG TCP/IP Analyzer-

【商標情報】
ラズベリーパイ財団 さん – https://www.raspberrypi.org/
マイクロソフト さん -windows-
日本ネットワークイネイブラー株式会社 さん -JPNE-
SONY さん -Playstation4-
Sony Interactive Entertainment さん