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

# 背景

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

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

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

# まずは結論から

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

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

# Shadowsocks？

> Shadowsocks A fast tunnel proxy that helps you bypass firewalls
> 

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

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

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

# 使い方(サーバー構築)

## 前提

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

## コードの取得

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

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

## 設定ファイルの編集

[`README.md`](http://README.md) に従って設定ファイルを用意します。

```bash
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 のディレクトリに移動します。

```bash
cd ./terraform
```

Terraform の初期化

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

デプロイ

```bash
terraform apply -var-file production.tfvars
```

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

![Screenshot 2023-07-11 at 23.27.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468780/58a2e576-0f06-6da8-dc50-c739bef5a62d.png)

# 使い方(クライアント)

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

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

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

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

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

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

![Screenshot 2023-07-12 at 0.47.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468780/c3767043-5b3f-0a1c-6638-8ec4d58c8465.png)

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

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

![Screenshot 2023-07-12 at 0.49.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468780/3c8e66d8-8692-8148-45b1-dfcf728c5262.png)

認証情報を設定した後に、Shadowsocks クライアントを有効化すれば、[自身のIPアドレスをチェックできるサイト](https://www.cman.jp/network/support/go_access.cgi)でIPアドレスが変わったことを確認できます。

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

![Screenshot 2023-07-12 at 0.54.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468780/c21d53a2-caae-08fc-35c5-08727e79e56c.png)

# 最後に

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

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