32
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

gost - GO Simple Tunnel がすごい

Last updated at Posted at 2018-11-11

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...

使い方

./gost
  -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

http_proxy
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=relay.net:3128 --proxy-bypass-list=<local>;192*
socks5_proxy
`"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=socks5://relay.net:8387 --proxy-bypass-list=<local>;192*
http2_proxy
` "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
オプション → ネットワーク設定の詳細設定 → HTTPプロキシ
socks5_proxy
// proxy.pacを用意する
function FindProxyForURL(url, host)
  {
  return "SOCKS5 relay.net:8387";
  }
http2_proxy
// proxy.pacを用意する
function FindProxyForURL(url, host)
  {
  return "HTTPS relay.net:8386";
  }

iPhone (safari)

socks5_proxy
// 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

socks.PNG socks2.PNG

Socks5の認証ネゴシエーションして、平文でGETリクエストしている。

http/2

http2.PNG

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
su_.PNG

socks5 on conoha vps

browser_chrome
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=relay.net:8187 --proxy-bypass-list=<local>;192*
server
nohup nice -n -10 ./gost -L=socks5://:8387 -D

87 Mbps
レイテンシ
アンロード済み 20 ms
ロード済み 33 ms
アップロード 71 Mbps
socks5_.PNG

http/2 on conoha vps

browser_chrome
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=https://relay.net:8387 --proxy-bypass-list=<local>;192*
server
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
http2_.PNG

squid on vps (参考)

89 Mbps
レイテンシ
アンロード済み 21 ms
ロード済み 32 ms
アップロード 77 Mbps
squid_.PNG

追試

クライアントとサーバ間のgostをいろんなトランスポートでつなぐ追試をしてみる。

h2 (http/2)

  • レイテンシの幅がやや大きめ。
  • パケットはTLSv1.2で暗号化されている。
client
gost -L=socks5://:8080 -F=h2://relay.net:8386 -D
server
nohup nice -n 10 ./gost -L=h2://:8386 -D

74 Mbps
レイテンシ
アンロード済み 21 ms
ロード済み 270 ms
アップロードスピード 67 Mbps

h2.PNG h2_.PNG

KCP

  • UDPベースのスループットを犠牲にして低遅延を試みるプロトコル (A Fast and Reliable ARQ Protocol)
  • だが、デフォルト設定のためか遅延は普通より大きめ
  • アップロードが100Mbps回線なのに130Mbpsとかいっちゃってて怒られるやつ
  • https://github.com/skywind3000/kcp/blob/master/README.en.md
client
gost -L=socks5://:8080 -F=kcp://relay.net:8386 -D
server
nohup nice -n 10 ./gost -L=kcp://:8386 -D

55 Mbps
レイテンシ
アンロード済み 20 ms
ロード済み 92 ms
アップロードスピード 56 Mbps

kcp.PNG kcp_.PNG

QUIC

  • UDPベースのTCP+TLS+http2の機能を含む次世代プロトコル (Quick UDP Internet Connections)
  • レイテンシ、スループットともに優秀(アップロードが振り切れているが。。。)
  • https://www.chromium.org/quic
client
gost -L=socks5://:8080 -F=quic://relay.net:8386 -D
server
nohup nice -n 10 ./gost -L=quic://:8386 -D

79 Mbps
レイテンシ
アンロード済み 20 ms
ロード済み 35 ms
アップロードスピード 120 Mbps

quic.PNG quic_.PNG

Shadowsocks

  • 金盾超えに使われているらしいSecureなSocks5プロトコル
  • 暗号化されているのにレイテンシもスループットも素のSocks5と変わらずすごい
  • https://shadowsocks.org/en/index.html
client
gost -L=socks5://:8080 -F=ss://chacha20:hoge1234@relay.net:8386 -D
server
nohup nice -n 10 ./gost -L=ss://chacha20:hoge1234@:8386 -D

88 Mbps
レイテンシ
アンロード済み 21 ms
ロード済み 39 ms
アップロードスピード 72 Mbps

ss.PNG ss_.PNG

そのためも

  • 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すごい(面白い)

32
18
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?