莞城建设小学网站,怎么做彩票平台网站,华蓥住房和城乡建设厅网站,seo网站排名优化快速排目录 一、参考资料二、upnp基本概念三、miniupnpd3.1参数说明3.1.1 config upnp 的配置参数表3.1.2 config perm_rule 许可设置配置参数表 3.2 windows上使用miniupnpc工具3.3 关于开启upnp功能后无法添加端口 四、其它知识补充4.1 NAT4.1.1 NAT概念4.1.2 NAT的分类 4.2 NAT穿透… 目录 一、参考资料二、upnp基本概念三、miniupnpd3.1参数说明3.1.1 config upnp 的配置参数表3.1.2 config perm_rule 许可设置配置参数表 3.2 windows上使用miniupnpc工具3.3 关于开启upnp功能后无法添加端口 四、其它知识补充4.1 NAT4.1.1 NAT概念4.1.2 NAT的分类 4.2 NAT穿透4.2.1 STUN4.2.2 TURN4.2.2.1 TURN协议出现的目的解决对称NAT无法穿越的问题4.2.2.2 TURN协议与STUN/RFC5389协议的关系 一、参考资料
通用即插即用UPnP互联网网关设备-端口控制协议互通功能IGD-PCP IWF UPnP基本原理以及在NAT中的应用 openwrt - UPnPUniversal Plug and Play通用即插即用 比特币源码分析–端口映射 miniupnpd最新版 NAT-PMP 和 UPnP 都无法使用 miniupnpd config OpenWrt WIKI miniupnpd
二、upnp基本概念
UPNP意为通用即插即用协议是由微软提出的一种NAT穿透技术。使用UPNP需要内网主机、网关和应用程序都支持UPNP技术。
UPnP全名是Universal Plug and PlayUPnP 最大的愿景就是希望任何设备只要一接上网络所有在网络上的设备马上就能知道有新设备加入这些设备彼此之间能互相沟通更能直接使用或控制它一切都不需要设定完全的Plug and Play 。
UPNP通过网关映射请求可以动态的为客户分配映射表项而NAT网关只需要执行地址和端口的转换。UPNP客户端发送到公网侧的信令或者控制消息中会包含映射之后公网IP和端口接收端根据这些信息就可以建立起P2P连接。
UPNP开启后能方便智能监控设备直接透传到因特网无需做烦琐的映射端口设置。UPNP开启后能方便智能网络存储设备与因特网进行数据传输节省手动设置时间。UPNP开启后能方便在因特网使用ERP、CRM、第三方远程桌面等软件。UPNP开启后能提高AnyChat系统的P2P成功率节省服务器的带宽。
UPnP是一种对等即插即用网络协议主要用于视频音频领域的传输协议对使用者来说打开UPnP之后可以增加迅雷等下载软件的下载速度。
三、miniupnpd
3.1参数说明
3.1.1 config upnp 的配置参数表
键值是否必须设置说明enable_natpmp1是开启 NAT-PMP 支持1 表示开启enable_upnp1是开启 UPnP 支持1 表示开启secure_mode1是安全模式客户端只能给自己转发一个输入口log_output0是日志输出级别0表示不输出日志如果设置了将输出到syslog中download数字是允许来自wan口的数据输入带宽单位是(KB/秒)。upload数字是允许输出到wan口的数据输入带宽单位是(KB/秒)。external_iface字符串是外网的设备域默认是waninternal_iface字符串是内网的设备域默认是lanport数字是监听的端口upnp_lease_file文件名是upnp客户端租用记录文件
3.1.2 config perm_rule 许可设置配置参数表
键值是否必须设置说明action字符串是设置是否许可allow 许可deny 不许可ext_ports字符串是外部端口范围int_addr字符串是ip 地址如果 0.0.0.0/0 表示全部int_ports字符串是内部端口范围
3.2 windows上使用miniupnpc工具
下载地址 MiniUPnP Project
选择win免安装包下载好就可以用了将其路径配置到环境变量就可以用了。
列出已有连接
upnpc-shared.exe -l
增加一条规则
upnpc-shared.exe -a 192.168.1.98 4444 8888 TCP其它相关规则使用-h查看使用3.3 关于开启upnp功能后无法添加端口
问题背景 upnpc-shared.exe -l查询或者upnpc-shared.exe -a 使用上述命令都提示失败主要看提示是wan口的IP事内网IP然后看打印也是提示私有IP。 可以看到源代码里getifaddr.c会检测私有IP和一些特殊IP如果是那么就无法成功配置相关规则。 RFC1918规范里规定了3个保留地址段10.0.0.0-10.255.255.255172.16.0.0-172.31.255.255192.168.0.0-192.168.255.255这三个范围分别处于A、B、C类的地址段专门用于组织或者企业内部使用不需要进行申请。和公有IP地址相比这些私有IP地址只在企业内部使用不能作为全球路由地址出了企业或组织的管理范围这类私有地址就不在有任何意义。注意任何一个组织都可以在内部使用这些私有地址因此两个不同网络中存在相同IP地址的情况是很可能出现的但是同一个网络中不允许两台主机拥有相同IP地址否则将发生地址冲突。 有两种方法可以暂时解决 方式一修改配置文件 1修改/etc/config/upnpd新增下面两行配置
option use_stun 1
option stun_host stun.qq.com #任意公网地址会自动转换为公网IP2或者直接配置一个任意公网IP就可以成功转发。
option external_ip 随意一个公网IP方式二直接修改上级路由器lan口地址 如下我修改上级lan地址为172.0.0.1最终能够成功配置下去。
查询miniupnpd的防火墙规则
iptables -t nat -nvL MINIUPNPD总结上述问题主要出现在miniupnpd版本2.2及以后版本2.0和2.1都不会去检测。
#查询版本信息
opkg list-installed | grep miniupnpd四、其它知识补充
4.1 NAT
4.1.1 NAT概念
NAT全称是Network Address Translation翻译过来就是网络地址转换。 (1) 有了NAT以后内网的主机不在需要申请公网IP地址只需要将内网主机地址和端口通过NAT映射到网络出口的公网IP即可然后通信的两端在无感知的情况下进行通信。这也是为什么前文说NAT挽救了IPV4因为大量的内网主机有了NAT只需要很少的公网地址做映射就可以了如此就可以节约出很多的IPV4地址空间。
(2) 当在私网网络出口处部署了NAT网关以后只能由内网主机发起到外网主机的连接外网主机无法主动发起连接到内网。这样虽然对外隔离了内网主机但同时又限制了P2P的通信这也是NAT带来的一大弊端。
4.1.2 NAT的分类
(1) 一对一NAT
就是一个内网主机对应一个公有IP。这种类型的NAT对于节省IP地址没什么意义。
(2) 一对多NAT
内网的多个主机都映射到同一个公有IP地址上。但是这里就有前文提到的那个面试问题当内网有多台主机都请求同一服务器时如果仅仅是替换地址从返回信息是无法确认该将响应转发到哪一台主机的。此时还需要NAT根据传输层信息或者上层协议区分不同的会话把不同的会话映射到公网IP不同的传输层端口上(NAPT)。
按照端口映射的方式分类1对多的NAT又可以细分为4种 (1) 全锥型NAT 假设内网设备192.168.0.1:80向svr1发起请求内网地址在NAT网关被映射为公网地址和端口192.169.0.1:8080在全锥形模式下一旦连接成功后外网所有主机发送到192.169.0.1:8080的数据都将被NAT网关转发到内网192.168.0.180设备上。 (2) 限制锥型NAT: 假设内网设备192.168.0.180成功连接了svr1内网设备的地址和端口在NAT网关被映射为192.169.0.18080在限制锥形模式下只有外网设备向svr1发送过数据之后从svr1的任意端口发送到192.169.0.18080的数据都会被网关转发给内网设备192.168.0.180但是外网其他设备图中的svr2发送到192.169.0.18080的数据将不会被转发。 (3) 端口限制锥形NAT
与限制锥形NAT相比端口限制锥形NAT更加严格 假设内网设备192.168.0.1:80向外网svr1的80端口建立连接并发送数据其内网地址和端口在NAT网关被映射为192.169.0.18080在端口限制锥形模式下只有svr1的80端口发送到网关192.169.0.18080的数据才会被转发到内网设备192.168.0.180svr1的其他端口或者外网其他主机发送到192.168.0.18080的数据均不会抓发到内网设备。 (4)对称型NAT 对于来自同一个内部IP地址和端口的所有数据包只要目标端口相同NAT网关会将它们映射到同一个外部端口。但是如果目标端口不同NAT网关会将它们映射到不同的外部端口。与限制锥型NAT不同的是当其他主机向这个已经被映射过的外部端口发送数据包时NAT网关会将其路由到该主机。 4.2 NAT穿透
P2P学习三网络传输基本知识—STUN协议一
4.2.1 STUN
RFC STUN规范中实际上有两套STUN规范
规范一RFC3489 STUN的全称是Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs)(Simple Tranversal of UDP through NAT)即穿越NAT的简单UDP传输是一个轻量级的协议允许应用程序发现自己和公网之间的中间件类型同时也能允许应用程序发现自己被NAT分配的公网IP。 它就是将STUN定义成简单的通过UDP进行NAT穿越的一套规范也就是告诉你如何一步一步通过UDP进行穿越但是这套规范在穿越的过程中还是存在很多问题尤其是现在的网络路由器对UDP的限制比较多有的路由器甚至不允许进行UDP传输所以这就导致了我们通RFC3489这套规范进行NAT穿越的时候它的失败率会非常高。 所以为了解决这个问题又定义了另一套标准RFC5389.
规范二RFC5389 在RFC5389中STUN的全称为Session Traversal Utilities for NAT即NAT环境下的会话传输工具是一种处理NAT传输的协议但主要作为一个工具来服务于其他协议。 和STUN/RFC3489类似可以被终端用来发现其公网IP和端口同时可以检测端点间的连接性也可以作为一种保活keep-alive协议来维持NAT的绑定。 和RFC3489最大的不同点在于STUN本身不再是一个完整的NAT传输解决方案而是在NAT传输环境中作为一个辅助的解决方法同时也增加了TCP的支持。 RFC5389废弃了RFC3489因此后者通常称为classic STUN但依旧是后向兼容的。而完整的NAT传输解决方案则使用STUN的工具性质ICE就是一个基于offer/answer方法的完整NAT传输方案如SIP。 RFC5389是在RFC3489的基础上又增加了一些功能但是它对整个STUN的描述就不一样了, 它是把STUN描述成一系列穿越NAT的工具所以都叫STUN但是他们的含义完全就不一样了。RFC5389在UDP尝试可能失败的情况下尝试使用TCP也就是说RFC5389是包括UDP和TCP的两种协议进行NAT穿越的这是两套规范最本质的区别。当然在协议的具体内容上包括协议头还有协议体中的属性都有很多的变化但是那些都不是最关键的最关键的是RFC5389里面将TCP纳入进来。你可以通过TCP进行穿越。 4.2.2 TURN TURN的全称为Traversal Using Relays around NAT是STUN/RFC5389的一个拓展主要添加了Relay中继功能。 那么在特定的情景下有可能使得终端无法和其对等端peer进行直接的通信这时就需要公网的服务器作为一个中继对来往的数据进行转发。 这个转发的协议就被定义为TURN。TURN和其他中继协议的不同之处在于它允许客户端使用同一个中继地址relay address与多个不同的peer进行通信。 使用TURN协议的客户端必须能够通过中继地址和对等端进行通讯并且能够得知每个peer的的IP地址和端口确切地说应该是peer的服务器反射地址。 4.2.2.1 TURN协议出现的目的解决对称NAT无法穿越的问题
在之前我们介绍过NAT的四种类型(完全锥型NAT (Full Cone NAT)、地址限制锥型NAT(Address Restricted Cone NAT)、端口限制锥型NAT (Port Restricted Cone NAT)、对称型NAT (Symmetric NAT))。 当我们检测到一端是端口受限锥型一端是对称型或者两端都是对称型那肯定是无法穿越的
在NAT无法穿越的时候我们如何才能保证业务的运行呢 那这个时候就要引入TURN协议TURN协议实际上就是在服务端架设一个TURN服务客户端在发送数据的时候无法NAT穿越的时候将这个媒体流数据首先传给TURN服务通过URN的中介然后转给其他的接收者或者其他接收者也可以发送数据给这个TURN服务TURN在转给client端。这就是TURN 出现的目的。
4.2.2.2 TURN协议与STUN/RFC5389协议的关系
其建立在STUN/RFC5389之上消息格式使用STUN格式消息; 那TURN协议就是建立在STUN协议之上的它的协议头和body几乎是一样的只是里面的一些属性和内容不一样外壳形式什么的都是一样的所以很多服务器都是将STUN协议和TURN协议放在一起形成了一个服务器就是既提供STUN的功能又提供TURN的功能 。
TURN Client要求服务端分配一个公共IP和Port用于接收或发送数据 实际上在进行TURN协议的时候我们应该将它分成两类一类是TURN Client一类是服务端这与我们之前介绍的STUN是一样的就是客户端服务器模式。
那如何在这个TURN服务器上提供这种中继服务呢 首先要TURN Client向TURN 服务端发送一个请求发送了请求之后就就在服务端根据这个请求建立一个公共的IP地址和端口用户接收和发送数据 。 那么对端TURN client想要通讯的对端其实是不需要是一个TURN Client端的它只需要正常的发送UDP包就可以,