0x01 Socket 通信

大家都知道,两台计算机间是通过“IP地址”相互通信的,但这样说其实毫无意义。现实中,两台计算机间的通信,其实是两台计算机中应用程序(进程)与应用程序(进程)间的通信。但“IP地址”仅能定位到计算机,如何定位到应用程序(进程)呢?答案是“协议+端口”。

网络层的“IP地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(IP地址,协议,端口)就可以标识网络的进程了,从而实现网络中进程间的通信与交互。

TCP 是面向连接的传输层协议。这就是说,应用程序在使用 TCP 协议之前,必须先建立 TCP 连接。在传送数据完毕后,必须释放已经建立的 TCP 连接。也就是说,应用程序之前的通信好像在“打电话”:通话前要先拨号建立连接,通话结束后要挂机释放连接。

Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Socket 接口后。对用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议。
Socket 起源于 Unix,而 Unix/Linux 的基本哲学之一就是“一切皆文件”,即Unix/Linux 中所有内容都以文件的形式保存和管理,都可以使用“打开open –> 读写write/read –> 关闭close”的模式来操作。

Unix/Linux 中普通文件是文件,目录(Windows 下称为文件夹)是文件,硬件设备(键盘、监视器、硬盘、打印机)是文件,就连套接字(Socket)也是文件。

在我的理解中,Socket 就是一个类,封装了许多功能函数,当需要建立连接进行通信时,它会先进行初始化,然后通过内置的功能函数建立连接并完成通信(打开、读/写IO、关闭),其中就包含了TCP的三次握手。

0x02 正向代理与反向代理

代理就相当于是中介。正常来说客户端将请求发送给服务器端,服务器端收到请求后将响应结果返回给客户端。设置代理后,请求和响应都将经过代理到达彼此。当客户端发送请求时,代理对其进行拦截,再由代理将其发送给服务器端。服务器端收到请求后,代理再对响应结果进行拦截,再由代理返回给客户端。

正向代理和反向代理本质上并无区别,如上述所示。其根本区别在于正向代理对客户端是透明的,即客户端设置的。而反向代理对服务器端是透明的,即服务器端设置的。比如我们使用抓包工具进行抓包,我们清楚的知道自己设置了代理,如 Burpsuite 的8080端口,这就是正向代理。而当我们访问一个网页时,我们不知道它是否设置了代理,而服务器端清楚的知道自己是否设置了代理,如果设置了那就是反向代理。

正向代理可以隐藏用户的信息,并能够将其作为跳板访问我们无法访问的资源,如翻墙。反向代理可以隐藏服务器的信息,保障了内网的安全,同时能够用来实现负载均衡。

总的来说,正向代理即客户端代理,代理客户端,服务端不知道实际发起请求的客户端。反向代理即服务端代理,代理服务端,客户端不知道实际提供服务的服务端。

0x03 地址转换与端口映射

一、静态NAT

路由器上手动配置,一个内网地址和一个公网地址相关联,一一对应。


二、动态NAT

路由器上配置一个公网IP地址池,当内网地址访问外网时从地址池里获取公网IP进行映射。当公网IP地址池分配完时,只能等待被占用的公网IP被释放后,其他主机才能获取公网IP访问公网。这种将源地址进行转换的方式也可称之为 SNAT(源地址转换)。

三、NAPT 网络地址端口转换

允许多个内网地址映射到同一个公网IP的不同端口。这种将源地址和端口进行转换的方式也可称之为 SNAPT(源地址端口转换)。


外网访问内网服务器提供的服务时,直接访问出口防火墙提供的公网IP和端口,防火墙将请求根据端口映射转发到对应的内网服务器。这种将目的地址和端口进行转换的方式也可称之为 DNAPT(目的地址端口转换)。

所谓内网端口映射口就是将内网中主机的一个端口映射到外网主机的一个端口,提供相应的服务。当用户访问外网IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。

这就好像是我们在内网中有一台Web服务器,但是外网中的用户是没有办法直接访问该服务器。因此我们可以在路由器上设置一个端口映射,只要外网用户访问路由器IP的80端口,那么路由器就会自动把流量转到内网Web服务器的80端口上。而且在路由器上还存在一个Session,当内网服务器返回数据给路由器时,路由器可以准确的把消息发送给外网请求用户的主机。在这期间,路由器充当了一个反向代理的作用,保护了内网中主机的安全。

0x04 端口转发与端口映射

在 IPv6 尚未普及,IPv4 消耗殆尽的情形下,不可能为每一台接入互联网的计算机都分配一个静态的公网IP,甚至连IP地址池都显得十分奢侈,因此大多数路由器使用的都是 SNAPT 技术。

端口转发(Port forwarding),有时被叫做隧道,是安全壳(SSH)为网络安全通信使用的一种方法。

比如,我们现在在内网中,是没有办法直接访问外网的。但是我们可以通过路由器的NAT方式访问外网。假如我们内网现在有100台主机,那么我们现在都是通过路由器的这一个公网IP和外网通信的。那么,当互联网上的消息发送回来时,路由器是怎么知道这个消息是给他的,而另外消息是给你的呢?这就要我们的IP地址和路由器的端口进行绑定了,这时,在路由器中就会有一个内网IP和路由器端口对应的一张表。当路由器的10000端口收到消息时,就知道把消息发送给他,而当20000端口收到消息时,就知道把消息发送给你。这就是端口转发,其转发一个端口收到的流量,给另一个主机。

在我的理解中,端口转发可以作为端口映射的功能实现,但端口转发又不局限于端口映射。当外网主机访问内网服务时,正是通过端口映射后的端口转发实现的。当内网主机使用 SNAPT 技术访问公网服务时,也是通过端口映射后的端口转发实现的对于同一公网IP不同主机的响应区分。

端口映射与端口转发用于发布防火墙内部的服务器或者防火墙内部的客户端计算机,有的路由器也有端口映射与端口转发功能。端口映射与端口转发实现的功能类似,但又不完全一样。端口映射是将外网的一个端口完全映射给内网一个地址的指定端口,而端口转发是将发往外网的一个端口的通信完全转发给内网一个地址的指定端口。端口映射可以实现外网到内网和内网到外网通信双向,而映射转发只能实现外网到内网的单向通信。

以上是百度百科对于端口映射与端口转发的区分,其实解释的也很模糊,很容易让人产生误解。其中“端口映射可以实现外网到内网和内网到外网通信双向”,指的是 SNAPT+DNAPT 的双向映射;“而映射转发只能实现外网到内网的单向通信”,指的是仅 DNAPT 的单向映射。但无论是前者还是后者,不都是通过端口转发实现其功能的吗?

0x05 内网穿透

当想要访问内部网络但又没有权限去操作防火墙做端口映射的情况下,内网穿透便横空出世。下面我们将通过一款被称为ew的内网穿透工具来学习内网穿透的相关知识。

EarthWorm是一套轻量便携且功能强大的网络穿透工具,基于标准C开发,具有socks5代理、端口转发和端口映射三大功能。相较于其他穿透工具,如reGeorg等,EarthWorm可以穿透更复杂的内网环境同时也不需要跳板机运行web服务,也可以支持多平台间的转接通讯,如Linux、Windows、MacOS、Arm-Linux等。

根据官方文档说明,EarthWorm能够以“正向连接”、“反向连接”、“多级级联”等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。

一、正向SOCKS v5服务器

当攻击者位于外网时,无法直接访问到目标网络内部的主机,但是可以访问到目标网络中对外提供服务的服务器(存在公网IP),而恰巧这台机器也拥有内网IP地址,可以访问其他内网机器。

因此攻击者可以在跳板机上运行EarthWorm,执行以下命令,在1080端口上开启socks正向代理,在自己的攻击机上开启全局代理,代理到跳板机的1080端口,至此跳板机就可以将攻击者本地操作的流量转发到内网当中,从而访问到原先无法访问的内网机器,实现内网穿透:

./ew -s ssocksd-l 1080

这里跳板机就相当于正向代理。因为对于攻击者来说它是可知的,而对于内网机来说,它们并不知道它们返回给跳板机的响应又被发送给了攻击者。

二、反弹SOCKS v5服务器

目标机器没有公网IP,但可访问内网资源。

因此攻击者可以在内网跳板机上运行EarthWorm使其反弹到某台公网服务器上,然后攻击者再通过外网连接到对外服务器进而进入到内网中。首先在一公网VPS上执行以下命令,添加一个转接隧道,把1080端口收到的代理请求转交给8888端口(开启1080端口和8888端口的监听):

./ew-s rcsocks -l 1080 -e 8888

然后在内网跳板机上执行以下命令,启动SOCKS v5服务,并反弹到公网VPS的8888端口,

./ew-s rssocks -d xxx.xxx.xxx.xxx -e 8888

这里公网服务器既是正向代理也是反向代理。对于攻击者来说它是可知的,因为我们要通过它访问我们无法访问的资源,对于内网服务器(跳板机)来说它也是可知的,因为我们是在内网服务器(跳板机)上执行的反弹命令,使其反向连接到公网服务器上。而内网服务器(跳板机)在这里充当的仅是公网服务器的正向代理,因为它对于公网服务器来说是可知的,而对于其他内网机来说则是不可知的。

但是这里大家要注意参考系的问题,正向代理和反向代理都是相对的。在攻击者——公网服务器——内网服务器这一环,内网服务器怎么可能会是代理呢?但在公网服务器——内网服务器——内网机这一环,内网服务器毋庸置疑是代理。

当攻击者可以访问内网服务器(跳板机)时,既可以直接使用前面介绍的正向连接,也可以使用这里介绍的反弹连接,此时在公网服务器上执行的命令直接在本地执行即可。此时内网服务器(跳板机)如正向连接图所示直接与攻击者交互,跳板机充当正向代理的角色。既然该情形下与正向连接结果一致,那为什么正向连接仅使用了一条命令,而反弹连接使用了两条命令呢?这可能就是前面所提到的,前者是双向映射,一条命令即可双向奔赴。而后者是单向映射,需要两条命令使他们双向奔赴。

0x06 Reference

Socket通信原理

反向代理和正向代理区别

地址转换和端口映射及内网穿透的区别

美创科技安全实验室课堂——利用EarthWorm实现内网穿透

如何从零构建对内网穿透的理解相关推荐

  1. 通过云服务器对内网穿透实现外网访问群晖NAS

    一.准备工作: 1.一台云服务器,这里我用的是腾讯云 2.一个可用的域名 3.一台内网群晖NAS 二.安装frp服务端 1.在https://github.com/fatedier/frp/relea ...

  2. 内网穿透究竟解决的是什么问题 与代理的区别

    内网穿透究竟解决的是什么问题 & 与代理的区别 参考 猫盘群晖外部网络访问的三种方法:公网IP.内网穿透.qc的实际评测 内网穿透比公网ip稳定性和速度会更好吗?(讨论比较多,有点意思) 内网 ...

  3. 光猫安全性增强,另辟蹊径实现内网穿透

    前几天家里的宽带被供应商免费升级后直接把公网ip干掉了,家里的服务器与群晖NAS也陷入半残的状态,好不容易有时间了尝试重建内网穿透.成功后记录此次重建的历程与配置内网穿透的新方法. 文章目录 问题分析 ...

  4. 使用内网穿透与公网ip的差异对比---金万维

    在IPv4公网IP严重不足的环境下,内网穿透技术越来越多的被人们所使用,二者能够实现的效果是差不多的 但是相较于公网ip来说,使用内网穿透技术的会更加有优势,具体来说: 1. 无需公网ip 物以稀为贵 ...

  5. 内网穿透+nginx转发

    内网穿透加nginx转发实现本地服务远程访问 前言 一.关于内网穿透 介绍 内网穿透常用工具 二.安装nginx(docker方式) 拉取镜像并启动 创建文件挂载目录(老规矩了) 重新创建并启动ngi ...

  6. 在外远程访问禅道,点亮软件测试新技能「内网穿透」

    文章目录 1.前言 2.BUG管理软件设置 2.1.禅道Bug管理软件下载安装 2.2.cpolar下载安装 3.本地内网穿透 3.1.Cpolar云端设置 3.2.Cpolar本地设置 4.公网访问 ...

  7. ZeroTier内网穿透工具配置

    之前有写了一篇frps内网穿透的教程,不过frps要求比较高,需要有个有固定IP的服务器.所以这个就有限制了小伙伴们没有服务器的. 这次我们写个不需要外网服务器的教程.软件就是zerotier这个东西 ...

  8. 传输超大文件的方法————utools内网穿透 #传大文件#

    内网穿透原理: 内网穿透:将自己的局域网映射到公网上 我们经常要将自己文件发送给朋友,但是总会因为太大,用网盘.U盘都不是很方便,这个时候我们就可以用"内网穿透"的方式 " ...

  9. 树莓派(raspberry pi)日记1之个人网站的构建(localhost内网穿透实现公网可以访问)

    树莓派(raspberry pi)日记1之个人网站的构建(localhost内网穿透实现公网可以访问) 板子:raspberry pi 3B+ // 作者:shawn 2021.2.9 14:10 A ...

  10. 用快解析内网穿透实现零成本自建网站

    作为一个IT行业从业者,因为掌握编程技术,经常会受开公司的朋友之托做个网站,但是发现自己的网络竟然不是公网IP,是电信给的虚拟IP,也就是说就算做好了网站,也映射不出去,别人访问不到,怎么办?现在我们 ...

最新文章

  1. 第五章 Spring进阶-注解方式实现AOP(1)
  2. python官网 中文版 新闻-新闻主页 - python兵者 - 博客园
  3. tensorboard的初次使用
  4. 几道web题简单总结
  5. maven 可执行 jar_Maven提示:有关可执行jar的所有信息
  6. Python定时任务框架APScheduler
  7. 03-13 微信小程序自动化测试
  8. 13、MVC 设计思想
  9. java.lang.UnsupportedOperationException: This parser does not support specification “null“ version “
  10. 对于os.walk()的认识--python遍历文件执行相应操作
  11. hi3559_imx334_sensor修改配置1080P60
  12. 2021全国化妆品产业区域研究报告
  13. HTML数据可视化散点图,数据可视化:用散点图进行数据分析
  14. Vue2 + ElementUI登录界面模板
  15. CodecContext->gop_size 是什么
  16. STM32L476入坑-2-STM32CubeMX安装
  17. 数据目录是什么?为何需要它?
  18. 网站制作入门指导教程
  19. RISCV学习笔记7.8(开源虚拟机篇)--AlmaLinux虚拟机安装modelsim
  20. c语言中国象棋ai算法,【中国象棋】AI算法中的棋子价值是怎么衡定的?

热门文章

  1. HTC Vive开发笔记之手柄震动
  2. springboot 优雅关闭_SpringBoot 2.3.0 优雅关闭 shutdown graceful
  3. Xcode No account for team . Add a new account in the Accounts preference pane or verify that your
  4. 钉钉企业内微应用对现有系统的免登和消息发送
  5. php 查询8到10点之间的数据,一个人的命运决定于晚上8点到10点之间
  6. python 面向对象 烤地瓜实例
  7. 在线绘制函数图像和在线图标绘制网址
  8. 你需要知道的关于元宇宙NFT平台艺术数字藏品交易的一切
  9. Google Maps的故事,你知道多少?
  10. unlink函数 与 remove函数