通过SSH隧道安全访问内网服务

我的unraid通过frp做了内网穿透,但目前有几个安全隐患:

1、unraid服务器和gitlab docker服务的ssh端口通过frp暴露在公网上了,虽然不是标准端口,口令也比较复杂,但总归是个隐患。而且由于gitlab内部ssh端口和外部ssh端口不一致,导致内外网环境的git remote url不一致,影响开发体验

2、内部的一些虚拟机的远程桌面端口也暴露在公网上了,这也是不安全的行为

为了解决上面的问题,我这边对这些敏感服务统一使用SSH隧道进行加密访问。下面是具体步骤

部署SSH跳板机

我这边使用一个docker容器作为跳板机,这个容器里面只安装一个sshd服务

# 使用 Ubuntu 作为基础镜像
FROM ubuntu:latest

# 安装 SSH 服务
RUN apt-get update \
    && apt-get install -y openssh-server \
    && rm -rf /var/lib/apt/lists/* \
    && mkdir /var/run/sshd

# 创建一个用户(例如 jumpuser),并设置密码(你可以使用自定义的用户名和密码)
RUN useradd -m -s /bin/bash jumpuser \
    && echo 'jumpuser:password' | chpasswd

# 禁用密码认证,只允许密钥登录来提高安全性
RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config

# 复制你自己的公钥到 jumpuser 的 home 目录下
RUN mkdir -p /home/jumpuser/.ssh
COPY authorized_keys /home/jumpuser/.ssh/authorized_keys
RUN chown jumpuser:jumpuser -R /home/jumpuser/.ssh && \
     chmod 700 /home/jumpuser/.ssh && \
     chmod 600 /home/jumpuser/.ssh/authorized_keys

# 容器需要开放 SSH 的端口 22
EXPOSE 22

# 启动 SSH 服务
CMD ["/usr/sbin/sshd", "-D"]

编译并启动容器

docker build -t jumpserver .

docker run
  -d
  --name='jumpserver'
  --net='bridge'
  -p '10022:22/tcp'
  -v '/mnt/user/appdata/jumpserver/ssh':'/home/jumpuser/.ssh':'rw' 'jumpserver:latest'

至此跳板机准备好了

暴露跳板机SSH端口到公网

我使用的是frp内网穿透,frp在客户端配置文件里增加下面的配置

[jumpserver]
type = tcp
local_ip = 192.168.0.100   #容器宿主机ip
local_port = 10022
remote_port = 10022

通过跳板机访问内部ssh服务

编辑工作电脑的家目录下的.ssh/config文件,内容如下

Host jumpserver
  Hostname domain_of_jumpserver
  User jumpuser
  Port 10022

Host unraid
  HostName 192.168.0.100              #unraid的内网ip
  User root
  ProxyJump jumpserver

Host gitlab
  Hostname 192.168.0.140              #gitlab服务的内网ip
  User wenky
  ProxyJump jumpserver

需要保证你的工作电脑里面的私钥(即~/.ssh/id_rsa文件)有权限访问这些SSH服务。

在你的路由器里将 domain_of_jumpserver 域名指向跳板机的ip,同时在你的域名解析商那边将域名指向你公网vps的ip, 这样无论你在内网还是外网,都可以通过 ssh unraid 命令连接到你的unraid,同时gitlab托管的代码无论是内网还是在外网都可以使用相同的git remote url

通过SSH隧道加密远程桌面连接

linux系统里推荐一款非常好用的远程桌面客户端:Remmina,它支持通过SSH通道连接远程桌面

以windows远程桌面为例,基本信息里的服务器填写你windows的内网ip img

点击SSH通道选项卡,填写跳板机信息

img

这样在公网访问远程桌面时也是经过跳板机SSH加密的,保证了安全。

访问VNC远程桌面设置类似,不再赘述

总结

通过SSH跳板机,我们在只暴露跳板机SSH端口的情况下实现了对内网其他服务的访问,且流量都经过了SSH加密,提高了安全性。