那能不克不及把 conntrack 功能去掉落呢?比如解决筹划:
- iptables -I OUTPUT -t raw -p udp --sport 5060 -j CT --notrack
- iptables -I PREROUTING -t raw -p udp --dport 5060 -j CT --notrack
解决筹划
知道了问题的原因,解决筹划也就很轻易找到。
应用 TCP 协定
如不雅办事端和客户端应用 TCP 协定进行通信,它们之间的收集是正常的。
也就是说,经由过程设置 IP_PKTINFO socket 选项为 1,然后应用 recvmsg 和 sendmsg 传输数据就能包管源地址选择相符我们的期望。这也是 dnsmasq 应用的筹划,而出问题的应用是因为应用了默认的 recvfrom 和 sendto 。
- $ nc -l 56789
比来在工作中碰到一个 docker 容器下 UDP 协定收集不通的问题,困扰了良久,也比较有意思,所以想写下来和大年夜家分享。
监听在特定端口
应用 nc 启动一个 udp 办事器,监听在 eth0 上:
- ➜ ~ nc -ul 172.16.13.13 56789
nc 可以跟两个参数,分别代表 ip 和 端口,表示办事端监听在某个特定 ip 上。如不雅接收到的报文目标地址不是 172.16.13.13,也会被内核直接丢弃。
这种情况下,办事端和客户端也能正常通信。
修改应用法度榜样实现
比较下来,两者的不合有几点:
- 后者应用的是 ipv6,而前者是 ipv4
- 后者应用 recvfrom 和 sendto 传输数据,而前者是 sendmsg 和 recvmsg
- 前者有调用 setsockopt 设置 IP_PKTINFO 的值,而后者没有
修改应用法度榜样的逻辑,在 UDP socket 上设置 IP_PKTIFO ,并经由过程 recvmsg 和 sendmsg 函数传输数据。
【编辑推荐】
- 在Docker中运行MySQL:多主机收集下Docker Swarm模式的容器治理
- 搭建前端开辟情况——docker篇
- 使Docker搭建Java Web运行情况
- 在Docker中运行Java:为了防止掉败,你应当知道的
- 踩坑小结!喜马拉雅 FM 测试情况的 Docker 化实践
推荐阅读
【51CTO晃荡】8.26 带你与清华大年夜学、搜狗、京东大年夜咖们一路商量基于算法的IT运维实践 很不幸,你在本身的电脑里发清楚明了一个恶意的可履行法度榜样!那么问题来了:这个文件到底有>>>详细阅读
地址:http://www.17bianji.com/lsqh/36867.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示