OpenVPN
softethervpn
shadowsocks
GFW

中国でのGFW&VPN事情


はじめに

中国に滞在する機会があったので,VPNの接続可否を少し検証してみました.なお,商用サービスは利用していないので分かりません.

後半ではShadowSocksの環境構築と,Google BBRによる高速化についてまとめておきます.


VPN事情@北京,2018年12月

とりあえず出発前に自前のサーバで,L2TP/IPSec, SoftetherVPN, ShadowSocksの3つを用意していきました.SoftetherVPNはOpenVPN互換機能があり,AndroidからはOpenVPNのプロトコルで接続できます.

使えたプロトコル


  • SoftetherVPN (port: 443)

  • ShadowSocks (port: 443, 993, 1212)

ブロックされたプロトコル


  • L2TP/IPSec (port: default)

  • OpenVPN (Port: 443)

試したところ,サーバ側のPortはあまり関係ないようなので,Over SSLのプロトコルだからといってSSL関連のPortに拘る必要はないようです.

SoftetherVPN と ShadowSocks を比較するとShadowSocks のほうが圧倒的に快適です.ただし私の環境では,SoftetherVPNを使用した場合とShadowSocksを使用した場合で,Globalに出ていくまでのネットワーク構成が異なるので,純粋なプロトコルの比較ではありません.

AndroidのスマートフォンはShadowSocksによってほぼ常時VPNを張り続けた状態でしたが,非常に安定して使えました.


その後

AWSで固定のIP/Portを使ってShadowSocksを運用し,スマートフォンからほぼ常時接続していたのですが,1か月ほどたったところで繋がらなくなりました.このPortでNginxを走らせてもTimeoutしますし,GFWで規制されたっぽい?ちなみに同じIPの他のPortは繋がります.


ShadowSocksの構築


Server

個人的にはAmazonのLightsailが楽でした.最小構成で 3.5ドル/月 です.インスタンスを破棄することでグローバルIPを変更できるのも嬉しい点です.(ただし個人で使っている限りはGFWによってIPがブロックされることはないようです?) もちろんEC2などでも良いと思いますが,Lightsailはトラヒックに関しても基本的に定額なので安心です.

dockerを使うと一瞬でShadowSocksのサーバを立てることができます.インスタンスの起動スクリプトでDockerを導入しておきます.


起動スクリプト

curl -fsSL https://get.docker.com/ | sh

usermod -aG docker ubuntu

こちら (https://hub.docker.com/r/shadowsocks/shadowsocks-libev/) を参考にShadowSocksを起動します.

最低限必要なのは,PASSWORDとPORTです.またMETHODで暗号化方式を指定できます.ここで指定したportに対して外からアクセスできるようにLightsailの管理画面からFWの設定を変更する必要があります.

$ docker run -e PASSWORD=PASSWORD -e METHOD=chacha20-ietf-poly1305 -p PORT:8388 -p PORT:8388/udp -d shadowsocks/shadowsocks-libev


Client

For Windows: https://github.com/shadowsocks/shadowsocks-windows

For Android: https://play.google.com/store/apps/details?id=com.github.shadowsocks

Others: https://shadowsocks.org/en/download/clients.html


Google BBR

BBRはGoogleが開発しているTCPの輻輳制御アルゴリズムです.特に通信が不安定な状況で効率化が期待できるらしく,中国<=>日本などは特に効果が期待できそうなので導入してみました.

導入はこちらのスクリプトを使用すると簡単でした(要再起動).たぶん信頼して大丈夫だと思います:

https://raw.githubusercontent.com/teddysun/across/master/bbr.sh


BBRの効果

AWS Lightsail@TOKYO に2つのインスタンスを立ててほぼ同時刻に切り替えながら速度計測をしてみました.接続元の回線はChina Telecom で,計測には https://fast.com を使用しました (下り5回平均). (Server: ubuntu 16.04, 512MB, Client: shadowsocks-windows)


  • ShadowSocks w/o BBR: 10.8 MBps

  • ShadowSocks w/ BBR: 39.2 MBps

  • (No VPN: 1.6 MBps)

圧倒的に高速化されました!!

VPNを接続しない場合が激遅ですが,これはfast.comがNetflixによって運営されている計測サービスでSeattleにあるサーバに接続しているから,ですかね?ちょっと納得いかないですけど...