SSH客户端在进行SSH端口转发时如何绑定到外部IP


0

根据我对SSH端口转发的基本了解,SSH客户端软件在IP:PORT上打开一个监听套接字,比如185.68.93.141:80。因此,如果我访问我的网络浏览器并访问解析为185.68.93.141的somewebsite.com,那么我的网络浏览器将打开一个套接字以与185.68.93.141:80对话。

唉,在浏览器不知情的情况下,它不是与Web服务器通信,而是与SSH客户端通信。SSH客户端将通过SSH连接发送它(通过端口22,这是唯一允许通过NAT和防火墙的端口),SSH服务器将它转发到localhost:80。

但是,正如我从经验和一些谷歌搜索中所知,您无法将侦听套接字绑定到外部IP。您得到一些“IP在此上下文中无效”错误。

那么,这实际上是如何工作的?


乍一看,你的基本理解似乎非常错误。您无法绑定到任意(外部)IP地址。请包含完整的ssh命令-L-R或者-D然后我们可以告诉你它是如何工作的(或者如果命令没有意义的话,它可以告诉你)。
Kamil Maciorowski

@KamilMaciorowski我知道你不能绑定到一个外国的ip地址,这就是不加起来的东西。过程的其他部分中的某些内容必定是错误的。我没有运行特定的ssh命令,我只是想了解它是如何工作的。让我稍微改变一下这个问题:如果我有一台支持运行Web服务器的SSH的远程主机,但没有暴露端口80,我可以配置SSH客户端,以便当有人在本地计算机上打开Web浏览器时它可以访问远程计算机上的Web服务器?
早餐

在您的示例中,您使用185.68.93.141的远程计算机的某个接口的地址是?
Kamil Maciorowski

@KamilMaciorowski这是路由器的地址。远程机器将在路由器后面有一些本地IP地址,这将是远程
主机

Answers:


1

假设:

  • NAT后面有一个远程服务器,公共IP是185.68.93.141因为NAT服务器不能直接使用。
  • 服务器sshd在端口22httpd端口上运行80
  • 185.68.93.141:22转发到服务器,所以我们可以ssh(像ssh 185.68.93.141)。
  • 185.68.93.141:80不是转发到服务器。

目标:

  • httpd从外面到达遥控器。

可能的方法:

  1. ssh -L 5678:localhost:80 185.68.93.141

    (注意:localhost上面的意思是远程服务器上下文中的localhost)。现在localhost:5678,本地计算机上的每个连接都将到达远程服务器的localhost:80127.0.0.1:80)。遥控器httpd将“看到”远程服务器本身的连接。您的本地浏览器应该访问http://localhost:5678。障碍很少:

    • 远程httpd可能拒绝连接,因为使用的URL不是它所期望的,假设它预期http://example.com。您可以通过提供自己的DNS服务或修改来重定向example.com127.0.0.1本地端来解决此问题/etc/hosts。即使这样,你也需要连接到http://example.com:5678
    • 您可能希望使用端口80而不是5678本地端(因此使用上述技巧可以使用所需的URL http://example.com)但可能您的本地操作系统不允许您打开数字低于的端口1024,除非您root(或管理员等)。跑步sshroot不推荐使用。
  2. ssh -D 5678 185.68.93.141

    在这种情况下,您需要设置本地浏览器以在localhost:5678127.0.0.1:5678)使用SOCKS4或SOCKS5动态代理。与其访问的任何站点的连接由sshd远程端代表浏览器建立。您的浏览器“看到”就像从远程服务器连接一样。现在你所要做的就是使用从远程服务器连接到自己的URL时有效的URL httpd(但如果它http://localhost或类似的话,请记住你的本地浏览器可能有一个选项,如“不要使用代理本地地址”) 。

    更多信息在这里

如果您想在本地浏览器中使用185.68.93.141(或somewebsite.com解析为185.68.93.141)作为URL的主要部分,并且sshd尽管没有端口80转发,仍然可以到达远程185.68.93.141,那么您需要按照上述规则以某种方式使浏览器连接。Sole ssh无法拦截来自不合作的浏览器的流量。


感谢您抽出宝贵时间回答。这更加清晰。您是否认为我应该编辑原始问题以将其更改为评论中的问题?
freejuices

@freejuices是的,这是一个好主意; 但请注意,不要让现有的答案出现在主题之后。
Kamil Maciorowski

1

SSH客户端绑定到localhost上的端口。浏览器将请求发送到SSH客户端。客户端将请求转发到SSH服务器(防火墙外)。SSH服务器连接到URL。SSH服务器不必绑定到端口(22以外),因为在此上下文中它充当客户端,远程Web服务器将获取其默认IP地址。

此外,浏览器连接到localhost而不是URL上的IP地址的原因是浏览器代理设置。设置代理时,浏览器始终连接到代理IP地址(在本例中可能是localhost),并告诉代理服务器您要连接的实际地址。


1

从评论中提出问题:

如果我有支持运行Web服务器的SSH的远程主机,但未公开端口80,我是否可以配置SSH客户端,以便当有人在本地计算机上打开Web浏览器时,它可以访问远程计算机上的Web服务器?

如果远程主机上的SSH正在侦听22并且您可以访问它,那么您可以使用本地端口转发进行连接。例如,考虑一个Linux客户端:

ssh remotehost -L 81:localhost:80

运行上一个命令后,您应该在端口81上看到一个新的侦听套接字(您可以查看netstat -latn | grep 81)。

结果,本地端口81将被转发到remotehost:80。

您现在可以在客户端计算机上浏览http:// localhost:81,您将看到Web服务器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.