使用AutoSSH 建立TCP/IP隧道,实现内网穿透

本文介绍了如何仅利用系统自带的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

 

 

 

 

 

 

 

评论列表: