UDP打洞实验

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介: 依云 posted @ 2 年前 in 网络 with tags python 网络 socat UDP , 7095 阅读 本文来自依云's Blog,转载请注明。 两台没有外网 IP、在 NAT 后边的主机如何直连?UDP打洞通常可行,但是需要第三方服务器。

 

依云 posted @  2 年前 in 网络 with tags python 网络 socat UDP , 7095 阅读

本文来自依云's Blog,转载请注明。

两台没有外网 IP、在 NAT 后边的主机如何直连?UDP打洞通常可行,但是需要第三方服务器。方法如下:

在服务器 S 上监听一个 UDP 端口,在收到 UDP 数据包后把源地址发回去。代码如下(github):

 
udpaddr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import sys
import time
import socket
 
def main(port):
   s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
   s.bind(('', port))
   try :
     while True :
       data, addr = s.recvfrom( 4096 )
       back = 'Your address is %r\n' % (addr,)
       s.sendto(back.encode(), addr)
       print (time.strftime( '%Y-%m-%d %H:%M:%S' ), addr, 'just sent us a message:' , data.decode( 'utf-8' , 'replace' ), end = '')
   except KeyboardInterrupt:
     print ()
 
if __name__ = = '__main__' :
   try :
     main( int (sys.argv[ 1 ]))
   except (ValueError, IndexError):
     sys.exit( 'which port to listen?' )

主机 A 发送数据包:

 
1
2
3
$ socat readline udp:xmpp.vim-cn.com:2727,sourceport=4567
my addr?
Your address is ( 'a.b.c.d' , 40060)

输入任意消息并回车,一个 UDP 就从本地的 4567 发送出去了。从上述示例我们可以看到,NAT 设备转发时是从 40060 端口发送出去的。为了让服务器返回的数据能够到达内网主机,在一段时间内,NAT 设备会记住外网来自 40060 端口的 UDP 数据包要发送给主机 a.b.c.d 的 4567 端口。完全圆锥型NAT不会在意外部数据包是从什么地方发回来的。受限圆锥型NAT会忽略掉其它主机的数据包,上例中只认可来自 xmpp.vim-cn.com 的数据包。端口受限圆锥型NAT更进一步地要求源端口(上例中是 2727)必须跟之前发出的数据包的目的端口一致。当然,「之前发出的数据包」不必是最后一个。所以,除了最后一种——对称NAT——之外,其它类型的NAT都是有可能成功穿透的。参见维基百科条目网络地址转换STUN

后来通过 pystun 程序,我得知我所处的 NAT 是完全圆锥型的。

在知道 A 的发送地址后,主机 B 就可以向这个地址发送数据了。接下来的操作使用 socat 命令就是:

 
1
2
3
4
# host A
$ socat readline udp-listen:4567
# host B
$ socat readline udp:A:4567

然后 B 先发送数据让 A 知道 B 的地址(socat 会 connect 到这个地址),双方就可以相互通信了。当然,因为是 UDP 协议,所以通信是不可靠的,丢包啊乱序啊都有可能。

2013年10月13日更新:想要连接到 NAT 后边的 mosh 请看这里

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
7月前
|
网络协议 程序员 定位技术
学习网络的第一步:全面解析OSI与TCP/IP模型
**网络基础知识概览:** 探索网络通信的关键模型——OSI七层模型和TCP/IP五层模型。OSI模型(物理、数据链路、网络、传输、会话、表示、应用层)提供理论框架,而TCP/IP模型(物理、数据链路、网络、传输、应用层)更为实际,合并了会话、表示和应用层。两者帮助理解数据在网络中的传输过程,为网络设计和管理提供理论支持。了解这些模型,如同在复杂的网络世界中持有了地图。
127 2
|
存储 网络协议 Linux
|
网络协议 Unix 关系型数据库
|
存储 网络协议
【网络篇】第七篇——网络套接字编程(三)(TCP详解)(二)
【网络篇】第七篇——网络套接字编程(三)(TCP详解)
【网络篇】第七篇——网络套接字编程(三)(TCP详解)(二)
|
网络协议 Linux
【网络篇】第七篇——网络套接字编程(三)(TCP详解)(一)
【网络篇】第七篇——网络套接字编程(三)(TCP详解)
【网络篇】第七篇——网络套接字编程(三)(TCP详解)(一)
|
网络协议 网络架构
第四章TCP/IP网络层设备路由器
路由是指路由器从一个接口上收到数据包,根据数据包的目的地址进行定向并转发到另一个 接口的过程,路由通常与桥接来对比,路由工作包含两个基本的动作,一是确定最佳路径, 二是通过网络传输信息,路由分为静态路由和动态路由和直连路由三种来源
382 0
第四章TCP/IP网络层设备路由器
|
网络协议 网络架构
计算机网络:IP、端口、网络通信协议、TCP/IP五层模型、字节序
计算机网络:IP、端口、网络通信协议、TCP/IP五层模型、字节序
159 0
计算机网络:IP、端口、网络通信协议、TCP/IP五层模型、字节序
|
运维 网络协议 Shell
第四章 TCP/IP 网络层设备路由器
学习TCP/IP网络层设备路由器
168 0
第四章 TCP/IP 网络层设备路由器

热门文章

最新文章