众所周知,ssh一般用来远程登录服务器,但是其实ssh有几个非常强大的参数可以用来实现隧道代理,有很多应用场景,这里主要说一下其隧道转发应用
目前由于ipv4地址枯竭,大部分电脑都是没有公网ip的,于是诞生了NAT技术,也正是因为万恶的NAT技术,不同局域网之间的电脑是无法直接通信的,互联网设计的初意所有设备应该是互通互联的!有人说不是啊,我和别人QQ微信都没问题呢?实际上,我们之间是有腾讯的服务器做了中转,还有可能是使用了p2p,但是p2p涉及到复杂的打洞问题,ipv6的时代马上到来,讲道理应该会好过一点!
ssh
假设有下面的场景:
1.你公司有一台电脑,可以访问外网,但是外部无法访问它
2.你家里有一台电脑,可以访问外网,但是外部无法访问它
3.你还有一台阿里云服务器,能访问外网,也能被外网访问到
你一眼就想到了可以使用阿里云服务器做中转,不过配置麻烦,还不一定有Linux的客户端。。。
下面教你使用2条ssh命令实现代理效果,访问内网服务畅通无阻!
在操作之前,必须先修改中转服务器ssh配置里面的“GatewayPorts yes”,一般默认都是false
在你公司电脑执行
ssh -fNR 443:localhost:22 root@39.97.190.14
简单说明一下这个命令,f是后台运行(不需要的话可以不加),N是不打开终端,因为我们只需要转发,最关键的就是R,表示远程转发
root@39.97.190.14 这个是阿里云中转服务器
443:localhost:22 表示的意思把阿里云服务器的443端口转发到本地的22端口
端口你可以随便改,在这个例子里面,就是把对阿里云服务器443端口的请求转发到了我公司电脑的22端口
第一步完成之后,其实我们就可以在家里通过
ssh -p 443 jwang@39.97.190.14
命令访问我们公司电脑了,这个应该很好理解,就是一个隧道转发。
有人可能心里在想,阿里云又没法直接访问到我公司的电脑,为什么它可以转发呢?
其实这里是在公司电脑执行的命令,相当于公司电脑主动去连接阿里云,这不是http,tcp长连接是可以收发消息的,相当于他们中间打通一条隧道,可以相互发消息
当阿里云服务器的443端口收到一个请求后,它会通过隧道告诉公司的电脑这个请求需要干啥,然后公司的电脑把结果通过隧道返回给阿里云服务器,阿里云再返回给请求的人。
虽然现在我们可以在家里ssh公司的电脑了,但是ssh里面又不能访问网页,我们要求实现的效果是访问公司内网所有服务,比如gitlab、禅道、wiki。。。其实很简单!
在你家里电脑执行
ssh -fND 1080 -p 443 jwang@39.97.190.14
这里最关键的就是D,它的意思是动态端口转发,和上面命令的区别就是,它会把所有的请求都转发到远程服务器!其实就是一个socks代理了
这条命令的意思是监听本地1080端口,把所有通过1080端口的请求全部转发到远程服务器,这里的443是刚才转发到服务器的22端口,是ssh的连接端口,这样就搭建了一条socks隧道,你通过1080端口代理的请求都会被转发到公司内网,socks代理我相信很多人都用过!
你把家里的浏览器代理设置成 127.0.0.1:1080
就可以访问公司内网的所有服务了!
其实这条命令不一定必须在家里电脑执行,其实我们可以在一台具有公网ip的电脑上执行,甚至就是中转服务器,然后把socks代理监听的ip改成0.0.0.0,这样就相当于一个公开的socks代理,虽然可以被多人使用,但是存在安全隐患,不建议这么干!
自动重连
ssh命令时间长了会自动断开,如果想日常用的话可以使用autossh,具体用法这里就不多说了!使用 apt install autossh 安装,然后把原来命令里面ssh替换成autossh就行了,区别就在于autossh断线后会自动重连!
如果想做的更好,可以这条命令放到开机自启命令里面,这样一个长期高可用的代理就搭建起来了!