SSH访问NAT路由器后面的办公室主机


33

我想从家里访问我的办公室linux主机的ssh端口。不幸的是,主机位于NAT路由器后面。因此,该IP地址不是公开可用的。但是,可以访问另一个Internet主机(服务器),不幸的是,它只能是非root用户访问。经过一段时间的搜索,我找不到合适的解决方案。

设置如下:

  • NAT(IP非公开)后面的Office PC(Linux,root用户访问权限)但具有完全Internet访问权限。
  • 服务器PC(Linux,无root访问权限)静态和公用IP以及完整的Internet访问权限。
  • NAT(IP不公开)后面的家用PC(Linux,root用户访问权限),但可以完全访问Internet。

可能的连接:Office PC->服务器<-家用PC

不可能:Office PC <-X- Server -X->家用PC

家用PC或服务器都无法启动对Office PC的访问。但是Office PC和家用PC都可以启动与服务器的连接。

无法使用反向SSH隧道:我尝试了一种称为反向ssh-tunnel的方法。不幸的是,这需要将服务器上的GatewayPorts在/ etc / ssh / sshd_config中设置为“ yes”,在该位置我没有root访问权限。

原则上应该有可能:

0)在服务器上,我启动一个用户空间程序,该程序在2个端口上侦听(1个传入端口,1个传出端口)

1)在我的办公室PC上,我运行另一个程序,该程序使TCP连接保持开放到服务器上的传出端口。

2)从家里我连接到服务器的传入端口。

那里应该有一个标准的解决方案。

解决此问题的最快,最清洁的解决方案是什么?

坦率


1
工作PC可以连接到家庭建立ssh隧道吗?en.gentoo-wiki.com/wiki/Autossh

您可以将FileZilla与sftp和端口转发一起使用。检出:superuser.com/a/1286681/141314
Noam Manos

Answers:


31
youatwork@officepc$ autossh -R 12345:localhost:22 notroot@serverpc

后来:

you@homepc$ autossh -L 23456:localhost:12345 notroot@serverpc

you@homepc$ ssh youatwork@localhost -p 23456

您可以执行以下操作:在步骤1中,将远程端口从Office PC转发到服务器(12345以示例为例,任何大于1024的端口都可以使用)。现在,连接到服务器上的12345应该可以将您连接到officepc上的端口22。

在步骤2中,将端口23456从您的家用计算机转发到服务器上的12345(因此将其转发到步骤1中设置的officepc:22)

在步骤3中,使用Office PC登录名连接到本地端口23456 。这将通过步骤2转发到服务器上的端口12345,并通过步骤1转发到办公室PC。

请注意,我正在使用autossh进行转发,因为它是一个ssh包装器,如果断开连接,它将自动重新连接隧道。但是只要连接不断开,普通的ssh也可以正常工作。

可能存在一个漏洞:可以连接到serverpc上的localhost:12345的任何人现在都可以连接到officepc:22,并尝试破解它。(请注意,如果您正在运行SSH服务器,则无论如何都应将其保护在默认情况下处于启用状态的基本保护之上;我建议至少禁用root登录并禁用密码验证-参见例如this

编辑:我已经使用相同的配置验证了它,并且可以正常工作。GatewayPorts no仅影响对世界开放的端口,而不影响本地隧道。这是转发的端口:

homepc:
  outgoing ssh to serverpc:22
  listening localhost:23456 forwarded through ssh tunnel
serverpc:
  listening ssh at *:22
  incoming localhost ssh tunnel (from homepc) forwarded to localhost:12345
  listening localhost ssh tunnel (from officepc) forwarded from localhost:12345
officepc:
  outgoing ssh to serverpc:22
  incoming localhost through ssh tunnel (from serverpc) forwarded to localhost:22

因此,就网络堆栈而言,它是各个环回接口(加上 serverpc的ssh连接)上的所有本地流量;因此,GatewayPorts根本不检查。

但是,有一条指令AllowTcpForwarding:如果为no,则此设置将失败,因为根本不允许转发,甚至不允许跨环回接口转发。

注意事项

  • 如果使用autossh和最近的ssh,则可能要使用ssh ServerAliveIntervalServerAliveCountMax保持隧道畅通。Autossh具有内置检查功能,但显然在Fedora上存在一些问题。-M0禁用它,并-oServerAliveInterval=20 -oServerAliveCountMax=3检查连接是否建立-每20秒尝试一次,如果连续3次失败,则停止ssh(而autossh会创建一个新的):

    autossh -M0 -R 12345:localhost:22 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
    
    autossh -M0 -L 23456:localhost:12345 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
    
  • 如果转发失败,则重新启动ssh隧道可能很有用,如果使用-oExitOnForwardFailure=yes-如果端口已绑定,则可能会获得可用的SSH连接,但没有转发的隧道。

  • 建议~/.ssh/config为选项(和端口)使用,否则命令行太冗长。例如:

    Host fwdserverpc
        Hostname serverpc
        User notroot
        ServerAliveInterval 20
        ServerAliveCountMax 3
        ExitOnForwardFailure yes
        LocalForward 23456 localhost:12345
    

然后,您可以仅使用服务器别名:

    autossh -M0 fwdserverpc

我相信您所假设的这种方法称为“反向ssh隧道”。不幸的是,这要求将服务器上的GatewayPorts在/ etc / ssh / sshd_config中设置为“ yes”。该服务器没有启用网关端口,并且我那里没有root用户访问权限。

3
@Frank:实际上,我不这么认为:GatewayPorts no限制打开的端口只能在回送接口上访问;请注意,在第2步中,您正在回送接口上转发(实际上,两个转发都是“仅限本地主机”),因此这可能会起作用(AllowTcpForwarding no在sshd配置中会破坏这一点)。
Piskvor 2011年

3
@弗兰克:是的,确认。甚至可以用GatewayPorts no; 编辑了答案。请注意,还有其他指令(例如PermitOpenAllowTcpForwarding)可能会破坏此设置:manpagez.com/man/5/sshd_config
Piskvor 2011年

1
很好的答案!它有效,您保存了我的周末!非常感谢!!

1
如果没有-M,则无法从终端运行我的autossh版本(Fedora Core)。我还链接到另一个经历过的人。您在手册中将其标记为可选参数是正确的。如果对许多人有用,那就好了,可惜不是所有人。
Yaroslav Nikitenko

4

如果可以在家中从SSH到内部服务器以及从内部服务器到办公室Linux机器SSH,则可以从家ProxyCommand通过SSH 通过nc(netcat)静默地通过服务器反弹到内部计算机。

# ~/.ssh/config on your home machine:
Host internalpc 
   ForwardAgent yes 
   ProxyCommand ssh user@server.example.com exec nc internal.pc.example.com %p

然后,您就ssh user@internalpc可以通过服务器计算机进行静默转发,而两端都不需要打开端口或隧道。


1
感谢您的回答。不幸的是,家用PC和服务器都无法启动对Office PC的访问。但是Office PC和家用PC都可以启动与服务器的连接。

4

在要远程访问SSH的计算机中安装Robo-TiTO。

  • 这样,您可以在任何地方通过Google Talk客户端应用访问SSH。
  • 不需要公共IP地址或特殊设置。
  • 它是免费和开源的,不再支付任何应用程序服务。
  • 无需打开SSH端口(保持计算机安全)。
  • 无需打开任何隧道(例如VPN或类似的东西)

随着站点的移动,以下安装说明已过时。新的URL是https://github.com/formigarafa/robotito

我编写了一个脚本(在Raspberry Pi的Raspbian OS上进行了测试),因此您可以轻松地在Raspberry Pi,Debian或Ubuntu Box(Debian软件包分发版)上安装Robo-TiTO。这是使Linux机器可远程操作的步骤:

  1. 打开Shell Command或将其命名为Terminal,转到您的主文件夹,通过命令下载安装程序脚本:

    $ wget https://opengateway.googlecode.com/files/robotito
    
  2. 之后,通过输入命令运行脚本:

    $ sudo ./robotito
    
  3. 然后您可以credentials.rb使用您的GTalk帐户从Robo-TiTO的config文件夹中编辑文件,然后按Ctrl+ X和进行保存Y。默认是使用nano编辑器。

  4. 通过命令从Robo-TiTO文件夹运行Robo-TiTO

    $ cd robotito
    $ ./jabbershd start
    
  5. 现在,您可以从任何Google Talk客户端使用SSH。在使用该帐户之前,请不要忘记将Robo-TiTO GTalk帐户添加到您的Google Talk帐户并通过相互聊天对其进行测试。


5
我有一个严重的问题,“无需打开SSH端口(请保存您的计算机保存)”-您提出的shell-over-jabber僵尸程序CLIENT_PASSPHRASE = "logmein"纯文本加引号保护。这实际上是安全性-您正在制造一个卡车大小的孔,任何人都可以进入。与SSH公钥身份验证相反:我正在通过安全通道进行身份验证,使用的凭据甚至从未越过网络。谁现在在保护他们的计算机安全?
Piskvor 2014年

@ Piskvor,robotito将仅运行来自列入白名单的联系人的命令。github.com/formigarafa/robotito/blob/master/config/…–
formigarafa

由于基于白名单的身份验证,我从未遇到任何麻烦。如果我没看错,那么与GTalk一起使用时,消息传输将被加密。一种或另一种方式,我最近更改了它,现在它使用来自Google Authenticator之类的工具的一次性密码来允许访问。
formigarafa

1
@formigarafa:(1)如果您曾经或曾经参与此产品的开发,则必须明确地这样说。使用相同的名称是不够的。大多数人不会注意到这一点。(您可以在个人资料中提及它。)(2)编辑帖子时,应尽可能多地对其进行修复。例如,尝试捕捉“ I'ts”之类的错字。而且,如果链接断开了,请不要仅仅将其标记为无效链接;将新的URL 放入帖子中。人们不必挖掘注释即可找到正确的信息。
G-Man说'恢复莫妮卡'

@ G-Man,原始答案和编辑不是我的。而且我从未打算让它看起来像我的。我注意到答案上的链接无效,我也没有创建链接。我实际上很想看到它的内容,并试图遵循它。不幸的是我找不到资源。我标记为无效链接,希望更改后的任何人都将得到答案并尝试对其进行修复。
formigarafa '17

3

Piskvor的解决方案很好用。但是,它可以使终端悬空并悬挂登录外壳,使终端悬空打开。不太好

我一直使用我编写的这个小脚本来连接服务器,并通过在cron中运行它来保持连接状态:

#!/bin/bash
TARGET_HOST=${1:-myserver.example.com}
TARGET_PORT=${2:-7777}
TUNNEL_PORT=${3:-22}
T_USER="odin"

#Check that we have an active connection to the remote system
ACTIVE_PROCESS=`ps -ef | \
    grep "ssh $TARGET_HOST -l $T_USER -R $TARGET_PORT:127.0.0.1:$TUNNEL_PORT" | \
    grep -v grep | \
    wc -l`
if [ $ACTIVE_PROCESS -lt 1 ]; then
    echo "`date` : establishing connection to $TARGET_HOST on port $TARGET_PORT"
    screen -m -d ssh $TARGET_HOST -l $T_USER -R $TARGET_PORT:127.0.0.1:$TUNNEL_PORT > /dev/null
fi

我敢打赌,我们可以使用更优雅的autossh以及分离的屏幕来修复Piskvor的解决方案,也可以使用-NT ssh参数仅将连接保持在后台。


感谢您的赞美:)对于我的用例,我经常需要shell访问以及转发;另外,我尝试在此处显示最小的情况(可以通过透明的SSH主机跳跃将以上简化为两个命令,但这需要在homepc计算机上进行其他配置)。
Piskvor 2014年

2

在我看来,您应该尝试使用VPN,而不是SSH隧道:通过外部使用服务器进行代理(例如Hamachi)来工作的VPN 。还有其他像这样的免费软件,但是Hamachi是我的最爱。


1
现在,5.0.0.0/8网络实际上已分配了公共IPv4地址,Hamachi遇到了麻烦(如果Hamachi正在运行,您将无法访问Internet的某个随机部分)。此外,Hamachi不再免费使用。
Piskvor 2014年
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.