Routing

允許在 Azure 子網中進行透明埠轉發

  • November 29, 2016

我在 Azure VNet 中有一個 VM,它需要知道由防火牆設備轉發的埠的傳入連接的原始公共 IP 地址。到目前為止,如果我“SNAT”傳入連接,我只能成功地將埠從防火牆轉發到伺服器。但這隱藏了原始源 IP。

這是 目前設計的簡化

防火牆具有 10.0.0.1 的單個介面,它與 Azure 中的公共 IP 相關聯。在防火牆上配置埠轉發,以按照本部落格中概述的邏輯將任何 TCP 80 發送到伺服器 10.0.1.1 客戶端連接到公共 IP 地址。防火牆上的日誌顯示來自 IP 1.2.3.4 -> 10.0.0.1 的已批准數據。如果防火牆上配置了outbound NAT轉換埠轉發後的連接,伺服器(10.0.1.1)顯示連接,但源IP=10.0.0.1(即FW的私有介面)

如果在 FW 設備上禁用了出站 NAT 轉換,則日誌會在 FW 上為傳入連接顯示相同的批准資訊,但數據包永遠不會到達 10.0.1.1 伺服器。

如果我建立第二台伺服器 10.0.1.2 或 10.0.0.2,然後連接到 10.0.0.1:80(在 FW 設備上禁用出站 NAT 轉換),那麼連接會成功連接到伺服器 10.0.1.1 和 src IP 正確等於 10.0.1.2 或 10.0.0.2

我懷疑 Azure 結構路由正在丟棄任何 src IP 不在 VNet 地址空間範圍內的任何數據包。有很多線上文章在 Azure 中展示了類似的“DMZ”風格方法,但沒有一個請求處理伺服器需要知道原始公共源 IP 地址。

可以做到嗎?

編輯:

經過一整天的鬥爭,我無法讓它發揮作用。所以我放棄了韌體並重新創建了另一個帶有 2 個 NIC 的應用程序。原來的 NIC(WAN)和以前一樣,另一個在 10.0.1.1 子網(LAN)中。但它仍然無法正常工作!我連連線都聯繫不上了…

我在辦公室的一些裸機上複製了相同的設置,並且效果很好。我檢查了裸機實例和 azure 實例之間的所有 FW 設置(包括路由)。我已經在 azure 實例的 LAN 介面上執行了數據包擷取,並且可以看到離開介面的“埠轉發”數據包。我在 10.0.1.1 上執行了 Wireshark,但沒有數據包到達!我認為這可能是預設網關問題,因此我為網路 1.2.3.4/32 添加了一個使用者定義的路由到 10.0.1.0 子網,以確保 ACK 將通過 FW 設備返回到客戶端。但這也不起作用。

任何其他幫助將不勝感激,這個已經被破壞了。

成功

很多小時和虛擬機之後,我已經開始工作了。問題是 10.0.1.x 網路上的使用者定義路由。我只啟用了一條覆蓋客戶端連接範圍的路由,但這不起作用。如果我設置 UDR = 0.0.0.0/0 並且下一跳到 FW 設備,那麼賓果遊戲。

所以總結一下我的工作配置。

  • 帶一個 NIC 的 pfSense 防火牆
  • 10.0.0.x 網路中的 NIC 也關聯了公共 IP
  • 未定義出站 NAT 映射
  • 從客戶端 IP 埠轉發規則:埠到 10.0.1.x 網路中的伺服器
  • 使用者定義的規則 0.0.0.0/0 在 10.0.1.x 網路上設置,下一跳 = FW 上 NIC 的私有 ip
  • 在 FW NIC 上啟用 IP 轉發

雖然上面現在將客戶端 IP 一直傳遞到 10.0.1.x 網路中的 VM 並允許成功連接,但我確實添加了 10.0.1.x/24 的出站 NAT 映射,以便 VM 可以訪問網際網路。沒有它,它就做不到。UDR 還會終止通過連接到 10.0.1.x 網路中的 VM 的公共 IP 的任何訪問,並且現在需要在 FW 上附加規則以允許 RDP 等通過 FW 訪問 VM。

為了任何人的利益,我也讓兩個 NIC FW 工作。在這裡,UDR 只需要指向“LAN”網卡的 IP。

如果防火牆上配置了outbound NAT轉換埠轉發後的連接,伺服器(10.0.1.1)顯示連接,但源IP=10.0.0.1(即FW的私有介面)

如果在 FW 設備上禁用了出站 NAT 轉換,則日誌會在 FW 上為傳入連接顯示相同的批准資訊,但數據包永遠不會到達 10.0.1.1 伺服器。

所有這些都是設計行為。它應該以這種方式工作。

如果源IP地址不是防火牆的私有地址,那麼響應將直接發送到1.2.3.4。(源IP是公共IP地址,響應將與分配給伺服器的公共地址一起發送.)

發送數據包的客戶端將收到來自完全不同的公共 IP 地址的響應,這將導致連接失敗。

要使響應數據包通過防火牆,應啟用出站 NAT。

=========================================================================

更新:

如果涉及使用者定義的路線 (UDR),那麼它可以工作。我用 2 個 Linux 虛擬機對其進行了測試。

有幾點需要注意:

  1. 應在執行埠轉發的 VM 上啟用 IP 轉發。(Azure 門戶和作業系統上的設置。)
  2. 執行埠轉發的 VM 的 NSG 需要重新配置以允許轉發的流量和來自客戶端 VM 的響應。
  3. 客戶端 VM 的 NSG 需要重新配置以允許埠轉發 VM 轉發的流量。

引用自:https://serverfault.com/questions/817207