最近在学习 docker 下桥接网络的实现,容器之间可以 ping 通,但 ping 外网不通
想请教下大家该怎么配置呢?
拓扑图如下:
# 创建两个命名网络空间 $ ip netns add net1 $ ip netns add net2 # 创建两对 veth peer ,并分别将其中一端绑定到两个网络空间中 $ ip link add veth1 type veth peer name veth1_p $ ip link set veth1 netns net1 $ ip link add veth2 type veth peer name veth2_p $ ip link set veth2 netns net2 # 把网络空间中的 veth2 和 veth1 网卡设置 ip 并启用 $ ip netns exec net1 ip addr add 192.168.0.101/24 dev veth1 $ ip netns exec net1 ip link set veth1 up $ ip netns exec net2 ip addr add 192.168.0.102/24 dev veth2 $ ip netns exec net2 ip link set veth2 up # 创建一个 br0 网桥,并把 veth1 和 veth2 的对端接口绑定到网桥上,并启用 $ brctl addbr br0 $ ip link set dev veth1_p master br0 $ ip link set dev veth2_p master br0 $ ip link set veth1_p up $ ip link set veth2_p up $ ip link set br0 up # 在宿主机上添加一对新的 veth pair3 ,一段绑定在 br0 上,一段位于宿主机上 $ ip link add veth3 type veth peer name veth3_p $ ip link set dev veth3_p master br0 $ ip link set veth3_p up $ ip addr add 192.168.0.103/24 dev veth3 $ ip link set veth3 up # 把 net1 和 net2 看成两台拥有网卡的机器,它们通过 br0 网桥连接到一起,所以可以 ping 通 $ ip netns exec net1 ping 192.168.0.102 -I veth1 PING 192.168.0.102 (192.168.0.102) from 192.168.0.101 veth1: 56(84) bytes of data. 64 bytes from 192.168.0.102: icmp_seq=1 ttl=64 time=0.037 ms 64 bytes from 192.168.0.102: icmp_seq=2 ttl=64 time=0.008 ms # net1 、net2 和宿主机 3 台机器通过交换机 br0 连接在一起,可以互通 $ ip netns exec net1 ping 192.168.0.103 -I veth1 PING 192.168.0.103 (192.168.0.103) from 192.168.0.101 veth1: 56(84) bytes of data. 64 bytes from 192.168.0.103: icmp_seq=1 ttl=64 time=0.100 ms 64 bytes from 192.168.0.103: icmp_seq=2 ttl=64 time=0.084 ms
问题出在这,ping 外网 ping 不通,是因为手机作为一个路由器,没有对 192.168.0.0 网段的数据包做 SNAT 吗?
# 为 net1 配置默认网关 $ ip netns exec net1 route add default gw 192.168.0.103 # ping 百度服务器,ping 不通 $ ip netns exec net1 ping 110.242.68.66 -I veth1 # wlp1s0 网卡能收到 net1 发出的数据 $ tcpdump -vv -i wlp1s0 src host 192.168.0.101 tcpdump: listening on wlp1s0, link-type EN10MB (Ethernet), snapshot length 262144 bytes 16:22:06.427844 IP (tos 0x0, ttl 63, id 2941, offset 0, flags [DF], proto ICMP (1), length 84) 192.168.0.101 > 110.242.68.66: ICMP echo request, id 37009, seq 1, length 64 16:22:07.448181 IP (tos 0x0, ttl 63, id 3138, offset 0, flags [DF], proto ICMP (1), length 84) 192.168.0.101 > 110.242.68.66: ICMP echo request, id 37009, seq 2, length 64 # 本机路由 $ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.159.223 0.0.0.0 UG 600 0 0 wlp1s0 169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 wlp1s0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker_gwbridge 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 veth3 192.168.159.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp1s0 # 本机部分网卡 $ ip a 2: wlp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 5c:51:4f:10:22:9b brd ff:ff:ff:ff:ff:ff inet 192.168.159.201/24 brd 192.168.159.255 scope global dynamic noprefixroute wlp1s0 valid_lft 3519sec preferred_lft 3519sec inet6 240e:476:ff95:e0d4:3390:ff9f:b0d5:2798/64 scope global temporary dynamic valid_lft 3524sec preferred_lft 3524sec inet6 240e:476:ff95:e0d4:603e:8018:5b5c:5e53/64 scope global dynamic mngtmpaddr noprefixroute valid_lft 3524sec preferred_lft 3524sec inet6 fe80::6009:e9c:61a3:3c9d/64 scope link noprefixroute valid_lft forever preferred_lft forever 21: veth1_p@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP group default qlen 1000 link/ether 82:62:51:0d:17:15 brd ff:ff:ff:ff:ff:ff link-netns net1 inet6 fe80::8062:51ff:fe0d:1715/64 scope link valid_lft forever preferred_lft forever 23: veth2_p@if24: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP group default qlen 1000 link/ether 6e:fc:d0:ac:ba:84 brd ff:ff:ff:ff:ff:ff link-netns net2 inet6 fe80::6cfc:d0ff:feac:ba84/64 scope link valid_lft forever preferred_lft forever 25: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether ee:ba:bd:86:a2:48 brd ff:ff:ff:ff:ff:ff inet6 fe80::ecba:bdff:fe86:a248/64 scope link valid_lft forever preferred_lft forever 26: veth3_p@veth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP group default qlen 1000 link/ether 5e:ff:27:20:56:15 brd ff:ff:ff:ff:ff:ff inet6 fe80::5cff:27ff:fe20:5615/64 scope link valid_lft forever preferred_lft forever 27: veth3@veth3_p: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether d2:6a:18:98:1e:23 brd ff:ff:ff:ff:ff:ff inet 192.168.0.103/24 scope global veth3 valid_lft forever preferred_lft forever inet6 fe80::d06a:18ff:fe98:1e23/64 scope link valid_lft forever preferred_lft forever