从服务器到笔记本电脑的反向 ssh 隧道

从服务器到笔记本电脑的反向 ssh 隧道

问题我想知道如何使用 ssh 隧道将服务器(debian)上发出的请求隧道传输到我的笔记本电脑上的端口 80。

问题我可以使用以下命令打开隧道,但其行为并不像我希望的那样:

ssh -R 4445:localhost:80 [email protected]

运行此命令并在 example.com 上获取 shell 后,以下命令将按预期执行,返回托管在我的笔记本电脑上的网页:

wget localhost:4445

但是,当尝试使用 example.com:4445 而不是 localhost:4445 运行相同命令时,出现连接被拒绝的情况。

额外信息:我还尝试使用 shorewall 编写转发规则:

DNAT            net             $FW:127.0.0.1:4445        tcp     4446

然后尝试

wget example.com:4446

当 wget 在上述任何情况下失败时,我得到以下信息:

--2011-02-16 13:48:26--  http://example.com:4446/
Resolving example.com... 70.90.XXX.XX
Connecting to example.com|70.90.XXX.XX|:4446... failed: Connection refused.

您对下一步该怎么做有什么想法吗?此外,如果有不同/更好的方法来实现此效果,我完全愿意接受这个想法。

编辑感谢您的建议!尝试了以下方法:

ssh -R example.com:4445:localhost:80 [email protected]

ssh -R :4445:localhost:80 [email protected]

然后,当运行与上述相同的 wget 时,返回相同的错误。我可能应该提到该服务器有两个接口(eth0 公共 eth1 私有)。

编辑

我是个白痴:( 不得不设置

GatewayPorts yes

在 sshd_config 中。感谢大家的帮助!

答案1

出于安全原因,配置 ssh 以使新隧道在本地主机上监听。您必须使用:

ssh -R :4445:localhost:80 [email protected]

来自 openssh 的手册页:

 -R [bind_address:]port:host:hostport

指定将远程(服务器)主机上的给定端口转发到本地端的给定主机和端口。此操作通过分配套接字来监听远程端的端口来实现,并且每当与此端口建立连接时,连接都会通过安全通道转发,并从本地计算机与主机端口 hostport 建立连接。

还可以在配置文件中指定端口转发。只有以 root 身份登录远程计算机时才能转发特权端口。可以通过将地址括在方括号中或使用替代语法来指定 IPv6 地址:[bind_address/]host/port/hostport。

默认情况下,服务器上的侦听套接字将仅绑定到环回接口。这可以通过指定 bind_address 来覆盖。空的 bind_address 或地址“*”表示远程套接字应侦听所有接口。仅当启用了服务器的 GatewayPorts 选项时,指定远程 bind_address 才会成功(请参阅 sshd_config(5))。

答案2

首先要记住的是隧道有一个特定的终点。这个终点并不作为客户端或服务器,但数据仅在客户端和服务器之间加密。

如果您希望服务器上的连接通过隧道传输到 example.com,您可以运行

 ssh -R 4445:example.com:80 [email protected]

什么时候服务器上的任何人连接到 localhost:4445 数据包将通过隧道加密发送到您的客户端。从您的客户端,数据包将以未加密的形式传输到 example.com:80。SSH 不会对您的连接协议进行任何分析,数据包只是从一端进入并从另一端出来。

一个隧道只能通向一个端点。如果您想要通向其他地方(例如 example.org),则需要关闭 ssh 连接并使用 建立新连接-R 4445:example.org:80。如果您想要同时连接到 example.com 和 example.org,则需要设置两个具有不同本地端口的不同隧道:-R 4445:example.com:80 -R 4446:example.com:80

默认情况下,隧道只能“来自”一个地方(对于 -R 隧道,来自服务器的本地主机;对于 -L 隧道,来自客户端的本地主机)。对于 -R 隧道,如果您GatewayPorts在服务器的 sshd_config 文件中启用,则可以告诉它监听服务器的 IP 地址,以查找可以连接到服务器的任何人:

ssh -R server:4445:example.com:80 ...

然后,任何人可以到达服务器:4445 的用户的数据包将以未加密的形式传输到服务器,服务器将通过隧道将数据包加密传输到客户端,然后客户端将数据包以未加密的形式发送到 example.com:80。

答案3

问题是您试图打开 example.com:4445 上的端口,但该端口实际上并未打开。

如果你想在 wget 命令或浏览器中引用 example.com 时访问 localhost 上的隧道端口 4445,则需要在 /etc/hosts 文件中添加条目

127.0.0.1 example.com

然后,你将能够在执行时访问本地主机上的隧道端口

wget example.com:4445

这里建立隧道的其他有用之处是,如果您打算定期使用它,则需要设置.ssh/config文件并像这样制作块。

Host example
Hostname example.com
User    someuser
LocalForward 4445 localhost:80

只需调用以下命令即可将 example.com 的 80 端口隧道传输到 localhost:4445 ssh example

相关内容