[中国金盾][VPN][ShadowsocksR][BBR] VPNを自分構築してみる


# はじめに

中国では2018年7月から、一層ネットワークの検閲が厳しくなってきました。
以下はVPN大手VyprVPNを運営するgoldenfrogのブログです。
「[Chinese Government Increases VPN Blocking by 300%](https://www.goldenfrog.com/blog/china-vpn-blocking-storm)」

筆者は、VyprVPNを使っていますが、同時に自分でGMOの運営する[ConoHa](https://www.conoha.jp/)を使って、
日本にshadowsocksを使ってプロキシサーバーを立てています。
しかし、７月以降はどちらもパケットロスが多くなり、Youtubeをストレスなく見るのも困難になってきました。

改善を図るべく、色々探しました。その結果以下の記事に辿り着きました。
「[GoogleのTCP BBRでTCPを高速化しProxyもその恩恵にあずかる](https://qiita.com/fallout/items/92b2099ab5e16cfeb1f9)」
BBRはTCPの輻輳制御アルゴリズムの一種です。「輻輳制御」とはTCP通信（パケット）が混雑したときにどう制御するかということです。
国外への通信はパケットが簡単にロストしたりして、通信が遅延しがちです。
中国から国外に通信するときは特に顕著です。
これを自前のプロキシサーバーに導入したところ2~3倍の効果が見られました。

そこで、中国でVPNに悩んでいる人に少しでもお役に立てればと、VPNサーバーの構築方法及び、BBRの導入方法について
説明したいと思います。

ちなみに、個人のはてなブログにはAWS上にshadowsocksサーバーを構築する記事を書きましたので、エンジニアの方はそちらもどうぞ参考にされてください。
https://nishiyama.hatenablog.com/entry/shadowsocks-on-aws

では話を戻しまして、構成は以下のようになっています。

- ConoHa VPS
- CentOS
- BBR
- ShadowsocksR

サーバーはConoHaから借ります。メリットは、サーバーの場所を日本・シンガポール・アメリカから選べること。サーバーの再構築で、新しいIPアドレス付番されること。WEBコンソールがあることなどです。あと従量課金です。
VPNアプリは、ShadowsocksRを採用します。導入しやすく、安定性も高いです。
これにより、全ての作業をWEBブラウザ上で行うことが出来ます。

Shadowsocksのメリットは以下を参考にして下さい。
[もうVPNは不要！？新接続方式Shadowsocksを使ってみたら驚愕した](https://china-log.com/shadowsocks)

# ConoHa VPSの準備
ConoHaはGMOが運営するVPSサービスです。クラウド上のサーバーを貸してくれます。
サーバーは、執筆時点で東京、アメリカ、シンガポールから選べて、
東京の１GBモデルで、1時間1.3円となっています。1ヶ月最低900円と1000円未満でサーバーを1ヶ月運用することができます。

以下がConoHaのホームページです。
https://www.conoha.jp/
まず登録しましょう。

## 料金体系
今回はサーバースペックは貧弱でいいので、512MBのプランで結構です。
従量課金制ですので、サーバーを動かしている時間に対して課金されます。注意点は、サーバーを停止していても「存在している」だけで課金は発生します。ですので、不要になったサーバーは破棄しましょう。
![ConoHa_fee.png](https://qiita-image-store.s3.amazonaws.com/0/81962/d093f125-d342-2585-8b96-f9f5bb83b852.png)


# サーバーの作製
ダッシュボードからサーバーを作製します。リージョンですが、まずは東京で立てましょう。安いので。
サーバーは512MBが表示されていれば、そちらを利用してもらっても結構です。なぜか筆者のアカウントでは発見できず。以下の画像では1GBモデルで構築しました。
では、CentOS（7.5）を選択して下さい。その後、下部のroot パスワードに任意のパスワード（英数字と大文字と記号が必要です）を入力して、右の追加ボタンを押します。（ここで入力したパスワードは後で使うので、忘れないようにして下さい）
![choose-server.png](https://qiita-image-store.s3.amazonaws.com/0/81962/2c7fa080-1928-a069-6b00-d6bcb9866ade.png)

追加ボタンを押した後は、自動でサーバーリストに遷移します。構築したサーバーを見つけて、詳細を見てみましょう。
![serverlist.png](https://qiita-image-store.s3.amazonaws.com/0/81962/61ec85a5-5548-c872-c306-9b00060d477d.png)

「Qiita-Demo-vps-2018-08-16-10-54」というサーバーが今回私が作製したサーバーです（サーバー構築時に名前を付けました）。
このサーバーは今回の執筆用に建てたので、早くこの記事を書き終わらないと、課金が止まりません。頑張ります。

サーバーの詳細は以下になります。ここに書いていあるIPアドレスは後でつかうので、ここに記載されていることを覚えておきましょう。
![serverdetail.png](https://qiita-image-store.s3.amazonaws.com/0/81962/4aa8eb02-cf53-22c5-ead0-49482539a13e.png)

そしたら上部にあるコンソールとかかれた箇所をクリックして、サーバーにログインしましょう。
クリックすると別ウィンドウ（コンソール）が立ち上がります。昔でしたら、このコンソールというのは、自分のPCから繋いで、がちゃがちゃするものだったのですが、ブラウザ上で可能になっています。初心者には非常に便利です。

![loginconsole.png](https://qiita-image-store.s3.amazonaws.com/0/81962/e121a3b0-402e-4d72-5844-6e0b7ec4f988.png)

ログインユーザーは「root」、パスワードは先ほどサーバーを構築する際に指定した「rootパスワード」になります。
ちなみにパスワード欄で、キーボード打っても、何も表示されませんが、安心して下さい。見えないだけです。入力が終わったらEnterキーを押して下さい。
コンソールへの接続は多少不安定のようですので、うまく接続できていないようでしたら、一回ウィンドウを閉じて、再度コンソールを開いてみて下さい。

筆者がハマった点として、海外でPCを使っている人はキーボードが日本語配列でないことがあるかと思います。
ConoHaのコントロールパネルに入力する際には、デフォルトが日本語キーボードの配置になってしまっているようで、入力した値と別の値が入力されているときがあります。その際は、「テキスト送信」というところで入力して直接送信することができます。
筆者はパスワードの中で使っている記号が日本語と英語キーボードで配置が違くて、これに気づくのに5分かかりました。

うまくログインできましたでしょうか？`pwd`や`date`など入力してみましょう。現在の場所や日時が表示されましたでしょうか？
![Selection_563.png](https://qiita-image-store.s3.amazonaws.com/0/81962/a12824d1-5154-93bc-ef08-a1a59d55e811.png)

以上でサーバーの作製は完了です。以降の作業は全て、このコンソール上で行っていきます。

# CentOSのUpdate
まずは肩慣らしに、CentOSを更新しましょう。

```
$ yum update
```
というコマンドをテキスト送信の欄に入力して、送信ボタンを押すと、コンソールに入力されますので、Enterで確定させて下さい。
今後は、コマンドをこのように入力していきましょう。（テキスト送信欄にしかコピペができないためです。）
ちなみに```$```の部分は入力する必要ありません。これはコマンドを示す記述用の記号です。
途中で、yes/no聞かれたら全て`y(yes)`で結構です。
Updateにはしばらく時間（5分程度）がかかるので、休憩していて下さい。


# BBRの導入
BBRに導入に関しては、以下の記事をそのまま実行していきます。
「[GoogleのTCP BBRでTCPを高速化しProxyもその恩恵にあずかる](https://qiita.com/fallout/items/92b2099ab5e16cfeb1f9)」
以上の記事をまとめると、以下のコマンドを実行することになります。

```
$ wget https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x ./bbr.sh && ./bbr.sh
```
あまり深く考えずに、こちらを実行してインストールして下さい。インストール時に再起動が走りますので、
再起動して再度ログインしましょう。

そして以下のようになっていれば、BBRの導入成功です。

```
$ sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = bbr
```


# ShadowsocksRの導入
この記事のまま導入しましょう。
「[CentOSでのShadowsocksRサーバー構築(安全性の高いProxyを簡単に)](https://qiita.com/fallout/items/39360befe4dd35ee98c2)」

先ほど同様に一括入力コマンドは以下のようになります。

```
wget https://github.com/teddysun/shadowsocks_install/raw/master/shadowsocksR.sh && chmod +x ./shadowsocksR.sh && ./shadowsocksR.sh
```
導入時に入力していった内容は全て控えておいて下さい。

クライアントアプリの設定時に必要になります。
以下のように入力して、画像のように`ShadowsocksR(pid xxxx) is running`と表示されたら、ShadowsocksRの導入完了です。

```
$ /etc/init.d/shadowsocks status
```

![Selection_568.png](https://qiita-image-store.s3.amazonaws.com/0/81962/ced1c4b7-293d-c1b4-0569-eeb139418149.png)



# クライアントアプリの導入

中国のAppleStoreではVPNクライアントアプリが締めだされています。
「[アップル、中国のApp StoreからVPNアプリ削除か](https://japan.cnet.com/article/35105005/)」
いたちごっこにはなりますが、ここは頑張りどころです。
「shadowsocks クライアントアプリ」などで検索してなんとかインストール頑張って下さい。
以下は、筆者が利用した取得先です。なお筆者はiPhone, Andorid, Mac, Windows, Amazon Fire HDに
アプリをインストールして、利用しています。中国でインストールが難しい場合は、VPNアプリを利用してダウンロードしたり、日本に居る時などにインストールしましょう（VPNアプリをインストールするのにVPNが必要という悲しい状況ですが）。

## iPhone
Shadowsocksサーバーに接続するためのアプリはいくつかあるのですが、筆者はWaterdropを使っています。
中国AppleStoreでは出てこない場合は、日本などに切り替えて探してみて下さい。
[How Do I Download and Install Water Drop for Shadowsocks Using iPhone ?](https://shadowtunnelz.com/shadowsocks-how-to/how-do-i-download-and-install-water-drop-for-iphone/)
設定内容は以下のようになります。
<img width="375" alt="Image from iOS.png" src="https://qiita-image-store.s3.amazonaws.com/0/81962/0a4bd2b7-ef8c-fc0a-21eb-35dcd0ec15d0.png">
サーバーにはConoHaでサーバー構築した際のIPをアドレスを入力して下さい。
Port・Password・EncryptionにはShadowsocksRをインストールした際に、入力(選択)した値を指定して下さい。
そしたら、Shadowsocks接続をONにしてください。Googleの検索や、Youtubeが見れたら接続成功です。
以下で案内しているAndroidやMac, Windowsでも設定の手順は一緒です。

## Android
Android
https://shadowsocks.en.uptodown.com/android

## Mac, Windows
https://shadowsocks.org/en/download/clients.html

# Tips

## ShadowsockR構築時の情報
以下のように入力するとshadowsockrをinstallした際に入力した情報を見ることが出来ます。

```
$ cat /etc/shadowsocks.json
{
   "server":"0.0.0.0",
   "server_port":"17335",
   "password":"your-password",
   "method":"xchacha20",
   ...
}
```

## ShadowsocksRサーバーの再インストール
以下のコマンドでShadowsocksRのインストールと起動を再度行うことができます。パスワードを入力しなおしたりなどの再に利用下さい。

```
$ ./shadowsocksR.sh
```

## サーバーのSnapshot
ConoHaにはサーバーのスナップショットを取って、イメージを作製する機能があります。
今回のサーバー作製が無事終わりましたら、一度スナップショットを取っておきましょう。
そうすれば、それから再度サーバーを構築することができます。IPアドレスそのものが金盾にブロックされたときなどは、
ボタン一つで同じサーバーを新しいIPアドレスで構築することができます。

# 参考
[CentOSでのShadowsocksRサーバー構築(安全性の高いProxyを簡単に)](https://qiita.com/fallout/items/39360befe4dd35ee98c2)
[一つのコードが中国のインターネットを変えた | Shadowsocksに纏わるストーリー](https://addonecubit.com/clowwindy-shadowsocks/)
[もうVPNは不要！？新接続方式Shadowsocksを使ってみたら驚愕した](https://china-log.com/shadowsocks)
[GoogleのTCP BBRでTCPを高速化しProxyもその恩恵にあずかる](https://qiita.com/fallout/items/92b2099ab5e16cfeb1f9)