私のプロジェクトでは、UDPのみのVPNがTCP(できればポート443または80)で動作する可能性を探しています。調査を行っているときに次のことがわかりました。
UDPのみのVPNをTCP上で機能させたい理由としては、さまざまな企業ファイアウォールまたは全国規模のファイアウォールが(ランダムな)UDPポート上のUDPトラフィックをブロックします。もちろん、ほとんど開いている指定されたUDPポート(たとえば53 DNS)が存在しますが、これらのポートの通常のトラフィックからVPNを認識するのは非常に簡単です。トラフィックの模倣については知っていますが、これはVPNのオーバーヘッドを大幅に増やす方法を意味します。このプロジェクトで使用されるプロトコルは、TCPフォールバックが組み込まれているOpenVPNではなくWireGuardです。
私の知る限り、UDPトラフィックをTCPでラップするための優れた(信頼できる)手法は存在しません。これは本当ですか?もしそうなら、私の目標を達成できる他のテクニックはありますか?
私は直接の答えであなたを助けることはできませんが、あなたは以下の情報源で良い情報を見つけるかもしれません。
Zebedee (2005年からのオープンソース)
Zebedeeは、2つのシステム間でTCP/IPまたはUDPデータを転送するための暗号化された圧縮された「トンネル」を確立するためのシンプルなプログラムです。これにより、telnet、ftp、Xなどのトラフィックをスヌーピングから保護できるだけでなく、圧縮によって低帯域幅ネットワークでパフォーマンスを向上させることができます。
さらに詳しい情報は ここにあります です。
udptunnel
これはLinuxパッケージとして利用できます( Debianリンク )。
そのソースは GitHub上 にあり、次のように記述されています:
このプロジェクトは、UDPトンネルを介してTCPデータをトンネリングします。実行可能ファイルはサーバーまたはクライアントとして機能できます。サーバーはクライアントのプロキシとして機能し、指定されたUDPポートでリッスンし、への接続を作成します。 a TCPクライアントが指定するサーバー。クライアントはTCPポートでリッスンし、一部のTCPクライアントはに接続します。クライアントはそのポートでTCPデータを受信し、データをudpserverに送信します。udpserverはデータをTCP必要なTCPサーバー。
TCPベースのVPNトンネルを通過するUDPパケットは、全体の旅のTCP部分のみの配信を保証していることに注意してください。TCPベースのVPNトンネルの外側の合計パスの部分、パケット損失が発生する可能性があります。
少し遅れるかもしれませんが dp2raw-tunnel は、TCPを介してUDPをトンネリングするための優れたソフトウェアです。おそらくsocat
は、UDPパケットがTCPトンネルで連結された後、受信側で正しく分割できないため)機能しません。TCPは結局のところストリームです。
udp2raw-tunnel
をUDP-over-TCPトンネルとして使用する場合、root権限は必要ありません。クライアントマシンで、次を実行します。
udp2raw -c -l 0.0.0.0:3333 -r $server_ip:80
vPNクライアントをローカルホストのUDPポート3333に接続します。
サーバーマシンのポート80/443でリッスンするには、root権限が必要な場合があります。
Sudo udp2raw -s -l 0.0.0.0:80 -r 127.0.0.1:$vpn_server_udp_port
VPNクライアント/サーバーマシンは、必ずしもudp2raw
クライアント/サーバーと同じマシンである必要はありません。正しいIPを設定するだけで、機能します。
編集:Oopsこれは「偽の」TCPであることがわかりました。つまり、生のIPデータグラムを使用していますが、外部の世界ではTCP接続だと思われます。したがって、 SSHを介して「TCP」接続をトンネリングしようとしても成功しませんが、それでもシナリオではうまく機能します。