WireGuardベースのTailscaleを使ってAmazon Lightsail上にVPNサーバを10分で作る

VPSサービスのAmazon Lightsail上にWireGuardベースのTailscaleをインストールしてVPNサーバをシュッと作る
2022.03.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon LightsailTailscaleを使い、AWS上でVPNサーバーをシュッと構築する方法を紹介します。

Amazon Lightsail

Amazon Lightsailは、AWSが提供するVPSサービスです。 AWSは世界各地にデータセンターを集積したリージョンが存在します。

VPNサーバを特定のリージョンに作成すると、VPN接続時はそのリージョンのあるエリアからアクセスしていることになります。

東京リージョンにVPNサーバを構築すれば、日本ローカルのサービスにアクセスしたり、ソーシャルメディアが規制されているエリアに滞在中の迂回策としても利用できます。

参考 : Amazon Lightsail を利用可能なリージョン

Tailscale

Tailscale はデバイス・アプリケーション同士をP2Pのメッシュネットワークで通信させるVPNサービスです。 Linuxカーネルにも組み込まれているWireGuardをベースに実装されています。

デフォルト設定では、スプリットトンネル的に、Tailscaleネットワーク向けトラフィックにのみ Tailscaleは割り込みます。

Exit Node機能を利用すると、Tailscaleネットワーク外へのトラフィック(0.0.0.0/0;デフォルトルート)をTailscaleネットワークの特定のノード(exit node)に向けることができます。

※ 図の引用元 Exit Nodes (route all traffic) · Tailscale

やってみた

今回は Tailscale の exit node を東京リージョンの Amazon Lightsail インスタンス上に作成し、Tailscale をインストールしたクライアントからこのインスタンスのIP経由でインターネット通信できることを確認します。

Tailscaleのアカウント開設

まずは次の URL から Tailscale のアカウントを開設します。

https://tailscale.com/start

Google/Microsoft/GitHubのアカウントでSSOします。

また、接続に利用する端末にTailscaleエージェントをインストールしてください。

認証キーの事前発行

Tailscaleネットワークに新しいノードを参加させるには、基本的には、インタラクティブに認証させる必要があります。

今回は、CloudFormation のプロビジョニング中に認証も済ませたいため、認証キーを事前に発行します。

管理コンソールのSettings → Keys → Auth Keys から認証キーを発行します。

  • 認証キーを使い回さないため、Reusable : Off
  • exit node は一時停止する可能性もあるため、 Ephemeral : Off

とします。

認証キーをあとから再取得することはできません。ご注意ください。

参考 : Auth keys · Tailscale

AWS CloudFormationで Lightsail サーバーを起動

Amazon CloudFormation は AWSリソースを構築する IaC サービスです。

次のテンプレートをお好みのリージョン(例えば東京)から実行します。 テンプレート最終行の --authkey tskey-XXX には、先の手順で取得した認証キーに置き換えてください。

tailscale.yml

AWSTemplateFormatVersion: "2010-09-09"
Description: Tailscale

Resources:
  TailscaleNode: 
    Type: AWS::Lightsail::Instance
    Properties:
      BlueprintId: ubuntu_20_04
      BundleId: nano_2_0
      InstanceName: TailScaleExitNode
      Networking: 
        Ports:
          - AccessDirection: inbound
            AccessFrom: "Anywhere (0.0.0.0/0)"
            AccessType: Public
            Protocol: udp
            FromPort: 41641
            ToPort: 41641
      UserData: |
        #!/bin/bash -xe

        # enable ip forwarding
        echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
        echo 'net.ipv6.conf.all.forwarding = 1' >> /etc/sysctl.conf
        sudo sysctl -p /etc/sysctl.conf

        # install tailscale
        curl -fsSL https://tailscale.com/install.sh | sh

        # register node
        tailscale up --advertise-exit-node  \
          --hostname=lightsail-exit-node \
          --authkey tskey-XXX # 認証キーを入れ替える

具体的にやっていることは以下です。

  • Amazon Lightsail Nano を起動
    • $3.5/月
    • 512 MB, 1 コアプロセッサ、20 GB, 毎月1TBまでデータ転送無料
  • OS に Ubuntu 20.04を利用
  • IP フォーワードを有効
  • tailscale のインストール
  • ノードを exit-node として登録
  • UDP 41641ポートへのインバウンド通信を許可(Tailscaleの要件)

CloudFormationスタックのステータスが CREATE_COMPLETE になっていることを確認し、LightSail インスタンスも Running になっていることを確認してください。

Tailscaleコンソールから exit node の承認

CloudFormation で作成したノードは、起動時に exit node となるようにリクエストしています。 Tailscaleコンソールからこのリクエストを承認します。

exit nodeは「lightsail-exit-node」のノード名で作成しています(--hostname=lightsail-exit-node)。

Machines 一覧に、新しいノードが追加されていることを確認し、Edit Route Settings から "Use as exit node" をチェックします。

クライアントのルーティングモードを変更

Tailscaleクライアントから Exit Node のメニューを確認すると、先程登録した exit node(lightsail-exit-node) を選択できるようになっています。

このノード経由でインターネット通信するよう変更しましょう。

次の URL ような、IPアドレスの場所・所有者を解析するサービスにアクセスし、IPアドレス・ロケーションが構築したAmazon Lightsailのインスタンス・リージョンのものに変わっていることを確認しましょう。

https://www.ip2location.com/demo

利用費

本ソリューションの TailscaleとAWSの利用費を試算します。

Tailscale の利用費

個人用途で少数のデバイスでTailscaleを利用する限り、Tailscaleの利用費は無料です。

Pricing · Tailscale

AWS の利用費

今回利用した Amazon Lightsail nano スペックの 1ヶ月の利用費は $3.50 です。 この中には、1TBのデータ転送量も含まれています。

そのため、ヘビーに使わない限りは、仮に起動し続けても、月の利用費は $3.50 程度に収まります。

VPNを利用しないときはLightsailを停止すると、利用費は更に安くなります。

VPS, web hosting pricing—Amazon Lightsail—Amazon Web Services

まとめ

TailscaleのExit Nodeを利用したVPNソリューションを紹介しました。

WireGuardに慣れた人なら、0から構築することも可能でしょうが、TailscaleとAmazon Lightsail/CloudFormationを組み合わせると、簡単かつスピーディーに構築できます。

それでは。

参考