我們一般所說的NAT是指snat,既源網絡地址轉換。這類NAT不接受從外部發起的連接,而是只處理從內部向外部發起的請求。比如NAT內部的機器A向百度發起查詢請求,數據包經過NAT時,NAT把數據包的原地址(既機器A的IP地址)換成NAT所在的機器的IP地址(如果有多個可以指定某一個),把源端口換成NAT所在機器的某個未被使用的端口,然后把數據包發出去。同時NAT把這個映射關系記錄下來(源地址,源端口對應NAT轉換后的IP和端口),并且會在轉換后的主機端口等待發出去的請求響應。等請求響應回來以后,會查詢映射表,把響應的數據包轉發給后端的機器A。由于NAT隱藏了后端的所有機器地址,所以從外面發起的請求必須經過NAT所在的機器IP(一般是個公有地址)以及某個端口,但是這時這個端口不在NAT的映射表里,數據包不會得到處理,被丟棄掉了。因此一般情況下從外部無法發現NAT后端的機器也無法訪問他們。
但是就沒辦法了嗎?也不是。
第一,假如有某個軟件在NAT機器的某個端口監聽,把收到的數據包轉發給后端的某個IP的某個端口,這就把NAT后端的某個IP和端口間接的暴露了出去。實際上NAT就有這個端口映射功能(簡單點的可以看vmwareworkstation的網絡設置,里面就有NAT端口映射)。但是這個只能端口一一對應映射,對于要發現NAT后端任意機器并進行通訊是不行的。
第二,想要發現NAT后端的任意機器,實際上你也必須加入到NAT后端的這個網絡。手段就是VPN。在NAT機器上架設一個VPN服務器,IP網段為NAT后端的網段IP,通過NAT機器IP提供服務,VPN客戶端連上以后分配到一個NAT后端同樣的IP并給你的機器自動設置路由,這樣就可以發現NAT里的任意機器了。
純手打。