Ubuntu 14.04 上 Docker 导致的 ping: sendmsg: Operation not permitted 问题 时间: 2021-04-05 00:16 分类: 服务器 ####前言 如果你使用的是`Ubuntu 14.04`内核,当你调整好了各种最大连接数之后,启动`Docker`想要快乐的玩耍时,可能会发现还是会有性能问题,并且不知所云。 ####问题 ``` ping google.com unknown host google.com ``` 首先,你会想到的是`DNS`问题?那我们再试试: ``` ping 8.8.8.8 ping: sendmsg: Operation not permitted ``` 外部服务器网络原因?`ping`下局域网其他机器: ``` ping 192.168.1.123 ping: sendmsg: Operation not permitted ``` 什么玩意儿?`ping`自己: ``` ping 127.0.0.1 ping: sendmsg: Operation not permitted ``` 到这里,你可能已经崩溃了。 最终对比下其他机器,唯一区别就是有没有运行`Docker`。 网上搜索了一下有人说这是`Ubuntu 14.04`的一个[内核BUG](https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1274320) 使用`dmesg`查看内核错误: ``` root@xwlcn ~ # dmesg|more [166738.148738] nf_conntrack: table full, dropping packet [166742.788998] net_ratelimit: 59 callbacks suppressed [166742.789001] nf_conntrack: table full, dropping packet [166742.813014] nf_conntrack: table full, dropping packet ... ``` 果不其然,大量的错误信息。 想想`Docker`的工作原理:`NAT`!这意味着iptables需要跟踪你的所有连接,从而了解完整的消息。 而你搜索`ping: sendmsg: Operation not permitted`问题,别人可能会让你检查`iptables`规则和ACCEPT / INPUT链,看看有没有耗时的内容,如果有的话就是`iptables`导致的,而`iptables`的问题链路显示的就是`Docker`创建的规则。 结合`dmesg`错误信息,我们要做的就是增加`nf_conntrack`的值,在`/etc/sysctl.conf`增加下面内容: ``` net.netfilter.nf_conntrack_generic_timeout = 120 net.netfilter.nf_conntrack_max = 888000 ``` 888000 的值根据自己的情况调整,最后`sysctl -p`应用生效。 好了,至此,你的`Docker`重启后就可以愉快的处理大量的连接了。 标签: 无