🐈‍⬛

中国国内からGoogleやTwitterにアクセスできるようにShadowsocksのサーバーをTerraformで構築する話

2023/07/12に公開

背景

近々、一ヶ月ほど中国に行く予定があります。その間、オンラインミーティングを続ける必要があるのですが、中国からだとGoogleやTwitterなどに直接アクセスできないです。つまりは Google Meet でオンラインミーティングできない訳ですね、困りました。

Shadowsocks というツールを使用すれば、ネットワークの制限を迂回できるようなので、困らないように事前にサーバーを立てておきます。

手作業のインフラ管理はしたくないので、Terraform で定義します。

まずは結論から

Terraform 定義はこちらです。設定書き換えるだけでデプロイできます。

https://github.com/MOCA-ORG/shadowsocks

Shadowsocks?

Shadowsocks A fast tunnel proxy that helps you bypass firewalls

ひとことで言うと、ファイアウォールを迂回するためのプロキシサーバーです。

公式サイトによると下記の特徴があります。

  • とても高速
  • 様々な暗号化アルゴリズムを選択できる
  • CPU&帯域の使用量が低い
  • クロスプラットフォーム

使い方(サーバー構築)

前提

terraform コマンドがインストール済みであり、認証情報も設定されていることを想定しています。

コードの取得

まずGitHubからコードを取得します。

$ git clone https://github.com/MOCA-ORG/shadowsocks.git

設定ファイルの編集

README.md に従って設定ファイルを用意します。

cp sample.tfbackend ./terraform/production.tfbackend
cp sample.tfvars ./terraform/production.tfvars

production.tfbackendは Terraform の State ファイルの保存場所を指定するファイルです。

下記のような形になっているので、適切なリージョンとバケット名を指定して、書き込み権限のあるS3バケットを指定します。

bucket = "name-of-bucket"
key    = "shadowsocks.tfstate"
region = "ap-northeast-1"

production.tfvars はインフラ構成の設定です。

# EC2にSSH接続するために普段使用しているキーペアの名前を指定します。
key_name=""
# サーバーを配置するVPCのIDを指定します。
vpc_id=""
# サーバーを配置するパブリックサブネットのIDを指定します。
subnet_id=""
# SSH接続を許可する信頼できるIPのリストを指定します。
# 1.1.1.1 のIPが自身の信頼できるIPである場合は trusted_ips=["1.1.1.1/32"] を設定します。
trusted_ips=[]
# サーバーにドメインを割り当てるため、Route53のゾーンネームを指定します。
# 実際にRoute53上にゾーンが存在している必要があります。
# example.com を設定した場合、サーバーは shadowsocks.example.com のドメインを使用します。
route53_zone=""

デプロイ

Terraform のディレクトリに移動します。

cd ./terraform

Terraform の初期化

terraform init -reconfigure -backend-config=production.tfbackend

デプロイ

terraform apply -var-file production.tfvars

デプロイコマンドを実行すると、パスワードの入力が求められますので、任意のパスワードを入力します。(このパスワードはShadowsocksサーバー接続時に使用されます)

使い方(クライアント)

クライアントのインストール

公式サイトにいくつかのオープンソースのクライアントが紹介されています。他にも Shadowsocks で検索すれば色々なクライアントアプリがあります。

https://shadowsocks.org/doc/getting-started.html#gui-clients

クライアントの設定例(Mac: shadowsocksX-NG)

(正しい接続情報を設定すれば、どんなクライアントからでも繋がります。)

まず、サーバーの設定を開きます。

次に、接続情報を設定します。

  • Address:
    • shadowsocks + サーバーの設定ファイルに記載したRoute53のゾーンネーム
  • Port:
    • デフォルトは 1480
  • Encryption:
    • aes-256-gcm
  • Password:
    • サーバーデプロイ時に入力したパスワード

認証情報を設定した後に、Shadowsocks クライアントを有効化すれば、自身のIPアドレスをチェックできるサイトでIPアドレスが変わったことを確認できます。

この状態であれば、中国国内からでも Google や Twitter などにアクセスすることができます。

最後に

一回汎用的にTerraformで定義してしまえば、いつでも使いたい時に使えるので、本当に便利です。

サーバー内のシステム構築も user_data で実装すれば、EC2をDockerのように楽に扱えます。

Discussion