關於我自己

我的相片
New York, New York, United States
我叫江奕賢啦

2010年6月21日

[破解]讓兩端都用NAT的人照樣可以連線

繼上次【如何隱藏自己的IP掃瞄別人的port】這篇 好久沒有寫網路破解方面的文章了
今天要介紹的是 如果有個server在NAT後面, 另一個NAT後面的client要怎麼連到這個server呢?
不需要port forwarding, 不需要DMZ, 也不需要透過第三台在firewall外面的機器喔! (像skype和teamviewer就是透過第三台機器)
而且 在NAT後面的server不需要先知道client的IP (通常都只有client知道server的IP)

怎麼可能? 真的嗎? 是的! 原理呢?

你有在router的NAT後面 ping過外面的某台機器嗎?
有沒有想過為什麼ping的結果為什麼傳得回來?
利用他傳回來的原理 以及tunneling, 你就可以讓兩個NAT後面的雙方有個管道可以溝通

詳細原理如下:
router在看到NAT裡面有人傳送ping的package出去之後的一小段時間內 會允許相對的ping response 傳回來
A在這個router(我們叫他R)的NAT後面 去ping (or tracert) 3.3.3.3
路徑中每一台機器(假設我們叫他B)都可以回給這個R, 說他連不到3.3.3.3
而這個R 看到ping response是關於3.3.3.3的 他就知道要傳回給A
A就會知道從哪一個IP(B)傳回這個response, 告訴他B連不到3.3.3.3
OK, 你已經破解了一邊了. 你已經有辦法讓B告訴A(要記得, A在NAT後面)他自己的IP(B的IP)
這時候, B一樣去ping一個IP, 比如說 還是3.3.3.3
A趕緊送一個ping response去給B的router(要記得,ping response會包含所有經過的node的IP,所以可以知道B的router的IP)
一樣的, B的router就會告訴B, 說"A說他連不到3.3.3.3". (but who cares)
PS: 3.3.3.3可以是一個根本不存在的機器

到此 你可以看到 A想辦法傳東西給B, B也想辦法傳了東西給A. And this is a handshake.
再來 A和B已經互相知道對方的IP 不需要那麼麻煩了
透過一樣的原理 A和B用UDP把資料傳來傳去 router看到雙方互傳類似的package, 就讓這些UDP data通過.
剩下的 只需要把TCP的package透過這個UDP tunnel互傳 就好了.

這裡有個利用這個原理做出來的proxy
http://samy.pl/pwnat/
玩玩看吧
記住: client要連到在NAT後面的server的時候 得先知道server的外部IP, 通常是router的IP. (內部IP不重要)

沒有留言: