web-dev-qa-db-ja.com

UDPのみのVPNを機能させるTCP

私のプロジェクトでは、UDPのみのVPNがTCP(できればポート443または80)で動作する可能性を探しています。調査を行っているときに次のことがわかりました。

  • これはsocatで可能ですが、UDP接続がトラフィックをプッシュし続ける可能性があるため、これは信頼できませんが、TCPバッファは過負荷になります。
  • Secure Socket Funneling(SSF)[1]で可能かもしれないと思いますが、これが100%信頼できるかどうか、トラフィックをTCP)にプッシュするのか、それとも何らかの方法で見つけたのかはわかりません。 TLS over UDPを使用する(私にとってはそのように思われる)。

UDPのみのVPNをTCP上で機能させたい理由としては、さまざまな企業ファイアウォールまたは全国規模のファイアウォールが(ランダムな)UDPポート上のUDPトラフィックをブロックします。もちろん、ほとんど開いている指定されたUDPポート(たとえば53 DNS)が存在しますが、これらのポートの通常のトラフィックからVPNを認識するのは非常に簡単です。トラフィックの模倣については知っていますが、これはVPNのオーバーヘッドを大幅に増やす方法を意味します。このプロジェクトで使用されるプロトコルは、TCPフォールバックが組み込まれているOpenVPNではなくWireGuardです。

私の知る限り、UDPトラフィックをTCPでラップするための優れた(信頼できる)手法は存在しません。これは本当ですか?もしそうなら、私の目標を達成できる他のテクニックはありますか?

[1] https://securesocketfunneling.github.io/ssf/#home

2
Breus

私は直接の答えであなたを助けることはできませんが、あなたは以下の情報源で良い情報を見つけるかもしれません。

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トンネルの外側の合計パスの部分、パケット損失が発生する可能性があります。

0
harrymc

少し遅れるかもしれませんが 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」接続をトンネリングしようとしても成功しませんが、それでもシナリオではうまく機能します。

0
ReeseWang