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
Sockets 解释SSH隧道过程和限制(对于远程Xdebug会话) 序言_Sockets_Ssh_Ssh Tunnel - Fatal编程技术网

Sockets 解释SSH隧道过程和限制(对于远程Xdebug会话) 序言

Sockets 解释SSH隧道过程和限制(对于远程Xdebug会话) 序言,sockets,ssh,ssh-tunnel,Sockets,Ssh,Ssh Tunnel,我在防火墙后面启动本地SSH终端,并一直连接到远程服务器,没有任何问题 Xdebug的工作方式是,如果我错了,请纠正我,它会向我的网络端口9000发送一个“未经请求的”请求。实际上,我通过浏览器向远程服务器发送一个HTTP请求,并使用POST/GET/COOKIE变量指示xdebug启动,从而启动了该操作。但我的网络不知道这一点。它所知道的是,它正在收到来自互联网的9000端口请求。它不知道将其转发到专用网络中的哪台计算机(不在路由器上设置端口转发),只能忽略该请求 所以,如果您不能进行端口转发

我在防火墙后面启动本地SSH终端,并一直连接到远程服务器,没有任何问题

Xdebug的工作方式是,如果我错了,请纠正我,它会向我的网络端口9000发送一个“未经请求的”请求。实际上,我通过浏览器向远程服务器发送一个HTTP请求,并使用POST/GET/COOKIE变量指示xdebug启动,从而启动了该操作。但我的网络不知道这一点。它所知道的是,它正在收到来自互联网的9000端口请求。它不知道将其转发到专用网络中的哪台计算机(不在路由器上设置端口转发),只能忽略该请求

所以,如果您不能进行端口转发,另一个选择(我可以告诉您,这是一个更好的选择)是SSH隧道。我的计算机发送SSH请求,服务器响应。我的路由器知道将这些响应路由到其网络中的哪台计算机。借助SSH连接,远程服务器发出的那些“未经请求的”端口9000请求可以到达我的邮箱

我想我很明白

多亏了stackoverflow,我终于开始工作了,但它的工作原理对我来说仍然很模糊

在远程服务器上,我告诉Xdebug连接到端口9000上的本地主机(不要通过
Xdebug.remote\u host=173.123.45.56
连接到我的ip,也不要连接到
Xdebug.remote\u connect\u back=1
,这也会在我的ip上结束)。连接到localhost似乎有点奇怪,因为我把它想象成服务器将消息发送到自己的IP地址,就好像它正在向自己发送消息一样(但我认为连接到
localhost
可能与连接到任何其他IP根本不同……我认为消息不会被路由到
localhost

在我工作的计算机上,我在端口22上打开了一个SSH连接,指定了到端口9000和远程端口9000的隧道。我在这里看到了关于各种设置的一些解释,但仍然不理解它们。有些甚至似乎涉及三台机器。不过,似乎发生的是,我像往常一样通过端口22连接,但我已经告诉了我希望接收其端口9000通信的远程计算机。我在隧道中指定了“localhost”,我想这可能需要匹配我的
xdebug.remote\u host
值中的
localhost
。我不知道是否在这两个位置都指定了我的IP地址(即远程服务器上的xdebug.remote_host=173.123.45.56,我的SSH终端中的IP相同),这也可以吗

因此,远程服务器上的Xdebug向我发送了一个启动调试会话的请求。它通过我的端口22发送,但我的SSH隧道以某种方式使它看起来好像是在端口9000上发送的。因此,侦听端口9000的IDE接收请求并发送响应(也在9000上),我的SSH隧道以某种方式截获了它,并将其发送回端口22上的远程服务器,在那里它被类似地欺骗成xdebug的端口9000

症结 所以我真正不清楚的是,我的SSH隧道配置中的
localhost
到底指的是什么?它是否直接与
xdebug.remote\u host=localhost
值相关?我可以将它们都更改为我的IP地址吗

是将端口9000上远程服务器的所有传出通信转发给我,还是仅转发其中的一部分?例如,如果Chattanooga中的某个人在其浏览器中启动调试会话,我是否会收到Xdebug的响应


端口9000上的所有传出通信是否都转发到该服务器?即,我是否可以同时调试两台不同服务器上的两个应用程序,其中一些端口9000通信是单向的,另一些是单向的,或者每个本地应用程序需要一个端口?(我可以同时使用Google Chrome和Firefox浏览器,例如,两者都在端口80上。)

隧道由一个监听端口9000(以及端口22)的SSHD组成在您的一端,一个SSHD在另一端监听端口22。当您将XDebug连接到本地9000时,SSHDs会相互通信,远程SSHD会连接到远程的端口9000。此后,本地端口9000的行为与远程端口9000相同:写入任一端的所有数据都会显示在另一端。

隧道c侦听端口9000(以及22)的SSHD的发起人在您的一端,一个SSHD在另一端监听端口22。当您将XDebug连接到本地9000时,SSHDs会相互通信,远程SSHD会连接到远程的端口9000。此后,本地端口9000的行为与远程端口9000相同:写入任一端的所有数据都会显示在另一端