# 搭建反向代理服务器

可能是实现内网穿透,并且在远端暴露端口的最简单的方案。

步骤

  1. 搭建服务器(如 ubuntu 20.04)
  2. 添加代理用户
  3. 为用户添加 authorized_keys
  4. 关闭用户shell
  5. 修改 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 安全性极高,副作用就是有传输上的性能损耗,不适合大流量应用使用。