工具的使用

使用 SSH TUNNEL 打通公司和家里的网络

2018-10-15  本文已影响399人  anyesu

前言


平时经常遇到下面的情况:

  1. 工作没做完,想回家继续做。带电脑回家?
  2. 碰到以前做过的功能,想从家里的电脑捞一点代码。没独立 IP 怎么访问?
  3. 服务器只允许公司网络访问,在外面要登服务器。找领导设置安全组权限(或者防火墙)?
  4. 在外面想访问公司局域网中的某个服务,比如 Gitlab
  5. 公司网络不能逛淘宝?
  6. 想去墙外的世界看一看?

一般情况下的对应方法:

  1. 远程连接(比如Windows自带的)
  2. NAT内网穿透(比如花生壳,几年前用过免费版的,不太稳定,Linux下安装也不太顺畅)
  3. 一般需要正当理由
  4. 公司有固定公网 IP 的话,路由器设置端口转发,不过路由器权限呢?
  5. 代理服务器
  6. VPN(作用和代理服务器差不多,但原理不一样)

本文的目的就是使用 SSH TUNNEL 这项技术解决上面的问题,也就是打通所谓的 "公司内网" 和 "家庭内网"。

SSH TUNNEL 简介


经常远程连接 Linux 服务器的小伙伴,对于 ssh 这个命令应该不陌生吧。它还可以不执行远程指令只建立一条和远程服务器之间的连接,也就是形成了一条通道,在这条通道上我们就可以做一些文章了。
先看下 ssh 命令的参数介绍(需要了解更多请通过命令 man ssh 查看):

-1:强制使用ssh协议版本1;
-2:强制使用ssh协议版本2;
-4:强制使用IPv4地址;
-6:强制使用IPv6地址;
-A:开启认证代理连接转发功能;
-a:关闭认证代理连接转发功能;
-b:使用本机指定地址作为对应连接的源IP地址;
-C:请求压缩所有数据;
-F:指定ssh指令的配置文件;
-f:后台执行ssh指令;
-g:允许远程主机连接主机的转发端口;
-i:指定身份文件;
-l:指定连接远程服务器登录用户名;
-N:不执行远程指令;
-o:指定ssh客户端配置选项来覆盖配置文件中的配置,比如:-o "StrictHostKeyChecking no" 可以去除检查主机的提示;
-p:指定远程服务器上的ssh端口(默认为22);
-q:静默模式;
-X:开启X11转发功能;
-x:关闭X11转发功能;
-y:开启信任X11转发功能。

-D: 监听本地的指定端口,本机将作为 SOCKS5 服务器使用
-L: 本地监听指定端口,该端口收到的请求会通过远程服务器转发到另一台机器的指定端口上
-R: 远程服务器上监听指定端口,该端口收到的请求会通过本地转发到另一台机器的指定端口上


关键的就是最后的三个参数,对应 SSH 隧道 的三种端口转发模式:本地转发(-L Local),远程转发(-R Remote)和动态转发(-D Dynamic)

本地转发

本地监听指定端口,该端口收到的请求会通过远程服务器转发到另一台机器的指定端口上

ssh [-p ssh_port] -L [bind_address:]port:host:hostport user@remote_host

解释:
    port:本地监听的端口
    bind_address:监听端口使用的本地地址(如:192.168.1.2,127.0.0.1,0.0.0.0), 不设置默认为回环地址 127.0.0.1
    host:转发的目标IP
    hostport:转发的目标端口
注意:
    host:hostport 是远程主机 user@remote_host:ssh_port 所能访问到的地址(包括 user@remote_host自己),本地主机不一定能访问该地址
ssh -p 23 -Nf -L 0.0.0.0:3000:123.123.123.124:3001 root@123.123.123.123

说明:
    1. 通过 23 端口 ssh 远程服务器 123.123.123.123,使用帐号 root 登录
    2. 本地监听端口 0.0.0.0:3000
    3. 123.123.123.124 和 123.123.123.123 在一个局域网下,而本地不能直接访问 123.123.123.124
    4. 123.123.123.124 主机通过 3001 端口开放服务
    5. 调用链路:本地访问 --> 127.0.0.1:3000 -- ssh 隧道 --> 123.123.123.123 -- 转发 --> 123.123.123.124:3001

上面示例中相当于将远程主机 123.123.123.124 的 3001 端口映射为本地的 3000 端口,这样就可以通过局域网访问被限制的公网服务了。

远程转发

远程服务器上监听指定端口,该端口收到的请求会通过本地转发到另一台机器的指定端口上

ssh [-p ssh_port] -R [bind_address:]port:host:hostport user@remote_host

解释:
    语法和 -L 一样,只不过监听侧和目标侧的网络对换而已
    port:在远程主机 user@remote_host 上监听的端口
    bind_address:远程主机 user@remote_host  监听端口使用的地址(如:remote_host,127.0.0.1,0.0.0.0)。
    和 -L 有点区别,指定IP需要在远程主机上修改 /etc/ssh/sshd_config 中的配置:GatewayPorts。"yes" 表示 强制为 0.0.0.0; 默认为 "no" 表示强制为回环地址 127.0.0.1;"clientspecified" 表示由客户端决定
    host:转发的目标IP
    hostport:转发的目标端口
注意:
    host:hostport 是本地主机所能访问到的地址(包括本机),远程主机 user@remote_host:ssh_port 不一定能访问该地址
ssh -p 23 -Nf -R 172.17.0.1:3000:192.168.1.100:3001 root@123.123.123.123

说明:
    1. 通过 23 端口 ssh 远程服务器 123.123.123.123,使用帐号 root 登录
    2. 123.123.123.123 监听端口 172.17.0.1:3000 (远程服务器运行 docker , 多了一个虚拟网络 172.17.0.0)
    3. 192.168.1.100 和 本地主机 在一个局域网下,而 123.123.123.123(外网) 不能直接访问 192.168.1.100(内网)
    4. 192.168.1.100 主机通过 3001 端口开放服务
    5. 调用链路:远程服务器中访问 --> 172.17.0.1:3000 -- ssh 隧道 --> 本地 -- 转发 --> 192.168.1.100:3001

上面示例中相当于将局域网主机 192.168.1.100 的 3001 端口映射为远程服务器 123.123.123.123 的 3000 端口,这样就可以通过公网来访问局域网中的服务了。

动态转发

监听本地的指定端口,本机将作为 SOCKS5 服务器使用

ssh [-p ssh_port] -D [bind_address:]port user@remote_host

解释:
    port:本地监听的端口
    bind_address:监听端口使用的本地地址(如:192.168.1.2,127.0.0.1,0.0.0.0), 不设置默认为回环地址127.0.0.1
注意:
    启动 socks5 代理
代理使用示例:
    curl --socks5 bind_address:port baidu.com
ssh -p 23 -Nf -D 127.0.0.1:3000 root@123.123.123.123

说明:
    1. 通过 23 端口 ssh 远程服务器 123.123.123.123,使用帐号 root 登录
    2. 本地监听端口 127.0.0.1:3000
    3. 调用链路:本地局域网中访问任意http服务 -- 使用代理 --> 172.17.0.1:3000 -- ssh 隧道 --> 123.123.123.123 -- 转发 --> 目标http服务

上面示例中相当于开启了一个代理服务器,比起 本地转发 需要指定具体端口来说更加方便。

正文


上面已经介绍了 SSH TUNNEL 的使用方式,接下来就开始干正事了,先上两张网络拓扑图。

SSH TUNNEL 最终效果 原先未配置的网络

对比两张图把少的线连上就好了,是不是很easy?

就这么两步配置已经打通"公司网络"和"家里网络"了。不过,貌似实现的效果是单向的诶(只能家里连公司,公司还不能连家里, 如下图),【家里主机F】按【公司主机A】的步骤再配一下就好啦。

SSH TUNNEL 单向配置效果

拓展


WinSCP
  1. ssh隧道方式:使用【跳板机J】的【9999】端口加【公司主机A】的帐号、密码、端口。
WinSCP-ssh隧道方式
  1. 代理方式:可以选择 SOCKS5 协议或者 HTTP 协议,和上面的配置一致即可。
WinSCP-代理方式

其他问题


  1. SSH连接可能会中断(临时的网络拥塞、SSH 超时、中继主机重启等等),所以可以借助 autossh 实现自动重连来保证可靠的服务
  2. SSH连接有超时断开的机制,WinSCP 有时经常会提示断开重连,有两种方式来维持连接:
    1. 设置->面板->远程->修改刷新面板间隔为30s或者更短
    2. session设置->高级->连接->keepalives->执行哑命令(空SSH包是没效果的)
  3. Win10 1803 已经默认集成了 SSH 工具,可以直接使用上面的命令。当然也可以借助终端工具来建立SSH隧道,比如在 MobaXterm 上可以使用图形界面进行设置,比较直观。
  4. 文中的方法使用两级代理三次转发(如果在docker中运行那就是四次转发)实现不同网络的访问,中间代理层的带宽就限制了整体的访问速度,需要注意下
  5. 跳板机提供的 SOCKS5 代理服务没有密码,如果被别人知道了 IP 和端口容易被恶意攻击,所以一定要做好安全措施(比如:安全组或防火墙限制跳板机的入网 IP 为自己指定的 IP)
  6. 你公司其他同事也想连你家里的电脑?总不能把【跳板机】暴露给他吧,太不安全了,你本地再开一层代理,让他用你的电脑作为代理好了。

仓库


基于 docker-compose 运行的完整配置已经上传至GitHub

参考文章


吐槽


发布文章还会莫名其妙被锁定,也是醉了。好像是出现SS服务的全称就会被封,要了解更多相关内容的自己去 GitHub 用搜索 SS/SS-windows ( SS 替换为全称)。


转载请注明出处:https://www.jianshu.com/p/388a93b1e7f7

上一篇 下一篇

猜你喜欢

热点阅读