问题我想知道如何使用 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