🌐

IPv6しか無いサーバに繋ぐ為にTailscaleでなんとかした話

2023/08/25に公開

おはこんばんにちわ

先日IPv6でしかアクセスできないサーバに自宅PCからアクセスする必要があったのですが自宅のネットワークがIPv6未対応で繋がりませんでした

そこで

「TailscaleでIPv6持ってるマシンをexit nodeに指定したら行けるんじゃね?」

って思ってやってみたら出来たので備忘録として残します。

VPSを契約する

私はConohaのVPSをもともと使っていたのでそこに新たに一番安いインスタンスを作成しました。

一時的に使うので割引きっぷ等は使わず1時間1.3円の従量課金でUbuntuを契約しました。

TailscaleをVPSと自宅PCに入れる

私はどちらもLinuxなので以下の手順ですんなり入りました。

https://tailscale.com/download/

sudo tailscale up

で起動すると初回はURLが出てくるのでそこにブラウザからアクセスしてログインすると以降は起動時にVPNに参加した状態を維持出来ます。

VPSのVMにIPv6アドレスを設定

他のVPSはどうなってるかわからのないのですがConohaのVPSでUbuntuを立ち上げるとデフォルトではIPv6のアドレスは割り振られていないので手動で割り振る必要があります。

なのでまずはConohaのVPS管理画面で立ち上げたVPSのネットワーク情報から利用可能なIPv6アドレスを確認します。

この画面の情報を元にVPSの設定ファイルを以下のように書き換えます。

/etc/netplan/10-gmovps.yaml
 network:
     ethernets:
         eth0:
             addresses:
             - 「使いたいIPv6アドレス」/64
             dhcp4: true
             dhcp6: false
             accept-ra: false
             optional: true
             gateway6: 「ゲートウェイアドレス」
     version: 2

そしてコマンドで設定を反映

sudo netplan apply

反映を確認します。

ifconfig eth0

下記のような情報が出てくればOKです。

inet6 「使いたいIPv6アドレス」 prefixlen 64 scopeid 0x0<global>

VPSをExit Nodeとして設定する

この設定をするとネットワークがExit Nodeに指定されたサーバを介して行われるようになるので
IPv6アドレスを持っていないマシンでもExit NodeがIPv6のアドレスを持っていればアクセスできるようになります。

まずはパケットの転送を許可しましょう

echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf

これでクライアントのパケットを転送することが可能になります。

私はVPSに割り当てられたIPに対する接続を管理画面から全閉じしてTailscaleからしかアクセスしないようにしているのでVPSのFireWallは切っていますがFireWallが有効な場合そちらで弾かれる可能性もあります。

でTailscaleをExit nodeとして起動し直します。

sudo tailscale down
sudo tailscale up --advertise-exit-node

この段階ではExit nodeに名乗りを上げただけなので続いてTailscaleの管理画面にて許可する必要があります。

https://login.tailscale.com/admin/machines

この画面にログインすると以下のように!マークがついているマシンがあるので

そのマシンの設定からEdit route settingsを選び以下のようにUse as exit nodeを有効にしてください

これでVPSがExit Nodeとして機能するようになりました。

自宅PCからExit Node経由で通信するようにする

とりあえず現状IPv6につながるか確認します

$ ping6 -c 5 ipv6.google.com
ping6: connect: ネットワークに届きません

https://ipv6test.google.com/intl/ja/index.html

はい、繋がりませんね

ということでExit node経由で通信するようにしてみます。

まず、VPS上で以下のコマンドでExit NodeのIPアドレスを取得します。

$ tailscale ip
XXX.XXX.XXX.XXX
xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx

そして自宅PCのTailscaleでXXX.XXX.XXX.XXXをExit Nodeとして利用するようにTailscaleを再起動します。

sudo tailscale down
sudo tailscale up --exit-node=XXX.XXX.XXX.XXX

これでIPv6でアクセス出来るようになっているはずなので確認します。

$ ping6 -c 5 ipv6.google.com
PING ipv6.google.com(nrt12s45-in-x0e.1e100.net (2404:6800:4004:825::200e)) 56 data bytes
64 bytes from nrt12s45-in-x0e.1e100.net (2404:6800:4004:825::200e): icmp_seq=1 ttl=54 time=11.2 ms
64 bytes from nrt12s45-in-x0e.1e100.net (2404:6800:4004:825::200e): icmp_seq=2 ttl=54 time=11.4 ms
64 bytes from nrt12s45-in-x0e.1e100.net (2404:6800:4004:825::200e): icmp_seq=3 ttl=54 time=11.7 ms
64 bytes from nrt12s45-in-x0e.1e100.net (2404:6800:4004:825::200e): icmp_seq=4 ttl=54 time=11.4 ms
64 bytes from nrt12s45-in-x0e.1e100.net (2404:6800:4004:825::200e): icmp_seq=5 ttl=54 time=12.0 ms

--- ipv6.google.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4022ms
rtt min/avg/max/mdev = 11.208/11.535/12.009/0.276 ms

出来た出来た〜

おしまい

P.S

ちなみにスマホにクライアント入れてExit Node経由させれば通信が暗号化出来るのでフリーWifi使う時にも使うようになったので、今は常時起動してるVPSにこの設定入れて使ってます。

Discussion