环境说明

最近需要搭建一个内外网sip通信的环境,大概拓扑如下:

client1和SIP server都在内网,client2在外网,三者都经过防火墙做NAT,防火墙会开启ALG功能,内外网互相访问使用过NAT的公网IP,内网访问使用私网IP。

使用软件

  1. SIP server使用opensips
  2. client1 和client2使用eyeBeam和EasySip,对于不同sip客户端以后会具体说明

实现功能

  1. 内外网client之间能够正常打电话
  2. client1和client2之间的sip 通话控制连接由sever代理client1与client2实现,通话数据传输由client1和client2之间实现
  3. client1和client2之间的通话数据由RTP传输

环境配置

  1. 搭建opensips server + RTPproxy环境

opensips server搭建可以参考https://blog.csdn.net/smileyan9/article/details/86092036

rtpproxy 安装可以参考 https://blog.csdn.net/fg4215828/article/details/60869396

需要注意的是osipsconfig安装需要安装USE_NAT和ENABLE_TCP

安装过程有报错可以通过tail /var/log/messages查看

附使用的opensips.cfg的关键配置

alias=172.30.1.32listen=udp:10.226.6.1:5060
listen=tcp:10.226.6.1:5060####  NAT modules
loadmodule "nathelper.so"
modparam("nathelper", "natping_interval", 10)
modparam("nathelper", "ping_nated_only", 1)
modparam("nathelper", "sipping_bflag", "SIP_PING_FLAG")
modparam("nathelper", "sipping_from", "sip:pinger@10.226.6.1")
modparam("nathelper", "received_avp", "$avp(i:42)")loadmodule "rtpproxy.so"
modparam("rtpproxy", "rtpproxy_sock", "udp:10.226.6.1:12221")
loadmodule "proto_udp.so"
loadmodule "proto_tcp.so"
  1. 开启RTP
    rtpproxy -A 172.30.1.32 -l 10.226.6.1 -s udp:localhost:12221 -F
    rtpproxy -A 172.30.1.32 -l 10.226.6.1 -s udp:localhost:12222 -F

  2. opensips常用指令
    opensipsctl start/stop/restart 开启/关闭/重启服务
    opensipsctl ul show 查看online的用户
    opensipsctl ul rm [] 删除用户

[root@localhost ~]#  opensipsctl ul show
Domain:: location hash_size=512AOR:: 8002Contact:: sip:8002@10.128.18.30:61733;transport=udp Q=ContactID:: 417216284229585379Expires:: 271548Callid:: 83156025-0103-7252-b1df-bfb99aab6af8Cseq:: 31118User-agent:: JdMee/v1.0.58.550State:: CS_SYNCFlags:: 0Cflags:: NATSocket:: udp:10.226.6.1:5060Methods:: 7535AOR:: 8001Contact:: sip:8001@10.226.6.6:57098;transport=udp Q=ContactID:: 417427390462002824Expires:: 259073Callid:: 56e11dbe-af8e-2291-add8-ffccdede2435Cseq:: 2509User-agent:: JdMee/v1.0.58.550State:: CS_SYNCFlags:: 0Cflags:: NATSocket:: udp:10.226.6.1:5060Methods:: 7535
  1. client 1和client2能够注册到sip server

需要使用拨号的号码和密码,外网client注册的server ip是过NAT的公网IP,内网client注册使用server ip的私网IP
8001 为client1
8002 为client2
使用EasySIP

使用eyeBeam


需要注意的是本地实验环境在虚拟PC上,没有声卡,有些sip客户端需要声卡才能使用,拨通后会显示正在连接却没有RTP数据。
本地测试,用EasySip拨打,eyeBeam接收会有RTP数据。

实验结果

内呼外,client1拨打client2

实现过程

client1与server控制连接协商

INVITE报文携带message body,携带了client1的私网IP,以及client1进行数据通信的端口13328

200 OK携带message body,connection information为client2过NAT后的公网IP,以及client2进行数据通信的端口52344

client2与server控制连接协商
client2端抓包

INVITE报文携带message body,connection information为client1过NAT后的公网IP,以及client1进行数据通信的端口13328

200 OK携带message body,connection information为client2私网IP,以及client2进行数据通信的端口52344

client1端数据抓包

client2端数据抓包

可以看到client1和client2的数据连接在过防火墙之前都是私网IP,过防火墙后转换为各自的公网IP。数据RTP访问的就是对应200OK和INVITE报文中携带的公网IP和端口。

外呼内,client2拨打client1

实现过程:

client2端控制连接抓包

INVITE报文携带message body,携带了client2的私网IP,以及client2进行数据通信的端口17210

200 OK携带message body,connection information为client1过NAT后的公网IP,以及client1进行数据通信的端口53246

client1端控制连接抓包

INVITE报文携带message body,携带了client2过NAT后的公网IP,以及client2进行数据通信的端口17210

200 OK携带message body,connection information为client1私网IP,以及client1进行数据通信的端口53246

client1端数据抓包

client2端数据抓包

可以看到client1和client2的数据连接在过防火墙之前都是私网IP,过防火墙后转换为各自的公网IP。数据RTP访问的就是对应200OK和INVITE报文中携带的公网IP和端口。

这种环境影响因素很多,比如:受客户端影响,受防火墙ALG功能影响。
不同客户端对过NAT处理会不相同,本地测试遇到过,由于是双网卡PC,使用Blink客户端软件,控制连接正常,但是message body中带的ip不是自己网卡控制连接的ip,变成PC管理网卡的IP,导致传输数据从另外一块网卡出去了-_-!!!
不同防火墙ALG对SIP的处理不同,这个就不具体说了。

过NAT的SIP通信环境搭建相关推荐

  1. 1.Hadoop初步环境搭建(ssh无密码通信)

    一.初步环境搭建 1在Windows 7上安装VMware虚拟机(VMware-workstation-full-9.0.2),VMware Workstation下载地址: https://my.v ...

  2. Davinci DM6446 Codec Engine双核通信环境的搭建

    根据前几篇文章,一个DM6446的系统已经架构完成.但是有很多人都喜欢TI的机制,毕竟双核软件开发对很多工程师来说是非常麻烦的事情,既然TI提供开发套件和开发包,那么直接做OEM就可以了,底层的东西不 ...

  3. EC600 QuecPython开发环境搭建、固件下载,最方便的OpenCPU物联网4G通信解决方案

    EC600 QuecPython 官方资源汇总 开发环境搭建 1.安装windows驱动 2.验证模组的固件版本 3.烧录QuecPython固件 小试QuecPython 1.查看系统信息 2.点亮 ...

  4. VRP远程管理(华为设备telnet登录密码配置与测试环境搭建)——在物理机上创建回环网卡及eNSP模拟器与物理机实现连接通信

    目录 一.在网络连通的情况下,开启telnet服务 二.用户认证配置 1. 密码认证模式 2. aaa认证模式 三.eNSP模拟器telnet测试环境搭建 1.在物理机上创建回环网卡及IP地址配置 2 ...

  5. webrtc的DEMO环境搭建

    Webrtc 介绍与Demo环境搭建 一,webrtc的基本介绍 WebRTC是一个开源项目,提供简单的JavaScript接口以实现浏览器的实时通信(RTC).与普通的客户端与服务器之间的即时通信不 ...

  6. 基于docker的 Hyperledger Fabric 多机环境搭建(上)

    环境:ubuntu 16.04 Docker  17.04.0-ce go 1.7.4 consoul v0.8.0.4 ======================================= ...

  7. 嵌入式linux开发环境搭建——VirtualBox虚拟机网络环境解析

    嵌入式linux开发环境搭建--VirtualBox虚拟机网络环境解析 本博文转自:Pandoras Box http://blog.csdn.net/yxc135/article/details/8 ...

  8. LVS负载均衡群集部署之——NAT模式的介绍及搭建步骤

    文章目录 一.企业群集应用概述 1.1 群集的三种类型 1 负载均衡群集 2 高可用群集 3 高性能运算群集 1.2 负载均衡结构 1.3 负载均衡群集工作模式 (1) NAT模式--地址转换 (2) ...

  9. 大数据 -- Hadoop集群环境搭建

    首先我们来认识一下HDFS, HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.它其实是将一个大文件分成若干块保存在不同服务器的多个节点中.通过联网 ...

最新文章

  1. [C# Control] 仿RAR式进度条 (RarProgressBar)
  2. rockemq 发送延迟消息_RocketMQ系列(五)广播与延迟消息
  3. idea maven 出现:Try-with-resources are not supported at language level ‘5‘
  4. Myeclipse下Maven的配置
  5. 计算机技能测试题九,计算机技能培训后人人过关测试试题九
  6. 从一列数中筛除尽可能少的数使得从左往右看,这些数是从小到大再从大到小的(网易)。...
  7. 突破次元壁障,Python爬虫获取二次元女友
  8. python系列教程_python基础学习系列教程2-进阶之路中绕不开的知识点。
  9. 二叉树的递归与非递归
  10. 集成腾讯信鸽推送遇到的大坑
  11. 关于计算机的好处的英语作文,关于电脑好处的英语作文
  12. 自己的应用跳转到应用宝评分界面
  13. LabVIEW字符串中显示多种字体
  14. java 有意思面试题_一道有趣的Java面试题
  15. 计算机的发明是现代科学的奇迹之一翻译,2017年6月英语六级翻译每日一练:塑料旧法新用...
  16. 中国人最需要的“基础文明”有三项
  17. go go wagon! wagon go!
  18. 复杂的构造 有趣的原理
  19. 微表面模型GGX/Trowbridge-Reitz概率密度函数的推导
  20. 抖音小店无货源怎么发货?我们常用什么方法?具体怎么操作?

热门文章

  1. elasticsearch ik pingyin 分词器的安装和使用
  2. LKDHelper使用LKDBHelper以实体类对象进行数据库的操作,例如新建一个新闻实体类,以这个类来
  3. LaTex命令和环境的定义与重定义
  4. hse是什么意思的缩写_什么是HSE? HSE是什么?
  5. Windows下设置任意窗口总在最前面不被遮挡的方法
  6. 【图像识别】基于matlab实现步态周期检测与步态角度特征
  7. 运筹学知识:决策分析技术-乐观准则,悲观准则,后悔准则
  8. 学校等企事业单位通配符证书,通配符ov证书,泛域名ssl证书,ov通配符ssl证书
  9. java_TCP/UDP整合
  10. 西门子服务器提升抱闸信号不输出,西门子V90伺服调试工程师不可不知的一些事儿...