具體見https://docs.docker.com/network/
先討論overlay, 近2天排查的是container之間的問題. 記錄一下經常使用的腳本和命令.
https://docs.docker.com/netwo...
下圖參考concept使用. 原圖來自於
https://cloud.tencent.com/info/dc89b384392e75a6c3614d2dee4088ad.html
但連接已失效.
html
網絡名字空間, 由linux kernel實現.
network namespace(網絡名字空間)是相互隔離的網絡視圖,每一個網絡名字空間都有獨立的網絡配置,好比:網絡設備、路由表等.
ip netns list 可列出network namespacelinux
虛擬網卡接口對.
連接不一樣network namespacedocker
跨機器通訊, 經過3層的udp協議, 模擬2層網絡.
docker container 也經過 veth pair 連接 container 和 overlay 的 network namespace.
全部的包都會發到br0網橋, 再經過vtep(VXLAN Tunnel End Point) 封包成udp協議發送至遠端主機, 就像在同一臺機器同樣.bash
cd /var/run &&sudo ln -s /var/run/docker/netns netns root@xxxxx:/home/xxxxx# ip netns list 9c91cd6debed (id: 6) 5a80a1c4887f (id: 13) eb26f4d5b623 (id: 9) 1f2110b87988 (id: 4) ...
#!/bin/bash all_netns=$(ip netns | awk {'print $1'}) declare -A mac_to_netns for one_netns in $all_netns do mac_addr=$(ip netns exec $one_netns ifconfig | grep "\beth1\b" | awk {'print $NF'}) # echo "mac1$mac_addr" if [ -n "$mac_addr" ]; then mac_to_netns[$mac_addr]=$one_netns fi done for container in $(docker ps --format '{{.Names}}'); do mac_addr=`docker exec $container cat /sys/class/net/eth1/address` # echo "$container: $mac_addr" if [ -n "$mac_addr" ]; then echo "$container:${mac_to_netns[$mac_addr]}" fi done
#!/bin/bash for container in $(docker ps --format '{{.Names}}'); do iflink=`docker exec -it $container bash -c 'cat /sys/class/net/eth*/iflink'` for net in $iflink;do net=`echo $net|tr -d '\r'` veth=`grep -l $net /sys/class/net/veth*/ifindex` veth=`echo $veth|sed -e 's;^.*net/\(.*\)/ifindex$;\1;'` if [ -n "$veth" ]; then echo $container:$veth fi done done
用上面腳本拿到container的namespace網絡
ip netns exec 0c9dbfeee12f tcpdump -i any host 192.168.xxx.xxx -w xx.cap
直接抓eth0, 能夠用udp, port 4789 篩選tcp
tcpdump -i eth0 host xxxx udp port 4789 -w xxx_vxlan.cap