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为例: