Linux通过socks连接ssh服务器
公司的服务器设置了防火墙,要通过socks才能连接到ssh服务器。
windows下的很多ssh客户端,比方putty,等都内置了socks功能,设置一下就可以了。但我用的是linux,要找个linux下的解决方案。
搜索了一下,找到一个 dante 。
官方网站:
opensuse的源上就有,安装很简单,下面是我的配置过程。
编辑/etc/socks.conf文件,在最后添加:
route {
from: 0.0.0.0/0 to: 0.0.0.0/0 via: yoursocksserver port = socksserverport
protocol: tcp udp
proxyprotocol: socks_v4 socks_v5
method: username
}
把yoursocksserver替换成你的socks服务器ip,socksserverport替换成你的socks服务器端口。method指socks的认证方式。如果不需要认证就改成none。
如果是通过用户名验证的,则需要设置一个环境变量:
export SOCKS_USERNAME=yoursocksusername
这个变量就是你的socks服务器的用户名。dante会通过这个环境变量来获取socks用户名。如果没有设置就用当前用户。
然后用socksify脚本来执行需要使用socks的程序,在这里是ssh。
socksify ssh root@yoursshserverip
执行后可以看到,先要求你输入socks服务器的密码,输入正确之后,再提示你输入ssh服务器的密码。如果没有成功,你可以修改socks.conf文件,激活下面这两个选项:
#debug: 1 # uncomment to enable debugging
#logoutput: stdout # users usually don't want to be bothered with that.
看报什么错误。
查看一下socksify脚本,可以看到它做的事情很简单,就是在执行ssh前先加载libdsocks.so库。
至此,目的虽然达到了,但还有个问题就是每次登录服务器都需要输入两次密码,太麻烦,能不能让它自动化?
我又找到一个很有用的工具expect(如果不存在这个命令请先从源上安装)。这个工具是专门来让这样的交互式程序自动化的。
写一个脚本:
#!/usr/bin/expect
set sockspasswd "yoursockspassword"
set sshpasswd "yoursshpassword"
spawn socksify ssh root@yoursshserverip "[lindex $argv 0]";
expect "*password:";
send "$sockspasswdr";
expect "*password:";
send "$sshpasswdr";
interact;
保存后执行它,是不是自动登录到你的ssh服务器上了?
其实还不需要手动写这个脚本,expect有个工具,叫autoexpect,可以帮你自动生成这个脚本。
直接运行
autoexpect -f autologinserver socksify ssh root@yoursshserverip
按步骤完成输入,登录后退出。autoexpect就会录制下你的输入,给你生成一个名叫autologinserver(-f 参数指定)的文件。
运行它,是不是自动登录了?当然这个文件还需要修改下,因为它会把你登录后的ssh输出的内容也给记录下。
最后,这个问题算圆满解决了。
expect的功能很强大,这里只是它最简单的一个应用而已,详细的请参看man手册或者官方网站。
dante也可以做socks服务端,这里就不介绍了,具体参看官方网站。
享受生活,享受linux。