簡體   English   中英

Python端口轉發

[英]Python port forwarding

我正在開發python中的客戶端 - 服務器游戲,我想了解更多有關端口轉發的信息。

我正在做的是去我的路由器(192.168.0.1)並配置它以允許我的真實IP地址的請求被重定向到我的本地地址192.168.0.X. 它工作得很好。 但我想知道我是否可以通過自動編碼來做到這一點?

我認為skype就像一種p2p ,我可以在我的路由器中看到Skype自動端口轉發到我的電腦地址。 我也可以用Python做嗎?

這里有不同的解決方案,但大多數都不是微不足道的,你必須做一些閱讀,你需要某種后備。


UPnP / IGD是最簡單的。 如果您的路由器支持它,並且配置為允許它,並且您知道如何編寫低級網絡代碼或舊式SOAP Web服務代碼,則可以要求路由器為您分配端口。 如果它成功響應,開始使用該端口,你基本上完成了。


如果您可以為所有用戶運行帶有公共地址的(極低帶寬)服務器,則打孔可以解決問題。

想想NAT后面的客戶端如何與公共服務器通信。 你向某個IP和端口發出請求,但服務器看到你的路由器的IP,而不是你的(這是一件好事,因為你的無法訪問)。 當它回復時,您的路由器必須知道將它轉發給您 - 只需記住您是剛剛向該服務器發送請求的NAT客戶端。

如果您不是與公共服務器交談,而是與他自己獨立的NAT后面的其他同行交談,該怎么辦? 好吧,你的路由器不知道區別; 只要你從同一個地方得到回復,它就會通過。 但是當你的消息無法通過他的NAT時,你如何得到回應呢? 當然,他做同樣的事情。 其中一條消息可能會丟失,但另一條消息將通過,然后您已設置並可以進行通信。 您需要定期發送保持活動,以便路由器不會忘記您正在進行通信,但除此之外,實際上並沒有什么棘手的問題。

唯一的問題是你需要知道另一個對等方的公共IP地址,以及他期望你來自的端口,他需要了解你的相同信息。 這就是為什么你需要一台服務器 - 作為同伴之間的介紹人。

打孔將適用於來自大多數家庭網絡的UDP。 它不適用於許多家庭網絡中的TCP,也不適用於來自許多公司網絡的UDP或TCP。 (此外,在企業網絡中,您可能有多層NAT,這意味着您需要在每個接口上使用介紹器而不是互聯網上的一個介紹器,或者無法打孔的對稱NAT。)


您可以使用STCE (或類似)服務,如ICE或TURN。 這只適用於有使用ICE,TURN等服務的情況 - 對於不同家庭NAT上的兩個對等體通常不是這種情況,除非您部署自己的服務器並構建一個介紹人來幫忙,如果你是要做到這一點,你可以只使用打孔。 但在企業環境中,這可能是為P2P應用程序提供連接的最佳方式。


最后,您可以讓用戶手動配置端口轉發,並在您的問題中輸入轉發的端口號。 這並不理想,但您應始終將其作為后備(除了可能僅適用於企業部署的應用程序),因為其他任何內容都不適用於所有用戶。


我相信Skype使用所有這些。 如果啟用UPnP,它會嘗試IGD您的路由器。 或者您可以將其配置為使用TURN服務器。 或者您只需輸入您手動轉發的特定端口即可。 如果您不執行上述任何操作,它會嘗試使用UDP打孔,以及Skype運行的介紹人。

因此,如果我理解正確,您的應用程序需要進行TCP / UDP網絡連接。 這意味着至少有一個連接客戶端需要一個正確打開的端口,如果它們都在NAT(路由器)之后並且沒有配置的開放端口,則客戶端無法連接。

有幾種可能的解決方案,但並非所有解決方案都可靠:UPnP,如此處所建議的,可以按需打開端口,但不支持(或啟用)所有路由器(並且它是安全威脅),P2P解決方案是復雜但仍需要某些客戶端上的開放端口。

唯一可靠的解決方案是擁有一個所有客戶端都可以連接的專用服務器,它將協商連接,並可能在它們之間進行代理。

你可以看看這樣的東西(假設你的路由器支持它): http//en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal

為了使用python實現端口轉發,有一個很棒的ActriveState配方,只使用Python標准庫(套接字,暈厥)來執行異步端口轉發服務器。 看着

http://code.activestate.com/recipes/483732-asynchronous-port-forwarding/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM