使用ssh登陆远程服务器是每个开发者或运维再熟练不过的事情了。事实上,ssh是远程服务器的唯一入口,试想一下,如果不用ssh,还有什么方式可以进入服务器呢? ssh的功能其实远不止此,本文结合实际应用场景介绍三种鲜为人知的高级用法。你或许听说过使用ssh可以翻墙,是的,它可以作为socks5代理服务器;除此之外,它还能帮助你跳过堡垒机访问无法直接访问的服务器,穿透nat路由器访问内网中的计算机。
本地端口转发
需求
线上的服务器一般只允许从特定的ip通过ssh登录,对外网只开放80和443端口。跳板机是一台可以直接ssh登录到线上的服务器,它是所有开发者登录线上服务器的入口。 还有一种情况是多个云主机只有一个公网ip,绑定了这个公网ip的云主机就是跳板机,云主机之间通过内网ip通信。 我们通常先通过ssh登录到跳板机,然后再通过ssh登录到目标服务器,也就是受保护的服务器或者没有公网ip的云主机。这种用法对于大部分操作都没问题,然而当需要从PC传输文件到目标服务器上的时候就特别麻烦,需要执行两遍scp命令。
下面以第二种情况为例,介绍这种用法。 一台云主机的公网ip是123.59.26.232,它可以通过内网ip访问另一台云主机172.16.1.9:22。
step 1
在本地的PC上执行:
ssh -Nf -L 1993:172.16.1.9:22 root@123.59.26.232
ssh会在后台监听本地的1993端口,并将所有发送到该端口的数据通过跳板机123.59.26.232转发到172.16.1.9上的22端口。
step 2
然后在PC上执行以下命令就可以直接登录到远程服务器172.16.1.9。
ssh -p 1993 root@localhost
ssh root@172.16.1.9
。
如果需要用scp传输文件也类似,比如:
scp -P 1993 out.txt root@localhost:/tmp/hahah.out
上面都是通过root用户登录,需要明确的是,user@ip中的user永远是指ip表示的服务器上的用户,如果被转发,就需要看转发后的目的ip。
如果在跳板机123.59.26.232上配置172.16.1.9的root用户的私钥,就可以免密登陆。
通常会有多个需要通过跳板机登陆的目标服务器,这时就需要在本地监听不同的端口。
端口转发不只能够转发ssh的数据,它可以转发任意tcp流量,比如http,mysql等等。
远程端口转发
需求
如何在家里面登陆到公司内网中的办公服务器呢?或者反过来,如何在公司登陆家里面的linux电脑呢? 家里的、公司的电脑基本都是位于内网中,通过nat(网络地址转换,即共享同一个公网ip)的方式访问网络,因此外网无法主动连接到内网的电脑,内网中的电脑无法连接到另一个内网中的电脑。
通过ssh的远程端口转发可以实现这个目的,需要一台具有公网ip的虚拟主机作为中继。远程端口转发与本地端口转发类似,只不过转发的方向是相反的,这个过程叫做reverse tunnel。
- 中继虚拟主机的公网ip:23.105.207.175,建议选用国内的vps,这样速度快
- 目标服务器即公司办公服务器的内网ip:192.168.3.220
- 家里PC的ip:192.168.0.227
step 1
在中继服务器23.105.207.175上修改sshd的配置(只需一次),
vim /etc/ssh/sshd_config
#GatewayPorts no
改为GatewayPorts yes
。
step 2
在目标服务器上(192.168.3.220)运行:
ssh -Nf -R *:1993:localhost:22 root@23.105.207.175
以上命令会在中继服务器23.105.207.175上监听端口1993,凡是发送到这个端口的tcp流量都会转发到本机(目标服务器)的22端口(由此可见远程端口转发与本地端口转发的区别)。
step 3
在家里的PC上运行
ssh -p 1993 root@23.105.207.175
动态端口转发
需求
在中国大陆无法访问youtube.com,怎么办?当然是番羽 土啬啦!使用ssh搭建一个socks代理服务器这应该是在pc上最简单的翻墙方法。你只需要购买一台没有被墙的虚拟主机(virtual private server,下面简称vps,等同于云主机),将它作为一个代理服务器,推荐https://bandwagonhost.com,性价比高。
socks5是工作在介于传输层和应用层的代理协议(应该算应用层),对上层的http等可以实现透明代理,ssh恰好支持这种协议。
step 1
在PC上执行:
ssh -Nf -D 1080 root@23.105.207.175
-D表示动态端口转发。 -N和-f的意义同用法一。 以上命令会在本地(我的PC)的后台启动一个socks5服务器,监听1080端口。
step 2
要使用socks5代理需要进行设置,下面介绍全局配置和浏览器配置两种方式
全局配置(以MBP为例)
以我的MacBookPro为例,在系统偏好设置->网络->wifi->高级->代理页面设置如下:
然后就可以使用google了。 这种方式的速度很慢,有时候几乎不能看youtube,这个原因我也不太清楚。
浏览器配置(以chrome为例)
上面的方式会将所有流量通过socks5进行代理,如果只需要浏览器能翻墙,则可以使用这种配置方式。并且在chrome里结合Proxy SwitchyOmega,还能控制哪些网站走代理,哪些网站直接连接,否则,连接国内的网站不仅速度慢,而且浪费vps的流量。
在浏览器安装Proxy SwitchyOmega扩展,然后新建一种PAC情景模式,ssh,在PAC网址中粘贴https://raw.githubusercontent.com/breakwa11/gfw_whitelist/master/proxy.pac,点击立即更新情景模式。如图所示
这个pac文件包含了两个重要的信息:
- socks5服务器的地址(如果你的socks5服务器监听的端口不是1080,就需要编辑一下这个文件)
- 哪些网站走代理
然后将Proxy SwitchyOmega切换到刚刚新建的ssh模式,这时在chrome中就可以访问google.com了,访问baidu.com则是直接连接。
使用ssh翻墙简单快捷,适合作为临时方案,想要更稳定的解决方案,建议使用shadowsocks实现科学上网。shadowsocks在socks5协议的基础上增加了加密的功能,原理与ssh翻墙类似。
与本地端口的比较
上面的流程图大致与本地端口转发类似,但最大的不同是,本地端口转发是将TCP流量转发到固定远程主机的固定端口上,而动态端口转发则根据socks协议转发到动态的ip和端口。这也就是动态的含义。