我的办公室有一台位于防火墙后面的服务器、一台位于 NAT 后面的家庭服务器以及一台我随身携带的笔记本电脑。有时我想从家里访问办公室服务器,所以我做了以下设置。
家庭路由器将端口 2223 重定向到家庭服务器端口 22。
我正在办公室使用 autossh 和 systemd 单元运行反向隧道:
[Unit]
Description=Call home using port 2223 and reverse tunnel 22222 into 22
After=network.target
[Service]
User=atilla
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -p 2223 -N -R 22222:localhost:22 atilla@my_home_ip
[Install]
WantedBy=multi-user.target
在我的家庭服务器上,我可以ssh -p 22222 localhost
连接到办公室服务器。但是,当在家中执行 时ssh -p 22222 homeserver.local
,连接会被拒绝。我总是必须登录家庭服务器并进行另一跳。
办公室服务器使用最新的Raspbian,家庭服务器使用Ubuntu 22.04,全部默认设置。
答案1
阅读相关内容后,autossh
我发现除了一些标志之外,“所有其他参数都传递给 ssh“。该标志的规范ssh -R
在联机帮助页中显示man ssh
:
-R [bind_address:]port:host:hostport
在您的配置中,您(相当合理地)省略了可选bind_address:
部分,因此绑定仅适用于本地计算机。包括冒号和未定义的bind_address
成为通配符*
,这使得可以从任何地方访问端口(受防火墙、路由和其他网络管理层的限制)。
ExecStart=/usr/bin/autossh -p 2223 -N -R *:22222:localhost:22 atilla@my_home_ip
您可能还需要阅读并更改服务的GatewayPorts
设置sshd
。默认情况下,它的值为no
,这会阻止您执行我刚才描述的操作。请参阅man sshd_config
参考资料 获取详细信息,包括替代选项yes
和clientspecified
。不要在没有阅读相关内容的情况下选择一个值。
回答完这个问题后,我应该指出,不受管理地进入您的办公室网络很可能违反 IT 政策,并可能导致纪律处分。特别是对于一条可以从“任何地方”访问的路线。
答案2
为了完整起见,我分享我发现的另一个解决方案:使用称为 SSH 跳转主机的功能。
有了上面的ssh隧道,这个命令就可以一次性连接到办公服务器
ssh -J homeuser@homeserver:22 -p 22222 workuser@localhost
该-J
标志告诉使用 user@server:port 帐户作为跳转主机,后者是来自跳转主机的 SSH 参数。