ssh鲜为人知的三种用法

Published On July 14, 2017

category tool | tags ssh 翻墙


使用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。

local

step 1

本地的PC上执行:

ssh -Nf -L 1993:172.16.1.9:22 root@123.59.26.232
-L表示本地端口转发。-N表示不执行命令,-f表示在后台运行。具体的含义请参考ssh的mannul page,当不理解的时候请多读多领悟。

ssh会在后台监听本地的1993端口,并将所有发送到该端口的数据通过跳板机123.59.26.232转发到172.16.1.9上的22端口。

step 2

然后在PC上执行以下命令就可以直接登录到远程服务器172.16.1.9。

ssh -p 1993 root@localhost
等价于在跳板机123.59.26.232上执行ssh root@172.16.1.9

如果需要用scp传输文件也类似,比如:

scp -P 1993 out.txt root@localhost:/tmp/hahah.out
注意这里是大写的P。

上面都是通过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

remote

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
-R表示远程端口转发,-N和-f的意义同用法一,具体含义请参考ssh mannual。

以上命令会在中继服务器23.105.207.175上监听端口1993,凡是发送到这个端口的tcp流量都会转发到本机(目标服务器)的22端口(由此可见远程端口转发与本地端口转发的区别)。

step 3

在家里的PC上运行

ssh -p 1993 root@23.105.207.175
就可以登录到目标服务器。这里的root是目标机的用户,因为23.105.207.175将1993端口收到的数据转发回了目标机192.168.3.220的22端口。

动态端口转发

需求

在中国大陆无法访问youtube.com,怎么办?当然是番羽 土啬啦!使用ssh搭建一个socks代理服务器这应该是在pc上最简单的翻墙方法。你只需要购买一台没有被墙的虚拟主机(virtual private server,下面简称vps,等同于云主机),将它作为一个代理服务器,推荐https://bandwagonhost.com,性价比高。

socks5是工作在介于传输层和应用层的代理协议(应该算应用层),对上层的http等可以实现透明代理,ssh恰好支持这种协议。

dynamic

step 1

在PC上执行:

ssh -Nf -D 1080 root@23.105.207.175
23.105.207.175是我位于洛杉矶的vps的公网ip地址。

-D表示动态端口转发。 -N和-f的意义同用法一。 以上命令会在本地(我的PC)的后台启动一个socks5服务器,监听1080端口。

step 2

要使用socks5代理需要进行设置,下面介绍全局配置和浏览器配置两种方式

全局配置(以MBP为例)

以我的MacBookPro为例,在系统偏好设置->网络->wifi->高级->代理页面设置如下: socks_setting

然后就可以使用google了。 这种方式的速度很慢,有时候几乎不能看youtube,这个原因我也不太清楚。

浏览器配置(以chrome为例)

上面的方式会将所有流量通过socks5进行代理,如果只需要浏览器能翻墙,则可以使用这种配置方式。并且在chrome里结合Proxy SwitchyOmega,还能控制哪些网站走代理,哪些网站直接连接,否则,连接国内的网站不仅速度慢,而且浪费vps的流量。

在浏览器安装Proxy SwitchyOmega扩展,然后新建一种PAC情景模式,ssh,在PAC网址中粘贴https://raw.githubusercontent.com/breakwa11/gfw_whitelist/master/proxy.pac,点击立即更新情景模式。如图所示 proxy_switchyomega

这个pac文件包含了两个重要的信息:

  1. socks5服务器的地址(如果你的socks5服务器监听的端口不是1080,就需要编辑一下这个文件)
  2. 哪些网站走代理

然后将Proxy SwitchyOmega切换到刚刚新建的ssh模式,这时在chrome中就可以访问google.com了,访问baidu.com则是直接连接。

使用ssh翻墙简单快捷,适合作为临时方案,想要更稳定的解决方案,建议使用shadowsocks实现科学上网。shadowsocks在socks5协议的基础上增加了加密的功能,原理与ssh翻墙类似。

与本地端口的比较

上面的流程图大致与本地端口转发类似,但最大的不同是,本地端口转发是将TCP流量转发到固定远程主机的固定端口上,而动态端口转发则根据socks协议转发到动态的ip和端口。这也就是动态的含义。

参考


qq email facebook github
© 2018 - Xurui Yan. All rights reserved
Built using pelican