用“ssh -D”指令能方便地创建一个 socket 代理,作为网络隧道来使用。而且这个链路是通过 SSL 协议加密保护的,有一定的防御能力。
这个办法在 Linux 服务器维护上经常使用,可以利用这个“隧道”来访问服务器上的一些本地服务。(曾经这个办法被用来翻墙,不过随着长城的进步,这个翻墙办法现在会导致服务器 ip 地址快速被墙。)
1. 客户端用法
建立Tunnel: $ ssh -v -N -g -C -D 18080 username@host_ip 输入密码即可使用(也可以用key认证)。
- Windows的话,可以使用 plink.exe 或者 MyEnTunnel(MyEnTunnel 本质上也是使用 plink.exe 来建立Tunnel)。
2. 服务器端维护
限制“ssh -D”专用帐号权限的一个简单办法是——禁止用户登录(这样 ssh 只能连接到 sshd 但是不执行远程命令,因此需要使用 -N 参数)。
- 在服务器上建一个 username : $ useradd -s /bin/false username 将用户的 shell 设置成 /bin/false ,这样用户就无法与系统进行交互。
- 设置密码: $ passwd username
- 补充一下:对已有帐号禁止其shell交互使用: $ usermod -s /bin/false username
- 小技巧:也可以使用 /usr/bin/passwd 作为用户的 shell ,这样用户就可以通过登录而来自主修改密码。需要注意的是,需要将 /usr/bin/passwd 这一行写进 /etc/shells 文件。 sshd 认证通后之后,会检查设定的 shell 是否登记在 /etc/shells 文件中,若已经登记,则 fork自己,然后 fork 出来的子进程再 exec 设定的 shell 。而 ssh 的 -N 参数,则是告诉 sshd 不需要执行 shell。
3. 隧道辅助工具
有很多 ssh 自动管理工具处理自动输入登陆密码、断线重连等问题,简化代理使用。
- 命令行管理脚本推荐我用 python 实现的 solidssh 或者 用 C 语言实现的 autossh 。
- 类似的还有用 shell 脚本实现的文章 Build a wheel of autossh using expect 中提到的 Attach:autossh.sh.zip 。
- 也有很多图形界面的 ssh 隧道管理工具,可以搜索关键词“SSH Tunnel Manager”找到,比如“gSTM(Gnome SSH Tunnel Manager) ”等等。
- Mac OS X 下,建议使用 GoAgentX ,这个东西除了对 GoAgent 的支持外,也提供靠谱的 ssh 管理。
- Windows 推荐使用 Bitvise SSH Client ,配置好能用的 profile 之后,可以把快捷方式放在“启动”里头让它自动启动,并且可以在快捷方式里写参数指定自动调用哪个 profile 。
- 更全面的参考“各平台创建 SSH Tunnel 的免费客户端”。