AutoSSH是一款用于安全地自动执行SSH登录的软件。比如我们在host2机器上部署了很多服务,但是由于某些原因我们不能直接ssh访问服务器对应的端口及其服务,但是host3服务器既可以访问host2服务器也可以访问我们的host1服务器。这时候我们可以通过设置ssh来访问服务。但是仍然存在两个问题:需要保持终端打开,防止SSH进程被关闭;由于网络故障/波动导致SSH终止时,不会自动重新连接。前者可以使用tmux等第三方工具解决,后者则需要supervisor等第三方监控工具,不过我们还有一个更常用的选择,就是使用autossh工具。使用autossh工具进行内网穿透一、工具介绍这个工具最初的灵感和机制来源于rstunnel。autossh工具是一个命令行应用程序,用于启动和监控ssh服务。它可以在程序出现问题或网络出现问题时重启ssh服务。在autossh1.2中,它的方法发生了变化:autossh使用ssh构造一个ssh重定向循环(本地到远程,远程到本地),然后发送测试数据并取回结果。autossh1.3新增了一个方法:可以指定远程echo服务的端口返回测试数据发送结果。这避免了握手阶段和所有远程机器端口冲突问题,而旧的转发循环方法仍然有效。内网主机主动连接外网主机,也称为反向连接(ReverseConnection),这样NAT路由/防火墙就会在内网主机和外网主机之间建立映射,从而相互通信。但是这个映射是由路由网关自动维护的,不会继续下去。如果连接断开或网络不稳定,通信将失败。这时候内网主机就需要一个自动重连机制。#安装方式$yuminstallautossh$aptinstallautossh2.使用方法autossh使用系统自带的SSH端口映射功能,性能开销很小。命令使用方法#autosshusageautossh[-V][-Mport[:echo_port]][-f][SSH_OPTIONS]命令使用参数编号参数含义说明1-M用于出现问题时自动重连;服务器回显机制使用端口2-D本地机器动态应用端口转发3-R转发远程主机(服务器)的一个端口到本地指定机器的指定端口4-L转发一个端口本地机器(客户端)到远程指定机器的指定端口5-f后台运行6-T不占用shell7-n与-f参数一起使用8-N不执行远程命令9-q运行在静音模式;忽略提示和错误命令usedemo#localportBinding(runningonhost1server)#将发送到本机8527端口的所有数据转发到远程主机的8000端口$ssh-vv-N-Dlocalhost:8527[emailprotected]-p8000#主要用于更新安全运行ssh服务$autossh-M5678-vv-N-Dlocalhost:8527[电子邮件保护]-p80003。例子说明SSH只支持TCP端口映射!如果需要映射的端口不多的话,autossh确实是最好的选择,但是如果需要映射的端口比较多的话,还是建议使用ngrok之类的端口映射工具,毕竟这样的工具管理比较完善功能。[1]本地端口绑定转发(-L)=>setonhost1#会在host1主机上开启一个本地监听端口5900#之后访问本地5900端口的流量会被转发到host2的8000端口#其中其中,-M参数负责监听5678端口的连接状态,如果连接出现问题,会自动重连$autossh-M5678-fCN-L5900:localhost:8000[emailprotected]$autossh-M5678-fCN-L5900:[emailprotected]:8000[emailprotected]使用autossh工具穿透内网[2]远程端口转发功能(-R)=>setonhost3#willopenalocallisteningport5900onthehost1host#Afterthis,访问本地5900端口的流量会被转发到host2的8080端口#-M参数负责通过5678端口监听连接状态,如果连接有问题,会自动重连$autossh-M5678-fCN-R5900:localhost:8000[emailprotected]$autossh-M5678-fCN-R5900:[emailprotected]:8000[emailprotected]使用autossh工具进行内网穿透[3]动态端口转发功能(-D)=>在host1上设置#动态端口转发功能$autossh-M5678-vv-D1080[emailprotected]4.开机自动启动系统,服务自动启动!在Ubuntu或CentOS系统上,我们使用systemd来管理autossh启动问题。配置很简单,只需要创建一个服务启动配置文件如下。在旧版本中,可以使用init.d来管理模式,只需要在rc.local文件中添加相应的命令即可。#Ubuntu#配置文件地址#/etc/systemd/system/remote-autossh.service[Unit]Description=AutoSSHserviceforremotetunnelAfter=network-online.target[Service]User=rootExecStart=/usr/bin/autossh-M5678-fCNR18081:host2:8080[emailprotected][Install]WantedBy=multi-user.target#CentOS#配置文件地址#/etc/rc.d/rc.local$/usr/bin/autossh-M5678-fCNR18081:host2:8080[emailprotected]5.编写启停脚本,随时随地启停我们服务端口映射!PASS="escapelife"doexit(){expect-c"settimeout-1spawn$1-tpsaux|grepescape|grepsshd|awk'{print$2}'|xargskill-9expect{\"*?assword:*\"{发送\"$PASS\r\"}}expecteof"}dossh(){nohupexpect-c"settimeout-1spawn$1expect{\"*?assword:*\"{send\"$PASS\r\";exp_continue}}"&}#首先关闭各服务器的sshd连接doexit"ssh-o-p6622[emailprotected]"#开始ssh端口映射dossh"autossh-o-M5678-N-L5900:127.0.0.1:8000[emailprotected]-p6622"
