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
がなければwget
をsudo 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
もしくsu
でroot
になってから実行します。
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.conf
にnameserver 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へのゲートウェイです。
コメント