อุโมงค์ที่เปลี่ยนการรับส่งข้อมูล UDP ให้เป็นการรับส่งข้อมูล FakeTCP / UDP / ICMP ที่เข้ารหัสโดยใช้ Raw Socket ช่วยให้คุณหลีกเลี่ยงไฟร์วอลล์ UDP (หรือสภาพแวดล้อม UDP ที่ไม่เสถียร)
เมื่อใช้เพียงอย่างเดียว udp2raw tunnels จะรับส่งข้อมูล UDP เท่านั้น อย่างไรก็ตาม หากคุณใช้ udp2raw + VPN ที่ใช้ UDP ร่วมกัน คุณสามารถส่งสัญญาณการรับส่งข้อมูลใดๆ (รวมถึง TCP/UDP/ICMP) ขณะนี้ OpenVPN/L2TP/ShadowVPN และ TinyfecVPN ได้รับการยืนยันว่ารองรับแล้ว
หรือ
วิกิ udp2raw
简体中文
โฮสต์ Linux (รวมถึงเดสก์ท็อป Linux, โทรศัพท์/แท็บเล็ต Android, เราเตอร์ OpenWRT หรือ Raspberry PI) พร้อมบัญชีรูทหรือความสามารถ cap_net_raw
สำหรับผู้ใช้ Windows และ MacOS ให้ใช้ udp2raw ใน repo นี้
ส่วนหัว ICMP/FakeTCP ช่วยให้คุณหลีกเลี่ยงการบล็อก UDP, UDP QOS หรือพฤติกรรม UDP NAT ที่ไม่เหมาะสมใน ISP บางราย ในโหมดส่วนหัว ICMP udp2raw ทำงานเหมือนกับอุโมงค์ ICMP
รองรับส่วนหัว UDP ด้วย ในโหมดส่วนหัว UDP มันทำงานเหมือนกับอุโมงค์ UDP ปกติ และคุณสามารถใช้คุณสมบัติอื่นๆ ได้ (เช่น การเข้ารหัส ป้องกันการเล่นซ้ำ หรือความเสถียรของการเชื่อมต่อ)
ในโหมดส่วนหัว FakeTCP udp2raw จะจำลองการจับมือกัน 3 ทางในขณะที่สร้างการเชื่อมต่อ จำลอง seq และ ack_seq ในขณะที่ถ่ายโอนข้อมูล นอกจากนี้ยังจำลองตัวเลือก TCP บางตัวเช่น: MSS
, sackOk
, TS
, TS_ack
, wscale
ไฟร์วอลล์จะถือว่า FakeTCP เป็นการเชื่อมต่อ TCP แต่ UDP โดยพื้นฐานแล้ว: รองรับการจัดส่งแบบเรียลไทม์/ไม่เป็นไปตามคำสั่ง (เช่นเดียวกับ UDP ปกติ) ไม่มีการควบคุมความแออัดหรือการส่งซ้ำ ดังนั้นจะไม่มีปัญหา TCP over TCP ใด ๆ เมื่อใช้ OpenVPN
หมายเหตุเกี่ยวกับการเข้ารหัส
ความล้มเหลวในการเชื่อมต่อถูกตรวจพบโดยการเต้นของหัวใจ หากหมดเวลา ไคลเอนต์จะเปลี่ยนหมายเลขพอร์ตและเชื่อมต่อใหม่โดยอัตโนมัติ หากการเชื่อมต่อใหม่สำเร็จ การเชื่อมต่อก่อนหน้านี้จะถูกกู้คืน และการสนทนา UDP ที่มีอยู่ทั้งหมดจะยังคงใช้งานได้
ตัวอย่างเช่น หากคุณใช้ udp2raw + OpenVPN OpenVPN จะไม่ขาดการเชื่อมต่อหลังจากเชื่อมต่อใหม่ แม้ว่าจะเสียบสายเครือข่ายใหม่หรือจุดเข้าใช้งาน WiFi มีการเปลี่ยนแปลงก็ตาม
Multiplexing ไคลเอ็นต์เดียวสามารถรองรับการเชื่อมต่อ UDP หลายรายการ ซึ่งทั้งหมดใช้การเชื่อมต่อดิบเดียวกัน
ไคลเอนต์หลายตัว เซิร์ฟเวอร์หนึ่งตัวสามารถมีไคลเอนต์ได้หลายตัว
รองรับ NAT ทั้ง 3 โหมดทำงานในสภาพแวดล้อม NAT
ทดสอบ การรองรับ OpenVZ บน BandwagonHost VPS
ง่ายต่อการสร้าง ไม่มีการพึ่งพา ในการคอมไพล์ข้าม udp2raw สิ่งที่คุณต้องทำคือเพียงดาวน์โหลด toolchain แก้ไข makefile ให้ชี้ไปที่ toolchain รัน make cross
จากนั้นทุกอย่างก็เสร็จสิ้น (หมายเหตุ: ไบนารีที่คอมไพล์ไว้ล่วงหน้าสำหรับเดสก์ท็อป RaspberryPi, Android, เราเตอร์ Openwrt บางตัวรวมอยู่ในรุ่นแล้ว)
Bypass UDP QoS
Bypass UDP Blocking
Bypass OpenVPN TCP over TCP problem
OpenVPN over ICMP
UDP to ICMP tunnel
UDP to TCP tunnel
UDP over ICMP
UDP over TCP
ดาวน์โหลดไบนารีรีลีสจาก https://github.com/wangyu-/udp2raw-tunnel/releases
สมมติว่า UDP ของคุณถูกบล็อกหรือถูก QOS-ed หรือรองรับได้ไม่ดี สมมติว่าเซิร์ฟเวอร์ ip ของคุณคือ 44.55.66.77 คุณมีบริการรับฟังบนพอร์ต udp 7777
# Run at server side:
./udp2raw_amd64 -s -l0.0.0.0:4096 -r 127.0.0.1:7777 -k " passwd " --raw-mode faketcp -a
# Run at client side
./udp2raw_amd64 -c -l0.0.0.0:3333 -r44.55.66.77:4096 -k " passwd " --raw-mode faketcp -a
(คำสั่งข้างต้นจำเป็นต้องรันในฐานะรูท เพื่อความปลอดภัยที่ดีขึ้น ด้วยขั้นตอนเพิ่มเติม คุณสามารถรัน udp2raw แบบไม่ใช่รูทได้ ตรวจสอบลิงก์นี้เพื่อดูข้อมูลเพิ่มเติม )
ขณะนี้อุโมงค์ดิบที่เข้ารหัสได้ถูกสร้างขึ้นระหว่างไคลเอนต์และเซิร์ฟเวอร์ผ่านพอร์ต TCP 4096 การเชื่อมต่อกับพอร์ต UDP 3333 ที่ฝั่งไคลเอ็นต์เทียบเท่ากับการเชื่อมต่อกับพอร์ต 7777 ที่ฝั่งเซิร์ฟเวอร์ จะไม่มีการเปิดเผยการรับส่งข้อมูล UDP
หากต้องการทำงานบน Android ให้ตรวจสอบ Android_Guide
-a
ตัวเลือกจะเพิ่มกฎ iptables (หรือกฎ iptables สองสามข้อ) ให้คุณโดยอัตโนมัติ udp2raw อาศัยกฎ iptables นี้เพื่อให้ทำงานได้อย่างเสถียร โปรดทราบว่าคุณอย่าลืม -a
(มันเป็นข้อผิดพลาดทั่วไป) หากคุณไม่ต้องการให้ udp2raw เพิ่มกฎ iptables โดยอัตโนมัติ คุณสามารถเพิ่มได้ด้วยตนเอง (ดูที่ตัวเลือก -g
) และละเว้น -a
udp2raw-tunnel
git version:6e1df4b39f build date:Oct 24 2017 09:21:15
repository: https://github.com/wangyu-/udp2raw-tunnel
usage:
run as client : ./this_program -c -l local_listen_ip:local_port -r server_address:server_port [options]
run as server : ./this_program -s -l server_listen_ip:server_port -r remote_address:remote_port [options]
common options,these options must be same on both side:
--raw-mode <string> avaliable values:faketcp(default),udp,icmp
-k,--key <string> password to gen symetric key,default:"secret key"
--cipher-mode <string> avaliable values:aes128cbc(default),xor,none
--auth-mode <string> avaliable values:hmac_sha1,md5(default),crc32,simple,none
-a,--auto-rule auto add (and delete) iptables rule
-g,--gen-rule generate iptables rule then exit,so that you can copy and
add it manually.overrides -a
--disable-anti-replay disable anti-replay,not suggested
client options:
--source-ip <ip> force source-ip for raw socket
--source-port <port> force source-port for raw socket,tcp/udp only
this option disables port changing while re-connecting
other options:
--conf-file <string> read options from a configuration file instead of command line.
check example.conf in repo for format
--fifo <string> use a fifo(named pipe) for sending commands to the running program,
check readme.md in repository for supported commands.
--log-level <number> 0:never 1:fatal 2:error 3:warn
4:info (default) 5:debug 6:trace
--log-position enable file name,function name,line number in log
--disable-color disable log color
--disable-bpf disable the kernel space filter,most time its not necessary
unless you suspect there is a bug
--sock-buf <number> buf size for socket,>=10 and <=10240,unit:kbyte,default:1024
--force-sock-buf bypass system limitation while setting sock-buf
--seq-mode <number> seq increase mode for faketcp:
0:static header,do not increase seq and ack_seq
1:increase seq for every packet,simply ack last seq
2:increase seq randomly, about every 3 packets,simply ack last seq
3:simulate an almost real seq/ack procedure(default)
4:similiar to 3,but do not consider TCP Option Window_Scale,
maybe useful when firewall doesnt support TCP Option
--lower-level <string> send packets at OSI level 2, format:'if_name#dest_mac_adress'
ie:'eth0#00:23:45:67:89:b9'.or try '--lower-level auto' to obtain
the parameter automatically,specify it manually if 'auto' failed
--gen-add generate iptables rule and add it permanently,then exit.overrides -g
--keep-rule monitor iptables and auto re-add if necessary.implys -a
--clear clear any iptables rules added by this program.overrides everything
-h,--help print this help message
-a
และ -g
โปรแกรมนี้จะส่งแพ็กเก็ตผ่านซ็อกเก็ตดิบ ในโหมด FakeTCP การประมวลผลแพ็กเก็ต TCP ของเคอร์เนล Linux จะต้องถูกบล็อกโดยกฎ iptables ทั้งสองด้าน มิฉะนั้นเคอร์เนลจะส่ง RST โดยอัตโนมัติสำหรับแพ็กเก็ต TCP ที่ไม่ได้รับการปรับแต่ง และคุณจะประสบปัญหาด้านความเสถียร/ประสิทธิภาพการทำงาน คุณสามารถใช้ตัวเลือก -a
เพื่อให้โปรแกรมเพิ่ม / ลบกฎ iptables โดยอัตโนมัติเมื่อเริ่ม / ออก คุณยังสามารถใช้ตัวเลือก -g
เพื่อสร้างกฎ iptables และเพิ่มด้วยตนเอง
--cipher-mode
และ --auth-mode
ขอแนะนำให้ใช้ aes128cbc
+ hmac_sha1
เพื่อให้ได้ความปลอดภัยสูงสุด หากคุณต้องการรันโปรแกรมบนเราเตอร์ คุณสามารถลองใช้ xor
+ simple
ซึ่งสามารถหลอกการตรวจสอบแพ็กเก็ตด้วยไฟร์วอลล์ได้เกือบตลอดเวลา แต่ไม่สามารถป้องกันคุณจากการโจมตีร้ายแรงได้ โหมด none มีไว้เพื่อการแก้ไขจุดบกพร่องเท่านั้น ไม่แนะนำให้ตั้งค่าโหมดการเข้ารหัสหรือโหมดการตรวจสอบสิทธิ์เป็นไม่มี
--seq-mode
โหมด FakeTCP ไม่ทำงาน 100% เหมือนการเชื่อมต่อ TCP จริง ISP อาจสามารถแยกแยะการรับส่งข้อมูล TCP จำลองจากการรับส่งข้อมูล TCP จริงได้ (แม้ว่าจะมีค่าใช้จ่ายสูงก็ตาม) seq-mode สามารถช่วยให้คุณเปลี่ยนพฤติกรรมการเพิ่ม seq ได้เล็กน้อย หากคุณประสบปัญหาการเชื่อมต่อ ให้ลองเปลี่ยนค่า
--lower-level
--lower-level
ช่วยให้คุณสามารถส่งแพ็กเก็ตที่ OSI ระดับ 2 (ระดับลิงก์) เพื่อให้คุณสามารถข้ามกฎ iptables ในเครื่องได้ หากคุณมีกฎ iptables ที่ซับซ้อนซึ่งขัดแย้งกับ udp2raw และคุณไม่สามารถ (หรือขี้เกียจเกินไปที่จะ) แก้ไขกฎ iptables ได้ --lower-level
จะมีประโยชน์มาก ลอง --lower-level auto
เพื่อตรวจจับพารามิเตอร์อัตโนมัติ คุณสามารถระบุได้ด้วยตนเองหาก auto
ล้มเหลว
รูปแบบด้วยตนเอง if_name#dest_mac_adress
เช่น: eth0#00:23:45:67:89:b9
--keep-rule
ตรวจสอบ iptables และเพิ่มกฎ iptables อัตโนมัติ (สำหรับการบล็อกการประมวลผลเคอร์เนล TCP) หากจำเป็น มีประโยชน์อย่างยิ่งเมื่อกฎ iptables อาจถูกล้างโดยโปรแกรมอื่น (เช่น หากคุณใช้ openwrt ทุกครั้งที่คุณเปลี่ยนแปลงและยอมรับการตั้งค่า กฎ iptables สามารถเคลียร์แล้วสร้างใหม่ได้)
--conf-file
คุณยังสามารถโหลดตัวเลือกจากไฟล์กำหนดค่าเพื่อป้องกันไม่ให้เป็นความลับจากคำสั่ง ps
ตัวอย่างเช่น เขียนตัวเลือกสำหรับตัวอย่าง server
ด้านบนอีกครั้ง (ในส่วนเริ่มต้นใช้งาน) ลงในไฟล์การกำหนดค่า:
server.conf
-s
# You can add comments like this
# Comments MUST occupy an entire line
# Or they will not work as expected
# Listen address
-l 0.0.0.0:4096
# Remote address
-r 127.0.0.1:7777
-a
-k passwd
--raw-mode faketcp
ให้ความสนใจกับพารามิเตอร์ -k
: ในโหมดบรรทัดคำสั่ง เครื่องหมายคำพูดรอบรหัสผ่านจะถูกลบออกโดยเชลล์ ในไฟล์คอนฟิกูเรชัน เราจะไม่ลบเครื่องหมายคำพูด
จากนั้นสตาร์ทเซิร์ฟเวอร์ด้วย
./udp2raw_amd64 --conf-file server.conf
--fifo
ใช้ fifo (ไปป์ที่มีชื่อ) เพื่อส่งคำสั่งไปยังโปรแกรมที่รันอยู่ ตัวอย่างเช่น --fifo fifo.file
ที่ฝั่งไคลเอ็นต์ คุณสามารถใช้ echo reconnect >fifo.file
เพื่อบังคับให้ไคลเอ็นต์เชื่อมต่อใหม่ ขณะนี้ยังไม่มีการใช้คำสั่งสำหรับเซิร์ฟเวอร์
iperf3 TCP ผ่าน OpenVPN + udp2raw (ไม่ได้ใช้โหมด iperf3 UDP เนื่องจากมีจุดบกพร่องที่กล่าวถึงในปัญหานี้: esnet/iperf#296 เราจะรวมการรับส่งข้อมูล TCP ลงใน UDP โดย OpenVPN เพื่อทดสอบประสิทธิภาพแทน อ่านรายละเอียดการสมัคร
iperf3 -c 10.222.2.1 -P40
iperf3 -c 10.222.2.1 -P40 -R
raw_mode: faketcp cipher_mode: x หรือ auth_mode: ง่าย
(ความเร็วถอยหลังคล้ายกันและไม่ได้อัปโหลด)
raw_mode: faketcp cipher_mode: aes128cbc auth_mode: md5
(ความเร็วถอยหลังคล้ายกันและไม่ได้อัปโหลด)
ตรวจสอบวิกิเพื่อดูข้อมูลเพิ่มเติม:
https://github.com/wangyu-/udp2raw-tunnel/wiki