网络通信 频道

实战:不需公网IP架设OpenVPN网络

解决UDP穿越防火墙问题

    在能使用UDP成功打洞之前, 要先解决以下几个问题:

    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, 有通信两端交互的管道, 剩下的问题就是定一个简单的协议把这些真正的跑起来.
 

12
相关文章