最近在单位购置了一台小服务器,但是回到家就不能用了,太影响我加班了!用 SSH 反向隧道可以实现穿透内网访问服务器,基本原理是有一台在公网可以访问的机器,下面称为外网机器,在我这里是我以前在阿里云买的 ECS 实例(也即一个小服务器,通过 IP 可以直接连接)。首先内网服务器用 SSH 建立到外网机器的连接,然后通过这个连接反过来转发来自外网机器的 SSH. 可以想象成内网的服务器先开一根大水管连接到外网机器,然后在这跟大水管内装一个小水管,让外网机器连接内网服务器。看看步骤就懂啦,很容易的几步就实现了。
在外网机器启动 sshd
服务
systemctl start sshd
在内网服务器建立 SSH 连接到外网机器,为了能够在 SSH 超时关闭后,自动重新建立连接,使用 autossh
软件。
sudo apt-get install -y autossh
为了让 autossh
在后台运行需要 -f
参数,但这个参数会导致调用 ssh
命令前直接进入后台模式,所以无法输入密码进行验证。因此可以采用的方法是在内网服务器产生 SSH 密钥,然后把公钥拷贝到外网机器,拷贝用 ssh-copy-id
命令完成;也可以手动拷贝,手动的方法是在内网服务器 ssh-keygen
命令产生密钥后将 ~/.ssh/id_rsa.pub
内容写入外网机器 ~/.ssh/authorized_keys
文件。
公钥配置完成后进行 autossh
建立反向隧道。
autossh -M 34044 -fNR 34043:localhost:22 pengguoyu@39.108.164.158
这里 -R
表示监听外网机器 34043
端口并转发到本服务器 22
端口。-M
是 autossh
监听端口,要保证这个端口和这个端口加一的端口 34045 是没被占用的,用 -f
后台运行的话也要指定 -N
否则 autossh
会退出。
这样就完成了,从此可以在外网机器通过 ssh 访问内网服务器,在我这里是。
ssh -p 34043 localhost
可以把轮询时间的变量 AUTOSSH_POLL
设小一点,比如。
echo "export AUTOSSH_POLL=60" >> ~/.bashrc
source ~/.bashrc
查看常用端口网址:List of TCP and UDP port numbers - Wikipedia
请避开这些端口。
参考资料
What Is Reverse SSH Tunneling? (and How to Use It)
使用SSH反向隧道进行内网穿透 | 河 的 第 三 条 岸
autossh_README
网友评论