下次不要找借口说内网机器没法 SSH 远程登陆,我们要不要 QQ 远程之类的 ...
角色
- 主机 A
- 主机 B
- 主机 C
注意下文将用 A, B, C 指代它们,在命令里面也用 A, B, C 代表他们的域名。
网络情况
- A 能单向访问 B
- C 能单向访问 B
- A 和 C 互不相通
A => B <= C
一般情况下 A 和 C 分别处于两个不相干的内网,B 是一台可以公共访问的 VPS.
目标
利用 B 的转发,让 C 访问 A 的 8888 端口
操作步骤
1. 在 A 执行
ssh -vNR 8889:127.0.0.1:8888 -p 22 user@B
2. 现在 C 就可以通过 B:8889 间接访问 A:8888 了
$ curl http://B:8889 # 通过隧道转发到 http://A:8888
3. 如果上面遇到了挫折
可能是由于 SSH 服务端没有设置 GatewayPorts yes
,这种情况下映射端口仅绑定在 127.0.0.1
上,无法通过外网访问。请查看一下配置文件 /etc/ssh/sshd_config
,具体修改方式请自行了解。
❤ 其实用这个方法,可不仅仅是能让 C 访问 A 那么简单。
任何 A 能直接访问的内网服务,都可以通过这种方法分享给 B,比如 A 所在内网有个 Redis 服务 D:6379
,想要让 C 访问,C 并不需要知道知道 D 的存在。
仍然是在主机 A 上操作,执行如下命令:
$ ssh -vNR 6380:D:6379 -p 22 user@B
▲请仔细观察与上一个命令的不同之处▲
然后就可以在 C 访问 Redis 服务了:
$ redis-cli -h B -p 6380