11

我正在尝试在路由器后面的机器中生成 SSH 服务器。

首先,我尝试将 SSH 绑定到我的公共 IP 地址:

ssh -R 10002:localhost:22 <ip_address>

然后提示我输入密码请求,但是我的用户名密码似乎不起作用。

显然我知道我的用户名密码,所以在我看来,它正在尝试在同一网络下的另一台计算机上进行身份验证。

任何建议如何解决这个问题?

当您无权访问路由器时,它还可以帮助我在路由器后面创建 SSH 服务器的任何替代方法。

iptables 中的端口都是开放的。

更新

正如托马斯奥斯特的回答所建议的那样,我尝试了以下方法。

在路由器后面的机器中,我执行了以下命令:

$ ssh -R10002:localhost:22 <remote_public_ip_address> -l <my_remote_server_username>

<remote_ip_address>是我完全控制的具有公共 IP 和 SSH 服务器的服务器的 remote_ip_address。

<my_remote_server_username>是远程服务器用户名。

之后,我尝试从远程服务器连接到路由器后面的服务器,如下所示:

$ ssh -p 10002 <remote_public_ip_address>

但是,此命令显示以下输出:

ssh: connect to host <remote_public_ip_address> port 10002: Connection refused

于是我在 iptables 防火墙中打开了 10002 端口,使用以下命令:

sudo iptables -A INPUT -p tcp --dport 10002 -j ACCEPT

之后我再次执行该命令,但它显示相同的错误消息。

在路由器后面的机器中,我在 iptables 中打开了所有端口。

更新 2

您必须在 remove_public_ip_address 服务器的 /etc/ssh/sshd_config 中允许端口转发

我试图允许在 sshd_config 文件中添加此命令的端口转发:

LocalForward 10002 <my_remote_public_server_ip>:22

但它给了我这个错误信息:

Bad configuration option: LocalForward

在“ssh -R ....”之后,您是否打开了窗口?

执行该命令后,它连接到远程公共机器,是的,我让窗口保持打开状态。

创建隧道后,可以在公共服务器上使用 ssh -p 10002 localhost 吗?

是的,如果我在公共服务器中执行该命令,它会在向我询问凭据后连接。

请在路由器后面的机器上尝试“ssh localhost”以检查 sshd 是否正在运行和工作。

这也有效。

更新 3

我终于能够让它工作(再次感谢Thomas Oster

我们将使用三台机器:

目标机器:我们要连接的机器。

中间机:充当连接中介的服务器(在我的例子中是 Linode)

家用计算机:我们将访问目标计算机的位置。

这些是我遵循的步骤

步骤1:

[destination computer]$ vi /etc/ssh/sshd_config

添加 GatewayPorts 选项:

网关端口 是

重启ssh。

第2步:

[destination computer]$ ssh -R 4040:localhost:22 middle-machine-user@middle-machine-public-ip

这将通过端口 4040 将您的公共计算机与您的目标计算机链接起来

它将连接到中间机器并提示终端,您必须打开此选项卡。

第 3 步:

在家连接:

ssh destination-user@destination-ip -p4040

或者从中间机器连接:

[home computer]$ ssh middle-machine-user@middle-machine-ip

[middle computer]$ ssh destination-user@localhost -p4040

资源

4

3 回答 3

5

正如你所说,我们有“目标机器”(我们想要使用 ssh 连接的地方)、“中间机器”(作为转发器的公共服务器)、“其他计算机”(网络上的任何其他计算机)

正如@thomas-oster 所说,您必须使用

[destination computer] $ ssh -R 2222:localhost:22 ip_of_public_server

但是,为了让隧道绑定到 0.0.0.0 而不是 localhost,您必须在“中间机”(公共服务器)上的 /etc/ssh/sshd_config 中使用 GatewayPorts:

GatewayPorts yes

当然你必须在添加这个选项后重新启动 sshd。

阅读http://www.snailbook.com/faq/gatewayports.auto.html以获得解释:“默认情况下,SSH 仅侦听与环回地址上的转发端口的连接”

这将允许您使用中间机器(公共服务器)的 ip 从网络上的任何计算机连接到目标计算机:

[any computer on the net] $ ssh -p 2222 ip_of_public_server

确保公共服务器上的防火墙允许连接到端口 2222/tcp。

于 2013-11-30T04:23:07.747 回答
5

公共“ip_address”上是否有运行 ssh 服务器?您要做的是“打开到“ip_address”的 ssh 连接,然后将端口 10002 上的任何传入请求隧道传输到 localhost:22”。

如果“ip-address”是您的 dsl 路由器的公共 IP 地址,您必须在路由器的配置中创建一个端口转发到您的主机:22。

如果您无法访问路由器,唯一可能的情况是您可以访问 Internet 中运行 ssh 的另一台服务器,您可以从该服务器进行隧道传输。

# open a session to the public available machine and create a tunnel from port 10002 back  to your local sshd (22)
ssh -R 10002:localhost:22 ip_of_public_server
# as long as this session is open, all calls to the public available machine on port 10002 will be tunneled to your local machine (make sure sshd is running on port 22)
ssh -p 10002 ip_of_public_server
于 2013-10-09T10:28:59.350 回答
1

我最近偶然发现了同样的问题,但在 SSH 服务器上没有 root 权限。

如前所述GatewayPorts yes,来自网络的客户端也能够连接到 SSH 服务器上的远程转发端口。默认情况下,它设置为no。因此,如果您没有 root 权限,则无法将 SSHD 设置更改为将GatewayPorts选项设置为true. 但在这种情况下,您可以使用以下解决方法:

ssh -R 4041:localhost:22 myserver.com 'socat TCP-LISTEN:4040,fork TCP:127.0.0.1:4041'

socat4040是一个很棒的网络实用程序,它在接口上绑定 TCP 端口,0.0.0.0因此它可以从网络中看到,并将所有流量重定向到127.0.0.1:4041SSHD 正在侦听的位置,并将其重定向到客户端的端口22

因此,如果有人想按照您(在客户端)描述的那样在端口 22 上连接您的本地 SSH,他会这样做:

ssh -p 4040 myserver.com 

它的工作原理是这样的:

SSH client --> myserver.com:4040 (socat) --> 127.0.0.1:4041 (myserver.com, SSHD) --> SSH client port 22

socat可以从源代码构建或已安装在系统上。它存在于 RHEL/CentOS 的 RPMForge 存储库中(但是,如果您没有 root 权限,则无法安装它)。

于 2016-01-15T17:00:25.183 回答