可能是实现内网穿透,并且在远端暴露端口的最简单的方案。
步骤
- 搭建服务器(如 ubuntu 20.04)
- 添加代理用户
- 为用户添加 authorized_keys
- 关闭用户shell
- 修改 sshd 配置,开启代理功能
详细配置
新增一个用户:(根据提示设置密码等,无需自定义配置可以一路回车)
sudo adduser dbg
为用户添加 authorized_keys,以 dbg 用户为例
su dbg
mkdir ~/.ssh/
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
把公钥填入 authorized_keys,推荐使用 ed25519 格式的密钥对(短、安全、快)。
root@VM-32-57-ubuntu:~# cat /home/dbg/.ssh/authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA.................................... root@VM-32-57-ubuntu
编辑 /etc/ssh/sshd_config 在末尾增加如下配置,为 dbg 用户添加反向穿透功能,可根据需要决定是否启用密码登陆。
Match User dbg
GatewayPorts yes
PasswordAuthentication yes
编辑 /etc/passwd 文件,
dbg:x:1001:1001:,,,:/home/dbg:/bin/true
SSH 反向登陆
其中 $KEY 用路径替换,$USER / $SERVER 分别为服务器端对应的用户名和服务器地址。
ssh -i "$KEY" \
-o "ExitOnForwardFailure yes" \
-o "ServerAliveInterval 20" \
-o "ServerAliveCountMax 3" \
-o "StrictHostKeyChecking no" \
-g -N -R *:0:localhost:22 "$USER"@"$SERVER"
上面使用了远端0端口( *:0:localhost:22
),让服务器自行选择端口,这样可以规避线路不稳定断连导致服务端口占用冲突的问题。
延伸应用
既然可以将本地 22 端口映射出去,当然也可以映射其他端口。理论上可以暴露任意服务出去。
不过也别太乐观,SSH tunnel 安全性极高,副作用就是有传输上的性能损耗,不适合大流量应用使用。