虚拟网络设备 veth pair

veth-pair 就是一对的虚拟设备接口, 和tap/tun设备不同,它都是成对出现的,一端连着协议栈,一端彼此相连着。veth工作在L2数据链路层,veth-pair设备在转发数据包过程中并不串改数据包内容

veth-pair 基本命令

创建veth 命令

ip link add vetha type veth peer name vethb

veth-pair 连通性

ip addr add 192.168.0.2 dev vetha
ip addr add 192.168.0.3 dev vethb
ip link set vetha up
ip link set vethb up
ping -I vetha 192.168.0.3 -c 2

PING 192.168.0.3 (192.168.0.3) from 192.168.0.2 vetha: 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.042 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.063 ms
— 192.168.0.3 ping statistics —
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.042/0.052/0.063/0.012 ms

两个namespace之间的连通性

根据连接方式和规模,分为:直接相连、通过bridge相连、通过OVS相连

直接相连

创建namespace
ip netns add ns0
ip netns add ns1
创建一对veth-pair vetha vethb
ip link add vetha type veth peer name vethb
** 将vetha vethb 分别加入两个ns
ip link set vetha netns ns0
ip link set vethb netns ns1
分别配上ip并启用
ip netns exec ns0 ip addr add 192.168.0.2 dev vetha
ip netns exec ns0 ip link set vetha up
ip netns exec ns1 ip addr add 192.168.0.3 dev vethb
ip netns exec ns1 ip link set vethb up
从vetha ping vethb
ip netns exec ns0 ping 192.168.0.3

PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.058 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.057 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.056 ms

通过bridge相连

创建bridge br0
ip link add br0 type bridge
ip link set br0 up
创建两对 veth-pair
ip link add veth0 type veth peer name veth1
ip link add veth2 type veth peer name veth3
**分别将两对 veth-pair 加入到不同的netns

ip link set veth0 netns ns0
ip link set veth2 netns ns1
brctl addif br0 veth1
ip link set veth1 up
brctl addif br0 veth3
ip link set veth3 up
给两个ns中的veth配置ip并启动
ip netns exec ns0 ip link set veth0 up
ip netns exec ns0 ip addr add 192.168.0.2/24 dev veth0
ip netns exec ns1 ip link set veth2 up
ip netns exec ns1 ip addr add 192.168.0.3/24 dev veth2
veth2 ping veth0
ip netns exec ns1 ping 192.168.0.2

PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.058 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.066 ms

在namespace中如何通过bridge访问外网

直接ping www.baidu.com

ping www.baidu.com
ping: unknown host www.baidu.com

给bridge设置地址, ping br0

ip addr add 192.168.0.1/24 dev br0
ping 192.168.0.1

PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.097 ms

添加NAT

在nat表中添加nat规则
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 ! -o br0 -j MASQUERADE

如果网桥br0 收到来自192.168.0.0/24网段的外出包,把它交给MASQUERADE处理,MASQUERADE将包的源地址替换成host的地址发送出去,即做了一次SNAT

开启forward
echo 1 > /proc/sys/net/ipv4/ip_forward
添加forward规则
iptables -t filter -A FORWARD -i br0 ! -o br0 -j ACCEPT
iptables -t filter -A FORWARD ! -i br0 -o br0 -j ACCEPT

第一条规则是指从br0发出的目标不是br0的接收转发
第二条规则是指从非br0发出的 目标是br0的数据包接收转发

查看vethpair 对应关系

cat /sys/class/net/eth0/iflink

文档更新时间: 2021-01-22 05:14   作者:周国强