透過使用原始套接字將 UDP 流量轉換為加密的 FakeTCP/UDP/ICMP 流量的隧道可協助您繞過 UDP 防火牆(或不穩定的 UDP 環境)。
單獨使用時,udp2raw 僅傳輸 UDP 流量。不過,如果您同時使用 udp2raw + 任何基於 UDP 的 VPN,則可以隧道任何流量(包括 TCP/UDP/ICMP),目前已確認支援 OpenVPN/L2TP/ShadowVPN 和tinyfecVPN。
或者
udp2raw 維基
簡體中文
具有 root 帳號或 cap_net_raw 功能的 Linux 主機(包括桌上型 Linux、Android 手機/平板電腦、OpenWRT 路由器或 Raspberry PI)。
對於 Windows 和 MacOS 用戶,請使用此儲存庫中的 udp2raw。
ICMP/FakeTCP 標頭可協助您繞過某些 ISP 上的 UDP 封鎖、UDP QOS 或不正確的 UDP NAT 行為。在 ICMP 標頭模式下,udp2raw 的工作方式類似於 ICMP 隧道。
也支援 UDP 標頭。在 UDP 標頭模式下,它的行為就像普通的 UDP 隧道一樣,您可以使用其他功能(例如加密、防重播或連接穩定)。
在FakeTCP頭模式下,udp2raw在建立連線時模擬3次握手,在資料傳輸時模擬seq和ack_seq。它也模擬一些 TCP 選項,例如: MSS
、 sackOk
、 TS
、 TS_ack
、 wscale
。防火牆會將 FakeTCP 視為 TCP 連接,但其本質上是 UDP:它支援即時/亂序傳送(就像普通 UDP 一樣),沒有擁塞控製或重傳。所以使用OpenVPN時不會出現任何TCP over TCP問題。
加密注意事項
透過心跳檢測連線失敗。如果逾時,用戶端將自動變更連接埠號碼並重新連線。如果重連成功,先前的連線將恢復,並且所有現有的 UDP 會話將保持有效。
例如,如果您使用udp2raw + OpenVPN,OpenVPN在任何重新連接後都不會遺失連接,即使重新插入網路線或變更WiFi存取點。
多路復用一個客戶端可以處理多個 UDP 連接,所有這些連接共享相同的原始連接。
多個客戶端一台伺服器可以有多個客戶端。
NAT 支援這 3 種模式均適用於 NAT 環境。
OpenVZ 支援已在 BandwagonHost VPS 上測試。
易於構建,無依賴關係make cross
一些Openwrt 路由器已包含在版本中)
Bypass UDP QoS
Bypass UDP Blocking
Bypass OpenVPN TCP over TCP problem
OpenVPN over ICMP
UDP to ICMP tunnel
UDP over TCP
隧道UDP over ICMP
ICMP UDP to TCP tunnel
從 https://github.com/wangyu-/udp2raw-tunnel/releases 下載二進位版本
假設您的 UDP 被阻止或受到 QOS 限製或只是支持不佳。假設你的伺服器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
(上述命令需要以root身份運行。為了更好的安全性,透過一些額外的步驟,您可以以非root身份運行udp2raw。查看此連結以獲取更多資訊)
現在,用戶端和伺服器之間已經透過 TCP 4096 連接埠建立了一條加密的原始隧道。不會暴露任何 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 模式下,Linux 核心 TCP 封包處理必須被雙方的 iptables 規則阻止,否則核心將自動為未識別的 TCP 封包發送 RST,並且您將面臨穩定性/效能問題。您可以使用-a
選項讓程式在啟動/退出時自動新增/刪除 iptables 規則。您也可以使用-g
選項產生 iptables 規則並手動新增。
--cipher-mode
和--auth-mode
建議使用aes128cbc
+ hmac_sha1
以獲得最大的安全性。如果你想在路由器上運行該程序,你可以嘗試xor
+ simple
,它大多數時候可以欺騙防火牆的封包檢查,但它不能保護你免受嚴重攻擊。 none 模式僅用於調試目的。不建議將 cipher-mode 或 auth-mode 設為 none。
--seq-mode
FakeTCP 模式的行為並不 100% 像真正的 TCP 連線。 ISP 或許能夠區分模擬的 TCP 流量和真實的 TCP 流量(儘管成本很高)。 seq-mode 可以幫助您稍微改變 seq 增加行為。如果您遇到連線問題,請嘗試變更該值。
--lower-level
--lower-level
可讓您在 OSI 層級 2(連結層級)傳送封包,這樣您就可以繞過任何本機 iptables 規則。如果您有一個與 udp2raw 衝突的複雜 iptables 規則,並且您無法(或懶得)編輯 iptables 規則,那麼--lower-level
可能非常有用。嘗試--lower-level auto
自動偵測參數,如果auto
失敗可以手動指定。
手動格式if_name#dest_mac_adress
,即: eth0#00:23:45:67:89:b9
。
--keep-rule
監控 iptables 並在必要時自動重新新增 iptables 規則(用於阻止核心 tcp 處理)。會被清除並重建)。
--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
參數:在命令列模式下,密碼周圍的引號將會被 shell 刪除。在設定檔中,我們不刪除引號。
然後啟動伺服器
./udp2raw_amd64 --conf-file server.conf
--fifo
使用 fifo(命名管道)向正在執行的程式發送命令。例如--fifo fifo.file
。
在客戶端,可以使用echo reconnect >fifo.file
強制客戶端重新連線。
iperf3 TCP via OpenVPN + udp2raw (由於本期提到的 bug,沒有使用 iperf3 UDP 模式: esnet/iperf#296 。相反,我們透過 OpenVPN 將 TCP 流量打包成 UDP 來測試效能。詳細資訊請閱讀應用程式。
iperf3 -c 10.222.2.1 -P40
iperf3 -c 10.222.2.1 -P40 -R
raw_mode: faketcp cipher_mode: xor auth_mode: simple
(倒車速度類似,未上傳)
raw_mode: faketcp cipher_mode: aes128cbc auth_mode: md5
(倒車速度類似,未上傳)
檢查維基以獲取更多資訊:
https://github.com/wangyu-/udp2raw-tunnel/wiki