使用 autossh 建立反向 SSH 隧道管理个人计算机

假设你有这样一个需求:你在家中有一台 Linux/Unix 设备,可以是路由器、NAS 或者台式机,存有自己常用工具或者数据,想要在自己外出时也能随时访问。那么你现在的目的和我一样了,你所需要的是少许 Linux/Unix 经验以及一台能够从公网访问的中继服务器。我们所需要的技术是通过 SSH 隧道搭建一个反向代理。

配置

在你的 SSH 配置文件中加入这一行GatewayPorts clientspecified。可以直接使用命令:sudo echo "GatewayPorts clientspecifie" >> /etc/ssh/sshd_config

然后重新加载 SSH 配置文件:sudo reload ssh

然后在本地建立连接: ssh -f -R 0.0.0.0:20000:localhost:22 local_user@a_a_a_a

现在还有两个问题:你需要保持终端开启防止 SSH 进程被关闭;由于网络故障/波动导致 SSH 终断时无法自动重连。

前者可以使用 -N 参数来解决,后者需要 supervisor 等第三方监控工具。

使用 autossh 代替 ssh

不过我们还有一个更常用的选择方案:autossh

autossh -M 20001 \
-fN -o "PubkeyAuthentication=yes" \
-o "StrictHostKeyChecking=false" -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" \
-R a_a_a_a:20000:localhost:22 \
-p 8383 remote_user@a_a_a_a

说明:

  • -M 20001 选项指定中继服务器上的监视端口,用于交换监视 SSH 会话的测试数据,需要保证该端口在服务器上未被占用。
  • -o 用于设置 autossh 参数。
  • -f 指定 autossh 在后台运行,并不会传给 ssh。和 ssh 的 -f 不一样,autossh 指定 -f 时将无法寻求密码。指定 -f 时,会将环境变量 AUTOSSH_GATETIME 覆盖为 0!

开机启动

在 Ubuntu 中我们可以使用 systemd 管理 autossh 的开机启动问题(旧版本中可以使用 init.d)。配置很简单,只需要创建一个 /etc/systemd/system/remote-autossh.service 文件:

[Unit]
Description=AutoSSH service for remote tunnel
After=network-online.target

[Service]
User=your_username
ExecStart=/usr/bin/autossh -M 20001 -N -o "PubkeyAuthentication=yes" -o "StrictHostKeyChecking=false" -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -R a_a_a_a:20000:localhost:22 -p 8383 remote_user@a_a_a_a

[Install]
WantedBy=multi-user.target

这样就创建了一个 remote-autossh 服务,并指定其在网络服务启动后启动。可以运行 systemctl daemon-reload && systemctl start remote-autossh 立即启动服务,或者 systemctl enable remote-autossh.service 启动服务并设置为开机启动。

需要注意的是,配置文件中的 autossh 命令需要替换为其绝对地址,以及不支持 -f 参数。

========================================================================================================================================例子=============================================================

通常家用的宽带没有公网IP,运营商现在都分配的是内网IP。这样,公网上的机器就无法直接访问到内网的机器。

SSH具有建立反向隧道的能力,进行内网穿透,前提是我们有一台有公网IP的机器,假设机器情况如下:

机器 网络 IP 端口
A 公网 114.114.114.114 80
B 内网 192.168.10.1

7777

1.修改公网机器A的SSH配置文件/etc/ssh/sshd_config

GatewayPorts yes

这样可以把监听的端口绑定到任意IP 0.0.0.0上,否则只有本机127.0.0.1可以访问。

2.在内网B的机器上执行命令,建立反向隧道

ssh -NfR 80:127.0.0.1:7777 [email protected]

然后输入密码,通道即建立成功。 
-N:只建立连接,不打开shell 
-f:建立成功后在后台运行 
-R:指定端口映射

此时,会在A的机器上开一个80端口监听,所有访问公网机器A的80端口的请求都会转发到内网B的7777端口上。 
在公网A机器上查看端口:

[root@upshi ~]# lsof -i:80
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1578 root    8u  IPv4  19403      0t0  TCP *:cbt (LISTEN)

如果不想每次都输入密码,可以配置一下SSH免密登录。

AutoSSH 自动重连

使用SSH的方式不够稳定,使用AutoSSH可以自动在连接断开时自动重连,再把AutoSSH加入系统服务自动启动,则可以做到稳定的连接。

1.安装AutoSSH

sudo apt-get install autossh

2.执行AutoSSH命令

autossh -M 5555 -NR 80:127.0.0.1:7777 [email protected]
-M:在5555端口上监听连接的变化,只要断开就重连 
少了-f 参数,因为AutoSSH本来就在后台运行
 
 

 

猜你喜欢

转载自blog.csdn.net/yu132563/article/details/87857668