使用ssh tunnel 来做代理或跳板
接前文
http://www.cnblogs.com/piperck/p/6188984.html 使用ssh config配置文件来管理ssh连接
前文说了如何配置自己的ssh config 来方便的管理自己的ssh连接,以及如何使用ssh-add来将自己密钥密码存储起来。接下将讨论一下使用ssh来做转发和跳板的相关实践。
首先还是先说下这么一个情况:
我们的外部防火墙阻止了一些常用端口,现在打开的只有22 80 和443 也就是ssh http以及https服务可用,现在我可以通过和远程主机建立 tunnel 通过命令将本地的某个端口的流量通过tunnel 转发到远程主机的指定端口上。
ssh -L 就是做这个事情的
例如我想将本地的 3306 端口上的流量通过ssh23 端口转发到目标主机的 9999 端口上可以使用
ssh -L 3306:127.0.0.1:9999 target_host
同时这个命令也可以使用ssh config写法如下:
Host tokyo-hot
Host target_host
LocalForward 9906 127.0.0.1:3306
User: piperck
另外一个非常实用的,可以使用ssh来轻松越过墙
使用ssh -D 命令可以直接代理到目标,而且目标将会自动监听和转发。支持 socks4 socks5 代理。ssh 可以在此充当一个 socks5 代理服务器。指定一个端口,然后由这个端口作为 socks 代理服务器进行转发。
ssh -TND 9999 piperck@target_server 即可建立一个简易的sock5代理服务了。 如果你的机器是在墙外面,那么你将可以使用这条 ssh tunnel FQ。
流量会由 9999 端口进行代理转发。
我理解的流量走的顺序大概是,应用端口->指定端口代理服务器(9999)->ssh(22) >>>>>>>>>>>ssh(22)目标主机->代为访问目标地址->原路返回数据。
这样相当于将外部服务器做了一个跳板,从跳板上访问另外的目标地址。 如果你喜欢 甚至可以嵌套ssh命令登陆多台机器 类似:
ssh -A -t target_1 ssh -A -T target_2.....
使用这种链条一路访问下去(这里使用-A参数是因为 目标主机存储的是 本地计算机的公钥 如果不是存的本地公钥而是target_1的公钥可以去掉这个参数)。
另外还有一种方式可以实现这种连续跳转的。
使用 ssh -o ProxyCommand="ssh -W %h:%p jumphost.example.org" server.example.org
大概解释一下 ProxyCommand的-W参数 可以指定一个hostname:port参数
这里的 jumphost.xx 是跳板机的地址, 后面的server.xx是要去往的目标地址,同样ProxyCommand允许使用config配置文件使得他变得更灵活
例如:
Host lab HostName xcfapp-crontab User piperck IdentityFile ~/.ssh/id_rsa ProxyCommand ssh -W %h:%p jumphost.example.org
这样来实现。
ssh 还有非常多的细节可以去探索,暂时我使用到的就是这些,如果以后有更细的功能使用 可能会追加更多的内容。
Reference:
http://nerderati.com/2011/03/17/simplify-your-life-with-an-ssh-config-file/ Simplify Your Life With an SSH Config File
http://www.cnblogs.com/-chaos/p/3378564.html ssh -D -L -R 差异
http://www.cnblogs.com/piperck/p/6188984.html 使用ssh config配置文件来管理ssh连接
https://heipei.github.io/2015/02/26/SSH-Agent-Forwarding-considered-harmful/ SSH-Agent-Forwarding-considered-harmful
https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts Proxies_and_Jump_Hosts
https://dslztx.github.io/blog/2017/05/19/ssh%E5%91%BD%E4%BB%A4%E4%B9%8BProxyCommand%E9%80%89%E9%A1%B9/ ssh命令之ProxyCommand选项