一文讲透所有网络穿透(篇一)
朝闻道 发表于 湖北 渗透测试 3623浏览 · 2024-05-15 02:36

没有人比我更懂网络穿透 ——懂王

想一口气讲清楚网络穿透的所有知识点,不知道有没这个能力。主要脉络为端口转发、端口映射,网络代理,网络隧道,VPN,异地组网这些概念说起,把这些概念讲透。第一篇先讲端口转发。

  • 端口转发是将流量从一个IP地址和端口转发到另一个IP地址和端口的技术。
  • 端口映射是端口转发的一种实现方式,主要用于NAT和PAT。主要在防火墙,路由器,网闸等设备上配置。
  • 网络代理代理客户端请求,可以进行内容过滤和缓存,比如最出名的中间件代理,还有nps,frp,Neo-reGeorg等
  • 网络隧道通过加密和封装技术在网络间创建安全连接。如PPTP、L2TP、OpenVPN、IPSec,还有一些奇技淫巧,用 icmp,dns 等协议实现的隧道。网络隧道是VPN的一部分,除了VPN外,还用于其他加密通信。
  • VPN使用网络隧道技术在公网上创建虚拟专用网络,提供加密和安全性。VPN可以用于异地组网,也可以用于其他远程访问和安全通信。
  • 异地组网使用VPN技术连接不同地理位置的网络。

前言

为什么要网络穿透,网络穿透在渗透、异地组网、 远程办公和访问、开发和测试环境、物联网(IoT)设备管理等方面有很大用处。
想要讲清楚来龙去脉,还得从头说起。网络穿透技术的出现主要原因归咎于 ipv4 地址枯竭。 ipv4地址枯竭导致 nat 技术出现,普通终端没有公网 ip 了。为了缓解公网 ip资源紧张问题, nat技术顺势而生,只需要一个公网 ip 就可以为成千上万的用户网络访问。根据NAT转换是对报文中的源地址进行转换还是对目的地址进行转换,NAT可以分为源NAT、目的NAT和双向NAT。具体细节不展开了,它的工作原理和网络穿透关系不大。

nat 的技术导致的许多问题。很多问题都是一环套一环的。正如计算机技术很多问题又都是加中间层来解决。搞清楚基础理论就可以弄明白很多问题。一般你想访问一个单点目标,你们组成一个 p2p 网络。在都有公网 ip 的情况下,你们相互访问是没有问题的。但 nat 技术出现后,出现问题了。P2P网络要求通信双方都能主动发起访问,但是NAT设备的存在,却阻断了这种主动访问,导致P2P应用无法正常运行。

为了解决NAT设备给P2P网络带来的问题,出现了一些适用于P2P网络的NAT穿越技术。例如:

  • 打洞技术(Hole Punching) 这个就多了,webrtc,stun,ssh,一般就是隧道技术,各种隧道,应用层,传输层,网络层的,也是网络穿透的灵魂,其实打洞和隧道还是有区别的,这里就不展开了
  • 反向链接技术 一般远程工具,反向shell都是用的这种技术
  • 应用层网关ALG(Application Level Gateway)技术 NAT alg,通常情况下,NAT只对报文头中的IP地址和端口信息进行转换,不对应用层数据载荷中的字段进行分析。然而一些特殊协议,它们报文的数据载荷中可能包含IP地址或端口信息,这些内容不能被NAT进行有效的转换,就可能导致问题。
  • 中间件技术 一般就是中继服务器

STUN全称Session Traversal Utilities for NAT( NAT会话穿越应用程序)是一种解决P2P应用NAT穿越问题的常用技术。它允许网络设备找出通信端点经NAT设备后的IP地址和端口号,并利用这些信息在通信双方之间建立一条可以穿越NAT设备的数据通道,实现P2P通信。
首先需要介绍一下 nat 类型,在STUN标准中,根据私网IP地址和端口到NAT出口的公网IP地址和端口的映射方式,把NAT分为如下四种类型,详见下图。

1. 全锥形NAT(Full Cone NAT)

定义 任何外部主机只要知道NAT的公共IP地址和端口,都可以通过这个地址和端口向内网主机发送数据。
STUN支持
支持程度:最高
穿透效果:非常容易
原因:全锥形NAT对入站流量没有严格限制,只要知道公共IP和端口,外部设备就可以直接通信。STUN服务器可以轻松返回正确的公共IP和端口,客户端可以直接进行P2P通信。

2. 受限锥形NAT(Restricted Cone NAT)

定义 只有先前从内网主机发送数据的外部主机可以通过NAT的公共IP地址和端口向内网主机发送数据。
STUN支持
支持程度:较高
穿透效果:相对容易
原因:受限锥形NAT限制入站流量只能来自先前发送数据的外部地址。STUN服务器可以返回公共IP和端口信息,客户端需要通过信令服务器交换这些信息并尝试通信,初始数据包可以帮助打洞。

3. 端口受限锥形NAT(Port Restricted Cone NAT)

定义 只有先前从内网主机发送数据的外部主机的特定端口可以通过NAT的公共IP地址和端口向内网主机发送数据。
STUN支持
支持程度:中等
穿透效果:较难
原因:端口受限锥形NAT在受限锥形NAT的基础上增加了对端口的限制。STUN服务器可以返回公共IP和端口信息,但需要更精确的端口信息,打洞操作需要同时进行以确保双向通信成功。

4. 对称NAT(Symmetric NAT)

定义 对于每一个外部主机和端口的请求,NAT分配不同的映射公共端口。
STUN支持
支持程度:低
穿透效果:非常困难
原因:对称NAT对每个外部地址和端口使用不同的映射,使得STUN服务器返回的公共IP和端口信息不能直接用于P2P通信。通常需要TURN(Traversal Using Relays around NAT)服务器来中继数据,因为打洞技术很难成功。
STUN对于不同类型的NAT设备支持程度和穿透效果各不相同:
全锥形NAT:支持程度最高,穿透效果最好,直接获取公共IP和端口即可通信。
受限锥形NAT:支持程度较高,穿透效果相对容易,通过初始数据包打洞即可实现通信。
端口受限锥形NAT:支持程度中等,穿透效果较难,需要更精确的端口信息和同步打洞操作。
对称NAT:支持程度最低,穿透效果非常困难,通常需要使用TURN服务器进行中继。
在面对复杂的NAT环境时,了解设备的NAT类型和STUN的支持情况,可以帮助选择适合的穿透技术和工具,提高P2P通信的成功率和效率。
一般如果进行网络优化的话,都是往成全锥形NAT方向上优化,减少 nat的次数。
可以使用这个工具测试网络的nat类型

其实说了半天,都没讲到具体技术,只是做一个全面了解的基础概括。现在开始讲解端口转发。

端口转发

常用的端口转发工具有ssh、netsh(windows)、iptables、nc、lcx(已过时,易被杀毒软件当成病毒)等。在现代网络中,端口转发是一种重要的技术,用于在网络地址转换(NAT)设备上将特定的网络流量重定向到内部网络中的特定设备。端口转发在家庭网络、企业网络以及各种网络服务中广泛应用,确保内部网络中的设备能够通过外部网络(如互联网)进行通信。

ssh端口转发

SSH(Secure Shell)不仅是一种常用的远程登录工具,还提供强大的端口转发功能。SSH端口转发能够将网络流量通过加密的SSH隧道进行重定向,从而提高网络通信的安全性和灵活性。以下将详细介绍SSH端口转发的概念、类型、工作原理、配置方法以及应用场景。

SSH端口转发的概念

SSH端口转发是利用SSH协议将网络流量通过加密通道进行重定向的技术。通过SSH端口转发,用户可以将本地或远程端口上的流量转发到另一台主机上的指定端口,从而实现安全的数据传输和访问控制。

SSH端口转发的类型

SSH端口转发主要分为三种类型:

  1. 本地端口转发(Local Port Forwarding, LPF)
  2. 远程端口转发(Remote Port Forwarding, RPF)
  3. 动态端口转发(Dynamic Port Forwarding, DPF)
本地端口转发(Local Port Forwarding, LPF)

本地端口转发将本地机器上的一个端口绑定到SSH服务器上的一个远程端口。其作用是将本地的请求通过SSH隧道转发到远程主机上的指定端口。 本地端口转发有点像网络代理中正向代理的意味。
工作原理
用户在本地机器上指定一个端口(如本地端口1234)。
当本地端口123接收到流量时,这些流量将通过SSH隧道转发到SSH服务器。
SSH服务器将流量转发到指定的远程主机和端口(如远程端口456)。
配置方法

ssh -L [本地端口]:[目标主机]:[目标端口] [SSH用户]@[SSH服务器]

例如,将本地的123端口转发到远程服务器(remote.example.com)的456端口:

ssh -NfC -L 123:localhost:456 user@example.com
-N:表示不执行远程命令。此选项通常用于仅进行端口转发时,连接建立后不打开远程shell。
-f:将SSH进程放入后台。在端口转发时,这个选项使得SSH在要求输入密码或进行认证后立即转入后台运行。
-C:启用压缩。在数据传输过程中使用压缩,以减少传输的数据量。对慢速连接可能有帮助。
-L 8080:localhost:80  这是本地端口转发选项:-L:指定本地端口转发。
8080:本地机器上的端口号。表示你希望在本地计算机上的端口8080上监听连接。
localhost:目标主机名。这是SSH服务器所在的机器名,表示流量将被转发到远程主机的本地主机。
80:目标端口号。这是目标主机上的端口,表示流量将被转发到远程主机的80端口。
user:SSH连接的用户名。用于登录远程主机。也可以直接输入域名或 ip,之后再输入账号密码。或者采取公钥验证。
example.com:SSH服务器的地址。可以是域名或IP地址。


图源:https://unix.stackexchange.com/questions/46235/how-does-reverse-ssh-tunneling-work
网上的这张图对 ssh的讲解真的是超神了。这张图展示了SSH本地端口转发的两种情况,分别是将流量通过SSH隧道转发到远程主机的不同目标地址和端口。下面是详细讲解。
上图:转发到远程主机的localhost

ssh -L 123:localhost:456 remotehost
  • -L 本地转发
  • 123(绿色):在本地主机上监听的端口号。
  • localhost(橙色):SSH连接的远程主机的localhost(即远程主机本身)。
  • 456(紫色):在远程主机上转发的目标端口号。
  • remotehost(棕色):远程主机的地址或名称。

在本地主机(your host)上监听端口123。
当本地端口123接收到流量时,这些流量将通过SSH隧道转发到remotehost。
在remotehost上,这些流量会被转发到其本地主机(localhost)的端口456。
使用场景
通过SSH隧道访问远程主机上的服务,该服务运行在remotehost的本地端口456(例如,远程主机上的某个应用程序)。
下图:转发到远程主机以外的其他主机

ssh -L 123:farawayhost:456 remotehost
  • 123(绿色):在本地主机上监听的端口号。
  • farawayhost(橙色):远程主机可以访问的另一台主机。
  • 456(紫色):在另一台主机上的目标端口号。
  • remotehost(棕色):远程主机的地址或名称。

在本地主机(your host)上监听端口123。
当本地端口123接收到流量时(比如连接 123 端口),这些流量将通过SSH隧道转发到remotehost。
在remotehost上,这些流量会被转发到另一台主机(farawayhost)的端口456。
不管本地转发还是远程转发,命令都是在your host上执行

适用场景,在渗透测试中,如果拿下一台跳板机,跳板机可以访问内网,就可以构建本地到内网的访问

远程端口转发

这张图展示了SSH反向端口转发的两种情况,分别是将流量通过SSH隧道转发到本地主机的不同目标地址和端口。下面是详细讲解。
上图:转发到本地主机的localhost

ssh -R 123:localhost:456 remotehost
  • -R 远程转发
  • 123(绿色):在远程主机上监听的端口号。
  • localhost(橙色):SSH连接的本地主机的localhost(即本地主机本身)。
  • 456(紫色):在本地主机上转发的目标端口号。
  • remotehost(棕色):远程主机的地址或名称。

在远程主机(remotehost)上监听端口123。
当远程端口123接收到流量时,这些流量将通过SSH隧道转发到本地主机(your host)。
在本地主机上,这些流量会被转发到其本地localhost的端口456。
通过SSH隧道访问本地主机上的服务,该服务运行在本地主机的端口456(例如,本地开发环境中的Web服务器)。
下图:转发到本地网络中的另一台主机

ssh -R 123:nearhost:456 remotehost
  • -R 远程转发
  • 123(绿色):在远程主机上监听的端口号。
  • nearhost(橙色):本地网络中的另一台主机。
  • 456(紫色):在另一台本地主机上的目标端口号。
  • remotehost(棕色):远程主机的地址或名称。

在远程主机(remotehost)上监听端口123。
当远程端口123接收到流量时,这些流量将通过SSH隧道转发到本地网络中的另一台主机(nearhost)。
在nearhost上,这些流量会被转发到其端口456。
通过SSH隧道访问本地网络中其他主机上的服务,该服务运行在nearhost的端口456(例如,本地网络中的数据库服务器)。
适用场景,在渗透测试中,如果拿下一台跳板机,跳板机可以访问内网,就可以构建本地到内网的访问。这都是单端口的访问,没有代理网络的全端口访问方便。说到全端口访问就得是动态端口转发了。动态端口转发从某种意思上说就是 socks 代理。

动态端口转发

SSH 动态端口转发是一种通过 SSH 隧道实现 SOCKS 代理功能的技术。它允许客户端将所有流量动态地转发到远程主机,并且可以用来访问多个远程网络服务,而不需要为每个服务单独设置端口转发。
动态端口转发与本地端口转发和远程端口转发不同,它不需要指定特定的目标地址和端口,而是通过一个本地监听端口创建一个 SOCKS 代理。任何连接到这个 SOCKS 代理的流量都可以通过 SSH 隧道动态地转发到不同的远程地址和端口。

使用场景

  • 绕过防火墙:可以用来访问被防火墙或公司网络限制的资源。
  • 匿名浏览:通过 SSH 隧道加密流量,可以提高隐私和安全性。
  • 访问受限网络:通过远程服务器访问特定区域限制的服务。
ssh -D [本地端口] [用户@远程主机]
ssh -D 8080 user@remotehost
-D [本地端口]:指定本地端口,SSH 会在该端口上创建一个 SOCKS 代理。
[用户@远程主机]:SSH 连接的远程主机及用户名。

建立 SSH 连接:在本地机器上运行上述命令后,SSH 会与远程主机建立加密连接。
创建 SOCKS 代理:SSH 在本地指定端口(例如 8080)上创建一个 SOCKS 代理。
代理流量:本地应用程序(如浏览器)将流量发送到 SOCKS 代理。代理会将流量通过 SSH 隧道转发到远程主机,然后根据请求动态地访问不同的目标服务器和端口。
通过创建 SOCKS 代理,可以灵活、安全地访问远程网络资源。无论是为了绕过网络限制,还是提高网络通信的安全性,SSH 动态端口转发都提供了便捷的解决方案。
ssh 是真的强。不断能实现端口转发还是实现代理的功能。

netsh端口转发

算了,不介绍工具了,又成安全工具了。
不过PortProxyGUI确实挺好用的,netsh的图形化工具。不用写费劲的命令行,就可以进行端口转发。

2 条评论
某人
表情
可输入 255