ssh内网穿透


这种方法需要有一台公网中的VPS。

将三台机器描述如下:

机器代号 网络位置描述 地址 账户 端口 运行程序
server 内网或者防火墙后,只能主动连外网 localhost user 22 autossh
VPS 有一个公网IP,公网双向可用 lowentropy.me rp 2201, 2200 sshd
PC 自己的电脑,能访问到VPS ssh

我们的目标很简单:在PC端使用ssh,以VPS作为跳板,连接内网中的服务器server

分别描述在三台机器上需要做的操作:

vps

为了安全,创建一个专门用于端口转发的用户。这个用户不需要具有执行命令的权限。

# 增加一个新用户rp,rp只是一个名字,随便你怎么起,不是已有用户就行
sudo useradd -m rp
# 设定这个用户的密码
# 因为我这台vps禁止使用密码登录,不设密码应该也没什么,我只是顺手添加的。
# 后面也不需要用到这个密码
sudo passwd rp
# 禁止新用户rp执行命令的权限
sudo chsh -s /bin/false rp

注释里提到了,这台vps我只允许秘钥登录,因此要给新用户rp添加authorized_keys

# 首先生成一个秘钥
# 这个秘钥为了方便最好不要设置密码
# 按照提示指定秘钥文件
ssh-keygen -t rsa
# 添加authorized_keys
# 注意把cat后面替换为你生成的公钥的位置
cat {公钥位置} > /home/rp/.ssh/authorized_keys

给用户rp添加authorized_keys的方法很多,无论你怎么搞,最终目的都是将公钥内容复制到~/.ssh/authorized_keys中。

server

首先在server上安装autossh。如果是Ubuntu,安装命令就是apt install autossh

接着将刚才生成的私钥拷贝到server上。

运行

# -M指定的 2200 是autossh使用的监听端口,随便指定一个你的vps开放的端口就行。
# 2201 是你在vps上连接server的本地端口,依旧是你随便指定
# 22 就是server的sshd监听端口,一般就是22了。
autossh -M 2200 -NR 2201:localhost:22 rp@lowentropy.me -i {私钥位置} -p 2222

# 22以后的东西其实就是你在server上连接vps的命令
# 比如上面这一行,我首先指定了私钥位置,使用私钥登录,
# 又用-p指定了连接vps的端口,
# (一般其实是22,不需要专门指定,只不过我改过我的vps端口)

需要的时候可以设置自动运行这个命令。

运行后,实际上只有你的VPS可以ssh连到server,不直接把server端口暴露到公网中是基本常识了。(其实我很担心实验室某些同学设置的内网穿透,能把整个内网都暴露在公网中,简直害人。)

PC

将刚才生成的私钥拷贝到PC上。

在自己的ssh config中添加下面两项:

Host vps
        HostName lowentropy.me
        User rp
        Port 2222
        IdentityFile /home/budui/.ssh/rp_id_rsa
Host server
        HostName 127.0.0.1
        User user
        Port 2201
        ProxyCommand ssh -q -W %h:%p vps

vps这一项就是你连接vps使用的配置。server这一项是指你登陆到vps后,你连接server的操作。ProxyCommand表示使用vps做一次跳板。