TailscaleとAWS無料枠EC2でつくる“ほぼ無料”VPN
喫茶店やホテルで無料Wifiに接続しながらECサイトで注文するとき、少しセキュリティへの不安を感じませんか?
かといって商用VPNはコストが高く、携帯回線のテザリングでは料金、速度の問題がある…
そんな理由で、AWSの勉強がてら、TailscaleとAWSの無料枠EC2を組み合わせて構築しました。
セキュリティ向上目的だけではなく、世界各地のExit Nodeを用意することで、地域制限を回避したりする用途にも使えます。
ほぼ無料とは
AWSを初めて使う人は特典で無料枠が付与されます。
これを使うことでVPN利用料が無料になります。(ただしVPN構成設定にかかる手間は費用から除外するものとする)
無料枠は100ドル分で、それを超えると課金されます。
Tailscaleとは
- TailscaleはWireGuardをベースにしたVPNサービス
- 設定をほとんど意識せずにVPNを構成できるのが特徴
- Googleアカウントさえあれば、認証周りの設定を簡単に行えるので、とにかく簡単
公式サイト: https://tailscale.com/
構成のイメージ
VPN構築方法
TailScaleのアカウントを作成
TailScaleの公式サイトにアクセスし、アカウントを作成します。
https://login.tailscale.com/start
もしくは、TailScaleの公式サイトにアクセスして、ヘッダーの「Get Started」からアカウント作成ページを開きます。
お好きなアカウントで登録してください。
スマートフォンにTailScaleをセットアップ
さて、VPNを実際に使用したい機器にセットアップします。
今回iPhoneにTailScaleをセットアップします。
AppStoreで「tailscale」と検索すると出てきます。
ダウンロードして開きます。
開くとウェルカムページが表示されます。「Get Started」を押します。
iPhoneの場合VPN構成の許可を求められます。「許可」を押し、パスコードを入力します。
「Connect」を押して、ログインします。
「続ける」をおすと、ログイン画面に遷移します。
ここで先ほど作ったアカウントの情報を入力します。
ログインしたあと、「Connect」を押します
「Login Successful」の表示が出たら、「×」マークを押していったん閉じます。
すると、現在のTailNet(VPN)に登録されているデバイスの一覧が表示されます。
自分の場合、iPhone-15,AWS EC2(オーストラリア、韓国、東京)、今回これから設定するEC2(ip-...)、私用PC、Xiami-Pad-7がデバイス登録されています。
実際にVPNに接続しているデバイスは、左に🟢表示がされています。
EXIT NODE が Noneになっています。つまり、ここに接続しているデバイス間の通信は暗号化されますが、iPhoneから通常のwebサイトへの通信はまだ暗号化されません。
これを解決するためにAWS EC2 を Exit Node として設定します。
AWSアカウントのセットアップ
次に、VPNからの出口(Exit Node)としてAWSのクラウドPC EC2を使います。
そのためにAWSアカウントのセットアップが必要です。AWS公式が出しているガイドに従って作っていきます。
AWS アカウント作成の流れ
他の方が解説されている方法でも全くかまいません。
1. AWS無料枠のEC2を用意
まず、無料枠で使えるt3.microを1台用意し、そこにTailScaleをインストールしてExitNodeとします。
VPNの出口となるインスタンスです。
まず、AWSコンソール上の検索バーから「EC2」を入力し、EC2の画面に入ります。
つぎにリージョンを選びます。
地域制限回避のために使う場合は、制限がかかっていないリージョンを選びます。
普通に使う場合は、居住地から近いほうが良いでしょう。
右上のリージョン選択ボタンから、選択します。
今回は東京(ap-northeast-1)を選びます。
ここからEC2インスタンスを実際に起動していきます。
「EC2」→「インスタンス」から、「インスタンス起動」ボタンをクリックします。
実際にインスタンス起動画面が開かれると思いますので、そこから始めます。
今回自分はこのインスタンスに「TailScale-Tokyo-ExitNode」と名付けようと思います。
次に画面を下にスクロールして、インバウンドルールを、自IPからの接続のみに制限します。
「任意の場所」から「自分のIP」を選択します。
下にスクロールして、「インスタンス起動」を押します。
キーペアの選択が出くるので、「新しいキーペアの作成」→「キーペア名」を入力(今回はRSA-TailScale-Tokyo としました。)→「キーペアのタイプ」をRSAに→「インスタンスを起動」をクリック
ボタンを押すと、実際に起動されます。
RSAキーも自動的にダウンロードされます。大切に保管してください。
「EC2」→「インスタンス」で起動したインスタンスを確認します。
注 : 作業していないとき、ずっと実行中にしておくと、費用が掛かるので停止しておきます
停止したいEC2にチェック→「インスタンスの状態」→「インスタンスを停止」
2. Tailscaleをインストール
EC2にSSHで入り、公式のインストール手順に沿ってTailscaleを導入します。
SSM セッションマネージャーで接続します。
IAMロールを設定します。対象インスタンスを選択し、「インスタンスの状態」→「セキュリティ」→「IAM ロールを変更」

「新しい IAM ロールを作成」
基本デフォルトで作成します。一応、ポリシーに「AmazonSSManagedInstanceCore」が割り当てられていることを確認してください。(デフォルトで設定されています)
下までスクロールして、「ロールを作成」します。
先ほど作成したロールが選択されていることを確認して、「IAMロールの更新」を押します。
(今回、自分はデフォルトの「instanceRole」と名付けました)
対象のEC2インスタンスをにチェックを入れ「接続」を押します。
次に、「SSM セッションマネージャー」を選択→
「接続」を押します。
注:セッションマネージャーが接続されるまで時間がかかります。(自分の環境だと、15分ほど待ちました。)
「セッションマネージャーの接続ステータス」が「接続済み」になるまで待ってください。
接続できると、以下のようなコンソール画面が開きます。
TailScale公式のインストール方法に従い、以下のコマンドを実行します。
curl -fsSL https://tailscale.com/install.sh | sh
コマンドをコピペして実行します。(数分ほど時間がかかります。)

完了すると以下のような表示になります。
次に、以下のコマンドでTailScaleを起動します。
sudo tailscale up
すると、URLを開いて認証するよう言われるので、URLを開きます。
作成したアカウントでサインインして下さい。
Gmailでログインすると、以下のような表示になります。
「Connect」を押すと「Login Successful」の表示がされ、自動的に管理コンソールに飛ばされます。
3. Exit Nodeを設定
公式のExitNodeのセットアップガイドに従い、
SSMセッションマネージャーで以下のコマンドを実行してExit Node(VPNの出口)として設定します。
IPフォワーディングの有効化
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
実際に実行すると以下のようなコンソール画面になります。
sudo tailscale set --advertise-exit-node
このコマンド実行時は何も表示されないようです。
管理コンソールに入り、今回設定したAWS EC2 のデバイスから、「・・・」→「Edit route settings…」を選びます。
ここで、EC2の名前は、EC2のグローバルIPが自動的に割り当てられます。(例:ip-1xx-xx-xx-xxなど)
「Use as exit node」を設定し、「Save」を選択
対象の EC2 が Exit Node として設定されていることを管理コンソールから確認します。
次に、iPhoneを開いて、先ほど設定したExit Node EC2を使用します。
一旦、トグルボタンをOFF→ONにして再度VPNに接続します。(先ほどの設定を読み込ませるため)
EXIT NODE 「None」をタップして、Exit Node設定画面に進みます。
先ほど設定した EC2 を選びます。
Recommendedでおすすめされているか、もしくは下の一覧に出ています。
Exit Node に先ほど設定した EC2 が使われていることを確認します。これで設定完了です。
ネットワークの確認
さて、先ほど設定した Exit Node が本当に使われているか確認しましょう。
WhereAmI.comで自分のIPがどう認識されるか確認します。
VPN設定をしていないとき、WhereAmI.comに接続して位置を見ると、ISP(プロバイダー)は NTT Communications Corporation で、Cityは横浜と表示されます。

Exit Node をON して VPNに接続したとき、ISP は Amazon.com, Inc. で、Cityは東京です。

つまり、Exit Node を設定した通り、ネットワークの出口が東京に設置された Amazon の EC2 からになっていることがわかります。
この確認では、Exit Node とネットワークが 構成のイメージ で紹介した通りに設定されていることを確認しました。
ただ、実際にデータが Exit Node まで暗号化されていることの確認にはなっていません。この確認は、申し訳ありませんが、FutureWorkとさせてください。
(とはいえ、機能の根幹部分なのでTailScale社が確認していると思います。)
注意点
- 使わないときはExit Node EC2 インスタンスの停止をしておく
- EC2の クレジットが溜まっていないと動作が低速になる
- 「完全に無料」ではなく、あくまで“ほぼ無料”






























