grasshopper
Optimize performance for QPP encryption
Grasshopper เป็นตัวส่งต่อแพ็กเก็ต UDP ที่รับฟังแพ็กเก็ตขาเข้าและส่งต่อไปยังปลายทางที่กำหนดค่าไว้ นอกจากนี้ยังรองรับการเข้ารหัสสำหรับแพ็กเก็ตทั้งขาเข้าและขาออก โดยใช้คีย์และวิธีการที่แตกต่างกัน
ตั๊กแตนทำหน้าที่เป็นระบบรีเลย์แบบโซ่ ใช้แบบสอบถาม 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
เพื่อเริ่มเซิร์ฟเวอร์ UDP echo บนพอร์ต 5000:
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
echoรันคำสั่งต่อไปนี้เพื่อสตาร์ทรีเลย์อื่น:
./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
: ถอดรหัสและถ่ายทอดแพ็คเก็ตไปยังรีเลย์ระดับ 2dig
(บนแล็ปท็อปของคุณ) dig google.com @127.0.0.1 -p 4000