autossh在Ubuntu上的配置 ssh 隧道

ssh除了可以提供远程登录服务之外,还可以建立主机之间的网络隧道,尤其是可以提供SOCKS代理(传说中的ssh -D)。但用ssh命令建立的隧道可能会受网络的影响而中断,不能为用户提供持续的服务。autossh正好是解决上述问题的工具:为用户提供可靠的ssh隧道服务。

在使用autossh之前,我的做法是:首先,做一个shell脚本检查相应的ssh进程是否存在,如不存在,则重新启动ssh隧道;然后,将上述 脚本加入系统crontab,定时执行,例如1分钟1次。但是,用shell脚本检查有一个缺点:有时候,ssh进程虽然并没有退出,但ssh隧道已经不 能正常转发报文了,shell脚本难以发现这类情况。为了避免ssh进程存在、隧道假死的问题,可以采用定时重启ssh进程并重新建立ssh隧道的方法。 但重启间隔不好设置:间隔过短,导致ssh隧道用户频频掉线,影响用户使用;间隔过长,一旦隧道假死,在重启ssh服务之前会有较长的服务中断间隔。

autossh对ssh隧道的监控则更加有效。首先,在开始执行时,autossh首先创建ssh子进程,建立隧道。同时autossh作为父进 程,随时监控ssh进程是否退出,一旦退出则立即启动新的ssh隧道。autossh这种做法比crontab定时检查在失效恢复速度上更具有优势。其 次,autossh还会定期检查ssh隧道是否能够正确传输数据,如发现隧道假死,也会强制重启ssh,建立新的ssh隧道。

Ubuntu上的autossh

autossh在Ubuntu上的安装很简单,运行下面的命令即可:

apt-get install autossh

然而,Ubuntu下的autossh并没有包含相关的后台服务脚本。用户如果希望开机自动运行autossh需要自己写daemon脚本。 Ubuntu下写daemon脚本有两个选择,一种是写传统的/etc/init.d下的脚本,令一种就是Ubuntu特有的upstart脚本。

upstart是Ubuntu设计用来替换传统的SysV init的软件。upstart的daemon脚本除了更加简洁之外,还支持服务的自动唤醒(respawn)。这样autossh本身如果出错退出了,也会立即被upstart唤醒。避免autossh出错退出导致ssh隧道无法访问。

我写的autossh的upstart脚本文件如下(文件名是/etc/init/autossh.conf):

# autossh
 
description	"autossh daemon"
 
start on runlevel [2345]
stop on runlevel [!2345]
 
respawn
respawn limit 5 60 # respawn max 5 times in 60 seconds
 
script
    export AUTOSSH_PIDFILE=/var/run/autossh.pid
    export AUTOSSH_PORT=10007:7
    export AUTOSSH_POLL=60
    export AUTOSSH_FIRST_POLL=30
    autossh -4 -N example.com -D 1080 -o BatchMode=yes -o StrictHostKeyChecking=no
end script

这样重启之后,autossh就会自动启动。手动启动、停止、重启autossh服务可以通过运行start、stop、restart等命令完成。

其他

1. ssh自动登录

autossh在后台执行ssh命令建立隧道时,需要设置好配置好本机的ssh证书,以及服务器上的authorized_keys文件,以实现ssh的自动登录。否则autossh将无法登录远程主机并建立隧道。相关说明参见网络上的教程

2. echo服务

上述autossh脚本中的AUTOSSH_PORT参数,是autossh用于判断ssh隧道健康状况专用的隧道链接,参数意义是:建立本地端口10007到远程服务器端口7的隧道,其他参数说明初次启动ssh时,在30秒后判断隧道链接情况,之后每60秒检查一次。

其中,远程服务器端口7,运行的是标准的TCP Echo服务。在Ubuntu上echo服务可以通过openbsd-inetd来实现,首先在远程服务器(注意:不是autossh所在的ssh客户端机器)上安装软件:

apt-get install openbsd-inetd

安装之后,inetd默认没有把echo服务激活,需要手动在/etc/inetd.conf配置文件中增加下面一行:

echo		stream	tcp	nowait	root	internal

重启inetd后,远程服务器的echo服务就正式上线了,可以供autossh判断网络隧道连通情况了。


分享到: 微信 更多