SSH隧道

客户端监控方法

Linux下客户端的连接方法:

ssh -fN -D 7070 -p port user@host

在客户端建立的SSH隧道可能会死掉。需要一些监控和重启手段。可以用autossh来帮助监控和重启隧道。尽管如此,连接还是会出问题,可用以下办法来检查问题:

tail -f /var/log/syslog

autossh的log在这里。

ps ww `pgrep ssh`

查看ssh进程情况。

ss -ap dport = :socks or sport = :socks or dport = :ssh | column -t

查看SOCKS端口连接情况以及SSH服务器连接情况。注意观察TCP的State,来得知连接的状态;看Recv-QSend-Q也可以看出是否阻塞。

autossh(1)中写到当ssh正常退出时,autossh也正常退出而不是重启。如果发现连接不通,用killall ssh后,ssh退出且返回值为0,这样autossh也就退出了,还得再启动。见下面的syslog:

Jun 13 00:00:47 dell autossh[9682]: ssh exited with status 0; autossh exiting

同时autossh(1)中也说,autossh收到SIGUSR1信号时,它会杀死ssh进程并启动一个新的。所以当连接不通的时候,不要killall ssh,而直接killall -SIGUSR1 autossh就好了。

有时候到服务器的连接一直就SYN着,是不是服务器的TCP backlog满了呢?参看TCP/IP Illustrated P257 Incoming Connection Request Queue。

服务器端SSH Tunnel用户的添加

服务器上OpenSSH服务要打开AllowTcpForwarding选项,这个选项默认是yes。

服务端用户的添加(完善脚本):

groupadd sshtunnel

useradd -g sshtunnel -m -k /etc/sshtunnel/ -s /bin/false -e MM/DD/YY user1

passwd user1

尽管用户是无法登录进去的,为什么要-m开关来建立家目录呢?因为如果想要用SSH的公钥认证,这样连接的时候就不需要输入密码了,需要把客户端的SSH公钥拷贝到服务器user1用户的家目录。

/etc/sshtunnel/是模板目录,里面要有.ssh/config文件,用来对SSH登录的并发数目等进行限制。

存在问题

用OpenSSH建立Tunnel,用Firefox的AutoProxy插件设置Firefox的代理服务器。时不时会出现整个浏览器上不去网的情况。这种情况下,用ss观察TCP连接,会发现到SSH服务器的Send-Q阻塞,一直没有清空。有时候,是因为到localhost的Socks链接太多了。重启浏览器,让这些连接消失后再试验可能会好。还试图改变了Firefox里面几个连接数相关的设置(about:config里面搜索connections)。这样的问题到底是什么造成的呢?是SSH的设置、Firefox,还是AutoProxy?

Windows下SSH Tunnel使用设置