grasshopper
Optimize performance for QPP encryption
Grasshopper は、受信パケットをリッスンし、構成された宛先に転送する UDP パケット フォワーダーです。オプションで、異なるキーとメソッドを使用した、受信パケットと送信パケットの両方の暗号化をサポートします。
Grasshopper は連鎖リレー システムとして機能します。チェーンされた DNS クエリを考えてみましょう。次に例を示します。
┌────────────┐ ┌───────────────┐
│ ENCRYPTED │ │ RE-ENCRYPTION │
└──────┬─────┘ │ AES ───► 3DES │
│ └───┬───────────┘
│ │
┌─────────┐▼ ┌────────────┐│ ┌─────────┐
<HOP0> HOPS(AES) │ DECRYPTED │▼ <HOP5> HOPS(FINAL)
┌─────────┐ └ ┌────┐ └ DATA HOPS(3DES) │ ┌─┴──┐ ┌────────────┐
│ dig xxx ├─► CLEAR TEXT │HOP1┼── CIPHER ──► PACKET ┌─┴──┐ └ DNS │Hop6├─► 8.8.8.8:53 │
│ @hop0 │ ┌ │Hop2│ (AES) ┌ │Hop4├─ CIPHER ──► QUERY │Hop7│ └────────────┘
└─────────┘ │ ▲ │HOP3│ <HOP2> ▲ │Hop5│ (3DES) ┌ └─┬──┘
│ │ └────┘ │ │ └─┬──┘ │ │
└──┼──────┘ └─────┼──────┘ └─────────┘
│ │
┌──┼────────┐ │
│ │ │
│ OPTIONAL ├──────────────────┘
│ PACKET │
│ PROCESSOR │
│ │
└───────────┘
次のコマンドを使用して、最新バージョンの Grasshopper をインストールします。
go install github.com/xtaci/grasshopper/cmd/grasshopper@latest
Grasshopper は次のパラメータをサポートしています。
Grasshopper is a UDP packet forwarder that listens for incoming packets and forwards them to a configured destination. It optionally supports cryptography for both incoming and outgoing packets, using different keys and methods. Optionally, the listener can be configured to apply cryptogrraphy on both the incoming and outgoing packets, with different keys and methods.
Usage:
grasshopper [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
help Help about any command
start Start a listener for UDP packet forwarding
Flags:
--ci string Cryptography method for incoming data. Available options: aes, aes-128, aes-192, qpp, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, sm4, none (default "qpp")
--co string Cryptography method for incoming data. Available options: aes, aes-128, aes-192, qpp, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, sm4, none (default "qpp")
-c, --config string config file name
-h, --help help for grasshopper
--ki string Secret key to encrypt and decrypt for the last hop(client-side) (default "it's a secret")
--ko string Secret key to encrypt and decrypt for the next hops (default "it's a secret")
-l, --listen string Listener address, eg: "IP:1234" (default ":1234")
-n, --nexthops strings Servers to randomly forward to (default [127.0.0.1:3000])
--sockbuf int Socket buffer size for the listener (default 1048576)
--timeout duration Idle timeout duration for a UDP connection (default 1m0s)
-t, --toggle Help message for toggle
-v, --version version for grasshopper
Use "grasshopper [command] --help" for more information about a command.
ncat
を使用して、ポート 5000 で UDP エコー サーバーを起動します。
ncat -e /bin/cat -k -u -l 5000
次のコマンドを実行してリレーラーを開始します。
./grasshopper start --ci aes --co none -l " 127.0.0.1:4001 " -n " 127.0.0.1:5000 "
--ci aes
: 受信パケットに暗号化を適用します。--co none
: プレーンテキストをncat
エコー サーバーに転送します。次のコマンドを実行して、別のリレーラーを起動します。
./grasshopper start --ci none --co aes -l " 127.0.0.1:4000 " -n " 127.0.0.1:4001 "
--ci none
: 受信パケットに暗号化は適用されません。--co aes
: パケットを暗号化してネクストホップに中継します。ncat
を使用して UDP パケットを送信し、リレーラー チェーンと対話します。
ncat -u 127.0.0.1 2132
┌──────────── YOUR─LAPTOP ──────────────┐ ┌────────── CLOUD─SERVER ───────────┐
│ │ │ │
│ │ │ │
│ ┌───────────────────┐ ┌──────────┐ │ │ ┌──────────┐ ┌───────────────┐ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ dig google.com ├───► Level-1 │ │ │ │ Level-2 ├───► Google DNS:53 │ │
│ │ @127.0.0.1 -p 4000│ │ Relayer ┼──┼ ENCRYPTED ┼─► Relayer │ │ CloudFlare:53 │ │
│ │ │ │ │ │ UDP │ │ │ │ │ │
│ └───────────────────┘ └──────────┘ │ │ └──────────┘ └───────────────┘ │
│ │ │ │
│ │ │ │
└───────────────────────────────────────┘ └───────────────────────────────────┘
./grasshopper start --ci aes --co none -l " CLOUD_PUBLIC_IP:4000 " -n " 8.8.8.8:53,1.1.1.1:53 "
--ci aes
: レベル 1 中継器からのパケットを復号化します。--co none
: 復号化された平文 DNS クエリ パケットを Google DNS に転送します。./grasshopper start --ci none --co aes -l " 127.0.0.1:4000 " -n " CLOUD_PUBLIC_IP:4000 "
--ci none
: dig
コマンドは平文でクエリを実行するため、パケットを復号化する必要はありません。--co aes
: パケットを復号化してレベル 2 中継器に中継しますdig
を使用してレベル 1 リレイヤーをクエリする (ラップトップ上) dig google.com @127.0.0.1 -p 4000