Python端口转发

2024-05-14 03:10:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python开发一个客户机-服务器游戏,我想知道更多关于端口转发的信息。

例如,我正在做的是去我的路由器(192.168.0.1),并将其配置为允许请求将我的真实IP地址重定向到我的本地地址192.168.0.X.,它工作得非常好。但我想知道我是否可以通过自动编码来实现?

我认为skype的工作方式类似于p2p,我可以在路由器中看到skype被自动端口转发到我的pc地址。我也可以用Python做吗?


Tags: 端口服务器信息游戏客户机地址方式路由器
3条回答

这里有不同的解决方案,但大多数都不是琐碎的,你必须做一些阅读,你需要一些退路。


UPnP/IGD是最简单的。如果您的路由器支持它,并且配置为允许它,并且您知道如何编写低级网络代码或老式SOAP web服务代码,那么您可以要求路由器为您分配一个端口。如果它成功响应,开始使用该端口,基本上就完成了。


如果您可以为所有用户运行一个带有公共地址的(非常低带宽)服务器,Hole punching可以解决问题。

想想一个幕后的NAT客户机如何与公共服务器对话。您向某些IP和端口发出请求,但服务器看到的是路由器的IP,而不是您的IP(这是一件好事,因为您的IP不可访问)。当它回复时,你的路由器必须知道转发给你,只要记住你是NAT客户机的幕后黑手,而NAT客户机刚刚向服务器发送了一个请求。

如果你不是和一个公共服务器对话,而是和另一个在他自己的NAT后面的对等机对话呢?好吧,你的路由器不知道区别;只要你从同一个地方得到响应,它就会通过。但是,当你的信息无法通过他的NAT时,你如何得到回应?当然,他也做同样的事。其中一条信息可能会丢失,但另一条会通过,然后你们都准备好了,可以交流。你需要定期发送keep alives,这样路由器就不会忘记你在通信,但除此之外,真的没有什么棘手的事情。

唯一的问题是你需要知道对方的公共IP地址,以及他希望你来自的端口,他也需要知道你的相同信息。这就是为什么您需要一个服务器来充当对等方之间的介绍人。

打孔将与来自大多数家庭网络的UDP一起工作。它不适用于来自许多家庭网络的TCP,也不适用于来自许多公司网络的UDP或TCP。(另外,在公司网络中,您可能有多层NAT,这意味着您需要在每个接口上使用介绍人,而不是internet上的一个介绍人,或者对称NAT,这是不能穿孔的。)


您可以使用STUN(或类似的)服务,如ICE或TURN。只有在需要使用ICE、TURN等服务的情况下,这种方法才有效,而对于不同家庭NAT上的两个对等方来说,通常不是这样,除非您部署自己的服务器并构建一个介绍人来提供帮助,如果您要这样做,您可以使用打孔。但在企业环境中,这可能是为P2P应用程序提供连接的最佳方式。


最后,您可以让用户手动配置端口转发,并在问题中输入转发的端口号。这并不理想,但您应该始终将其作为回退提供(可能仅用于公司部署的应用除外),因为没有其他东西对您的所有用户都有效。


我相信Skype会用到所有这些。如果您启用UPnP,它会尝试IGD您的路由器。或者可以将其配置为使用TURN服务器。或者您只需输入手动转发的特定端口。如果您不执行以上任何操作,它将尝试使用UDP打孔,并使用Skype运行的介绍人。

你可以看看这样的东西(假设你的路由器支持它):http://en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal

因此,如果我理解正确,您的应用程序需要进行TCP/UDP网络连接。这意味着至少有一个正在连接的客户端需要一个正确打开的端口,如果这两个客户端都在NAT(路由器)后面并且没有配置的打开端口,则您的客户端无法连接。

对此有几种可能的解决方案,但并非所有方案都是可靠的:UPnP,如本文所建议的,可以按需打开端口,但并非所有路由器都支持(或启用)(这是一种安全威胁),P2P解决方案很复杂,仍需要在某些客户端上打开端口。

唯一可靠的解决方案是拥有一个专用服务器,所有客户端都可以连接到该服务器,该服务器将协商连接,并可能在它们之间进行代理。

相关问题 更多 >