IPtabels被認爲是Linux中實現包過濾功能的第四代應用程序。iptables包含在2.4以後的內核中,它可以實現防火牆、NAT(網絡地址翻譯)和數據包的分割等功能。本文講述的是四種NAT的iptables的實現。
四種NAT的iptables實現:
1. Full Cone NAT:所有來自同一個內部Tuple X的請求均被NAT轉換至同一個外部Tuple Y,而不管這些請求是不是屬於同一個應用或者是多個應用的。除此之外,當X-Y的轉換關係建立之後,任意外部主機均可隨時將Y中的地址和端口作爲目標地址和目標端口,向內部主機發送UDP報文,由於對外部請求的來源無任何限制,因此這種方式雖然足夠簡單,但卻不那麼安全。
2. Restricted Cone NAT: 它是Full Cone的受限版本:所有來自同一個內部Tuple X的請求均被NAT轉換至同一個外部Tuple Y,這與Full Cone相同,但不同的是,只有當內部主機曾經發送過報文給外部主機(假設其IP地址爲Z)後,外部主機才能以Y中的信息作爲目標地址和目標端口,向內部主機發送UDP請求報文,這意味着,NAT設備只向內轉發(目標地址/端口轉換)那些來自於當前已知的外部主機的UDP報文,從而保障了外部請求來源的安全性。
3. Port Restricted Cone NAT:它是Restricted Cone NAT的進一步受限版。只有當內部主機曾經發送過報文給外部主機(假設其IP地址爲Z且端口爲P)之後,外部主機才能以Y中的信息作爲目標地址和目標端口,向內部主機發送UDP報文,同時,其請求報文的源端口必須爲P,這一要求進一步強化了對外部報文請求來源的限制,從而較Restrictd Cone更具安全性。
4. Symmetric NAT:這是一種比所有Cone NAT都要更爲靈活的轉換方式:在Cone NAT中,內部主機的內部Tuple與外部Tuple的轉換映射關係是獨立於內部主機所發出的UDP報文中的目標地址及端口的,即與目標Tuple無關;在Symmetric NAT中,目標Tuple則成爲了NAT設備建立轉換關係的一個重要考量:只有來自於同一個內部Tuple 、且針對同一目標Tuple的請求才被NAT轉換至同一個外部Tuple,否則的話,NAT將爲之分配一個新的外部Tuple;打個比方,當內部主機以相同的內部Tuple對2個不同的目標Tuple發送UDP報文時,此時NAT將會爲內部主機分配兩個不同的外部Tuple,並且建立起兩個不同的內、外部 Tuple轉換關係。與此同時,只有接收到了內部主機所發送的數據包的外部主機才能向內部主機返回UDP報文,這裏對外部返回報文來源的限制是與Port Restricted Cone一致的。不難看出,如果說Full Cone是要求最寬鬆NAT UDP轉換方式,那麼,Symmetric NAT則是要求最嚴格的NAT方式,其不僅體現在轉換關係的建立上,而且還體現在對外部報文來源的限制方面。
NAT類型檢測
前提條件:有一個公網的Server並且綁定了兩個公網IP(IP-1,IP-2)。這個Server做UDP監聽(IP-1,Port-1),(IP-2,Port-2)並根據客戶端的要求進行應答。
第一步:檢測客戶端是否有能力進行UDP通信以及客戶端是否位於NAT後?
客戶端建立UDP socket然後用這個socket向服務器的(IP-1,Port-1)發送數據包要求服務器返回客戶端的IP和Port, 客戶端發送請求後立即開始接受數據包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程若干次。如果每次都超時,無法接受到服務器的迴應,則說明客戶端無法進行UDP通信,可能是防火牆或NAT阻止UDP通信,這樣的客戶端也就不能P2P了(檢測停止)。
當客戶端能夠接收到服務器的迴應時,需要把服務器返回的客戶端(IP,Port)和這個客戶端socket的(LocalIP,LocalPort)比較。如果完全相同則客戶端不在NAT後,這樣的客戶端具有公網IP可以直接監聽UDP端口接收數據進行通信(檢測停止)。否則客戶端在NAT後要做進一步的NAT類型檢測(繼續)。
第二步:檢測客戶端NAT是否是Full Cone NAT?
客戶端建立UDP socket然後用這個socket向服務器的(IP-1,Port-1)發送數據包要求服務器用另一對(IP-2,Port-2)響應客戶端的請求往回發一個數據包,客戶端發送請求後立即開始接受數據包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程若干次。如果每次都超時,無法接受到服務器的迴應,則說明客戶端的NAT不是一個Full Cone NAT,具體類型有待下一步檢測(繼續)。如果能夠接受到服務器從(IP-2,Port-2)返回的應答UDP包,則說明客戶端是一個Full Cone NAT,這樣的客戶端能夠進行UDP-P2P通信(檢測停止)。
第三步:檢測客戶端NAT是否是Symmetric NAT?
客戶端建立UDP socket然後用這個socket向服務器的(IP-1,Port-1)發送數據包要求服務器返回客戶端的IP和Port, 客戶端發送請求後立即開始接受數據包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程直到收到迴應(一定能夠收到,因爲第一步保證了這個客戶端可以進行UDP通信)。
用同樣的方法用一個socket向服務器的 (IP-2,Port-2)發送數據包要求服務器返回客戶端的IP和Port。
比較上面兩個過程從服務器返回的客戶端(IP,Port),如果兩個過程返回的(IP,Port)有一對不同則說明客戶端爲Symmetric NAT,這樣的客戶端無法進行UDP-P2P通信(檢測停止)。否則是Restricted Cone NAT,是否爲Port Restricted Cone NAT有待檢測(繼續)。
第四步:檢測客戶端NAT是否是Restricted Cone NAT還是Port Restricted Cone NAT?
客戶端建立UDP socket然後用這個socket向服務器的(IP-1,Port-1)發送數據包要求服務器用IP-1和一個不同於Port-1的端口發送一個UDP 數據包響應客戶端, 客戶端發送請求後立即開始接受數據包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程若干次。如果每次都超時,無法接受到服務器的迴應,則說明客戶端是一個Port Restricted Cone NAT,如果能夠收到服務器的響應則說明客戶端是一個Restricted Cone NAT。以上兩種NAT都可以進行UDP-P2P通信。
- /-"Full Cone NAT":/
- iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 202.96.209.111
- iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.1.1
- /-"Port Restricted Cone NAT":/
- iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 202.96.209.111
- /-"Restricted Cone NAT":/
- iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 202.96.209.111
- iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.1.1
- iptables -A FORWARD -d 202.96.209.111 -j ACCEPT
- iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
- iptables -I FORWARD 1 -s 85.214.128.86 -j ACCEPT(加入對點IP,作弊型連通)
【編輯推薦】