31、【Ubuntu】【远程开发】内网穿透:反向隧道建立(三)
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【Ubuntu】【远程开发】内网穿透:反向隧道建立(二)
分析了 SSH -R 选项的剩下关键内容,并开始分析 sshd_config 中的关键配置项 GatewayPorts,下面继续
内网穿透
下面回到 sshd_config 配置项 GatewayPorts 继续分析
- 默认情况下,SSH 服务进程
sshd会把ssh -R选项创建的监听端口绑定到回环地址127.0.0.1,只有服务器自己能连这个端口,外网无法访问,遵循的默认最小权限的安全设计原则,防止用户无意中把内网服务暴露到公网,是一个安全防护机制 - 如果想让外网也能这些转发端口,就需要显式启用
GatewayPorts选项,启用后,sshd才会允许将监听地址绑定到非回环地址上,比如0.0.0.0或其他公网 IP 等,这样其他主机就有连接机会了
这里面 GatewayPorts 配置项有三个可选参数:
no:这也是默认参数,强制所有ssh -R转发只能绑定到回环地址127.0.0.1,外网无法访问,只有服务器本机可用,很安全,适合内部调试用yes:强制所有的ssh -R转发都绑定到*,也就是0.0.0.0所有ssh -R的端口自动对公网开放,所有 IP 都能访问,简单但风险高,不推荐clientspecified:允许客户端通过ssh -R [bind_address:]...指定绑定地址,客户端可自由选择是否对公网开放,推荐这种方式,灵活可控
这里再强调下 GatewayPorts yes 和 GatewayPorts clientspecified 的区别,yes 是强制行为,服务端强制决定所有客户端的 ssh -R 请求自动绑定到 *,0.0.0.0 接口上,也就是所有用户的 ssh -R 都会被暴露到公网上,即使有客户端不想暴露,只想在服务器上本地用也不行,也会被服务端强制公开,而 clientspecified 会尊重客户端的意愿,除非客户端显式写 bind_address,否则就默认只绑定服务器的回环地址 127.0.0.1,yes的安全性较低,只适合内部可信环境,或测试服务器,用来内网穿透,而且是长期使用,还是选 clientspecified 更安全
OK,下面来就来配置云服务器,之前 blog 【Ubuntu】【远程开发】内网穿透:环境准备 已经介绍了云服务器的一些信息,下面进入云服务器控制台,在终端输入
sudo vim /etc/ssh/sshd_config
用 root 权限编辑 sshd_config 配置文件,找到 GatewayPorts 配置项(应该默认是 no),给他设置成 GatewayPorts clientspecified

另外,这里再最后说下 ssh 命令的格式,在
ssh -N -v -R 云服务器端口:localhost:本地端口 云服务器用户名@云服务器ip
之中,前面的选项都说完了,还剩最后的 用户@ip,打开终端,输入 man ssh,可以查看 ssh 命令描述如下

可以看到,ssh 命令中唯一一个必选项就是 destination,其格式描述在 DESCRIPTION 部分,可以看到,必选项 destination 就是 [user@]hostname,这里用户名 user@ 是可选项,(如果不写,会默认使用当前本地用户名或配置文件中的默认用户),这里 manual 手册没有提到(本地试下就会发现,这里就不演示了),手册的维护者倾向于让手册更简洁,应该是假设用户已了解了基本 Unix 行为,就比如现在的场景,不指定用户就默认用当前用户
最后,在云服务器的防火墙上开放反向隧道要指定的端口访问,点击服务器面板上的防火墙规则

点击添加规则

按照自己 ssh -R 指定的端口设置规则

ok,现在在终端输入
ssh -N -v -R 0.0.0.0:ServerPort:localhost:22 ServerUser@ServerIp
应该可以看到反向隧道建立成功

OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
