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 ServerAliveInterval
并ServerAliveCountMax
保持隧道畅通。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