
UDPトラフィックを暗号化されたUDP/FakeTCP/ICMPトラフィックに変換し、Raw Socketを使用してUDPファイアウォール(または不安定なUDP環境)をバイパスするのに役立つトンネル
Raw Socket を使用して UDP トラフィックを暗号化された FakeTCP/UDP/ICMP トラフィックに変換し、UDP ファイアウォール(または不安定な UDP 環境)をバイパスするトンネルです。
単体で使用する場合、udp2raw は UDP トラフィックのみをトンネリングします。ただし、udp2raw と任意の UDP ベースの VPN を併用すると、あらゆるトラフィック(TCP/UDP/ICMP を含む)をトンネリングできます。現在、OpenVPN/L2TP/ShadowVPN および tinyfecVPN がサポートされていることが確認されています。

または

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 をシミュレートします。また、MSS、sackOk、TS、TS_ack、wscale などのいくつかの TCP オプションもシミュレートします。ファイアウォールは FakeTCP を TCP 接続とみなしますが、本質的には UDP です。通常の UDP と同様にリアルタイム/順序外配信をサポートし、輻輳制御や再送信は行いません。そのため、OpenVPN 使用時に TCP over TCP 問題は発生しません。
接続障害はハートビートによって検出されます。タイムアウトすると、クライアントは自動的にポート番号を変更して再接続します。再接続が成功すると、以前の接続が回復され、既存のすべての UDP セッションは有効なまま維持されます。
たとえば、udp2raw + OpenVPN を使用している場合、ネットワークケーブルが抜き差しされたり、WiFi アクセスポイントが変更されたりしても、OpenVPN は再接続後に切断されません。
make cross を実行するだけです。(注:デスクトップ、Raspberry Pi、Android、一部の OpenWrt ルーター向けのプリコンパイル済みバイナリは Releases に既に含まれています)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 が適用されているか、サポートが不十分であると仮定します。サーバー IP が 44.55.66.77 で、UDP ポート 7777 でサービスが待機しているとします。
# サーバー側で実行:
./udp2raw_amd64 -s -l0.0.0.0:4096 -r 127.0.0.1:7777 -k "passwd" --raw-mode faketcp -a
# クライアント側で実行
./udp2raw_amd64 -c -l0.0.0.0:3333 -r44.55.66.77:4096 -k "passwd" --raw-mode faketcp -a
(上記のコマンドは root で実行する必要があります。セキュリティを向上させるために、追加の手順を踏むことで非 root として udp2raw を実行できます。詳細については このリンク を参照してください)


これで、クライアントとサーバー間に、TCP ポート 4096 を介した暗号化 raw トンネルが確立されました。クライアント側の UDP ポート 3333 に接続することは、サーバー側のポート 7777 に接続することと同じです。UDP トラフィックは露出しません。
Android で実行する場合は、Android_Guide を確認してください。
-a オプションは、自動的に iptables ルール(またはいくつかの iptables ルール)を追加します。udp2raw はこの iptables ルールに依存して安定して動作します。-a を忘れないように注意してください(よくある間違いです)。udp2raw に iptables ルールを自動的に追加させたくない場合は、手動で追加(-g オプションを参照)し、-a を省略できます。
udp2raw-tunnel
git version:4623f878e0 build date:Nov 3 2024 23:15:46
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> available values:faketcp(default),udp,icmp and easy-faketcp
-k,--key <string> password to gen symetric key,default:"secret key"
--cipher-mode <string> available values:aes128cfb,aes128cbc(default),xor,none
--auth-mode <string> available 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
--fix-gro try to fix huge packet caused by GRO. this option is at an early stage.
make sure client and server are at same version.
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
--dev <string> bind raw socket to a device, not necessary but improves performance
--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
--wait-lock wait for xtables lock while invoking iptables, need iptables v1.4.20+
--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
--hb-len <number> length of heart-beat packet, >=0 and <=1500
--mtu-warn <number> mtu warning threshold, unit:byte, default:1375
--clear clear any iptables rules added by this program.overrides everything
--retry-on-error retry on error, allow to start udp2raw before network is initialized
-h,--help print this help message
-a および -gこのプログラムは raw ソケットを介してパケットを送信します。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-modeFakeTCP モードは、実際の TCP 接続と 100% 同じように動作するわけではありません。ISP は、シミュレートされた TCP トラフィックと実際の TCP トラフィックを区別できる可能性があります(ただし、コストがかかります)。seq-mode を使用すると、シーケンス増加動作をわずかに変更できます。接続に問題が発生した場合は、値を変更してみてください。
--lower-level--lower-level を使用すると、OSI レベル 2(リンクレベル)でパケットを送信できるため、ローカルの iptables ルールをバイパスできます。udp2raw と競合する複雑な iptables ルールがあり、そのルールを編集できない(または編集するのが面倒な)場合、--lower-level は非常に便利です。--lower-level auto を試してパラメータを自動検出し、auto が失敗した場合は手動で指定できます。
手動形式は if_name#dest_mac_adress、例:eth0#00:23:45:67:89:b9。
--keep-ruleiptables を監視し、必要に応じて iptables ルール(カーネル TCP 処理をブロックするため)を自動的に再追加します。特に、他のプログラムによって iptables ルールがクリアされる可能性がある場合に便利です(たとえば、OpenWrt を使用している場合、設定を変更してコミットするたびに iptables ルールがクリアされ、再構築される可能性があります)。
--conf-fileps コマンドから秘密を守るために、コマンドラインではなく設定ファイルからオプションを読み込むこともできます。
たとえば、上記の server の例(はじめにのセクション)のオプションを設定ファイルに書き換えます。
server.conf
-s
# このようにコメントを追加できます
# コメントは行全体を占める必要があります
# そうでないと期待通りに動作しません
# 待受アドレス
-l 0.0.0.0:4096
# リモートアドレス
-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 via OpenVPN + udp2raw (iperf3 UDP モードは、この issue で言及されているバグのため使用されていません:https://github.com/esnet/iperf/issues/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

(逆方向の速度も同様で、アップロードしていません)
詳細については wiki を確認してください: