Ubuntu用autossh实现内网穿透(反向隧道)

  1. 准备
  2. 配置密钥免密ssh登录
  3. 继续配置内网主机A(autossh配置端口转发)
  4. 设置开机自启动服务
  5. refs
  6. 后记

有一台内网ip的linux 工作机器A,想从外部互联网通过ssh连接,可以借助一台有公网ip的“跳板机B”(如vps等),使用autossh实现“反向代理”(autossh可以自动连接ssh,反向代理靠设置ssh端口转发),但该操作也使得内网机器有一定安全风险。

[TOC]

准备

  • 内网主机A,默认ssh端口:22,用户名:UserA
  • 公网ip主机B,假设ip为123:123:123:123,ssh端口为2000,用户名:UserB(一般默认ssh端口都为22,但为了公网vps机器安全,有时会修改ssh端口,公网vps主机用户名一般是root)。

在内网主机A上先测试能否ping通公网主机B以及能否建立正常ssh连接。

1
2
ping 123.123.123.123
ssh -p 2000 UserB@123.123.123.123

配置密钥免密ssh登录

在内网主机A,生成一对公私钥

1
ssh-keygen

连续3次enter缺省配置即可(但需要注意如果之前配置过,会覆盖~/.ssh/id_rsa原有密钥,以前配置过也可以直接使用),
ls ~/.ssh ,会有 id_rsa id_rsa.pub 两个文件

SSH远程免密登录的两种方式
Linux 命令(208)—— ssh-keygen 命令

将公钥拷贝到公网主机B

1
ssh-copy-id -i ~/.ssh/id_rsa.pub UserB@123.123.123.123

接下来测试能否免密建立ssh连接

1
ssh -p 2000 UserB@123.123.123.123

在公网主机B ls ~/.ssh/也可以看到有文件authorized_keyscat ~/.ssh/authorized_keys可以看到存储了刚才创建的公钥。

接着修改公网主机B的SSH配置文件(vim的安装及常见命令自行百度即可)

1
vim /etc/ssh/sshd_config

在最后一行添加并保存
GatewayPorts yes
可以将监听端口绑定到任意其他ip(默认openssh只允许从服务器主机连接远程转发端口,参考ssh 端口转发工具 tunnel),然后重启ssdh服务

1
sudo service sshd restart

继续配置内网主机A(autossh配置端口转发)

首先检查是否安装openssh,在内网主机A

1
ssh UserA@localhost

能正常登录,说明本机已经安装openssh-server端,否则先安装openssh-server

1
sudo apt install openssh-server

然后安装autossh

1
sudo apt install autossh

安装完成后,启动autossh并配置转发端口,

1
autossh -M 3001 -NfR 20001:localhost:22 root@123.123.123.123 -p 2000

-M 表示内网主机A使用端口3001 监视SSH连接状态,断连自动重连
-N 表示不执行远程指令
-f 表示建立成功后在后台运行
-R 表示指定端口映射
-p 2000 是因为公网主机B的ssh登录端口为 2000,如果默认22则不需要

这样设置后,就将内网主机A的22端口映射到公网主机B的20001,访问公网主机B的20001端口就自动转发到内网主机A的22端口,实现“内网穿透”。

测试内网穿透连接

1
ssh -p20001 UserA@123.123.123.123

顺利的话,应该可以以UserA用户的身份,连接并登录到内网主机A。

设置开机自启动服务

Ubuntu可以使用systemd管理autossh的开机自启动,创建一个.service文件

1
2
touch /etc/systemd/system/remote-autossh.service
sudo vim /etc/systemd/system/remote-autossh.service

编辑添加

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=AutoSSH service for remote tunnel
After=network-online.target

[Service]
User=tan
ExecStart=/usr/bin/autossh -M 3001 -NR 20001:localhost:22 root@123.123.123.123 -p 2000

[Install]
WantedBy=multi-user.target

这里按需设置自己的端口,并且去掉了-f的flag,否则服务可能启动失败。

运行
systemctl daemon-reload && systemctl start remote-autossh启动服务
systemctl enable remote-autossh设置开机自启动
systemctl status remote-autossh查看服务状态。

*Systemd 常用命令

refs

使用autossh前先在内网机器安装openssh服务-csdn:
https://blog.csdn.net/mba1398/article/details/122829875

Ubuntu实现SSH外网连接内网(反向隧道)-简书:
https://www.jianshu.com/p/9a16b45f29f7

Ubuntu下autossh 解决内网访问-csdn:
https://blog.csdn.net/scwMason/article/details/111152300

ssh: connect to host localhost port 22: Connection refused - csdn:
https://blog.csdn.net/mba1398/article/details/122829875

kex_exchange_identification: read: Connection reset by peer的报错解决:
https://blog.csdn.net/Horizon_carry/article/details/121874753

ESM 401 Unauthorized error on Ubuntu 16.04:
sudo apt install vim 时遇到

1
2
3
4
...
Err:1 https://esm.ubuntu.com/infra/ubuntu bionic-infra-security/main amd64 libzstd1 amd64 1.3.3+dfsg-2ubuntu1+esm1
401 Unauthorized
E: Failed to fetch https://esm.ubuntu.com/infra/ubuntu/pool/main/libz/libzstd/libzstd1_1.3.3+dfsg-2ubuntu1+esm1_amd64.deb 401 Unauthorized

https://askubuntu.com/a/1471328/1707836

后记

ps:好久没更博客了,之前师兄演示过autossh反向隧道连接内网主机,重装系统后,遂自行尝试一下,另吐个槽,京造麒麟ssd不到一年,炸0E掉盘略坑。

pps:太久没用hexo或git,这次hexo deploy出现报错:

1
2
3
4
5
6
7
8
9
Error: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s.
Please contact your system administrator.

搜了下才知道,GitHub今年3月份失误暴露了自己的私钥,所以替换了 用于Git 的 RSA SSH 主机密钥,所以之前本机存储的GitHub公钥失效了,只需要删除原有Github公钥ssh-keygen -R github.com(也可以手动vim ~/.ssh/known_hosts,删除GitHub所在行),然后再正常执行git或hexo deploy,像第一次执行git那样yes信任并重新添加公钥到known hosts即可。

GitHub blog - We updated our RSA SSH host key
http://www.cbww.cn/news/38861.shtml
Git出现"WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED"警告解决 - 简书