NAPT类型测试与XTCP点对点内网穿透适用例外--转载

版权声明:本文为CSDN博主「邓大帅」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/deng_xj/article/details/89187944

NAPT类型测试与XTCP点对点内网穿透适用例外

在内网穿透传输大量数据时如果都经过服务器中转的话,这样会对服务器端带宽压力比较大。

一种新的代理类型 XTCP 来解决这个问题,XTCP 模式下可以在传输大量数据时让流量不经过服务器中转。

由此,实现内外内网穿透有 点对点穿透 和 服务器中转穿透 两种不同途径。

然而,并不是所有网络环境下,都可以采用 点对点穿透 ,在了解 点对点穿透 前,需要先了解NAT分类。

一、 NAPT分类

根据Stun协议(RFC3489),NAPT大致分为下面四类:

(1) Full Cone(完全圆锥型)

从同一私网地址端口192.168.8.100:5000发至公网的所有请求都映射成同一个公网地址端口1.2.3.4:8000 ,192.168.8.100可以收到任意外部主机发到1.2.3.4:8000的数据报。

这种NAPT内部的机器A连接过外网机器C后,NAT会打开一个端口.然后外网的任何发到这个打开的端口的UDP数据报都可以到达A,不管是不是C发过来的。

例如:
A:192.168.8.100 ——NAT:1.2.3.4 ——C:292.88.88.88
[ok] C(292.88.88.88:2000) ——> NAT(1.2.3.4 : 8000) ——> A(192.168.8.100:5000)
[ok] C(292.88.88.88:3000) ——> NAT(1.2.3.4 : 8000) ——> A(192.168.8.100:5000)
[ok] D(292.99.99.99:3000) ——> NAT(1.2.3.4 : 8000) ——> A(192.168.8.100:5000)
任何发送到 NAT(202.100.100.100:8000) 的数据都可以到达 A(192.168.8.100:5000)

(2)Address Restricted Cone(地址限制圆锥型)

从同一私网地址端口192.168.8.100:5000发至公网的所有请求都映射成同一个公网地址端口1.2.3.4:8000,只有当内部主机192.168.8.100先给服务器C 292.88.88.88发送一个数据报后,192.168.8.100才能收到292.88.88.88发送到1.2.3.4 : 8000的数据报。

这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口,然后C可以用任何端口和A通信,其他的外网机器不行。

例如:
A:192.168.8.100 ——NAT:1.2.3.4 ——C:292.88.88.88
[ok] C(292.88.88.88:2000) ——> NAT(1.2.3.4 : 8000) ——> A(192.168.8.100:5000)
[ok] C(292.88.88.88:3000) ——> NAT(1.2.3.4 : 8000) ——> A(192.168.8.100:5000)
任何从C发送到 NAT(1.2.3.4:8000)的数据都可以到达A(192.168.8.100:5000)

(3)Port Restricted Cone(端口限制圆锥型)

从同一私网地址端口192.168.8.100:5000发至公网的所有请求都映射成同一个公网地址端口1.2.3.4:8000,只有当内部主机192.168.8.100先向外部主机地址端口292.88.88.88:2000 发送一个数据报后,192.168.8.100才能收到292.88.88.88:2000 发送到1.2.3.4:8000的数据报。

这种NAT内部的机器A连接过外网的机器C后,NAT打开一个端口,然后C可以用原来的端口和A通信,其他的外网机器不行。

例如:
A:192.168.8.100 ——NAT:1.2.3.4 ——C:292.88.88.88
[ok] C(292.88.88.88:2000) ——> NAT(1.2.3.4 : 8000) ——> A(192.168.8.100:5000)
C(202.88.88.88:2000)发送到 NAT(1.2.3.4:8000)的数据都可以到达A(192.168.8.100:5000)

以上三种NAT通称Cone NAT,我们只能用这种NAT进行UDP打洞。

(4)Symmetic

内网主机建立一个UDP socket(LocalIP,LocalPort),当用这个socket第一次发数据给外部主机1时,NAT为其映射一个(PublicIP-1,Port-1),以后内网主机发送给外部主机1的所有数据都是用这个(PublicIP-1,Port-1),如果内网主机同时用这个socket给外部主机2发送数据,第一次发送时,NAT会为其分配一个(PublicIP-2,Port-2), 以后内网主机发送给外部主机2的所有数据都是用这个(PublicIP-2,Port-2)。如果NAT有多于一个公网IP,则PublicIP-1和PublicIP-2可能不同,如果NAT只有一个公网IP,PublicIP-1和PublicIP-2只能相同,Port-1和Port-2就肯定不同,也就是说一定不能是PublicIP-1等于 PublicIP-2且Port-1等于Port-2。

如果任何外部主机想要发送数据给这个内网主机,那么它首先应该收到内网主机发给他的数据,然后才能往回发送,但对于这种NAT,不同于Cone NAT,在连接不同的外部目标,原来NAT打开的端口(Port)会变化,虽然可以用端口猜测,但是成功的概率很小,这种NAT无法实现UDP-P2P通信。

即在Symmetic环境下,无法适用点对点穿透,只能选择服务器中转穿透。

结论:

只要NAT类型不是 Symmetic ,就可以尝试使用 点对点穿透,以减缓服务器端带宽压力。

检测方法:

使用 NatTypeTester.exe ,点击 get ,即可检测完成。

下载链接:https://pan.baidu.com/s/1pm0TRD-m83iFvbnNnWgLEg
提取码:6529

 

二、点对点内网穿透

在传输大量数据时如果都经过服务器中转的话,这样会对服务器端带宽压力比较大。

FRP 提供了一种新的代理类型 XTCP 来解决这个问题,XTCP 模式下可以在传输大量数据时让流量不经过服务器中转。实现方式是在传输数据的两端都部署上 FRP 客户端上用于建立直接的连接。

首先在 FRP 服务端 配置上增加一个 UDP 端口用于支持该类型的客户端: bind_udp_port = 7001


 1 [common]
 2 bind_addr = 0.0.0.0
 3 bind_port = 7000            # 客户端与服务端进行通信的端口,即frp服务端口,需与客户端server_port一致
 4 privilege_token = 123456    # 特权模式密钥,需与客户端frpc.ini一致
 5 
 6 vhost_http_port = 8080      # http服务端口,开启后服务端完成通过域名访问部署于内网的 Web 服务部署,这里将 HTTP 访问端口设为 8080
 7 vhost_https_port = 443      # https服务端口
 8 
 9 dashboard_port = 7500       # 控制台端口 通过 Dashboard 可以方便的查看 FRP 的状态以及代理统计信息展示 通过 http://[server_addr]:7500 访问 Dashboard 界面,用户名密码默认都为 admin。
10 
11 bind_udp_port = 7001

其次配置 FRP 客户端,和常规 TCP 转发不同的是这里不需要指定远程端口。

修改前:


1 [common]
2 server_addr = your_server_ip
3 server_port = 7000
4 
5 [ssh]
6 type = tcp                  #连接协议 
7 local_ip = 127.0.0.1        #内网服务器ip
8 local_port = 22             #ssh默认端口
9 remote_port = 8000          #自定义的访问内部ssh端口号

修改后:


1 [common]
2 server_addr = your_server_ip
3 server_port = 7000
4 
5 [p2p_ssh]
6 type = xtcp
7 sk = abcdefg                # 只有 sk 一致的用户才能访问到此服务
8 local_ip = 127.0.0.1
9 local_port = 22

然后在要访问这个服务的机器上启动另外一个 FRP 客户端,配置如下:


 1 [common]
 2 server_addr = your_server_ip
 3 server_port = 7000
 4 
 5 [p2p_ssh_visitor]
 6 type = xtcp
 7 role = visitor              # XTCP 的访问者
 8 server_name = p2p_ssh       # 要访问的 XTCP 代理的名字
 9 sk = abcdefg
10 bind_addr = 127.0.0.1       # 绑定本地端口用于访问 ssh 服务
11 bind_port = 6006

这样就可以通过本机 6006 端口对内网机器 SSH 服务进行访问。

这里以SSH为例:

 

 

posted @ 2020-04-06 20:19  HiLuf  阅读(1394)  评论(0编辑  收藏  举报