スポンサーリンク

WireGuard で VPS と IPv6 over IPv4

network

結構無理やり感あるけど、なんだかわからんが動いてればヨシの精神でヨシ

外部のVPSを経由してIPv6で外に出てみよう!

普通のWireGuardでのVPS設置は次のページです。
https://wp.hima-jin.info/2021/08/05/426/

結局不便なので光BBユニットレンタルしました。ルーターの項目を次の記事に書きました。100Mしか出ないもん…
https://wp.hima-jin.info/2020/11/01/204/

誤自宅にはIPoEはあるのにインターネット疎通していないので NGNで閉塞しています。
ということでやってみた際のメモ書きのようなものです。

色々と変なことやってるのでツッコミ歓迎

はじめに構成など

最終的な構成としては

自宅内LAN → RaspberryPi → Internet(IPv4) → VPS → Internet(IPv6)

というかなり変なことしてます。
当然レスポンスとかはいいわけもないです。

またパススルー方式などが一般的らしいのですが、やり方がよくわからないためIPv4でも親しみ長いNATをして構築を行いました。
VPS自体には16のIPv6レンジ割当があるので本来であれば通したかったり。

前準備

まずルーターがパススルーでIPv6を配布している場合は停止させます。

停止できない場合は間にRaspberryPiを挟んでUSBのLANを増やし、ブリッジしてIPv6パケットを全破棄させる必要があるので注意。

ebtables -t broute -A BROUTING -i wan -p IPv6 -j DROP

なんか他のいい方法あるかわからないので捨てます。
下準備としては以上で。

WireGuardのインストール

まずWireGuardでVPSとRaspberryPiを繋ぎます。

インストール手順がこちら https://www.wireguard.com/install/

使ってるのはRaspbianとUbuntuです。
Raspbianは本家にはインストール方法が載っていませんでしたので、gitから拾ってきてインストールを行います。

git clone https://git.zx2c4.com/wireguard-linux-compat
cd wireguard-linux-compat/src
make
make install

git clone https://git.zx2c4.com/wireguard-tools
cd wireguard-tools/src
make
make install

以上でWireGuardインストール完了です。

WireGuardの構成

細かい部分は省きますが概要としては
トンネル間は10.0.0.0/8 fd00::/64で接続をする。
サーバー側でLAN内の機器監視をしているためアクセスを通す必要があるので、AllowedIPsに192.168.1.0/24のレンジ入れる。
ip6tablesでwg0でLAN内から来たパケットは全部eth0へ向かうようにnatを記載

WireGuardの設定

VPS側はサーバーとして動かします。
/etc/wireguard/wg0.conf

[Interface]
PrivateKey = <PrivateKey>
Address = 10.0.0.1, fd00::1/64
ListenPort = 51820
MTU = 1420

PostUp   = ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -A FORWARD -o %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -D FORWARD -o %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = <PublicKey>
AllowedIPs = 10.0.0.2/32, 192.168.1.0/24, fd00::/64

次にRaspberryPi側からVPSへ接続をするように設定します。
IPv6のデフォルトルート扱いにfd00::/0を入れて全パケットがwg0へ行くようにしている。
滅多に使わないがVPS経由でLAN内にモバイル機器をつなぐ場合があるため、その時用のiptablesでnatを記載してある
LAN内(eth0)から来たIPv6パケットはwg0へ向かうようにnatを記載
LAN内であってもポートを開けたり等特に必要無いので楽です。

[Interface]
PrivateKey = <PrivateKey>
Address = 10.0.0.2, fd00::2/64

PostUp = iptables -A FORWARD -i %i -j ACCEPT;iptables -A FORWARD -o %i -j ACCEPT;iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;ip6tables -t nat -I POSTROUTING -s fd00::/8 -o wg0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE;ip6tables -t nat -D POSTROUTING -s fd00::/8 -o wg0 -j MASQUERADE

[Peer]
PublicKey = <PublicKey>
EndPoint = <ServerIP>:51820
AllowedIPs = 10.0.0.1/32, 192.168.2.0/24, fd00::/0
PersistentKeepAlive = 25

書き終わったら それぞれ wg-quick up wg0 でリンクを張ります。

リンクが張れたら wg コマンドで接続状態が見れるので、ちゃんとIPが見えて送受信しているのを確認しましょう。

自動実行は sysctl enable wg-quick@wg0 とでもしておけばいいらしいです。

radvdの設定

次にradvdでRAを配布するように設定してデフォルトルートを通知する。

WireGuard内ちゃんと通知されてないような気がしますが、動いてないと正常に出れませんのでVPSとRaspberryPi両方にインストールします。

apt install -y radvd

インストール後は/etc/radvd.confをゴリゴリ書く必要があります。

interface wg0
{
        AdvSendAdvert on;
        prefix fd00::/64
        {
                AdvOnLink on;
                AdvAutonomous on;
                AdvRouterAddr off;
        };
};

RaspberryPi側

interface eth0
{
        AdvSendAdvert on;
        AdvDefaultPreference high;
        AdvLinkMTU 1420;
        MaxRtrAdvInterval 100;
        MinRtrAdvInterval 30;
        prefix ::/64
        {
            AdvOnLink on;
            AdvAutonomous on;
            AdvRouterAddr off;
        };
        route ::/0
        {
            AdvRoutePreference high;
        };
        RDNSS 2606:4700:4700::1111 2606:4700:4700::1001
        {
        };
};

書き終わったら動作させます。

systemctl enable radvd
systemctl start radvd

とりあえずfd00で適当に割り当ててますが、全部VPS側に流してしまうため特に意味はありません。

sysctlの調整

実質ルーターなのでそれぞれの/etc/sysctl.confに設定を追加します。

net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.forwarding = 1

接続の確認

以上で接続したクライアントPCでipv6testやipv6.google.comに向けてping等正常に通るか確認です。

問題なければちゃんと通過すると思いますん

ping ipv6.google.com

ipv6.l.google.com [2404:6800:4004:80f::200e]に ping を送信しています 32 バイトのデータ:
2404:6800:4004:80f::200e からの応答: 時間 =6ms
2404:6800:4004:80f::200e からの応答: 時間 =6ms
2404:6800:4004:80f::200e からの応答: 時間 =6ms
2404:6800:4004:80f::200e からの応答: 時間 =6ms

2404:6800:4004:80f::200e の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 6ms、最大 = 6ms、平均 = 6ms

ロスが多い場合はMTUを1420以下で調整してやるといいのかもしれませんが、どの程度に調整したらよいのかはよくわかりません。
知識ゼロで構築したのでダメ出し歓迎状態です。

コメント

タイトルとURLをコピーしました