准备工作 CentOS7
网卡eth0
(192.168.0.3/24)
在 Linux 中,网络名字空间可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络名字空间经常用来隔离网络设备和服务,只有拥有同样网络名字空间的设备,才能看到彼此。
从逻辑上说,网络命名空间是网络栈的副本,有自己的网络设备、路由选择表、邻接表、Netfilter表、网络套接字、网络procfs条目、网络sysfs条目和其他网络资源。
从系统的角度来看,当通过clone()系统调用创建新进程时,传递标志CLONE_NEWNET将在新进程中创建一个全新的网络命名空间。
从用户的角度来看,我们只需使用工具ip来创建一个新的持久网络命名空间。
# 创建网络命名空间
ip netns add ns1
# 查看网络命名空间
ip netns list
# 删除网络命名空间
ip netns delete ns1
tap/tun
TAP/TUN设备是一种让用户态程序向内核协议栈注入数据的设备,TAP等同于一个以太网设备,工作在二层;而TUN则是一个虚拟点对点设备,工作在三层。
# 创建tap/tun
ip tuntap add dev tap0 mod tap
ip tuntap add dev tun0 mod tun
# 删除tap/tun
ip tuntap del dev tap0 mod tap
ip tuntap del dev tun0 mod tun
veth pair
veth设备总是成对出现,也叫veth pair,一端发送的数据会由另外一端接收。
# 创建veth
ip link add veth type veth peer name veth-peer
# 删除veth,删除其中一个veth pair都会删除
ip link del veth
bridge
bridge,是Linux提供的一种虚拟网络设备之一。其工作方式非常类似于物理的网络交换机设备。Linux Bridge可以工作在二层,也可以工作在三层,默认工作在二层。工作在二层时,可以在同一网络的不同主机间转发以太网报文;一旦你给一个Linux Bridge分配了IP地址,也就开启了该Bridge的三层工作模式。网桥的简单命令如下。
# 创建网桥br1
ip link add br0 type bridge
# 删除网桥br1
ip link del br0
# 将eth0端口加入网桥br0
ip link set dev eth0 master br0
# 从网桥br1中删除eth0
ip link set dev eth0 nomaster
vlan
VLAN的基本原理是在二层协议里插入额外的VLAN协议数据(例如,VLAN Tag)对物理上相互连接的设备进行逻辑网络切割,同时保持和传统二层设备的兼容性。Linux里的VLAN设备是对IEEE 802.1.q 协议的一种内部软件实现,模拟现实世界中的 802.1.q 交换机。vlan的简单命令如下。
# 以太网接口 eth0 中创建名为 VLAN1、ID 为1 的 802.1Q VLAN 接口
ip link add link eth0 name eth0.1 type vlan id 1
# 删除vlan
ip link delete eth0.1
veth连接主机和namespace
# 创建 namespace
ip netns add ns1
ip netns add ns2
# 创建一对 veth-pair veth0 veth1
ip link add veth0 type veth peer name veth1
# 将 veth0 veth1 分别加入两个 ns
ip link set veth0 netns ns1
ip link set veth1 netns ns2
# 给两个 veth0 veth1 配上 IP 并启用
ip netns exec ns1 ip addr add 10.0.0.2/24 dev veth0
ip netns exec ns1 ip link set veth0 up
ip netns exec ns2 ip addr add 10.0.0.3/24 dev veth1
ip netns exec ns2 ip link set veth1 up
执行ping,查看结果
ip netns exec ns1 ping 10.0.0.3
ip netns exec ns2 ping 10.0.0.2
bridge连接namespace
# 首先创建 bridge br0
ip link add br0 type bridge
ip link set br0 up
# 然后创建两对 veth-pair
ip link add br-veth0 type veth peer name br-veth0-peer
ip link add br-veth1 type veth peer name br-veth1-peer
# 分别将两对 veth-pair 加入两个 ns 和 br0
ip link set br-veth0 netns ns1
ip link set br-veth0-peer master br0
ip link set br-veth0-peer up
ip link set br-veth1 netns ns2
ip link set br-veth1-peer master br0
ip link set br-veth1-peer up
# 给两个 ns 中的 veth 配置 IP 并启用
ip netns exec ns1 ip addr add 10.0.1.2/24 dev br-veth0
ip netns exec ns1 ip link set br-veth0 up
ip netns exec ns2 ip a a 10.0.1.3/24 dev veth1
ip netns exec ns2 ip link set br-veth1 up
执行ping,查看结果
ip netns exec ns1 ping 10.0.1.3
ip netns exec ns2 ping 10.0.1.2
vlan
# 进入 ns1
ip netns exec ns1
# 设置子接口
ip link add link veth1 name veth0.1 type vlan id 1
ip link add link veth1 name veth0.2 type vlan id 2
ip address add 100.0.2.2/24 dev veth0.1
ip address add 100.0.3.2/24 dev veth0.2
ip link set veth1.1 up
ip link set veth1.2 up
#退出namespace
exit
# 进入 ns2
ip netns exec ns2
# 设置子接口
ip link add link veth1 name veth1.1 type vlan id 1
ip link add link veth1 name veth1.2 type vlan id 2
ip address add 100.0.2.3/24 dev veth1.1
ip address add 100.0.3.3/24 dev veth1.2
ip link set veth1.1 up
ip link set veth1.2 up
#退出namespace
exit
执行ping,查看结果
ip netns exec ns1 ping 10.0.2.3
ip netns exec ns2 ping 10.0.3.3
host与namespace通过veth连接
ip link add host-veth type veth peer name host-veth-peer
ip link set host-veth-peer netns ns1
ip netns exec ns1 ip addr add 10.0.4.2/24 dev host-veth-peer
ip netns exec ns1 ip link set host-veth-peer up
ip addr add 10.0.4.3/24 dev veth1
ip link set host-veth up
# ns配置默认route
ip route del default via 10.0.4.3
# 开启内核转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 配置host使能IP伪装
iptables -t nat -A POSTROUTING -s 10.0.4.0/255.255.255.0 -o eth0 -j MASQUERADE
执行ping,查看结果
ip netns exec ns1 ping 192.168.0.3
# ping 192.168.0.3网关地址192.168.0.1
ip netns exec ns1 ping 192.168.0.1