公网用户接入NAT后面的freeswitch配置
大致网络示意和终端号码:
客户端侧: 终端号码(1019)终端IP(192.168.1.15)+ 网关(192.168.1.1) + 路由器公网IP(动态地址)
服务器侧: 防火墙(181.92.2.7)+ 负载(10.40.50.20X)+ FreeSWITCH(10.10.10.190)+ 终端号码(27909,本局域网内用户)
1. 公网的数据包怎么到达freeswitch?
需要在防火墙上配置转发规则:
信令转发:181.92.2.7: -> 10.10.10.190:
媒体端口转发:181.92.2.7:- -> 10.10.10.190:-
2. FreeSWITCH配置公网地址
配置文件:sip_profiles/internal.xml
配置项:ext-sip-ip和ext-rtp-ip
外部的地址有以下几种配置方式:
auto-nat //默认配置,由于我的外网路由器没有开启UPNP或者NAT-PMP协议,所以默认的配置不生效。
auto //使用内网地址,肯定不行。
stun:stun.freeswitch.org //能得到外网地址,但是不是实际使用的地址(可能是我的环境同时配置多个公网IP有关系),也PASS了。
181.92.2.7 //直接写上外部的服务IP,不灵活,但是可以用。
host:host.server.com //由于我本身就使用了域名,所以这个最合适。
最后配置成这个样子
<param name="ext-rtp-ip" value="host:cc-voip.xxx.com"/>
<param name="ext-sip-ip" value="host:cc-voip.xxx.com"/>
这个配置有什么用?
当FreeSWITCH识别出来呼叫的终端位于nat后面时,在构造SDP消息时,会“聪明”的加上ext-rtp-ip的配置值。
所以想和公网的终端通话,必须配置外部IP为公网的地址。
3. 客户端的公网地址
测试终端,软电话(linphone)。
本机地址:192.168.1.15,公网地址:动态未知
未知?
假设我这台装有软电话的笔记本在家里打电话,是一个公网地址。我拿到公司打电话,显然是另外一个公网地址。
4. 客户端的注册
找一个能ping通181.92.2.7的网络。填写注册地址cc-voip.xxx.com(注意:这是通过域名的方式,这涉及一个域用户的配置,可以单开一篇)
注册成功!!!
注册消息是怎么走的?
REGISTER (1019)192.168.1.15 -> 192.168.1.1(网关) -> 动态公网IP ->(公网路由节点)-> 181.92.2.7:5060 -> 10.40.50.203:15535 -> 10.10.10.190:5060
200 OK (1019)192.168.1.15 <- 192.168.1.1(网关) <- 动态公网IP <-(公网路由节点)<- 181.92.2.7:5060 <- 10.40.50.203:15535 <- 10.10.10.190:5060
5. 打电话试试?
入向拨号: 1019 -> 27909,振铃了,接通。看上去很美妙。但是没声音。
出向拨号: 27909 -> 1019,偶尔通,大部分时间不通。再进一步测试观察,哦,如果这个客户端刚注册上来,不超过1分钟,拨通的概率还是很大的。超过2分钟,就打不通了。当然了,即使拨通也没声音。
为什么出向拨号不通?
这就涉及到了一个常听的术语:UDP打洞。
客户端刚注册的时候,中途经过的各个转发设备都会临时启用一个新的端口(”打洞“)转发这条注册消息,并且保持这个新的端口一段时间(一般是120秒,各设备可以自己设定)。
保持的这段时间,所有转发地址的映射关系也存在。
例如上图注册消息路由示意图,出向拨号,FS记录1019的下一跳地址是10.40.50.203:15535;203记录15535端口映射的下一跳地址是181.92.2.7:5060,以此类推,直到INVITE消息送到192.168.1.15的地址上。
可是一旦过了端口保持的时期,这个15535端口就被释放掉了。但是FS记录的下一跳不变,悲剧了,再也无法出向拨号了。
这里又引出了另一个常用的术语:保活。
原理很简单,既然打洞只能存续一小段时间,那我就在这个洞消失之前,再发一条新的消息,刷新一下端口记录。比如120秒后释放,那我每隔100秒发一个注册消息,理论上这些个洞就会一直存在了。
这样就可以随时出向拨号了。
6. 没有声音怎么办?
先看看原因,抓包看SDP,啊哦,1019带的SDP地址竟然是192.168.1.15,FS往这个地址发语音包,1019肯定是收不到了。
这就需要使用各种NAT服务器了。
比如STUN、TURN、ICE(大致原理就是1019先去这些服务器查询一下自己的动态的公网IP,然后使用这些公网IP。具体细节自行百度)
比如我的1019客户端使用ICE服务器。再拨打一次电话,振铃了,接通,哎呀,能听到声音了!!!
再抓个包看SDP,1019带的SDP除了192.168.1.15,还带了一个公网转发地址,FS往公网地址发RTP包,这个公网再转发一下,没问题了啊。

附:
这是网络结构比较复杂的穿透情况。而且还有一些附带的问题。最好不要这么部署。
最简单的就是直接把FS部署到公网IP上。
再不济,也要把FS直接设置到公网IP后面,向我这种夹了一层私网的,真是难为FreeSWITCH了。
公网用户接入NAT后面的freeswitch配置的更多相关文章
- NAT后面的FTP SERVER终极篇
原文引用:http://blog.chinaunix.net/uid-20592805-id-1918661.html 如果对于被动模式还有不同的意见,我们可以再看下这篇文章: http://ww ...
- 用户登录拦截器查询到登录用户后如何将用户信息传递到后面的Controller
taotao创建订单代码中之前忘了加入用户信息,那么加上呢? 分析:用户创建订单的时候,我们会强制要求用户先登录,也就是说,创建订单的Controller执行时,一定是用户已经登录了的,而用户只要登录 ...
- Linux运维二:CentOS6.6系统安装后的基本配置与优化
CentOS6.6系统安装完成后还需要做一些配置与优化: 一:Linux内核版本号介绍 查看内核版本: [root@Gin scripts]# uname -r 2.6.32-504.el6.x86_ ...
- 配置文件后面的rc的由来
配置文件后面的rc的由来 配置文件比较正规的叫法是:运行控制文件 run control Linux就这个范儿 4.5.3 配置文件 配置文件比较文绉绉的称呼是“运行控制文件”,存放与具体程序相关的 ...
- wampserver安装后的基本配置
wampserver安装后的基本配置 1.WampServer的安装 下载好安装包后,你能在保存其文件夹中找到这样一个图标: 双击它,会弹出如下提示 提示信息:不要试图从Wamp5 1.x(x代表任意 ...
- Linux centos系统安装后的基本配置,Linux命令
一.centos系统安装后的基本配置 .常用软件安装 yum install -y bash-completion vim lrzsz wget expect net-tools nc nmap tr ...
- 铁通网络没有一个真实的公网IP,NAT转换能不能解决?
铁通网络没有一个真实的公网IP,NAT转换能不能解决? 我的是铁通宽带,现在想用自己的机子做一个动态主机,可是因为铁通垃圾网络的NAT转发问题,使用cn99qdns手动更新动态域名IP后公网能 ...
- linux(十二)___Apache服务器用户认证、虚拟主机的配置
创建xiangkejin zhangsan两个用户 可看见文件中创建的两个用户: 建立虚拟目录并配置用户认证 ①建立虚拟目录 /xiangkejin ②在Apache的主配置文件httpd.conf ...
- Django之用户上传文件的参数配置
Django之用户上传文件的参数配置 models.py文件 class Xxoo(models.Model): title = models.CharField(max_length=128) # ...
随机推荐
- 关于for in和for循环的遍历
今日看W3C的javascript教程,发现了这样的有趣的遍历方法. 第一是for in for (x in myArray) { document.write(myArray[x] + " ...
- 关于sendtoback()和bringtofront() 的理解
如下的代码: button2.Dock = DockStyle.Top; button1.SendToBack(); button1.Dock = DockStyle.Top; button3.Doc ...
- 顺利编译 binutiles-gcc-glibc
恩,前面一篇弃了,先知道怎么能成功,还有要避开哪些坑,然后再去仔细研究到底咋回事. 这里顺利编译 arm-lfs-linux-gnueabi , 参考了下面的资料: 1. <Linux From ...
- ES6 Generator async
Generator 函数是 ES6 提供的一种异步编程解决方案 async 函数使得异步操作变得更加方便,是 Generator 函数的语法糖. js单线程的原因是:避免DOM渲染冲突! 更新:201 ...
- SpringMVC学习笔记六:使用 hibernate-validator注解式数据校验
对客户端传过来的参数,在使用前一般需要进行校验. SpringMVC框架内置了Validator验证接口,但是实现起来太麻烦.我们一般使用 hibernate-validator进行数据校验. 1:j ...
- 写了一个简单的Linux Shell用来下载文件
#!/bin/sh ; i<; i=i+ )); do # 利用spider来探测请求的资源是否存在,并把请求的结果写入到一个文件 wget --spider --http-user=usern ...
- Jmeter-maven-plugin高级配置之选择测试脚本(转)
Posted on 2014 年 6 月 6 日 在pom.xml文件中可以指定运行哪些jmx脚本. 运行所有的测试脚本 Jmeter默认运行${project.base.directory}/src ...
- 对TCP连接被重置解决方案的探究
分类: 网络与安全 对TCP连接被重置解决方案的探究——跨过GFW通向自由网络的可行途径 2010年05月25日 星期二 上午 00:19 这个标题有点长——其实开始只想写破折号之前的部分,因为这种技 ...
- Struts1与Struts2的那些事
一.概述 Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的全部请求.Struts1框架有3个重要组成部分:Action.ActionForm和Act ...
- 【win7 + win server 2008】设置定时任务,设置.bat 文件去执行php脚本 == 用来配合爬虫程序简直不要太爽
Windows Server 2008中使用计划任务定时执行BAT bat进行PHP脚本的执行 一.首先进行任务管理器设置 每隔1分钟执行.BAT 文件配置 首先Windows Server 200 ...