23、【Ubuntu】【远程开发】内网穿透:SSH 反向隧道
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【Ubuntu】【远程开发】技术方案选择
综合分析了之前提到的远程开发技术方案,结合安全,性能,效率,成本,应用,部署难度多方面因素,决定以内网穿透为基础,进行远程开发环境部署,下面先准备部署远程开发环境
内网穿透
首先,明确当前的目标,远程的目的不是为了去控制一个内网的 Windows 系统,而是希望能连接上远程的 Ubuntu 环境,准确点应该说是远程 Linux 环境,因为通过终端命令行登录,也没必要看到 Ubuntu 的桌面环境了
然后,内网穿透是一个概念,是让位于私有网络中,没有公网 IP 的设备,能够被公网上的其他设备访问的技术,远程桌面比如远程桌面就是一种内网穿透技术的具体实现,但前面说了,现在目标不是去控制一个内网的 Windows 系统,而是希望通过终端命令行能够登录远程的 Linux 系统,就像在家里用 VSCode 登录 Ubuntu 一样,这里提到 VSCode 登录 Ubuntu 系统,就不得不提到 Remote SSH 插件,没错,就是 SSH 技术
SSH(Secure Shell)是一种用于安全远程登录和网络服务的加密通信协议,主要用于在不安全的网络(如互联网)中,安全地访问和管理远程计算机
- SSH 是运维,开发,云计算的基础设施协议
- 几乎所有 Linux 服务器都依赖 SSH 进行管理
- SSH 被广泛用于自动化脚本,CI/CD,Git 代码托管等
- 是实现零信任安全架构的重要组件之一,意思就是一旦 SSH 认证通过,那么后续就无限信任其来源,不会再做任何防备,可见 SSH 认证的含金量之高
目前主流是 SSH-2,SSH-1 有安全缺陷已经被淘汰,关于 SSH 的详细内容,后面有空再分析,OK,确定了内网穿透技术方案:SSH 远程认证登录,下面先回顾下之前在局域网领域,SSH 登录的过程

下面结合云服务器(具有公网 IP),其登录过程是这样的
- 第一步,内网设备主动连接云服务器,建立 SSH 反向隧道,没错,这里内网的家庭服务器需要先用私钥和云服务器进行 SSH 认证,随后建立反向隧道,反向隧道能让公网上的云服务器主动将某个端口的流量反向转发到内网客户端来,这个过程也叫打洞

- 第二步,用户在外地,先通过 SSH 认证,登录云服务器

- 第三步,登录云服务器后,再通过 SSH 本地转发的方式访问到内网

或者在第二步用户直接用私钥 1 访问云服务器的固定端口,云服务器只做转发

但是这种方法,任何能访问云服务器 IP 的人,都可以连接这个固定端口并穿透到内网,此时云服务器不做任何来源过滤或认证,只是纯 TCP 转发,万一有恶意流量,将直接打到内网
当然,这种情况也可以用云服务器防火墙限制来源 IP,设置安全组白名单,只允许用户的办公 IP 或家庭 IP 可以访问这个固定端口

另外,加强纵深防御,加固内网服务本身,确保即使流量进来了,内网服务难以被攻破,比如
- 禁用 SSH 密码登录,只允许密钥认证
- 使用强密钥(ed25519)
- 限制 SSH 用户权限,禁止 root 用户登录
- 定期更新系统和 OpenSSH,比如旧版 OpenSSH 的漏洞可能被利用
- 考虑用 fail2ban 防暴力破解
- 记录 SSH 登录日志
/var/log/auth.log,定期检查 - 监控异常端口监听,定期审计等
OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
