Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取某个本地端口的NAT转换IP和端口_Php_Sockets_Tcp_Router_Nat - Fatal编程技术网

Php 获取某个本地端口的NAT转换IP和端口

Php 获取某个本地端口的NAT转换IP和端口,php,sockets,tcp,router,nat,Php,Sockets,Tcp,Router,Nat,我有一些软件在NAT后面的计算机上的50885端口上运行 如何从internet访问此端口? 我可以从计算机启动一些东西,因为我必须启动应用程序 如果我没有弄错的话:我的本地地址是:port,比如说:192.168.0.10:50885 如果计算机启动的NAT中出现了问题,那么应该会自动创建某种类型的端口转发,并且应该有某种类型的公共IP:端口,该端口会敲击NAT后面计算机上的50885端口。我说得对吗 如果是这样的话,难道不能像php中那样询问服务器端脚本,嘿,告诉我这个IP和端口是什么吗 我

我有一些软件在NAT后面的计算机上的50885端口上运行

如何从internet访问此端口? 我可以从计算机启动一些东西,因为我必须启动应用程序

如果我没有弄错的话:我的本地地址是:port,比如说:192.168.0.10:50885 如果计算机启动的NAT中出现了问题,那么应该会自动创建某种类型的端口转发,并且应该有某种类型的公共IP:端口,该端口会敲击NAT后面计算机上的50885端口。我说得对吗

如果是这样的话,难道不能像php中那样询问服务器端脚本,嘿,告诉我这个IP和端口是什么吗


我对端口转发有点困惑。

是的,您必须查询外部脚本才能从路由器的另一端检索公共信息。有很多网站可以获取IP(,等等),但我从未见过一个同时报告IP和端口的网站,它们通常只报告IP。大多数NAT在端口上使用1对1关系,尽管它们可以使用不同的端口。如果您有自己的网站(或者有朋友有),那么编写自己的脚本来检索公共端口并不困难

如果您通过路由器从LAN PC到外部建立出站TCP连接,那么路由器会自动生成并跟踪必要的NAT查找信息,以便它可以为该连接来回转发流量


如果您从外部通过路由器与LAN PC建立入站TCP连接,则不会自动建立NAT查找信息。路由器需要通过端口转发规则提前告知,当它在特定的公共IP:端口上接收到新的客户端连接时,将传入连接定向到哪个专用LAN IP:端口。如果您的路由器支持uPNP(如果已启用),则当应用程序打开侦听套接字时,您的应用程序可以使用uPNP API/库在路由器中以编程方式创建端口转发规则。否则,如果uPNP不可用,则您必须手动配置路由器。

根据我的理解,假设您使用套接字本地\u ip:local\u端口连接remote1\u ip:remote1\u端口。NAPT设备本地\u ip:本地\u端口变为已翻译\u ip:已翻译\u端口后。remote1可以得到翻译的ip:translated的端口,但我还没有找到这样的服务。下次使用相同的客户端本地\u ip:本地\u端口与remote2\u ip:remote2\u端口建立新连接时,转换的\u ip:转换的\u端口是否会保持不变?通常NAPT服务器会保留一段时间,比如5分钟。因此,如果有人从remote3:remote3\u端口在5分钟内连接已翻译的\u ip:translated\u端口(自上次数据包发送到已翻译的\u ip:translated\u端口以来),NAPT服务器将把流量定向到本地\u ip:local\u端口。如果remote3_port=remote1_port,尽管是remote1_ip=remote1_ip,本地套接字将接受连接。如果信息过期,NAPT服务器将分配一个新的translated_ip2:translated_port2。

NAT后面的
是什么意思(NAT是一个操作,而不是一个设备)?您是否有配置了端口/地址转换的路由器?对于你关于从本地主机检测配置的问题,不,这是不可能的。是的,我的意思是在路由器后面,NAT配置只有路由器知道。假设您的路由器配置为将所有入站端口50885流量转换为您的公共IP(例如:12.34.56.78)以转到您的内部主机192.168.0.10。从外部的角度来看,发送者只知道/关心它需要使用什么作为目的地(12.34.56.78:50885)。从内部的角度来看,您的主机(192.168.0.10)只是通过50885接收流量;因为路由器已经转换了流量,所以您的内部主机不知道/不关心作为来自外部发送方的原始目的地的公共IP。
编写自己的脚本来检索公共端口不是很困难。
如何?只有路由器对地址转换有真正的可见性;在路由器之外收集翻译信息只能基于假设。即使使用whatismyip.com这样的资源,也会得到一个可以路由回您的公共IP,但从技术上来说,不可能知道该IP到底绑定到哪里。考虑连接到有线调制解调器的家庭路由器:whatismyip不会帮助您找到连接到调制解调器的路由器接口。对于入站端口转换,入站数据包的目的地在目标接收到它们时已被上游路由器修改,因此,目标无法知道发送方配置的原始目标IP/端口。真正的1:1 NAT只需将所有发送到配置的“外部”IP的流量转换为内部目标,不需要显式端口转换(显然,只有当您控制多个外部IP,并且您的路由器支持将多个IP绑定到其物理外部接口时,才可能实现此转换)@admdrew:公用服务器上的脚本将能够获取路由器的公用端口,因为路由器用于连接到服务器的端口。因此,服务器脚本将能够通过
getpeername()
或类似的API查询路由器和服务器之间的连接,以确定路由器正在使用的端口。我从来没有说过服务器可以确定路由器后面的LAN IP:端口。但它可以确定路由器本身的公共IP端口,然后可以通过连接将其传输回LAN PC。
服务器脚本将能够查询路由器和服务器之间的连接,以确定路由器正在使用的端口。
出站TCP通信中看到的源/目标端口(从内部主机的角度)服务器接收到的信息对inb没有实际帮助