内网穿透连接在长时间不使用时会自动断开。 现在有一个更好的解决方案,使用autossh来实现一个不会断开的反向链接,实现内网穿透。
如何使用
首先在树莓派上安装autossh,命令是:
apt-get install autossh
安装完毕后,启动autossh,可以使用如下命令:
autossh -M 5678 -NR 1234:localhost:22 [email protected] -p 222
参数解释:
参数“-M 5678”中,-M指定树莓派的监控端口,此处是5678。树莓派会定时检查该端口,如果不通则会重新发起连接。
命令“1234:localhost:22”中, 1234表示需要在远程主机上开启的端口,22表示本地的ssh端口。这个含义表示我们希望通过公网ip和1234端口访问树莓派的22端口。
[email protected] -p222 user为公网机器上的用户,222为公网机器的ssh端口。
免密码登陆
通常情况,建立反向连接时需要登陆公网机器,此时需要输入密码。而开机自启动输入密码显然不现实。此时需要使用sshkey来实现免密码登录。
首先,在树莓派上生成sshkey,命令如下:
ssh-keygen -t rsa
由于我们不需要密码,所以一路回车即可。生成的id_rsa.pub文件在~/.ssh/文件夹里。然后我们将这个key推送到公网机器。命令如下:
ssh-copy-id -i ~/.ssh/id_rsa.pub 用户@主机地址 -p 端口/开机自启动
为了使树莓派开启能够自动连接公网服务器,我们使用systemctl来注册一个能够开机自动启动的服务。
首先创建autossh.service,命令如下:
vim /lib/systemd/system/autossh.service
加入以下内容:
[Unit] Description=Auto SSH Tunnel After=network-online.target [Service] User=树莓派用户 Type=simple ExecStart=/usr/bin/autossh -NR 在公网服务器开启的端口:本地ip地址:本地端口 -i 树莓派用户的id_rsa绝对路径 公网服务器用户@公网服务器ip地址 -p 公网服务器端口 >> /dev/null 2>&1 ExecReload=/bin/kill -HUP $MAINPID ExecStop=/bin/kill -TERM $MAINPID KillMode=process Restart=no [Install] WantedBy=multi-user.target WantedBy=graphical.target
创建完毕之后保存该文件。然后使用下面两条命令启动autossh并设置开机自启动。
systemctl enable autossh systemctl start autossh
使用下面的命令查看autossh的运行状态:
systemctl status autossh