Iptables

埠轉發到 VPN 客戶端?

  • July 9, 2021

我遇到了一些難題,並且沒有太多運氣找到解決方案。現在我(遺憾地)通過 Verizon 3G 連接到網路。他們過濾所有傳入的流量,所以我不可能打開埠來接受連接。

我目前在 linode.com 有一個 Linux 虛擬機,我想到安裝pptpd並嘗試進行一些iptables埠轉發。我已經pptpd安裝並且我的家用機器連接愉快。也就是說,這裡有一些一般資訊:

伺服器 (Debian) WAN IP:eth0 上的 xxxx - pptpd IP:ppp0 上的 yyy1 - 客戶端 VPN IP:yyy100

為了驗證我沒有發瘋,我嘗試了一些從伺服器到客戶端上開放埠的連接,並且客戶端確實接受了通過 VPN IP 的連接。

我想要完成的是:

Internet -> WAN IP:Port -> 轉發到客戶端 VPN IP:Port

例如,如果我在客戶端上打開了埠 6000,一個人可以遠端登錄到 xxxx:6000,伺服器會擷取它並將其轉發到 192.168.3.100:6000。

我已經嘗試了至少 20 種不同的Google搜尋iptables配置,但都沒有奏效。有沒有人有任何想法,或者甚至是我可能不知道的完全不同的方法?這裡的目標是通過一個可怕的防火牆連接來監聽,最好是 TCP 和 UDP 流量。

你需要在你的 VPN 伺服器(Linode)上做三件事來完成這項工作:

  1. 您必須啟用 IP 轉發:
sysctl -w net.ipv4.ip_forward=1
  1. 設置目標 NAT (DNAT) 以轉發埠。您可能已經弄清楚了,因為它是標準埠轉發的東西,但為了完整性:
iptables -t nat -A PREROUTING -d x.x.x.x -p tcp --dport 6000 -j DNAT --to-dest y.y.y.100:6000
  1. 設置源 NAT (SNAT),以便從 VPN 客戶端的角度來看,連接來自 VPN 伺服器:
iptables -t nat -A POSTROUTING -d y.y.y.100 -p tcp --dport 6000 -j SNAT --to-source y.y.y.1

您需要 SNAT 的原因是,否則您的 VPN 客戶端將通過其預設網關(即 Verizon 3G)而不是通過 VPN 將其返回數據包直接發送到啟動連接(zzzz)的主機。因此,返回數據包上的源 IP 地址將是您的 Verizon 3G 地址,而不是 xxxx 這會導致各種問題,因為 zzzz 確實發起了與 xxxx 的連接

在大多數埠轉發設置中,不需要 SNAT,因為執行埠轉發的主機也是目標主機(例如家庭路由器)的預設網關。

另請注意,如果要將埠 6000 轉發到不同的埠(例如 7000),則 SNAT 規則應匹配 7000,而不是 6000。

引用自:https://unix.stackexchange.com/questions/55791