
問題が発生しました。 OpenWRTを使用して多くの組み込みデバイスをWireguardサーバーに接続したいのですが、80、443などのポートを除くすべてのポートがブロックされます。また、ネットワークではTCPのみが許可されます。
WireGuardトンネルUDPをTCPに接続する必要があるようです。私のサーバーでポート共有(SSHL)サービスを使用して、443(またはファイアウォールで許可されている他のポート)でHTTPSサーバーとWireGuardトンネルの両方を実行しようとしています。複数のユーザーをサポートするトンネルが欲しいので、高速socatハッキングはより多くのクライアントで機能しないと思います。
- 私は試してみましたが、
wireguard-proxy
SSLHを介したポート共有にはうまくいきますが、Rustで書かれていてOpenWRTに配布できませんでした(試してみましたが、コンパイルエラーが発生しました)。 - テストも試しましたが、udp2raw
専用ポートではうまく機能しますが、SSLHポートマルチプレクサを使用するときは接続できません。
OpenWRTビルドシステムでクロスコンパイルし、変更されたネットワーク機器で使用できるC / C ++で書かれたトンネリングソフトウェアを探しています。
答え1
あなたはそれを使用することができますsocat
トンネリングソフトウェアで。
これは、ポート51820でリッスンするWireGuardを使用した一般的な設定(対話式で行われます)です。スタートアップサービスにはまだ完全な統合が必要です。
OpenWRT(しかし実際には他のLinuxでテスト済み)
通常どおりWireguardインターフェイスを有効にします。
... MTUを除く:以下の説明の説明を参照してください。 1420-64=1356のMTUを使用します。はい(
wg0.conf
使用時に実際に実行する必要がありますwg-quick
):ip link set wg0 mtu 1356
ターミナル1:
sslh -n --listen 0.0.0.0:443 \ --tls 127.0.0.1:8443 \ --anyprot 127.0.0.1:51820 \ -f
sslh
WireGuardのプロトコルが認識されず、--anyprot
目的地に移動します。ターミナル2:
socat -T 120 \ tcp4-listen:51820,bind=127.0.0.1,reuseaddr,nodelay,fork \ udp4-connect:127.0.0.1:51820
〜のように
socat
提案その他の場合:注:2つのSocat「ライン側」間でパケットを転送する場合は、UDPなどのパケット境界を維持するプロトコルが必要です。TCP は Nodelay オプションとともに使用できます。。
sslh
特に使用されていませんが、ノードレイアウト、socat
どちらもします。これがこの部分に役立つことを願っています。これは
-T 120
、フォークが終了する前の非アクティブ遅延です。socat
クライアントがローミングして接続が切断された場合に便利です。クライアントWireGuardの永続性を維持するには、予想より高い値に設定する必要があります。とにかく、これはTLSではなくDDoSケースにはあまり役に立ちません。socat
DoSにのみ役立ついくつかのフォークがあります(WireGuard自体はこれらのトラフィックを無視します)。
顧客
ターミナル1:
socat -T 120 \ udp4-listen:51821,bind=127.0.0.1,fork \ tcp4:public-endpoint:51820,nodelay
実際にクライアントがローミングしている場合、
socat
TCP 部分が正常に失敗するのに時間がかかることがあるため、コマンドを再起動する必要があります。ラインバッカーインターフェース
以前と同様にMTUを下げます。 Linuxでは、次のようになります。
ip link set wg0 mtu 1356
その後、ピアエンドポイントを変更して、現在のローカルシステムにあるトンネル入口に切り替えます(クライアントからやり直す必要があります
wg0.conf
)。wg set wg0 peer XXXXXXXXX= endpoint 127.0.0.1:51821
クライアントがトンネル内でパケットを送信して認証すると、サーバーのWireGuardはクライアントエンドポイント(ローカルから127.0.0.1:randomportへsocat
)を更新して応答できるようになりました。これにより全二重通信が可能になります。
client ⟺ WG ⟺ UDP ⟺ socat ⟺ TCP over Internet
⇧
⇩
server ⟺ WG ⟺ UDP ⟺ socat ⟺ TCP ⟺ sslh
ノート
MTUに関する注意
一般的な80バイトのオーバーヘッド(1500-80 = 1420)WireGuard予約に加えて、TCPオーバーヘッドも追加する必要があります。これは、外部トンネル層が2つのTCPパケットでペイロードが大きくなりすぎることを基本プロトコルが認識しないことを防ぐためです
socat
。sslh
これにより、少なくとも2番目にカプセル化されたUDPペイロードが破損し、再送信が発生する可能性があります。このオーバーヘッドは実際には動的です。 IPv4 の場合は IP の場合は 20 以上、TCP の場合は 20 です。その後、最新のTCP接続は2 + 8 + 2 = 12バイトをタイムスタンプとして使用し、パケットが失われた場合は任意の数のSACKを使用する必要があります。 (2+2*4+2=12): 20+20+12+12=64 を考えてみましょう。正確な値は重要ではありません(各オプションをソートするために、実際に2つのTCPオプションの間に2つのTCP NOPがありますか?わかりません)。それで結局私はWireGuard MTUを1420-64 = 1356に選びました。
実際の物理LANの一部のテストでは、
ping -M do -s $MTU-28 -f 10.x.x.x
インターフェイスでMTU = 1420を維持すると約40%のパケット損失が発生し、MTU = 1356ではパケットが失われず、より高いMTUでも十分であることがわかりました。ポート443は限られており、SSLが必要です。
ポート443を制限するファイアウォールがそのポートのSSLトラフィックのみを期待している場合、状況はさらに複雑になります。 1つは
sslh
次に置き換える必要がありますhaproxy
またはnginx
(どちらもOpenWRTにパッケージされているようです。必要な機能が利用可能かどうかはわかりません)TLSパススルー機能を使用して、受信したClientHelloに基づいてTLS接続をルーティングします。ニューラルネットワーク研究所。そうすれば、両方のsは/代わりに/socat
と通信しますが、この場合MTUがどのような影響を受けるかはわかりません。tcp-listen
tcp
openssl-listen
openssl