ポート443 TCPトンネルのWireguard、ブロックされたポートバイパス、OpenWRTソリューション

ポート443 TCPトンネルのWireguard、ブロックされたポートバイパス、OpenWRTソリューション

問題が発生しました。 OpenWRTを使用して多くの組み込みデバイスをWireguardサーバーに接続したいのですが、80、443などのポートを除くすべてのポートがブロックされます。また、ネットワークではTCPのみが許可されます。

WireGuardトンネルUDPをTCPに接続する必要があるようです。私のサーバーでポート共有(SSHL)サービスを使用して、443(またはファイアウォールで許可されている他のポート)でHTTPSサーバーとWireGuardトンネルの両方を実行しようとしています。複数のユーザーをサポートするトンネルが欲しいので、高速socatハッキングはより多くのクライアントで機能しないと思います。

  • 私は試してみましたが、wireguard-proxySSLHを介したポート共有にはうまくいきますが、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
    

    sslhWireGuardのプロトコルが認識されず、--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ケースにはあまり役に立ちません。socatDoSにのみ役立ついくつかのフォークがあります(WireGuard自体はこれらのトラフィックを無視します)。

顧客

  • ターミナル1:

    socat -T 120 \
        udp4-listen:51821,bind=127.0.0.1,fork \
        tcp4:public-endpoint:51820,nodelay
    

    実際にクライアントがローミングしている場合、socatTCP 部分が正常に失敗するのに時間がかかることがあるため、コマンドを再起動する必要があります。

  • ラインバッカーインターフェース

    以前と同様に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パケットでペイロードが大きくなりすぎることを基本プロトコルが認識しないことを防ぐためですsocatsslhこれにより、少なくとも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-listentcpopenssl-listenopenssl

おすすめ記事