首先,我在網路方面的知識非常有限,所以如果我使用了錯誤的術語,我提前道歉。
情況
我正在嘗試建立一個原型,允許客戶端與不同網路上的本機 Web 伺服器進行通訊。網頁伺服器與 VPN 伺服器託管在同一網路上。到目前為止,我能夠將客戶端資料包(例如:SYN)路由到虛擬介面(tun)並將整個資料包傳送到 VPN 伺服器。在伺服器端,我接收這些資料包,更改來源和目標 IP,並重新計算標頭內的校驗和。
重申一下,流程如下:
- 使用者嘗試使用特定的 IP 位址存取 Web 伺服器。
- SYN 封包被傳送到虛擬接口,因為它與路由表中的路由相符。
- VPN 用戶端應用程式透過已建立的 websocket 連線將 SYN 封包傳送到 VPN 伺服器(無論這是什麼類型的連線)
- VPN 伺服器接收封包並修改來源/目標 IP 位址以指向同一網路上託管的實際 Web 伺服器。
- 如何將這些資料包發送到網路伺服器並接收來自網路伺服器的回應?我希望客戶端透過 VPN 伺服器/建立的 Web 套接字連接與 Web 伺服器進行通訊。我有哪些選擇?
問題
我怎麼才能將這些資料包發送到網路伺服器,並從網路伺服器接收資料包並發回客戶端?我是否將資料包「注入」到正確的介面並確保我的應用程式將回應傳送回客戶端?我希望客戶端透過 VPN 伺服器/建立的 Web 套接字連接與 Web 伺服器進行通訊。我有哪些選項?
我嘗試過的
我在伺服器端嘗試做的是建立一個虛擬介面(tun)並將從客戶端接收到的封包寫入該介面。但是,這些資料包不會發送到網路伺服器。客戶端和伺服器在 macOS 上運行,使用網路擴展(如果有任何用處的話)。 Web 伺服器正在 上運行,並且在寫入介面之前192.168.1.95
我已將封包的來源 IP 修改為。100.64.0.77
tun
Routing tables
Internet:
Destination Gateway Flags Netif Expire
default 192.168.1.254 UGSc en0
default link#10 UCSI utun2
100.64.0.77 100.64.0.77 UH utun2
127 127.0.0.1 UCS lo0
127.0.0.1 127.0.0.1 UH lo0
169.254 link#7 UCS en0 !
192.168.1 link#7 UCS en0 !
192.168.1 link#10 UCSI utun2
192.168.1.92/32 link#7 UCS en0 !
192.168.1.99 8c:a9:82:2e:d6:2e UHLWI en0 986
192.168.1.254/32 link#7 UCS en0 !
192.168.1.254 70:f1:96:86:e6:a0 UHLWIir en0 1196
224.0.0/4 link#7 UmCS en0 !
224.0.0/4 link#10 UmCSI utun2
224.0.0.251 1:0:5e:0:0:fb UHmLWI en0
255.255.255.255/32 link#7 UCS en0 !
255.255.255.255/32 link#10 UCSI utun2
`
答案1
VPN 伺服器接收封包並修改來源/目標 IP 位址以指向同一網路上託管的實際 Web 伺服器。
這根本不需要,因為客戶端已經指定了他們想要的目標 IP 位址。 (VPN封裝將原始資料包放入另一個 IP 封包中,而不改變原始 IP 標頭,因此伺服器只需再次對其進行解封裝並按原樣轉發原始資料包。
NAT 可以完成(並且偶爾會完成),但更常見的是作業系統防火牆的工作和系統管理員的決定 - 它不應該完全由 VPN 軟體自行完成。一般來說,內部網路內的通訊不應該需要網路位址轉換;使用它通常表示您的網路的基本路由設定不正確。
如何將這些資料包發送到網路伺服器並接收來自網路伺服器的回應?我希望客戶端透過 VPN 伺服器/建立的 Web 套接字連接與 Web 伺服器進行通訊。我有哪些選擇?
通常,VPN 伺服器將具有與 VPN 用戶端完全相同的虛擬接口,並將使用完全相同的機制來產生和接收封包。 (有些將為每個客戶端創建專用的虛擬接口,其他的將為所有客戶端創建一個接口。)如果您的客戶端正在使用一個tun
接口,您的伺服器也可以執行相同的操作。