透過VPN轉送tcp請求

透過VPN轉送tcp請求

我有 3 台設備:

  1. 連接 Network1 的伺服器
  2. 一台筆記型電腦,連接到 Network2
  3. Raspberry Pi,也連接到 Network2

Network1 上還有一個 openVPN 伺服器,以及用於存取 VPN 的連接埠轉送。

我需要 Raspi 從筆記型電腦接收 TCP 請求(針對伺服器)並透過 VPN 將它們傳送到伺服器,然後將伺服器的回應傳送回筆記型電腦。只會使用一個端口,但如果所有端口都轉發也可以。筆記型電腦上無法安裝任何軟體。筆記型電腦上最好也沒有指令等。

我需要某種“連接埠轉送”但進入 VPN

答案1

使用字面上相同的“連接埠轉送”,即路由器(RasPi)防火牆中的 DNAT 規則;無論網路類型如何,它的功能都相同。

也就是說,DNAT為您需要的每個「連接埠轉送」將 iptables 或 nftables 規則新增至 RasPi 防火牆。 (不要忘記還添加“允許轉發”規則 - 這些規則在大多數路由器中是自動的,但在普通 iptables 或 nftables 中不是自動的。)

您的伺服器必須有一條透過其 VPN 連線返回 Network2 的路由(在 OpenVPN 中,這可能意味著設定iroute)。如果設定起來很困難,另一個選擇是讓 RasPi 也執行 DNAT 操作SNATMASQUERADE除了 DNAT 之外還執行此操作。 (SNAT/MASQ 選項與 LAN 中的「NAT 髮夾」配置完全相同。)

  • nftable 的範例:

    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”。)

相關內容