环境:ubuntu 22.04
目的:模拟docker容器内访问外部网络实现(涉及iptables、route、veth-peer、bridge、ns以及docker)
veth veth0 bridge br_test 192.168.1.1/24
peer peer0 容器 eth1 192.168.1.3/24
1、起一个docker容器
docker run -d -i --name linux centos:latest /bin/bash
2、获取上方容器在宿主机的Pid
docker inspect linux | grep -w Pid
23368
3、创建veth-peer设备
ip link add veth0 type veth peer name peer0
4、将新建的veth-peer设备加到网桥和容器中
# 新建网桥br_test并配置ip 192.168.1.1/24
brctl addbr br_test
ip addr add 192.168.1.1/24 dev br_test
# 将veth0加入网桥br_test
ip link set dev veth0 master br_test
ip link set dev br_test up
ip link set dev veth0 up
# peer0配置加入容器(不要在宿主机上新建ns 23368,这里直接软链接后宿主机即可看到)
ln -s /proc/23368/ns/net /var/run/netns/23368
ip link set peer0 netns 572514
5、修改网卡名称,配置ip和路由(宿主机上进行)
ip netns exec 23368 ip link set dev peer0 name eth1
ip netns exec 23368 ip addr add 192.168.1.3/24 dev eth1
ip netns exec 23368 ip link set eth1 up
ip netns exec 23368 ip addr add default gw 192.168.1.1 eth1
# 核查路由
ip netns exec 23368 route -n
内核 IP 路由表
目标 网关 子网掩码 标志 跃点 引用 使用 接口
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth1
0.0.0.0 172.17.0.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
# 删除系统默认前往eth0的路由
ip netns exec 23368 route del -net 0.0.0.0/0 dev eth0
# 再核查路由
ip netns exec 23368 route -n
内核 IP 路由表
目标 网关 子网掩码 标志 跃点 引用 使用 接口
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth1
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
6、测试访问外网
ip netns exec 23368 ping 114.114.114.114
PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data.
64 bytes from 114.114.114.114: icmp_seq=1 ttl=127 time=10.6 ms
64 bytes from 114.114.114.114: icmp_seq=2 ttl=127 time=10.4 ms
^C
--- 114.114.114.114 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1003ms
rtt min/avg/max/mdev = 10.380/10.510/10.640/0.130 ms