双网卡实现网络隔离
大约 2 分钟
创建docker容器然后分配两张不同网段的网卡,验证网络隔离环境
一、环境准备
二、创建1个容器分配2张网卡
- 容器创建
$ docker run --net=none -itd --name busybox-test busybox
$ docker exec busybox-test ip a
- 创建网桥br1并且分配网卡eth1
$ yum install bridge-utils
$ brctl show
$ brctl addbr br1
$ ip link add veth1 type veth peer name veth2
$ brctl addif br1 veth1
$ ip link set veth1 up
# 获取docker容器内部的网络命名空间net namespace
# docker inspect -f '{{.State.Pid}}' <container_name>
$ proc_id=$(docker inspect -f '{{.State.Pid}}' busybox-test)
# 将容器进程内部namespace链接到宿主机的namespace
$ local_namespace_name=123456789
$ ln -s /proc/$proc_id/ns/net /var/run/netns/$local_namespace_name
# 将对端网卡插入docker容器命名空间之中
$ ip link set veth2 netns $local_namespace_name
# 重命名容器内部的网卡
$ ip netns exec $local_namespace_name ip link set dev veth2 name eth1
# 启用
$ ip netns exec $local_namespace_name ip link set eth1 up
# 分配ip
$ ip netns exec $local_namespace_name ip addr add 10.1.1.5/24 dev eth1
# 添加网关
$ ip netns exec $local_namespace_name ip route add default via 10.1.1.1
# 启动网桥br1并且分配ip以及子网掩码
$ ip addr add 10.1.1.1/24 dev br1
$ ip link set br1 up
- 创建网桥br2并且分配网卡eth2
$ brctl show
$ brctl addbr br2
$ ip link add veth3 type veth peer name veth4
$ brctl addif br2 veth3
$ ip link set veth3 up
# get docker container net namespace
$ proc_id=$(docker inspect -f '{{.State.Pid}}' busybox-test)
# net namespace link to local host
$ local_namespace_name=123456789
# 将对端网卡插入docker容器命名空间之中
$ ip link set veth4 netns $local_namespace_name
# 重命名容器内部的网卡
$ ip netns exec $local_namespace_name ip link set dev veth4 name eth2
# 启用
$ ip netns exec $local_namespace_name ip link set eth2 up
# 分配ip
$ ip netns exec $local_namespace_name ip addr add 173.8.8.9/24 dev eth2
# 启动网桥br1并且分配ip以及子网掩码
$ ip addr add 173.8.8.1/24 dev br2
$ ip link set br2 up
三、容器内监听不同的网卡
# nc -l -p <监听端口> -s <指定网卡名称>
# nc 监听TCP端口
$ docker exec busybox-test nc -l -p 9090 -s 10.1.1.5
# tcp端口发送数据包
$ echo "hello" | nc 10.1.1.5 9090
# nc -l -p <监听端口> -s <指定网卡名称>
$ docker exec busybox-test nc -l -p 8080 -s 173.8.8.9
$ echo "world" | nc 173.8.8.9 8080
Q&A
- nc监听UDP端口和发送数据
# 将字符串"Hello, world!"通过UDP协议传输到本地IP地址为127.0.0.1,端口号为12345的主机上
$ echo "Hello, world!" | sudo nc -u 127.0.0.1 12345
# 以UDP协议侦听端口号为12345的数据流量
$ nc -u -l 12345
- docker的网络命名空间
# 将网卡插入到net namespace就是docker容器内部网络网卡
$ proc_id=$(docker inspect -f '{{.State.Pid}}' busybox-test)
$ ls /proc/$proc_id/ns/net