通过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

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

这样在公网访问远程桌面时也是经过跳板机SSH加密的,保证了安全。
访问VNC远程桌面设置类似,不再赘述
总结
通过SSH跳板机,我们在只暴露跳板机SSH端口的情况下实现了对内网其他服务的访问,且流量都经过了SSH加密,提高了安全性。