nfqueue

所属分类:大数据
开发工具:Python
文件大小:0KB
下载次数:0
上传日期:2024-05-11 22:38:17
上 传 者sh-1993
说明:  解决FreeSWITCH外呼时通话中断的问题。经分析,发现中断原因是由于落地网关发送至FreeSWITCH服务器的200ok SIP数据包中的Contact值存在问题。为应对这一挑战,我们采用了一种创新的解决方案,即利用nfqueue队列对SIP数据包进行实时监控和修改。 解决方案的核心是编写一个Python脚本,该脚本在Ubuntu容器中运行,实时监听nfqueue队列。当脚本检测到200ok SIP数据包时,会根据预设条件对其中的Contact值进行必要的修改,以确保通话的连续性。修改完成后,数据包将被转发至SIP服务器,从而避免通话中断的问题。

文件列表:
Dockerfile
nfqueue_monitor.py
ubuntu.22.04.tar

### 问题场景 FreeSWITCH外呼时通话一分钟中断,经过查看抓包分析是落地网关发送到FreeSWITCH服务器的200ok数据包中的Contact值有问题 ### 解决方法 将FreeSWITCH收到的SIP数据包放到nfqueue队列里,写一个python脚本实时监听nfqueue队列,根据判断条件修改200ok里的Contact值,修改完成后,再转发到sip server服器上。 关于iptables的配置参见: https://asphaltt.github.io/post/iptables-nfqueue-usage/ https://www.hyuuhit.com/2018/07/13/nfqueue/ ### 实现方法 编写python脚本,在ubuntu容器中运行 ### 构建镜像 ```shell # 构建前先使用docker load加载镜像 docker load -i /home/nfqueue/ubuntu.22.04.tar # 打tag docker tag b2c9e106c9d9 ubuntu:20.04 # 构建 docker build -t nfqueue . ``` ### 运行容器 ```shell docker run -itd --name nfqueue_01 --net=host --restart=always --privileged=true -v /home/nfqueue/nfqueue_monitor.py:/opt/nfqueue_monitor.py -v /home/nfqueue/logs:/opt/logs nfqueue # 注:-v 主机目录:容器目录 映射情况 ``` ### iptables策略 ```shell iptables -A INPUT -p udp -m udp --dport 6660 -j NFQUEUE --queue-num 5080 --queue-bypass # 注:5080需要与python脚本中的一致 # --queue-bypass 如果没有用户空间程序侦听NFQUEUE上的数据包,则将要排队的所有数据包都将被丢弃;使用此选项时,NFQUEUE规则的行为类似于ACCEPT,数据包将移动到下一个表 ``` ### 查看queue队列 ```shell cat /proc/net/netfilter/nfnetlink_queue 40 23948 0 2 65531 0 0 106 1 # 队列号:由 --queue-number 指定 # 对端接口 ID:监听队列的 pid # 队列数量:当前在队列里等待的网络包数量 # 复制模式:0 和 1 只提供元数据;2 同时还会提供限定复制范围的部分网络包内容(a part of packet of size copy range)。 # 复制范围:放进消息里的网络包长度 # 队列丢包数量:因队列满了而丢包的网络包数量 # 用户丢包数量:因不能发送到用户态而丢包的网络包数量。如果该数值不为 0,尝试增大 netlink 缓存大小(increase netlink buffer size)。在程序侧,如果发生丢包,可以看到整数索引不连续了(see gap in packet id)。 # ID 序列:最后一个网络包的整数索引 # 1 ``` ### 将指定镜像保存为tar归档文件 ``` docker save [OPTIONS] IMAGE [IMAGE...] OPTIONS说明: -o: 输出到的文件 IMAGE: 镜像名称 或 镜像ID 如:docker save -o /tmp/aa.tar 4c42fc326802 ``` ### 导入并创建docker镜像 ``` docker load -i [docker镜像tar路径] 如:docker load -i /tmp/aa.tar # 导入成功以后,向新导入的镜像进行命名 docker tag [IMAGE ID] [REPOSITORY[:TAG]] 如:docker tag 35cdes freeswitch_ex:external ```

近期下载者

相关文件


收藏者