Technical note
Linux虚拟网络学习笔记
参考文档
- https://blog.phpgao.com/openwrt-interface.html openwrt中br-lan,eth0,eth0.1,eth0.2
- http://www.kdyzm.cn/post/121 主路由、旁路由、单臂路由的区别
- https://thiscute.world/posts/linux-virtual-network-interfaces Linux 中的虚拟网络接口
- https://thiscute.world/posts/iptables-and-container-networks iptables 及 docker 容器网络分析
- https://www.cnblogs.com/zylSec/p/14743285.html VLAN虚拟局域网知识笔记之(二)
- https://zhuanlan.zhihu.com/p/469430240 交换机和路由器到底有什么区别
- https://zhuanlan.zhihu.com/p/293658778 Linux tun:tap 详解
- https://zhuanlan.zhihu.com/p/293659939 Linux veth pair 详解
- https://zhuanlan.zhihu.com/p/293659403 Linux netns 详解
- https://zhuanlan.zhihu.com/p/293667316 Linux Bridge 详解
- https://zhuanlan.zhihu.com/p/351560182 Linux 环回网络接口
tun/tap
# 创建 tap
ip tuntap add dev tap0 mode tap
# 创建 tun
ip tuntap add dev tun0 mode tun
# 删除 tap
ip tuntap del dev tap0 mode tap
# 删除 tun
ip tuntap del dev tun0 mode tun
# 例如使用ip link命令也可以删除tun/tap设备
ip link del tap0
ip link del tun0
netns
ip netns list
# 添加并启动虚拟网卡tap设备
ip tuntap add dev tap0 mode tap
ip tuntap add dev tap1 mode tap
ip link set tap0 up
ip link set tap1 up
# 配置IP
ip addr add 10.0.0.1/24 dev tap0
ip addr add 10.0.0.2/24 dev tap1
# 添加netns
ip netns add ns0
ip netns add ns1
# 将虚拟网卡tap0,tap1分别移动到ns0和ns1中
ip link set tap0 netns ns0
ip link set tap1 netns ns1
# 指定netns后查看网卡
ip netns exec ns0 ip a
ip netns exec ns1 ip a
# 重新启动网卡并设置IP
ip netns exec ns0 ip link set lo up
ip netns exec ns0 ip link set tap0 up
ip netns exec ns0 ip addr add 10.0.0.1/24 dev tap0
ip netns exec ns1 ip link set lo up
ip netns exec ns1 ip link set tap1 up
ip netns exec ns1 ip addr add 10.0.0.2/24 dev tap1
# 指定netns后ping
ip netns exec ns0 ping 10.0.0.1
ip netns exec ns1 ping 10.0.0.2
# 清理
ip netns delete ns0
ip netns delete ns1
vethpair
# 添加netns
ip netns add ns0
ip netns add ns1
# 创建一对veth
ip link add veth0 type veth peer name veth1
# 将veth移动到netns中
ip link set veth0 netns ns0
ip link set veth1 netns ns1
# 指定netns后查看网卡
ip netns exec ns0 ip a
ip netns exec ns1 ip a
# 启动
ip netns exec ns0 ip link set veth0 up
ip netns exec ns1 ip link set veth1 up
# 查看路由表
ip netns exec ns0 route -n
ip netns exec ns1 route -n
# 修改路由出口为veth
ip netns exec ns0 ip route change 10.0.0.0/24 via 0.0.0.0 dev veth0
ip netns exec ns1 ip route change 10.0.0.0/24 via 0.0.0.0 dev veth1
# 跨ns互ping
ip netns exec ns0 ping 10.0.0.2
ip netns exec ns1 ping 10.0.0.1
# 清理
ip netns delete ns0
ip netns delete ns1
bridge
# 安装bridge-utils
yum install -y bridge-utils
# 添加网桥
brctl addbr br0
# 启动网桥
ip link set br0 up
# 新增三个netns
ip netns add ns0
ip netns add ns1
ip netns add ns2
# 新增两对veth
ip link add veth0-ns type veth peer name veth0-br
ip link add veth1-ns type veth peer name veth1-br
ip link add veth2-ns type veth peer name veth2-br
# 将veth的一端移动到netns中
ip link set veth0-ns netns ns0
ip link set veth1-ns netns ns1
ip link set veth2-ns netns ns2
# 将netns中的本地环回和veth启动并配置IP
ip netns exec ns0 ip link set lo up
ip netns exec ns0 ip link set veth0-ns up
ip netns exec ns0 ip addr add 10.0.0.1/24 dev veth0-ns
ip netns exec ns1 ip link set lo up
ip netns exec ns1 ip link set veth1-ns up
ip netns exec ns1 ip addr add 10.0.0.2/24 dev veth1-ns
ip netns exec ns2 ip link set lo up
ip netns exec ns2 ip link set veth2-ns up
ip netns exec ns2 ip addr add 10.0.0.3/24 dev veth2-ns
# 查看网卡
ip netns exec ns0 ip a
ip netns exec ns1 ip a
ip netns exec ns2 ip a
# 查看路由表
ip netns exec ns0 route -n
ip netns exec ns1 route -n
ip netns exec ns2 route -n
# 将veth的另一端启动并挂载到网桥上
ip link set veth0-br up
ip link set veth1-br up
ip link set veth2-br up
brctl addif br0 veth0-br
brctl addif br0 veth1-br
brctl addif br0 veth2-br
# 查询网桥
brctl show
# 添加iptables规则
iptables -A FORWARD -i br0 -j ACCEPT
# 测试网络连通性
ip netns exec ns0 ping 10.0.0.1
ip netns exec ns0 ping 10.0.0.2
ip netns exec ns0 ping 10.0.0.3
localhost
# 查本地的路由表
ip route show table local
# 查主路由表
ip route show table main
# 环回网络接口
ifconfig lo