歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux對稱NAT的UDP穿越

Linux對稱NAT的UDP穿越

日期:2017/2/28 15:48:35   编辑:Linux教程

和同事討論UDP打洞技術,後做了一個簡單的實驗,由於Windows上設置NAT以及察看其原理太麻煩或者根本就不可能,於是還是使用Linux做了實驗,發現基於Linux ip_conntrack這種對稱NAT也能很簡單的實現UDP穿越,實驗很簡單,並且這種UDP穿越還不需要公網服務器的協助(因為它們對於對稱NAT或者基於連接的NAT根本幫不上什麼忙),很實用。在展示實驗之前,首先要明白以下的知識點。

1.Linux的NAT是基於ip_conntrack的

這一點說明僅僅針對五元組決定的一個連接的第一個數據包進行NAT規則的查找和匹配並存入ip_conntrack結構體,後續的包自動應用ip_conntrack結構體中的NAT信息進行NAT。
由於五元組標示了一個連接,因此:
1).即使是同一個內網主機發起連接,最終很大程度上也不一定能被轉換成同一個(IP地址,協議端口)對
2).目的地址不同,就不是同一個連接,因此絕不可能做到像cone NAT那樣的偷梁換柱的效果

2.Linux目前還沒有實現cone NAT的模塊

Linux的NAT是處於Netfilter模塊中的,標准協議棧中沒有任何相關支持,那麼只要Netfilter不支持cone NAT,Linux NAT就別指望能被常規方式打洞。

3.Linux的NAT盡力不改變連接的源端口

Linux的NAT是通過iptables工具配置的,對於隱藏內網主機這種類型的NAT是iptables的SNAT實現的,如果你man iptables將會發現:
--to-source [ipaddr[-ipaddr]][:port[-port]]
which can specify a single new source IP address, an inclusive range of IP addresses, and optionally, a port range (which is only valid if the rule also specifies -p tcp or -p udp). If no port range is specified, then source ports below 512 will be mapped to other ports below 512: those between 512 and 1023 inclusive will be mapped to ports below 1024, and other ports will be mapped to 1024 or above. Where possible, no port alteration will occur.
注意最後一句,Linux盡力不改變連接的源端口,除非和另一個tuple相沖突,我們知道一個tuple就是一個五元組。
這一點正是給了我們一點啟示,那就是可以通過嘗試不同端口,直到找到沒有被改變源端口的那次連接。而印證這一點也很容易,那就是打洞成功。這也從反方面說明沒有必要存在外部服務器了,因為它根本幫不上什麼忙。

Copyright © Linux教程網 All Rights Reserved