仕事でCentOS7でDockerを使うことがあってハマった。具体的にはコンテナから外部通信ができない。
$ # docker run --rm --network bridge -it centos:latest /bin/bash
[root@15b96c6afbda /]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
...
なんでだろうと思って、手癖でtcpdumpを打つと。
$ tcpdump -i docker0 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on docker0, link-type EN10MB (Ethernet), capture size 262144 bytes
17:25:09.820768 IP 192.168.0.2 > 8.8.8.8: ICMP echo request, id 16, seq 1, length 64
17:25:09.821863 ARP, Request who-has 192.168.0.2 tell 192.168.0.1, length 28
17:25:09.821874 ARP, Reply 192.168.0.2 is-at 02:42:c0:a8:00:02, length 28
17:25:09.821877 IP 8.8.8.8 > 192.168.0.2: ICMP echo reply, id 16, seq 1, length 64
経験からプロミスキャストモードのときだけパケットが転送されることを瞬時に理解したので、まず1ツイート
ifconfig docker0 promiscas
とか打てば、それはそれで通信できるんだけど、本来はこんなことやらなくてもいいはずなので、色々探していると、大体大事なことはsyslogに書いてあるんですね。
dockerd: time="2020-07-30T17:10:53.075020306+09:00" level=warning msg="Running modprobe bridge br_netfilter failed with message: modprobe: WARNING: Module br_netfilter not found.\ninsmod /lib/modules/3.10.0-327.el7.x86_64/kernel/net/llc/llc.ko \ninsmod /lib/modules/3.10.0-327.el7.x86_64/kernel/net/802/stp.ko \ninsmod /lib/modules/3.10.0-327.el7.x86_64/kernel/net/bridge/bridge.ko \n, error: exit status 1"
br_netfilterについては こちら のページが詳しいです。さて、このbr_netfilterなんでないのだと思って、調べると。
$ lsmod |grep br_netfilter
$
ないでおじゃる。
このあたり の情報を見る限り古いkernelには含まれていなさそう。
ELRepo から新しめのカーネルを持ってきて、万事解決。
今回の教訓としては CentOSでDocker使うのやめましょう いかなるときも思い込みであれこれやらないようにしましょうでした。