NAT类型发现

nat · 浏览次数 : 0

小编点评

本文介绍了一种基于STUN协议的NAT类型检测方法。与原有方案相比,该方法利用了STUN协议中的属性,如CHANGE-REQUEST、MAPPED-ADDRESS、RESPONSE-ADDRESS和CHANGED-ADDRESS等,并采用单台服务器进行实现。文章首先解释了STUN协议中的相关概念,然后详细描述了NAT类型发现的三个测试过程。最后,文章总结了整个发现流程。 1. **STUN协议中的属性**: - CHANGE-REQUEST:客户端用于请求服务器在响应时使用不同的源IP地址或端口。 - MAPPED-ADDRESS:服务器在响应中包含的客户端的源IP和端口信息。 - RESPONSE-ADDRESS:客户端用于指示服务器将响应发送到的地址和端口。 - CHANGED-ADDRESS:服务器在响应中包含的IP地址和端口,无论客户端是否设置了CHANGE-REQUEST中的标志位。 2. **NAT类型发现流程**: - 测试I:客户端发送请求到服务器,不设置CHANGE-REQUEST标志位,不携带RESPONSE-ADDRESS属性。 - 测试II:客户端发送请求到服务器,同时设置CHANGE-REQUEST的两个标志位。 - 测试III:客户端发送请求到服务器,仅设置CHANGE-REQUEST的“change port”标志位。 3. **流程分析**: - 如果测试I无响应,则客户端判断自己不在NAT之后,可能位于公网或完全锥形NAT之后。 - 如果测试II有响应,客户端判断自己可以访问互联网或位于完全锥形NAT之后。 - 如果测试II无响应,客户端判断自己位于NAT之后,可能是限制锥形NAT或端口限制锥形NAT。 - 测试III用于进一步确定NAT类型:收到响应则判断为限制锥形NAT,未收到响应则判断为端口限制锥形NAT。 总的来说,本文提出的NAT类型检测方法利用了STUN协议的现有属性,并通过简单的测试流程有效地确定了客户端的NAT类型,这种方法对于网络应用开发和管理具有实际应用价值。

正文

一、前言

之前一篇文章中,提出了一个判断NAT类型的方案。该方案是自己研究设计的,比较粗糙。近期研读了关于STUN的一些协议标准,其中RFC3489中就包含了判断NAT类型的标准方案。

与自己设计的方案相比,标准方案有以下优点:

1,利用了STUN协议中定义的一些属性,如CHANGE-REQUEST/MAPPED-ADDRESS/RESPONSE-ADDRESS/CHANGED-ADDRESS等;

2,使用单台服务器就可以完成(需要服务器上至少配置2个IP地址);

3,步骤更精简;

注意:RFC3489已被RFC5389废弃,且RFC5389也已被RFC8489废弃。在最新的STUN协议标准中,上面提到的属性都已被废弃。

下面介绍一下RFC3489中的NAT类型发现方案。

二、名词解释

首先介绍一下方案中用到的STUN协议中的一些属性。

CHANGE-REQUEST

此属性被客户端使用,请求服务器在发送响应时,使用不同的源IP地址或端口(与客户端请求的目的IP地址和端口不同)。此属性包含2个标志位:

“change IP”:指示服务器更换源IP

“change port”:指示服务器更换源端口

MAPPED-ADDRESS

此属性被包含在服务器的响应中,内容是服务器看到的客户端的源IP和端口信息(经过NAT映射后的)。

RESPONSE-ADDRESS

此属性由客户端使用,指示服务器应该将响应发往哪里。其内容包含地址和端口。

CHANGED-ADDRESS

此属性被包含在服务器的响应中,内容是IP地址和端口。其含义是若客户端在CHANGE-REQUEST中指定了任意的标志位后,服务器的响应将要使用的源IP和端口。

无论客户端是否设置了这些标志位,此属性总是被包含在响应中。

三、NAT类型发现流程

客户端执行3种测试来发现NAT类型。

测试I:

客户端发送一个请求给服务器。此请求中不设置CHANGE-REQUEST中的任何标志位,也不携带RESPONSE-ADDRESS属性。

测试II:

客户端发送一个请求给服务器。此请求中同时设置CHANGE-REQUEST中的两个标志位。

测试III:

客户端发送一个请求给服务器。此请求中设置CHANGE-REQUEST中的“change port”标志位。

客户端首先执行测试I

有以下几种情况:

1,没有收到响应;则客户端会立即知道它无法发起UDP连接;

2,收到响应,客户端检查MAPPED-ADDRESS属性;

  (1) 若属性中的地址和端口与发送请求时使用的一致,则客户端知道自己不在NAT之后。继续执行测试II

    ① 若收到响应,则客户端知道它可以访问互联网(或者,至少客户端位于行为类似完全锥形NAT的防火墙之后,且没有地址转换)。

    ② 若未收到响应,则客户端知道它位于对称UDP防火墙之后。

    上述2种情况,都可以认定客户端位于公网上。

  (2) 若不一致,则客户端知道它位于NAT之后。继续执行测试II。

    ① 若收到响应,则客户端知道它位于完全锥形NAT之后。------测试II中,服务器使用不同的源IP地址和端口进行响应,若能收到,则表面是完全锥形NAT,这种NAT不检查下行报文的源IP和端口。

    ② 若未收到响应,则客户端重复执行测试I,但使用不同的目的IP地址和端口(这些信息可以从首次执行测试I的响应中获取,包含在CHANGED-ADDRESS属性中)

      1) 若此次响应中包含的MAPPED-ADDRESS属性中的IP地址和端口和第一次时不一致,则客户端知道它位于对称NAT之后。

      2) 若两次结果一致,则客户端位于限制锥形NAT或端口限制锥形NAT之后。为了确定是哪一种NAT,需要执行测试III。

        执行测试III后,若收到响应,则客户端位于限制锥形NAT之后。

        执行测试III后,若未收到响应,则客户端位于端口限制锥形NAT之后。

上述过程的流程图总结如下:

IMG_256

 

与NAT类型发现相似的内容:

NAT类型发现

一、前言之前一篇文章中,提出了一个判断NAT类型的方案。该方案是自己研究设计的,比较粗糙。近期研读了关于STUN的一些协议标准,其中RFC3489中就包含了判断NAT类型的标准方案。与自己设计的方案相比,标准方案有以下优点:1,利用了STUN协议中定义的一些属性,如CHANGE-REQUEST/MA

[转帖]Linux conntrack模块,ip_conntrack 模块的作用

ip_conntrack 是Linux NAT一个跟踪连接条目的模块记录着允许的跟踪连接条目ip_conntrack 模块会记录 tcp 通讯协议的 established connection 记录, 而且预设 timeout 时间长达五天 (432,000 秒).所以局域网中当有人使用p2p类的

[转帖][译] NAT - 网络地址转换(2016)

http://arthurchiao.art/blog/nat-zh/ 译者序 本文翻译自 2016 年的一篇英文博客 NAT - Network Address Translation 。 由于译者水平有限,本文不免存在遗漏或错误之处。如有疑问,请查阅原文。 以下是译文。 译者序 1 绪论 2 网

[转帖]iptables的四表五链与NAT工作原理

本文主要介绍了iptables的基本工作原理和四表五链等基本概念以及NAT的工作原理。 1、iptables简介 我们先来看一下netfilter官网对iptables的描述: iptables is the userspace command line program used to config

VMware NAT 模式 虚拟机网络电缆被拔出,连不上网

检查服务 VMnetDHCP,VMware NAT Service 服务是否已启动,启动后可以正常使用网络

[转帖]LVS负载均衡的三种方式

1.VS-NAT(基于网络地址转换,network address translation ,NAT) VS-NAT是LVS最基本的方法,如果想要设置一个用于测试的LVS,这是一个最简单的方法。 当客户发出请求,lvs负载均衡中的director会将接受到的包的目标地址重写为某个real-serve

Firewall-cmd 启用NAT开放内网机器通过能上网的机器访问外网的方法

Firewall-cmd 启用NAT开放内网机器通过能上网的机器访问外网的方法 背景说明 昨天的处置已经可以让外部可以使用唯一的电信IP地址访问内部交换机的服务器了. 但是今天的场景是想让内网交换机的服务器通过能够上网的机器进行上外网的操作. 之前整理过很多通过apache后者是nginx的正方向代

四层负载均衡的NAT模型与DR模型推导

本文首先讲述四层负载均衡技术的特点,然后通过提问的方式推导出四层负载均衡器的NAT模型和DR模型的工作原理。通过本文可以了解到四层负载均衡的技术特点、NAT模型和DR模型的工作原理、以及NAT模型和DR模型的优缺点。

[转帖]CentOS 7 下用 firewall-cmd / iptables 实现 NAT 转发供内网服务器联网

https://www.cnblogs.com/hope250/p/8033818.html 自从用 HAProxy 对服务器做了负载均衡以后,感觉后端服务器真的没必要再配置并占用公网IP资源。而且由于托管服务器的公网 IP 资源是固定的,想上 Keepalived 的话,需要挤出来 3 个公网 I

NAPT网络结构下TCP/UDP/ICMP访问外网原理思考

背景 作为程序员,应该都听说过NAT(Network Address Transfer,网络地址转换)这一技术名词,并或多或少大概知道其原理与作用--NAT是用于解决IPv4地址不够用,保证我们能够在IPv6普及前依然可以正常使用互联网而广泛使用的一个技术,其原理正如其名称所示:其可以将私网IP通过