VPN経由でTCPリクエストを転送する

VPN経由でTCPリクエストを転送する

私は3つのデバイスを持っています:

  1. ネットワーク1に接続されたサーバー
  2. ネットワーク2に接続されたラップトップ
  3. Network2に接続されたRaspberry Pi

Network1 には openVPN サーバーもあり、VPN にアクセスするためのポート転送もあります。

Raspi がラップトップから TCP 要求 (サーバー向け) を受信し、VPN 経由でサーバーに送信し、サーバーからの応答をラップトップに返す必要があります。使用されるポートは 1 つだけですが、すべてのポートが転送されても問題ありません。ラップトップにソフトウェアをインストールすることはできません。また、ラップトップにコマンドなどをインストールしないことが望ましいです。

何らかの「ポート転送」が必要ですが、VPNに接続する必要があります

答え1

文字通り同じ「ポート転送」、つまりルーター (RasPi) のファイアウォールの DNAT ルールを使用します。これは、ネットワークの種類に関係なく同じように機能します。

つまり、DNAT必要な「ポート転送」ごとに、RasPi ファイアウォールに iptables または nftables ルールを追加します。(「転送を許可する」ルールも追加することを忘れないでください。これらはほとんどのルーターでは自動的に行われますが、プレーンな iptables または nftables では自動的に行われません。)

サーバーは、VPN 接続を介して Network2 に戻るルートを持っている必要があります (OpenVPN では、これはおそらくiroute構成を意味します)。設定が難しい場合は、RasPi に DNAT も実行させるSNATか、またはMASQUERADEDNAT に加えて実行させるという代替策があります。(SNAT/MASQ オプションは、LAN の「NAT ヘアピン」とまったく同じ種類の構成になります。)

  • nftables の例:

    table inet filter {
        chain forward {
            type filter hook forward priority filter;
    
            ip daddr <ServerIP> accept
        }
    }
    
    table ip nat {
        chain prerouting {
            type nat hook prerouting priority dstnat;
    
            iifname "eth0" ip daddr <RasPiIP> tcp dport 80 \
              dnat to <ServerIP>:80
        }
    
        chain postrouting {
            type nat hook postrouting priority srcnat;
    
            oifname "tun0" masquerade
        }
    }
    
  • iptables の例:

    -t filter -I FORWARD -d <ServerIP> -j ACCEPT
    
    -t nat -I PREROUTING -i eth0 -d <RasPiIP> -p tcp --dport 80 \
        -j DNAT --to-destination <ServerIP>:80
    
    -t nat -I POSTROUTING -o tun0 -j MASQUERADE
    

代替案: RasPi で「リバース プロキシ」を使用します。ほとんどのリバース プロキシは HTTP/HTTPS 用ですが、任意の TCP または TLS プロトコルをプロキシできます。これは UDP では機能しません (少なくとも簡単には機能しません)。追加のソフトウェアが必要ですが、ルーティング要件は少なくなります。

HTTP/HTTPS サービスの場合、Nginx または Apache httpd が一般的な選択肢であり、他の場所にも広く文書化されています。(どちらの場合も、オプションは「proxy_pass」または「ProxyPass」と呼ばれます。)

関連情報