Networking

NAT 是否在 ICMP 有效負載中欺騙 TCP 或 UDP 埠?

  • February 4, 2020

當我從對稱 nat 下的網路發送 tcp 或 udp 數據包時,我希望埠與我的電腦選擇的埠不同,所以它是。但是當我發送一個低 ttl 的 udp 數據包,但它仍然設法離開 ISP 網路時,我收到一個錯誤 icmp 數據包,其中包含我最初作為有效負載發送的 udp 數據包,但埠由我生成系統 。

在這一點上,我懷疑 NAT 是否也沒有掌握 ICMP 數據包的內容。因為我知道有必要更改真正重要的層的標頭而不是有效負載。因此,在 ICMP 數據包的情況下,只有源 IP 地址,而不像我認為的那樣,還有回顯“子數據包”的 ip 和埠。

當我從對稱 nat 下的網路發送 tcp 或 udp 數據包時,我希望埠與我的電腦選擇的埠不同,所以它是。

那是 NAT 的網路地址埠轉換 (NAPT)版本。基本 NAT 對傳輸協議沒有任何作用。NAPT 必須為每個傳輸協議有不同的表,這就是為什麼它只支持 TCP、UDP 和 ICMP,因為 TCP 埠不是 UDP 埠,而 ICMP 不使用埠,它使用查詢 ID。

我收到一個錯誤 icmp 數據包,其中包含我最初作為有效負載發送的 udp 數據包,但埠由我的系統生成。

那是正確的。

在這一點上,我懷疑 NAT 是否也沒有掌握 ICMP 數據包的內容。

對於必須返回發送應用程序的 ICMP 錯誤消息,是的,NAPT 必須修復 ICMP 錯誤消息的內容,以便目標應用程序得到錯誤。ICMP 錯誤消息將原始數據包的第一部分作為其有效負載,以便可以將其返回給正確的應用程序。如果 NAPT 修改了傳出數據包,它必須將返回的 ICMP 錯誤消息有效負載修改為原始地址,包括埠號。

因此,在 ICMP 數據包的情況下,只有源 IP 地址,而不像我認為的那樣,還有回顯“子數據包”的 ip 和埠。

此行為在*RFC 2663,IP 網路地址轉換器 (NAT) 術語和注意事項*中進行了解釋:

3.3 . ICMP 錯誤包翻譯

所有 ICMP 錯誤消息(重定向消息類型除外)在通過 NAT 時都需要修改。需要修改 NAT 的 ICMP 錯誤消息類型包括 Destination-Unreachable、Source-Quench、Time-Exceeded 和 Parameter-Problem。NAT 不應嘗試修改重定向消息類型。

對 ICMP 錯誤消息的更改將包括對嵌入在 ICMP 錯誤消息有效負載中的原始 IP 數據包(或其部分)的更改。為了使 NAT 對終端主機完全透明,必須修改嵌入在 ICMP 數據包負載中的 IP 頭的 IP 地址,必須相應修改同一 IP 頭的校驗和欄位,以及隨附的傳輸頭。還必須修改 ICMP 標頭校驗和以反映對有效負載中的 IP 和傳輸標頭所做的更改。此外,還必須修改正常的 IP 標頭。


如您所見,NAT,尤其是 NAPT,非常佔用資源,這就是為什麼一些供應商(例如 Cisco)只允許在具有 NAT 硬體輔助的設備上進行 NAT。

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