VPSからVPNサービスに接続したい時に必要な設定

VPN

VPSからVPN接続サービスにアクセスしたい

VPS(Linux)からVPN接続サービスを利用する場合の方法を解説します。

VPN接続サービスは2年契約で1ヶ月あたり$1.99(200円くらい)という激安だけど高性能なSurfShark VPNを使います。

VPSは国内で最も安いVPSサーバーであるWeb ARENA Indigoを使用します。

という構成で、通信を秘密にして色々できるVPSサーバーを作成します。

WebARENAの新しいVPSサービスIndigoに登録してみてわかったメリット・デメリットを徹底解説

SurfShark VPNをubuntuで利用する

SurfSharkにはUbuntu(Debian)用のパッケージが用意されていますのでそれを使います。

wget https://ocean.surfshark.com/debian/pool/main/s/surfshark-release/surfshark-release_1.0.0-1.1_amd64.deb

wget.debパッケージをダウンロードしてきます(wgetがなければwgetsudo apt-get install wgetしよう)。

sudo apt-get install ./surfshark-release_1.0.0-1.1_amd64.deb
sudo apt-get update
sudo apt-get install surfshark-vpn

⇩要注意、ルーティングの設定を行っていないとssh接続が切断され、sshでリモート接続できなくなります。

sudo surfshark-vpn attack

VPSインスタンスを再起動するとssh接続できるようになるので、やらかした人はVPSのコントロールパネルから再起動してください(どのVPSでもそのVPSのWebサイト上からVPSのコンソール画面にログインできるようになっています)。

TCPで接続するかUDPで接続するか問われますが、

TCPで接続しましょう(0を入力します)。

TCPだと60Mbpsの速度がでたのにUDPだと<2Mbpsしか速度がでませんでした。

ちなみに、

surfshark-vpn attackで最寄りのVPNサーバーに接続されます。

surfshark-vpn downでVPNを切断できます。

sshの切断が起きないようにルーティングの設定を行います。

VPNに接続するとSSH接続が切れる

何も対処をせずに、VPNに接続しようとするとSSH通信が切れます。

VPNは全ての通信をVPNトンネルを使ってVPN接続事業者のサーバーに接続しようとするので、ssh接続のレスポンスもその経路に流そうとして、SSH通信が切断されます。

というわけで、ssh接続に関してはデフォルトゲートウェイを使うようにVPSに教えて上げる必要があります。

グローバルIPアドレスが140.227.55.14の場合

ip rule で グローバルIPアドレスからアクセスされる128というtableを作成します。

sudo もしくsurootになってから実行します。

ip rule add table 128 from 140.227.55.14
ip route add table 128 to 140.227.55.14 dev ens10
ip route add table 128 default via 140.227.55.1

インスタンスを再起動しても設定がされるようにする

.profileに以下を追記しています。再起動時にもこのシェルスクリプトが読み込まれてルーティングが再設定されます。

sudo ip rule add table 128 from 140.227.55.14
sudo ip route add table 128 to 140.227.55.14 dev ens10
sudo ip route add table 128 default via 140.227.55.1

tableの中身を確認する方法

ip route show table 128

tableの中身を消す場合

これはルーティングの設定を消したい場合の方法です。

消したくない人は実行しないでください。

ip route flush table 128

これでルーティングの設定は終了です。

IPルーティングに関するメモ

デバイス名はip addrで調べられます。

このVPSでは1: lo, 2: ens10でした。

loはローカルループバックと呼ばれる仮想的なネットワークデバイス名です。

ローカルループバックとは自分自身を示す仮想的なIPアドレスです。

127.0.0.1というIPアドレスがよく見られます(localhostのことですね)。

2番目にでてきたネットワークデバイス名がens10です。

以前はeth0がよく使われていましたが、最近では名前が変わったようです(命名規則ができたらしい)。

このens10に140.227.55.14のIPアドレスが割り当てられています(これがこのVPSインスタンスに割り当てられたグローバルIPアドレスのことですね)。

dev:対象デバイス

ip ruleについて

$ ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default

先頭の行の数字は優先度を表している。数字が小さいほど優先度が高い。

route -nでルーティングテーブルを表示

VPN接続後のルーティングテーブルは最終的にこんな感じになります。

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.8.8.1        128.0.0.0       UG    0      0        0 tun0
0.0.0.0         140.227.55.1    0.0.0.0         UG    0      0        0 ens10
10.8.8.0        0.0.0.0         255.255.255.0   U     0      0        0 tun0
45.86.112.245   140.227.55.1    255.255.255.255 UGH   0      0        0 ens10
128.0.0.0       10.8.8.1        128.0.0.0       UG    0      0        0 tun0
140.227.55.0    0.0.0.0         255.255.255.0   U     0      0        0 ens10

Use Ifaceカラムのtun0というのがVPNサーバーへのトンネル通信経路です。

ネームサーバーがつながらなくなりますので/etc/resolv.confに追記が必要

ネームサーバーの所在を指示するために/etc/resolv.confに

nameserver 8.8.8.8

を追記する必要があります。

8.8.8.8はgoogleのネームサーバーです。

ネームサーバーとはドメイン(例えばgoogle.com)への接続要求に対してIPアドレスを返します。

以下のようのsurfshark.shを書いてこれを実行しています(sudo sh surfshark.sh)。

VPN接続後に/etc/resolv.confnameserver 8.8.8.8を書き込むという設定です。

これで、明示的にgoogleのネームサーバーにドメインのIPアドレスを聞きに行くことになります。

surfshark-vpn attack <<EOF
1
EOF
echo "nameserver 8.8.8.8" > /etc/resolv.conf

tracerouteで実際に経路がVPN経由になっているか確認

ssh接続とVPN接続の共存をはかってきましたが、実際にうまくいっているか確認してみましょう。

ssh接続に関しては、リモート環境でコマンドが打ててる時点でOKです。

VPN接続に関しては実際にtracerouteというコマンドで経由されているIPを辿ってみましょう。

$ traceroute -n google.com
traceroute to google.com (172.217.161.78), 30 hops max, 60 byte packets
1 10.8.8.2 2.154 ms 2.123 ms 2.073 ms
2 41.83.223.2 10.615 ms 10.672 ms 10.930 ms

こんな感じで10.8.8.2で始まるIPアドレスでスタートして、2番目がVPSのグローバルipアドレスではなくSurfShark VPNの物に変わっていればOKです。

10.x.x.xは典型的なVPNへのゲートウェイです。

コメント