ShadowsocksRのサーバーを立ててみた

はじめに

ShadowsocksはセキュアなSOCKS 5プロキシを実現するプロトコルです。ShadowsocksRはShadowsocksのブランチで、データ難読化といった機能が追加されています。どちらも作者が開発をやめてしまったのですが、FOSSですのでミラーやフォークが出回っています。

とある国に出張中に「良いVPNはサービスは無いか」と聞いてみたところ、このプロトコルを使っているサービスを教えて貰いました。試しにそのサービス使ってみたところ、スマホに標準で付いているVPNクライアント機能ではなくアプリをインストールする方式だったことや、高速で快適だったので興味を持って調べ、私はShadowsocksというプロトコルのことを知りました。

快適とはいえ、見知らぬVPNプロバイダのサービスを本格的に使うことに私は抵抗があります。私の通信が見知らぬ人のサーバーを通過するのですから安心できません。また、VPNプロバイダのサービスの継続性にも疑問があります。そんな理由で、いつか自分のShadowsocksRサーバを構築しようと考えていました。今回、ちょうどアメリカのIPアドレスからトラフィックを発生させたい用事ができたので、AzureのWest USにVMを用意して構築をしてみました。

VM

AWSでもAzureでも良いのですが、最近は仕事でAzureを利用することが多いのでAzureにしました。West US(カリフォルニア州)に、Standard B1s (1 vcpus, 1 GiB memory)でCentOS 7のVMを用意しました。VMが起動したら、SSHでログインできるようにNwtworkingのInbound port rulesにport 22にアクセスできるよう設定をしました。

まず、CentOSをアップデートします。

$ sudo yum update

TCP BBRのインストール

次に、GoogleのTCP BBR (Bottleneck Bandwidth and Round-trip propagation time)という輻輳制御アルゴリズムを適用したkernelをインストールしました。やらなくても良いでしょうが、インストールしている例を多く見かけたので、teddysun氏の最新カーネルを自動でインストールしてくれるスクリプトを使ってインストールしました。

$ wget https://github.com/teddysun/across/raw/master/bbr.sh
$ chmod +x bbr.sh
$ sudo ./bbr.sh

私が実行したときには下記の2つのパッケージがインストールされました。

 kernel-ml           x86_64     5.3.6-1.el7.elrepo      elrepo-kernel      48 M
 kernel-ml-devel     x86_64     5.3.6-1.el7.elrepo      elrepo-kernel      13 M

再起動を促されるので再起動し、再起動後にBBRが使われていることを確認しました。

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

ShadowsocksRのインストール

$ wget https://github.com/teddysun/shadowsocks_install/raw/master/shadowsocksR.sh
$ chmod +x ./shadowsocksR.sh
$ sudo ./shadowsocksR.sh 2>&1 | tee ./shadowsocksR.log

すると、いくつかの確認があります。

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

まずはパスワードを決めなければならないので、ジェネレーターで作ったパスワードを入力しました。

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

次にポート番号です。私はデフォルトから変更しました。

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) salsa20
14) xchacha20
15) xsalsa20
16) rc4-md5
Which cipher you'd select(Default: aes-256-cfb):12

暗号化アルゴリズムは、私はChaChaが新しくて良いなと思ったので、12の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
9) auth_chain_c
10) auth_chain_d
11) auth_chain_e
12) auth_chain_f
Which protocol you'd select(Default: origin):

---------------------------
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):

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

ShadowsocksRのプロトコルはorigin、obfsもplainにしました。クライアントの選択肢を狭めないためです。 ここらへんのオプションの詳細は、中国語ですが、ssr.mdを参照すると良さそうです。

インストールは、下記のパッケージがインストールされた模様です。

================================================================================
 Package                          アーキテクチャー
                                         バージョン         リポジトリー   容量
================================================================================
インストール中:
 autoconf                         noarch 2.69-11.el7        base          701 k
 automake                         noarch 1.13.4-3.el7       base          679 k
 gcc                              x86_64 4.8.5-39.el7       base           16 M
 libtool                          x86_64 2.4.2-22.el7_3     base          588 k
 openssl-devel                    x86_64 1:1.0.2k-19.el7    base          1.5 M
 python-devel                     x86_64 2.7.5-86.el7       base          398 k
 python-setuptools                noarch 0.9.8-7.el7        base          397 k
依存性関連でのインストールをします:
 cpp                              x86_64 4.8.5-39.el7       base          5.9 M
 glibc-devel                      x86_64 2.17-292.el7       base          1.1 M
 glibc-headers                    x86_64 2.17-292.el7       base          687 k
 kernel-ml-headers                x86_64 5.3.6-1.el7.elrepo elrepo-kernel 1.3 M
 keyutils-libs-devel              x86_64 1.5.8-3.el7        base           37 k
 krb5-devel                       x86_64 1.15.1-37.el7_7.2  updates       272 k
 libcom_err-devel                 x86_64 1.42.9-16.el7      base           32 k
 libkadm5                         x86_64 1.15.1-37.el7_7.2  updates       178 k
 libmpc                           x86_64 1.0.1-3.el7        base           51 k
 libselinux-devel                 x86_64 2.5-14.1.el7       base          187 k
 libsepol-devel                   x86_64 2.5-10.el7         base           77 k
 libverto-devel                   x86_64 0.2.5-4.el7        base           12 k
 m4                               x86_64 1.4.16-10.el7      base          256 k
 mpfr                             x86_64 3.1.1-4.el7        base          203 k
 pcre-devel                       x86_64 8.32-17.el7        base          480 k
 perl-Data-Dumper                 x86_64 2.145-3.el7        base           47 k
 perl-Test-Harness                noarch 3.28-3.el7         base          302 k
 perl-Thread-Queue                noarch 3.02-2.el7         base           17 k
 python-backports                 x86_64 1.0-8.el7          base          5.8 k
 python-backports-ssl_match_hostname
                                  noarch 3.5.0.1-1.el7      base           13 k
 python-ipaddress                 noarch 1.0.16-2.el7       base           34 k
 python-rpm-macros                noarch 3-32.el7           base          8.8 k
 python-srpm-macros               noarch 3-32.el7           base          8.4 k
 python2-rpm-macros               noarch 3-32.el7           base          7.7 k
 zlib-devel                       x86_64 1.2.7-18.el7       base           50 k

インストールが完了すると、サーバのIPアドレスやポート番号、パスワードなどの設定内容が表示されました。これをメモしておけばShadowsocksRサーバを利用することができます。

ShadowsocksRサーバの設定は、/etc/shadowsocks.jsonに書いてあります。 起動スクリプトは/etc/init.d/shadowsocksにインストールされていますので、このようにコマンドで実行を制御できます。再起動してもサービスが自動で起動されそうですね。

$ chkconfig

注記: この出力に含まれるのは SysV サービスのみです。ネイティブな 
      systemd サービスは含まれません。SysV の設定データはネイティブな
        systemd 設定で上書きされる場合があります。
      systemd サービスを一覧表示する場合は 'systemctl list-unit-files' を使用します。
      特定のターゲットで有効になっているサービスを確認する場合は
      'systemctl list-dependencies [target]'を使用します。

netconsole      0:off   1:off   2:off   3:off   4:off   5:off   6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
shadowsocks     0:off   1:off   2:on    3:on    4:on    5:on    6:off
$ service shadowsocks status
ShadowsocksR (pid 47135) is running...

ちなみに、今使ったインストールスクリプトは、./shadowsocksR.sh uninstallとオプションを付けることでアンインストーラーにもなるそうです。僕は試していません。

クライアント

僕はiPhoneを使っています。ShadowsocksRを使ったVPNサービスを教えてもらったとき、このVPNサービスのマニュアルでは、iPhone用のクライアントとしてShadowrocketが紹介されていました。これをiPhoneにインストールしていたので、このクライアントを使って今構築したShadowsocksRサーバに接続してみました。

Shadowrocket

Shadowrocket

  • Shadow Launch Technology Limited
  • ユーティリティ
  • ¥370
apps.apple.com

macOSで使うクライアントは、ShadowsocksX-NG-Rを使ってみて、正常に使えることを確認しました。他のプラットフォーム向けのクライアントについては、ShadowsocksRの追加機能には対応していない可能性がありますが、Shadowsocks - Clientsに紹介があります。

変更履歴

日付 変更者 変更内容
2019/10/13 ytsuboi 作成