CentOSでのShadowsocksRサーバー構築(安全性の高いProxyを簡単に)

Shadowsocksは、元々は中国の[金盾(グレート・ファイアウォール)](https://ja.wikipedia.org/wiki/%E9%87%91%E7%9B%BE)対策として生み出されたものですが、**安全性の高いProxyとしての利用価値も高い**仕組みです。

日本では知名度が低く日本語の情報も皆無のため、サーバーの構築方法やクライアントを紹介してみる事にしました。

--------------------------------------------------------------------------------

## 対象としている人

- 中国の方が開発した技術への偏見がない人
- 最低限のLinuxの知識がある人
- Proxyを構築する事に興味がある人
- 中国やエジプト等でのインターネット規制に困っている人

--------------------------------------------------------------------------------

## Shadowsocksとは？

Shadowsocks(通称SS) は、SSHトンネル を Socks5 によって行うクライアント ⇔ サーバー型のプロトコルで、中国の金盾によるインターネット規制に対抗する仕組みとして、中国の Clowwindy氏 によって開発されました。

ShadowsocksR(通称SSR) は、その Shadowsocks を元に、互換性を保ちつつ主にセキュリティ面の機能を追加した派生バージョンで、中国の breakwa11氏 によって開発されました。

両者とも、GitHub上で自由に閲覧できるオープンソースプロジェクトです。

- [GitHub Shadowsocks](https://github.com/shadowsocks)
- [GitHub ShadowsocksR](https://www.google.co.jp/search?q=GitHub+ShadowsocksR&ie=utf-8&oe=utf-8)
	- 「R」の本家リポジトリは削除された(理由は後述)ため、Google検索結果へのリンクです。

図解も含めた詳説は、[コチラのページ](http://vc2tea.com/whats-shadowsocks/)が分かりやすいと思います。私も中国語は全くできませんが、Google翻訳等を活用して英語に翻訳[^1]すれば、何となく意味は分かるかと思います。

[^1]: 中国語の専門的な文章は、日本語よりも英語に翻訳した方が理解しやすい場合が多いです。

--------------------------------------------------------------------------------

## ShadowsocksRサーバーの構築

- さくらインターネットのVPS「さくらのVPS」を利用しています。

- CentOS6.8で検証しました。
	- 6.9や7系でも問題ないと思いますが、未検証です。

- インストールは[GitHubでteddysun氏が公開しているシェルスクリプト](https://github.com/teddysun/shadowsocks_install/raw/master/shadowsocksR.sh)を利用しています。
	- Python版のShadowsocksRをインストールします。Python実行環境が未インストールの場合は自動でインストールします。
	- iptablesによるポート開放なども行いますので、内容が気になる方はよく確認してください。

--------------------------------------------------------------------------------

### インストールスクリプトのダウンロード ～ 実行

```bash
#-- インストールスクリプトをダウンロード
$ wget https://github.com/teddysun/shadowsocks_install/raw/master/shadowsocksR.sh

#-- 実行権限を与える
$ chmod +x ./shadowsocksR.sh

#-- インストールスクリプトを実行(shadowsocksR.logとしてログを残す)
$ ./shadowsocksR.sh 2>&1 | tee ./shadowsocksR.log
```

--------------------------------------------------------------------------------

### インストール

```
#############################################################
# One click Install ShadowsocksR Server                     #
# Intro: https://shadowsocks.be/9.html                      #
# Author: Teddysun <i@teddysun.com>                         #
# Github: https://github.com/shadowsocksr/shadowsocksr      #
#############################################################

Please enter password for ShadowsocksR:
(Default password: teddysun.com):

---------------------------
password = 
---------------------------

Please enter a port for ShadowsocksR [1-65535]:
(Default port: 8989):

---------------------------
port = 
---------------------------

Please select stream cipher for ShadowsocksR:
1) none
2) aes-256-cfb
3) aes-192-cfb
4) aes-128-cfb
5) aes-256-cfb8
6) aes-192-cfb8
7) aes-128-cfb8
8) aes-256-ctr
9) aes-192-ctr
10) aes-128-ctr
11) chacha20-ietf
12) chacha20
13) rc4-md5
14) rc4-md5-6
Which cipher you'd select(Default: aes-256-cfb):12

---------------------------
cipher = chacha20
---------------------------

Please select protocol for ShadowsocksR:
1) origin
2) verify_deflate
3) auth_sha1_v4
4) auth_sha1_v4_compatible
5) auth_aes128_md5
6) auth_aes128_sha1
7) auth_chain_a
8) auth_chain_b
Which protocol you'd select(Default: origin):1

---------------------------
protocol = origin
---------------------------

Please select obfs for ShadowsocksR:
1) plain
2) http_simple
3) http_simple_compatible
4) http_post
5) http_post_compatible
6) tls1.2_ticket_auth
7) tls1.2_ticket_auth_compatible
8) tls1.2_ticket_fastauth
9) tls1.2_ticket_fastauth_compatible
Which obfs you'd select(Default: plain):1

---------------------------
obfs = plain
---------------------------
```

- password
	- 任意のものを入力

- port(使用するport番号)
	- デフォルトは8989ですが、変更した方が良いと思います。

- cipher(TLSのストリーム暗号方式)
	- [RFC 7905](https://tools.ietf.org/html/rfc7905)で標準化された chacha20 にしました。

- protocol と obfs
	- 「R」のみにある設定ですが、クライアントが対応していない事があるので、デフォルトの値(＝オリジナル版と同じ)にしました。

以上を入力すると…

```
Press any key to start...or Press Ctrl+C to cancel
```

…と表示されますので、問題がなければEnterを押せばインストールが始まります。キャンセルしたい場合はCtrl+Cでやり直せます。

```
Starting ShadowsocksR success

Congratulations, ShadowsocksR server install completed!
Your Server IP        :
Your Server Port      :
Your Password         :
Your Protocol         :
Your obfs             :
Your Encryption Method:
```

インストールが成功するとShadowsocksRが起動し、設定した内容の確認が表示されます。

```bash
#-- ShadowsocksRが起動している事を確認
$ /etc/init.d/shadowsocks status
ShadowsocksR (pid 23456) is running...

$ ps aux | grep shadowsocks | grep -v grep
python /usr/local/shadowsocks/server.py -c /etc/shadowsocks.json -d start
```

--------------------------------------------------------------------------------

### 設定の変更

上記からも分かる通り、設定ファイルは `/etc/shadowsocks.json` にあります。

```bash
$ vi /etc/shadowsocks.json
$ /etc/init.d/shadowsocks restart
```

設定を変更する際は、適当なエディタで編集後、再起動すればOKです。

--------------------------------------------------------------------------------

### アンインストール

```bash
$ ./shadowsocksR.sh uninstall
```

--------------------------------------------------------------------------------

### その他の情報

- サービス操作スクリプト：`/etc/init.d/shadowsocks`
	- `start` `stop` `restart` `status` 等の主要なコマンドを使えます。

- ログファイル：`/var/log/shadowsocksr.log`

--------------------------------------------------------------------------------

## ShadowsocksRサーバーの高速化

GoogleのTCP BBRを利用して高速化する記事を作成しました。SquidでProxyを構築している場合でも十分試す価値はあると思いますので、興味がある方は併せてご参考ください。

- [GoogleのTCP BBRでTCPを高速化しProxyもその恩恵にあずかる](https://qiita.com/fallout/items/92b2099ab5e16cfeb1f9)

--------------------------------------------------------------------------------

## Shadowsocksクライアント

ここまでの内容が理解できる方であれば、クライアントの設定や構築したサーバーへの接続テストは簡単にできると思います。

- Windows版
	- https://github.com/shadowsocksrr/shadowsocksr-csharp/releases
	- 設定画面に萌え絵？が表示されますが、これは作者のbreakwa11氏が、今は削除されてしまったGitHubやTwitterアカウントで愛用していたものです。耐性がないとちょっと恥ずかしい…(笑)
<br><br>
- Macintosh版(未調査です)
	- https://github.com/qinyuhang/ShadowsocksX-NG-R/releases
<br><br>
- Android版(未調査です)
	- https://github.com/shadowsocksrr/shadowsocksr-android/releases
<br><br>
- iPhone版(無料アプリのみ調査)
	- Waterdropが使いやすかったですが、「R」で追加された機能は利用できません。
		- https://itunes.apple.com/jp/app/id1212107997
	- Mume VPNは「R」の追加機能にも対応している他、Shadowsocksを通すかどうかのルールを細かく設定できたりもしますが、使い勝手はイマイチです。
		- https://itunes.apple.com/jp/app/id1144787928

クライアントを設定後は下記サイトにアクセスし、IPアドレスが構築したサーバーのものになっている事を確認してください。Proxy関連の環境変数は何も吐き出さない筈です。

- http://www.ugtop.com/spill.shtml

この記事を作成した2017年10月31日は中国に居ましたが、Windows版とiPhone版で問題なく接続できる事を確認しました。その他のクライアントは未調査です。

--------------------------------------------------------------------------------

## 余談：Shadowsocks開発者への圧力

中国は経済のみが自由化されましたが、今でも共産党の一党独裁制によって成り立っている社会主義国家であり、インターネットの検閲手段である金盾を回避するような技術には圧力がかけられています。

非常に残念な事ですが、Clowwindy氏 breakwa11氏 共に、現在はShadowsocksの開発には参加していません。詳しくは以下のサイトをご覧ください。

- [一つのコードが中国のインターネットを変えた | Shadowsocksに纏わるストーリー](https://addonecubit.com/clowwindy-shadowsocks/)
- [GitHub、中国から再び攻撃を受ける。当局はproxyソフト開発者にも圧力](http://www.excite.co.jp/News/it_g/20150831/Slashdot_15_08_31_0635218.html)

--------------------------------------------------------------------------------

## 参考URL

- https://shadowsocks.be/9.html
- https://shadowsocks.org/en/
- https://github.com/shadowsocksrr/shadowsocks-rss/wiki