結構無理やり感あるけど、なんだかわからんが動いてればヨシの精神でヨシ
外部の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以下で調整してやるといいのかもしれませんが、どの程度に調整したらよいのかはよくわかりません。
知識ゼロで構築したのでダメ出し歓迎状態です。
コメント