环境: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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐