gostってなに?
- goで書かれた多機能プロトコル変換中継simple tunnelソフトウェア
- 一言で言うと、stoneの多機能プロトコル版
- squidとかみたいにconfigはいらず、コマンドラインで完結できるシンプル設計
- WindowsとLinuxに対応
- goで書かれているので公式サイトのバイナリを落としてすぐ使える
- 公式github: https://github.com/ginuerzh/gost/blob/master/README_en.md
- 公式wiki: https://docs.ginuerzh.xyz/gost/en/
gostでできること
- 指定したIPアドレス、ポート番号、プロトコル、トランスポートで接続を受付および中継する
- 多彩なプロトコル、トランスポートを選べる。プロトコルはたとえばプロキシサーバとして機能し、トランスポートはgost同士のデータ転送に使用できる。
- 普通に使うならhttp、安定性なら(?)socks5、匿名性ならss、新しもの好きならquic
- gost同士で中継する場合は、プロトコルとトランスポートを'+'でつなぐことで、任意のプロトコルを任意のトランスポートでカプセル化指定することができる(一部の組み合わせのみ) https://docs.ginuerzh.xyz/gost/en/configuration/
対応プロトコル(アプリケーションプロトコル)
- http
- http/2
- socks5
- ss (shadow socks)
- etc...
対応トランスポート(トランスポートプロトコル)
- tcp
- tls
- kcp #udp
- quic #udp
- h2
- etc...
使い方
-C string
configure file
-D enable debug log
-F value
forward address, can make a forward chain
-L value
listen address, can listen on multiple ports
-V print version
-obfs4-distBias
Enable obfs4 using ScrambleSuit style table generation
gost -L=http://:8080 -D
localhostでport:8080にてhttp proxy接続を受付し、デバッグログを出力
gost -L=http://:8080 -L=socks5://:8081 -F=h2://relay.net:9000
localhostでport:8080でhttp proxyとport:8081でsocks5 proxy接続を受付し、h2トランスポートでrelay.net:9000へ中継
gost -L http+tls://:443 -F socks5+wss://:1443
プロトコルとトランスポートを組み合わせる
nohup nice -n -10 ./gost -L="http2://:8386?cert=/etc/letsencrypt/live/relay.net-0001/cert.pem&key=/etc/letsencrypt/live/relay.net-0001/privkey.pem" -L=socks5://:8387 -D &
nohupでログアウトしても稼働するようにして、nice値を上げてgost起動、http2プロトコルでport:8386で接続受付し証明書と秘密鍵を指定、socks5でport:8387にて接続を受付
./gost -L=ss://chacha20:hoge1234@:8386 -D
shadowsocksで接続受付
構成例
- browser[http]---[http]gost---(internet)
- browser[http2]---(internet)---[http2]gost---(internet)
- browser[socks5]---[socks5]gost[h2]---(internet)---[h2]gost[http]---[http]squid---(internet)
ブラウザから接続するときの設定方法
chrome
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=relay.net:3128 --proxy-bypass-list=<local>;192*
`"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=socks5://relay.net:8387 --proxy-bypass-list=<local>;192*
` "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=https://relay.net:8386 --proxy-bypass-list=<local>;192*;ws://*;150*;*163*
firefox
オプション → ネットワーク設定の詳細設定 → HTTPプロキシ
// proxy.pacを用意する
function FindProxyForURL(url, host)
{
return "SOCKS5 relay.net:8387";
}
// proxy.pacを用意する
function FindProxyForURL(url, host)
{
return "HTTPS relay.net:8386";
}
iPhone (safari)
// proxy.pacを用意する
function FindProxyForURL(url, host)
{
return "SOCKS relay.net:8387";
}
Wiresharkで見てみる
本当に指定したプロトコルが使われているのか見てみる。
キャプチャ環境
-
VPS(remote)上でhttp2とsocks5を待ち受けポートに設定してgostを起動
nohup nice -n -10 ./gost -L="http2://:8386?cert=/etc/letsencrypt/live/relay.net-0001/cert.pem&key=/etc/letsencrypt/live/relay.net-0001/privkey.pem" -L=socks5://:8387 -D &
-
クライアント(local)はChromeの起動オプションでプロキシ設定して以下のサイトを開いたときのパケットをキャプチャ
http://www.umin.ac.jp/http-man/http1.0jp.txt
キャプチャ結果のスクリーンショット
socks5
Socks5の認証ネゴシエーションして、平文でGETリクエストしている。
http/2
TLSv1.2でハンドシェイクして、暗号化したデータをやり取りしている。
いろんなプロトコルを使って転送速度を比較してみる
スピードテストでプロトコルごとの特性を比較してみる。
測定環境
- Google Chrome 64bit version 71.0.3578.44
- Windows 10 Pro version 1809 64bit
- 土曜夜19時台100Mフレッツ固定回線
- 測定サイトは https://fast.com
結論から言うと、なんとSocks5が速度、安定性(bufferbloat)ともに一番バランスがよく優秀な結果になった。
暗号化処理などしていないため当然かもしれない。
素(プロキシ設定なし)
24 Mbps
レイテンシ
アンロード済み 18 ms
ロード済み 26 ms
アップロード 78 Mbps
socks5 on conoha vps
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=relay.net:8187 --proxy-bypass-list=<local>;192*
nohup nice -n -10 ./gost -L=socks5://:8387 -D
87 Mbps
レイテンシ
アンロード済み 20 ms
ロード済み 33 ms
アップロード 71 Mbps
http/2 on conoha vps
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=https://relay.net:8387 --proxy-bypass-list=<local>;192*
nohup nice -n -10 ./gost -L="http2://:8386?cert=/etc/letsencrypt/live/relay.net-0001/cert.pem&key=/etc/letsencrypt/live/relay.net-0001/privkey.pem" -D
84Mbps
レイテンシ
アンロード済み 20 ms
ロード済み 210 ms
アップロード 38 Mbps
squid on vps (参考)
89 Mbps
レイテンシ
アンロード済み 21 ms
ロード済み 32 ms
アップロード 77 Mbps
追試
クライアントとサーバ間のgostをいろんなトランスポートでつなぐ追試をしてみる。
h2 (http/2)
- レイテンシの幅がやや大きめ。
- パケットはTLSv1.2で暗号化されている。
gost -L=socks5://:8080 -F=h2://relay.net:8386 -D
nohup nice -n 10 ./gost -L=h2://:8386 -D
74 Mbps
レイテンシ
アンロード済み 21 ms
ロード済み 270 ms
アップロードスピード 67 Mbps
KCP
- UDPベースのスループットを犠牲にして低遅延を試みるプロトコル (A Fast and Reliable ARQ Protocol)
- だが、デフォルト設定のためか遅延は普通より大きめ
- アップロードが100Mbps回線なのに130Mbpsとかいっちゃってて怒られるやつ
- https://github.com/skywind3000/kcp/blob/master/README.en.md
gost -L=socks5://:8080 -F=kcp://relay.net:8386 -D
nohup nice -n 10 ./gost -L=kcp://:8386 -D
55 Mbps
レイテンシ
アンロード済み 20 ms
ロード済み 92 ms
アップロードスピード 56 Mbps
QUIC
- UDPベースのTCP+TLS+http2の機能を含む次世代プロトコル (Quick UDP Internet Connections)
- レイテンシ、スループットともに優秀(アップロードが振り切れているが。。。)
- https://www.chromium.org/quic
gost -L=socks5://:8080 -F=quic://relay.net:8386 -D
nohup nice -n 10 ./gost -L=quic://:8386 -D
79 Mbps
レイテンシ
アンロード済み 20 ms
ロード済み 35 ms
アップロードスピード 120 Mbps
Shadowsocks
- 金盾超えに使われているらしいSecureなSocks5プロトコル
- 暗号化されているのにレイテンシもスループットも素のSocks5と変わらずすごい
- https://shadowsocks.org/en/index.html
gost -L=socks5://:8080 -F=ss://chacha20:hoge1234@relay.net:8386 -D
nohup nice -n 10 ./gost -L=ss://chacha20:hoge1234@:8386 -D
88 Mbps
レイテンシ
アンロード済み 21 ms
ロード済み 39 ms
アップロードスピード 72 Mbps
そのためも
- chromeはhttp/2 proxyにするとWebSocket(ws://)が死ぬ、一部サイト(sekai-kabuka.com)のグラフの中身が出ない → 起動オプション --proxy-bypass-list=ws://;http://1* で対応
- firefoxはhttp2 proxyにすると安定性がいまいち(スループットが上下運動する)
- ネット上に設置するときは、誰かに勝手に使われないように注意する(iptablesでアドレス制御するとか、squidに落として認証するなど)
- プロセスの優先度を上げると少しスループットが上がる
- chromeで使うならhttp/2 Proxy Modeがおすすめ(サイトをクリックしてから表示されるまでの体感が早く感じた) https://docs.ginuerzh.xyz/gost/en/http2/
まとめ
gostすごい(面白い)