一文讲透所有网络穿透(篇一)
一文讲透所有网络穿透(篇一)
网络穿透技术是现代网络通信中不可或缺的一部分,它解决了IPv4地址枯竭带来的诸多问题,使得私有网络能够与公网进行有效通信。本文将从基础理论出发,深入探讨网络穿透的相关概念和技术,包括端口转发、端口映射、网络代理、网络隧道、VPN、异地组网等。
为什么要网络穿透
网络穿透技术在多个领域都有重要应用,包括:
- 渗透测试
- 异地组网
- 远程办公和访问
- 开发和测试环境
- 物联网(IoT)设备管理
这些应用都需要解决一个核心问题:如何在NAT(网络地址转换)环境下实现内外网的通信。
NAT技术与网络穿透
IPv4地址的枯竭促使NAT技术的出现。NAT允许一个组织或ISP将一个公共IP地址映射到内部网络中的多个私有IP地址,从而节省公网IP资源。然而,这也带来了新的挑战:
- P2P(点对点)通信受阻
- 内网设备无法直接接收来自公网的主动连接
为了解决这些问题,出现了多种NAT穿越技术:
- 打洞技术(如WebRTC、STUN)
- 反向链接技术
- 应用层网关(ALG)技术
- 中间件技术
其中,STUN(Session Traversal Utilities for NAT)是一种常用的解决方案。它允许网络设备找出通信端点经NAT设备后的IP地址和端口,并利用这些信息在通信双方之间建立一条可以穿越NAT设备的数据通道,实现P2P通信。
NAT类型
在STUN标准中,根据私网IP地址和端口到NAT出口的公网IP地址和端口的映射方式,将NAT分为四种类型:
- 全锥形NAT(Full Cone NAT)
- 任何外部主机只要知道NAT的公共IP地址和端口,都可以通过这个地址和端口向内网主机发送数据。
- 支持程度:最高
- 穿透效果:非常容易
- 受限锥形NAT(Restricted Cone NAT)
- 只有先前从内网主机发送数据的外部主机可以通过NAT的公共IP地址和端口向内网主机发送数据。
- 支持程度:较高
- 穿透效果:相对容易
- 端口受限锥形NAT(Port Restricted Cone NAT)
- 只有先前从内网主机发送数据的外部主机的特定端口可以通过NAT的公共IP地址和端口向内网主机发送数据。
- 支持程度:中等
- 穿透效果:较难
- 对称NAT(Symmetric NAT)
- 对于每一个外部主机和端口的请求,NAT分配不同的映射公共端口。
- 支持程度:低
- 穿透效果:非常困难
端口转发技术详解
端口转发是网络穿透中最常用的技术之一,它允许将流量从一个IP地址和端口转发到另一个IP地址和端口。以下是几种常见的端口转发工具:
- SSH
- netsh(Windows)
- iptables
- nc
- lcx(已过时,易被杀毒软件当成病毒)
SSH端口转发
SSH(Secure Shell)不仅是一种常用的远程登录工具,还提供强大的端口转发功能。SSH端口转发能够将网络流量通过加密的SSH隧道进行重定向,从而提高网络通信的安全性和灵活性。
SSH端口转发的类型
SSH端口转发主要分为三种类型:
- 本地端口转发(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
:启用压缩。在数据传输过程中使用压缩,以减少传输的数据量。对慢速连接可能有帮助。图源: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 -L 123:farawayhost:456 remotehost
123
(绿色):在本地主机上监听的端口号。farawayhost
(橙色):远程主机可以访问的另一台主机。456
(紫色):在另一台主机上的目标端口号。remotehost
(棕色):远程主机的地址或名称。在本地主机(your host)上监听端口123。
当本地端口123接收到流量时(比如连接123端口),这些流量将通过SSH隧道转发到remotehost。
在remotehost上,这些流量会被转发到另一台主机(farawayhost)的端口456。不管本地转发还是远程转发,命令都是在your host上执行。
适用场景:在渗透测试中,如果拿下一台跳板机,跳板机可以访问内网,就可以构建本地到内网的访问。
- 远程端口转发(Remote Port Forwarding, RPF)
将远程主机上的一个端口绑定到SSH服务器上的一个本地端口。
其作用是将远程主机的请求通过SSH隧道转发到本地主机上的指定端口。
类似于网络代理中的反向代理。
这张图展示了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(例如,本地网络中的数据库服务器)。
适用场景:在渗透测试中,如果拿下一台跳板机,跳板机可以访问内网,就可以构建本地到内网的访问。这都是单端口的访问,没有代理网络的全端口访问方便。说到全端口访问就得是动态端口转发了。
- 动态端口转发(Dynamic Port Forwarding, DPF)
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端口转发
netsh是Windows系统自带的一个命令行工具,可以用来配置网络设置,包括端口转发。虽然文章中提到"算了,不介绍工具了,又成安全工具了",但netsh端口转发是一个实用的功能,值得简单介绍。
PortProxyGUI是netsh的图形化工具,使用起来更加直观。它允许用户通过图形界面进行端口转发的配置,而无需编写复杂的命令行。