Raw Socket を使用して 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 をシミュレートします。また、 MSS
、 sackOk
、 TS
、 TS_ack
、 wscale
などのいくつかの TCP オプションもシミュレートします。ファイアウォールは FakeTCP を TCP 接続とみなしますが、本質的には UDP です。(通常の UDP と同様に) リアルタイム/アウトオブオーダー配信をサポートし、輻輳制御や再送信は行いません。したがって、OpenVPN を使用するときに TCP over TCP の問題は発生しません。
暗号化に関する注意事項
接続障害はハートビートによって検出されます。タイムアウトになった場合、クライアントは自動的にポート番号を変更して再接続します。再接続が成功すると、以前の接続が回復され、既存の UDP 会話はすべて有効なままになります。
たとえば、udp2raw + OpenVPN を使用する場合、ネットワーク ケーブルが再接続されたり WiFi アクセス ポイントが変更された場合でも、OpenVPN は再接続後に接続を失いません。
多重化1 つのクライアントは複数の UDP 接続を処理でき、そのすべてが同じ raw 接続を共有します。
複数のクライアント1 つのサーバーに複数のクライアントを含めることができます。
NAT サポート3 つのモードはすべて NAT 環境で動作します。
OpenVZ サポートはBandwagonHost VPS でテストされました。
ビルドが簡単 依存関係がありません。udp2raw をクロスコンパイルするには、ツールチェーンをダウンロードし、ツールチェーンを指すように makefile を変更し、 make cross
実行するだけですべてが完了します。(注: デスクトップ用にコンパイル済みのバイナリ、 RaspberryPi、Android、一部の Openwrt Router はすでにリリースに含まれています)
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 でリッスンするサービスがあるとします。
# 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 を介してクライアントとサーバーの間に暗号化された raw トンネルが確立されました。クライアント側の 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 モードでは、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 モードは、実際の TCP 接続と 100% 同様に動作するわけではありません。 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 処理をブロックするため)。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
使用してクライアントに再接続を強制できます。現在、サーバー用のコマンドは実装されていません。
OpenVPN + udp2raw 経由の iperf3 TCP (この問題で言及されているバグのため、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
(逆速度は同様でアップロードされませんでした)
詳細については wiki を確認してください:
https://github.com/wangyu-/udp2raw-tunnel/wiki