Python写的nat穿透代理.
1 : http://code.google.com/p/natvpn/方法:
1, 确认通信双方所处NAT的类型, NAT可以大致的分成两类: 锥形NAT和对称NAT(关于NAT的详细分类可以参考RFC3489第5节, 那里分了4类, 前三类归为锥形NAT, 第4类为对称NAT). 做UDP穿透的一般原则是, 锥形NAT之间可以做UDP穿透, 而对称NAT不能, 事实上, 当一端为锥形一段为对称也是有可能的, 但这不能保证, 主要看对称NAT有没有规律可循.
如何确定自身的NAT类型呢? 可以利用STUN的客户端查看, 软件可以从这里获取:
Linux版: http://sourceforge.net/projects/stun/
Java版(适用各种操作系统): http://jstun.javawi.de/
这些软件很好使用, 比如Linux版的stun, 编译好后运行 ./client stun01.sipphone.com 即可. Java版则直接双击jar文件执行, 它会将结果记录在同目录的log文件里. 你只需要确认通信双方都不是对称NAT即可. 如果双方均为对称NAT那本文所描述的方法没有希望了. 如果查类型失败, 这可能的原因有两种:
a, 无法访问该STUN服务器, 你可以试试后面STUN列表中的其他服务器, 如果你是教育网用户且不能访问国外流量, 那么暂时没有办法用, 因为还没有找到国内的开放STUN服务器.
b, 你所在网络的防火墙把UDP禁了, 这种情况我见过, 很变态, 没有任何办法.
确认了两端NAT类型都不是对称NAT则继续往下看, 否则希望不大, 但也还有机会.
2, 通信建立前需要通信双方告知对方自己经NAT设备转换后的IP/PORT, IP/PORT也可以通过STUN服务器得到, 公网上有不少这种免费STUN服务, 只是国内的很少见.
前两个问题归结一下, 其实就是如何找到免费的STUN服务器, 下面的列表是我试过能用的, 但都在国外, 这对教育网用户不是个好消息, 国内的还在寻找中, 也希望有人能提供线索
stun01.sipphone.com
stun.ekiga.net
stun.fwdnet.net
stun.ideasip.com
stun.iptel.org
stun.rixtelecom.se
stun.schlund.de
stunserver.org
stun.softjoys.com
stun.voiparound.com
stun.voipbuster.com
stun.voipstunt.com
stun.voxgratia.org
stun.xten.com
3, 现在已经能知道自己经NAT映射后的真实地址了, 但如何才能告诉对方呢, 目前广泛使用的BT应用中实际上都有一个中介服务器, 但我们不会有, 否则的话我直接就拿它做VPN服务器了
解决这个问题有点麻烦, 在我的这个例子里是用的GMail做交互, 客户端注册一个GMail帐号, 服务端注册一个GMail帐号, 这样就有了一个速度很慢的管道, 但至少能完成通信了, 流程也就可以通了.
到了这里, 能查自己的IP/PORT, 有通信两端交互的管道, 剩下的问题就是定一个简单的协议把这些真正的跑起来.
如何建立UDP通道?
1, 客户端发起, 通过Mail告诉服务器客户端经NAT映射后的IP/PORT.
2, 服务端查询自己经NAT映射后的IP/PORT并将其通过邮件返回给客户端, 同时向客户端的UDP端口做打洞操作.
3, 客户端收到服务端的Mail后向服务端UDP端口发送数据, 这时服务端UDP端口应该能收到数据, 返回一条UDP信息给客户端, 标志通道建立成功.
4, 服务端启动OpenVPN, 客户端打开OpenVPN客户端, 通过刚才建立的通道即可建立VPN连接.
http://code.google.com/p/udponnat/
这个是代理
UDPonNAT Server端运行在主机C上,它等待来自指定UDPonNAT Client端的数据并将其转发到实际的UDP应用Server端口上
UDPonNAT Client端运行在主机H上,它从指定的端口等待UDP应用Client发出的数据包并将这些数据包穿透NAT设备转发给C上的UDPonNAT Server,我们这里的UDP应用Client是OpenVPN Client