一直希望在公司或者其他地方能随时控制自己家里的 Mac,无奈家里没有公网 IP。囿于这个问题,我甚至准备开发一个基于 TCP 的 Server,让家里的电脑通过跟远端服务器建立持久连接并接收和执行远端命令。在动手之前,还好我搜索了一下,终于找到了直接使用 ssh 的方式来控制局域网内的电脑,让我不用去做无用功。
SSH 端口转发
在 ssh.com 上有这样一段话[1]
在 OpenSSH 中,可以指定
-R
选项来进行端口转发。
1 ssh -R 8080:localhost:80 public.example.com这个命令可以让任何人通过远端服务器连上远端服务器的 8080 端口。该连接会被转发给客户端,客户端会向 80 端口发起 TCP 请求。
localhost:80 可以被任何域名或者 IP 代替。
这个示例对我们从外网连接内部服务器非常有用。
由此我们知道,我们可以通过 ssh -R
选项,将内网的端口映射到一台该主机可以连接的任何一台其他主机。
在 local_server 上执行
1 | # N 选项为不执行命令,仅转发 |
这样我们便将内网的 local_server 的 22 端口映射到了 remote_server 下的 2222 端口。
配置网关
通过上一步的命令,我们在 remote_server 上执行
1 | ssh root@localhost -p 2222 |
便可以连接上 local_server 的主机。
然而,当我们从其他主机执行
1 | ssh root@remote_server -p 2222 |
时,却会总是返回 “Connection refused”。
这是因为默认的 ssh 代理只允许本机访问该端口,如果需要让其他机器可以访问,则需要修改 /etc/sshd_config。
1 | # no 修改为 yes |
这样,我们便可以通过 ssh 代理的方式在任何地方访问内网的主机了。
总结
如果你想随时随地访问你内网的主机,你需要
- 一台有公网 ip 的其他主机;
- 通过
ssh -R
命令将内网主机代理到公网主机上; - 通过修改 GatewayPorts 让任何能访问到你公网主机的设备都可以访问你的内网主机。
参考资料 & 说明
[1] 本段原文地址在 SSH Port Forwarding Example,原文为英文,本文对该段进行引用时翻译为了中文。