前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >巧用 SSH 打通外网限制

巧用 SSH 打通外网限制

作者头像
崔庆才
发布2022-03-14 13:41:33
1.1K0
发布2022-03-14 13:41:33
举报
文章被收录于专栏:进击的Coder

这是「进击的Coder」的第 584 篇技术分享

作者:李耀 | 漫图:捷哥 排版:释然

来源:https://zhuanlan.zhihu.com/p/444319023

阅读本文大概需要 5 分钟。

笔者在工作中遇到此场景,如下两条网络限制下,总部如何访问分公司内部 web 服务器?

  • dmz 服务器可以访问总部外网服务器 22 端口,不可以访问 web 服务器;
  • web 服务器不可访问公网,但是到 dmz 网络无限制。

初看需求,我们第一个想到的肯定是内网端口映射到公网,或者 vpn,但是不修改网络策略情况下很难实现。有没有别的方法呢,我们继续从纯网络角度分析现有条件。

网络通信是双向的,有请求,有回应,就是我们俗称的“通”。dmz 可以访问外部 22 端口,代表请求,回包两个通信通道都是通畅的,我们是否可以借助回包通道,从外部发起到内部的反向访问呢?答案当然是有的,我们来试一试,需要 ssh 工具。

我们在 dmz 执行如下命令。

代码语言:javascript
复制
[root@dmz]#  ssh -f -N -g -R  6606:10.1.1.1:80 root@115.100.100.100

-f:代表后台运行程序

-N:表示使用远程端口转发创建ssh隧道

-g:监听本机所有IP地址

-R,表示使用远程端口转发创建ssh隧道

命令结合起来什么意思呢,我们使用 root 用户远程连接到 115.100.100.100,并且远程主机监听 6606 端口,当访问此端口时,会跳转到 dmz 的 80 端口。此过程会使用到 ssh 隧道。dmz 运行之后,总部服务器的已经有了端口监听。

代码语言:javascript
复制
[root@center]# netstat -tunlp | grep 6606
    tcp        0      0 127.0.0.1:6606          0.0.0.0:*               LISTEN      8616/sshd: root
    我们在总部服务器尝试端口提示拒绝,代表网络已经打通了,但是dmz服务器并没有监听80端口,所以报端口拒绝。
[root@center]# telnet 127.0.0.1 6606
    Trying 127.0.0.1...
    telnet: connect to address 127.0.0.1: Connection refused

如法炮制,再把 web 服务器到 dmz 的网络反向打通,dmz 服务器访问本地 80 端口时将跳转到 web 服务器的 80 端口。

代码语言:javascript
复制
[root@web]# ssh -f -N -g -R  80:10.1.1.1:80 root@10.1.1.2

再次到总部服务器测试访问就能通信了。

代码语言:javascript
复制
[root@center]# telnet 127.0.0.1 6606
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.

我们最后从网络角度来回顾数据包的的转发过程。

从总部服务器看到如下信息。

代码语言:javascript
复制
#dmz服务器以115.100.100.101:29493作源,访问本地22端口,建立了tcp连接。
[root@center]# ss | grep 115.
    tcp    ESTAB      0      0      172.16.1.1:22                115.100.100.101:29493
[root@center]# netstat -tpna | grep 115.
    tcp        0      0 172.16.1.127:22      101.230.91.53:29493     ESTABLISHED 8555/sshd: root#本地端口也对应到了进程号8616[root@center]#netstat -tunlp | grep 6606
    tcp        0      0 127.0.0.1:6606          0.0.0.0:*               LISTEN      8616/sshd: root[root@center]# ps -ef | grep 8616
    root      8616  8555  0 Dec03 ?        00:01:04 sshd: root.

当总部服务器访问 127.0.0.1:6606 时,网络连接信息如下。

代码语言:javascript
复制
双向通道已经建立
[root@center]# ss | grep 6606
    tcp    ESTAB      0      0      127.0.0.1:6606                 127.0.0.1:51158
    tcp    ESTAB      0      0      127.0.0.1:51158                127.0.0.1:6606

我们最后用图片来展示最终网络转发过程。

dmz 发起 ssh 连接到总部服务器,并且远程端口转发。远程服务器访问转发端口时,数据将封装到回包通道,由于 ssh 本身加密,外部网络无法知晓网络交互逻辑,从而实现反向访问。

End

崔庆才的新书《Python3网络爬虫开发实战(第二版)》已经正式上市了!书中详细介绍了零基础用 Python 开发爬虫的各方面知识,同时相比第一版新增了 JavaScript 逆向、Android 逆向、异步爬虫、深度学习、Kubernetes 相关内容,‍同时本书已经获得 Python 之父 Guido 的推荐,目前本书正在七折促销中!

内容介绍:《Python3网络爬虫开发实战(第二版)》内容介绍

扫码购买

好文和朋友一起看~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 进击的Coder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档