本文介绍了如何仅利用系统自带的ssh命令,以及带自动重连的AutoSSH 命令实现内网穿透。
如果想了解服务商或其他成品软件,可参考 常用的内网穿透服务商及内网穿透软件
AutoSSH 与ssh的语法基本一致,多了断开自动重连的功能。
用到的参数如下:
-f 后台执行ssh指令
-C 允许压缩数据
-N 不执行远程指令
-R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
-L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
-p 指定远程主机的端口
在内网机器上执行SSH反向代理命令:
ssh -CNfR *:5900:localhost:3389 -p 2112 yonghuming@rangotec.com
表示在rangotec.com服务器上监听5900端口,并把任何发送到5900端口的内容转发到本地3389端口。
现在转发是没有任何问题了,并且SSH自身会每隔一定时间发送心跳包,保证连接通畅。
/etc/ssh/sshd_config 的心跳配置如下:
ClientAliveInterval 10 # 客户端每隔X秒向服务端发送一个心跳数据,
ClientAliveCountMax 3 # 客户端心跳连接异常最大次数,若超过该次数,则断开连接
# 如上配置效果是,如果 10 x 3 = 30 秒后,还是未收到心跳包,则认为连接异常,自动断开连接。
假如异常断开连接后,ssh默认是不会自动重连的,所以我们需要AutoSSH , 当异常断开后自动重连。
AutoSSH 比 ssh 多了一个 -M 参数,当启动的时候,它会启动一个ssh客户端,并开个端口监听ssh的状态。
-M 参数指定了监听ssh 状态的端口。
完整的内网穿透命令如下:
autossh -M 5000 -CNfR *:5900:localhost:3389 -p 2112 yonghuming@rangotec.com
测试没问题后,以服务的方式运行,服务脚本如下:
rt@rangotec.com:~$ cat /usr/lib/systemd/system/autossh.service
[Unit]
Description=Auto SSH Tunnel
After=network-online.target
[Service]
User=root
Type=simple
PIDFile=/var/run/autossh.pid
ExecStart=/usr/bin/autossh \
-o "StrictHostKeyChecking=false" \
-o "ServerAliveInterval 60" \
-o "ServerAliveCountMax 10" \
-M 5000 \
-ND *:7890 \
root@xxx.xxx.xx.xxx \
-p 6555 \
-i /root/.ssh/id_rsa
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
StartLimitIntervalSec=5
StartLimitBurst=12
Restart=always
RestartSec=42s
[Install]
WantedBy=multi-user.target