作家
登录

Docker容器网络下UDP协议的一个问题

作者: 来源: 2017-08-23 09:49:41 阅读 我要评论

那能不克不及把 conntrack 功能去掉落呢?比如解决筹划:

  1. iptables -I OUTPUT -t raw -p udp --sport 5060 -j CT --notrack 
  2. iptables -I PREROUTING -t raw -p udp --dport 5060 -j CT --notrack 

解决筹划

知道了问题的原因,解决筹划也就很轻易找到。

应用 TCP 协定

如不雅办事端和客户端应用 TCP 协定进行通信,它们之间的收集是正常的。

也就是说,经由过程设置 IP_PKTINFO socket 选项为 1,然后应用 recvmsg 和 sendmsg 传输数据就能包管源地址选择相符我们的期望。这也是 dnsmasq 应用的筹划,而出问题的应用是因为应用了默认的 recvfrom 和 sendto 。

  1. $ nc -l 56789 

比来在工作中碰到一个 docker 容器下 UDP 协定收集不通的问题,困扰了良久,也比较有意思,所以想写下来和大年夜家分享。

监听在特定端口

应用 nc 启动一个 udp 办事器,监听在 eth0 上:

  1. ➜ ~ 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 函数传输数据。

【编辑推荐】

  1. 在Docker中运行MySQL:多主机收集下Docker Swarm模式的容器治理
  2. 搭建前端开辟情况——docker篇
  3. 使Docker搭建Java Web运行情况
  4. 在Docker中运行Java:为了防止掉败,你应当知道的
  5. 踩坑小结!喜马拉雅 FM 测试情况的 Docker 化实践
【义务编辑:未丽燕 TEL:(010)68476606】

  推荐阅读

  如何确定恶意软件是否在自己的电脑中执行过?

【51CTO晃荡】8.26 带你与清华大年夜学、搜狗、京东大年夜咖们一路商量基于算法的IT运维实践 很不幸,你在本身的电脑里发清楚明了一个恶意的可履行法度榜样!那么问题来了:这个文件到底有>>>详细阅读


本文标题:Docker容器网络下UDP协议的一个问题

地址:http://www.17bianji.com/lsqh/36867.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)