首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >veth/tuntap/bridge/netns详解与演示

veth/tuntap/bridge/netns详解与演示

原创
作者头像
skystone
发布2025-11-23 17:15:26
发布2025-11-23 17:15:26
490
举报
文章被收录于专栏:Linux DocLinux Doc

1. veth

创建

代码语言:shell
复制
    #创建veth接口对(一条命令创建1个接口对,也就是2个接口,可以理解为2个接口中间连着根线)
    ip link add veth-A type veth peer name veth-B
    #设置IP
    ip addr add 10.1.1.100/24 dev veth-A
    ip addr add 10.1.1.101/24 dev veth-B
    #拉起来
    ip link set veth-A up
    ip link set veth-B up
    #down掉
    ip link set veth-A down
    ip link set veth-B down  

2. tuntap

2.1. 概述

TUN/TAP 设备一端连着操作系统协议栈,另一端连着用户空间的程序:用户空间程序

--- tap0&tun0 --- TCP/IP 协议栈 --- ping

TUN 工作在三层,无 MAC 地址,无法加入网桥;TAP 工作在二层,更接近物理网卡;

TUN 设备常用于 VPN 场景;TAP 设备常用于虚拟机网卡;

简言之,通过对/dev/tap0或者/dev/tun/tun0,也就是socket文件,读写,就相当于在读写网卡。

2.2. tap

添加并启动虚拟网卡tap设备

代码语言:shell
复制
    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

代码语言:shell
复制
    ip addr add 10.0.0.1/24 dev tap0
    ip addr add 10.0.0.2/24 dev tap1
2.3. tun
代码语言:shell
复制
    # 创建网卡并配置IP
    ip tuntap add dev tun0 mode tun
    ip link set dev tun0 up
    ip addr add 10.0.0.1/24 dev tun0
    ip route add 10.0.0.0/24 via 10.0.0.1
    # 清除网卡
    ip link set dev tun0 down
    ip tuntap del dev tun0 mode tun

3. bridge

Linux bridge本身是桥接设置,桥配置IP,桥上的接口,不管是虚拟接口,还是物理接口,都不需要配置IP。是靠桥来桥接起来的。

当数据包进入bridge后,会根据目标MAC从不同的接口转发出去。

将物理网卡添加到bridge的场景中,物理网卡上联交换机,之前在物理网卡上的IP,需要设置到bridge地址取代物理网卡。

bridge、物理网卡、veth、tap,这几个之间,使用时其实比较费解。

veth是个link,我理解是网线加2个设备,这2个设备可以分别设置IP,就可以互相ping。

veth在和bridge一起使用时,只设置1端IP,另1端连接到bridge上的不设置IP。

tap是个设备我认为,addif添加到bridge时,tap需要设置IP,这样就能和其他tap通信。

tun是三层,不连bridge。

4. netns

对应的操作系统路径

旧系统:/var/run/netns

新系统:/run/network

每个命名空间拥有独立的网络栈(路由表、防火墙规则、/proc/net目录等)

默认创建时仅包含lo回环接口(DOWN状态)

命名空间生命周期由内核管理,删除时自动释放所有资源。

创建

代码语言:shell
复制
    ip netns add netns-01

删除

代码语言:shell
复制
    ip netns delete netns-01

查看

代码语言:shell
复制
    ip netns list

将接口加入某个netns

代码语言:shell
复制
    ip link set veth-A netns netns-01

设置接口IP

采用持久化的方式设置,跟普通网口一样。

采用ip命令设置也行,如下:

代码语言:shell
复制
    ip addr add X.X.X.X/Y dev <网卡名称>

进入网络命名空间执行命令或者启动进程

方法1:使用ip netns exec

代码语言:shell
复制
    ip netns exec netns-01 ip link show

方法2:使用nsenter(-t参数表示对应netns中的进程,譬如docker里的进程)

代码语言:shell
复制
    nsenter -t <pid> -n <要执行的命令>

5. 案例

5.1. 案例1: 创建vm,接口从ovs上创建

(1) 创建vm

代码语言:shell
复制
    ip link set $1 up
    ovs-vsctl add-port ${switch} $1

(2) 逆向操作

代码语言:shell
复制
    ip addr flush dev $1
    ip link set $1 down
    ovs-vsctl del-port ${switch} $1
5.2. 案例2:netns <-- veth --> bridge
任务

创建1个netns,创建1个bridge,创建1个veth接口对,连接netns和bridge。然后再删除清理掉这些。

步骤

(1) 创建netns

代码语言:shell
复制
    ip netns add netns-01

(2) 创建bridge

代码语言:shell
复制
    #创建bridge
    brctl addbr bridge-01
    #给bridge设置IP,这个不用命令,直接修改配置文件
    ip addr add 10.0.0.1/24 dev veth-A

(3) 创建veth接口对(一条命令创建1个接口对,也就是2个接口,可以理解为2个接口中间连着根线)

代码语言:shell
复制
    ip link add veth-A type veth peer name veth-B

(4) 将veth-A添加到netns

代码语言:shell
复制
    ip link set veth-A netns netns-01

(5) 为veth-A设置IP等

代码语言:shell
复制
    #进入到netns-01网络命名空间设置IP
    ip netns exec netns-01 ip addr add 10.0.0.1/24 dev veth-A
    #也可以在默认网络命名空间直接设置
    #晚点测试

    #将接口up起来
    ip link set veth-A up

(6) 将veth-B接入bridge(bridge添加端口)

代码语言:shell
复制
    #bridge添加if
    brctl addif bridge-01 veth-B
    #将接口up起来
    ip link set veth-B up
    #veth-B不需要设置IP, IP在bridge上设置的。

(7) 逆向操作

代码语言:shell
复制
    #从网桥上删除接口
    brctl delif bridge-01 veth-B

    #删除veth端口对
    ip link del veth-A
    
    #删除netns
    ip netns del netns-01
    
    #删除bridge
    brctl delbr bridge-01
5.3. 案例3:容器互联

(1) 创建bridge

代码语言:shell
复制
    brctl addbr br-01

bridge持久化配置文件

/etc/sysconfig/network-scripts/ifcfg-br-01

代码语言:shell
复制
    TYPE=Bridge  #注意,这个地方一点要大写
    DEVICE=br-01  #指定设备名称,一定要与文件名中ifcfg-br-01后的"br-01"相同
    ONBOOT=yes  #开机启动
    IPADDR=X.X.X.X  #配置网桥的地址
    NETMASK=X.X.X.X
    GATEWAY=X.X.X.X  #指定网关

(2) 创建模拟容器1的netns和veth对

veth-1-A

veth-1-B

代码语言:shell
复制
    ip netns add netns-1
    ip link add veth-1-A type veth peer name veth-1-B
    ip link set veth-1-A netns netns-1
    ip netns exec netns-1 ip addr add X.X.X.X/Y dev veth-1-A
    brctl addif br-01 veth-1-B

(3) 创建模拟容器2的netns和veth对

veth-2-A

veth-2-B

代码语言:shell
复制
    ip netns add netns-2
    ip link add veth-2-A type veth peer name veth-2-B
    ip link set veth-2-A netns netns-2
    ip netns exec netns-2 ip addr add X.X.X.X/Y dev veth-2-A
    brctl addif br-01 veth-2-B

(4) 测试

代码语言:shell
复制
    ip netns exec netns-2 ping <veth-1-A的IP>
5.4. 案例4:容器访问宿主机外部网络

与上面配置完全相同,在模拟容器的netns中,增加路由配置。

其中,默认路由设置成物理网络的网关,不是bridge的IP。

代码语言:shell
复制
    ip netns exec netns-1 ip route add default via X.X.X.1 dev veth0
    ip netns exec netns-1 route -rn
5.5. 案例5:tap设备连接到bridge
  1. 创建bridge

首先,你需要创建一个bridge设备。你可以使用ip命令或brctl命令来创建bridge。

使用ip命令:

代码语言:shell
复制
    sudo ip link add name br0 type bridge
    sudo ip addr add 192.168.1.1/24 dev br0
    sudo ip link set dev br0 up

或者

使用brctl命令(如果你安装了bridge-utils包):

代码语言:shell
复制
    sudo brctl addbr br0
    sudo brctl setfd br0 0  # 设置bridge转发延迟为0
    sudo ip addr add 192.168.1.1/24 dev br0
    sudo ip link set dev br0 up
  1. 创建并配置tap设备

接下来,创建一个tap设备,并将其设置为启用状态。

代码语言:shell
复制
    sudo ip tuntap add mode tap name tap0
    sudo ip link set dev tap0 up
  1. 将tap设备添加到bridge

现在,将创建的tap设备添加到bridge中。

使用ip命令:

代码语言:shell
复制
    sudo ip link set dev tap0 master br0

使用brctl命令:

代码语言:shell
复制
    sudo brctl addif br0 tap0
  1. 验证配置

为了验证配置是否成功,你可以查看bridge的状态和连接的接口。

使用ip命令:

代码语言:shell
复制
    ip addr show br0
    ip link show br0

使用brctl命令:

代码语言:shell
复制
    brctl show br0

这些命令将显示bridge的详细信息,包括它连接的接口。你应该能看到你的tap设备(例如tap0)已经成功添加到bridge中。

  1. 配置网络(可选)

根据需要,你还可以为tap设备分配IP地址,使其能够通过网络与其他设备通信。例如:

代码语言:shell
复制
    sudo ip addr add 192.168.1.2/24 dev tap0

这样,你的tap设备就可以通过bridge与其他网络设备通信了。确保你的网络环境(如路由器或防火墙设置)允许这样的桥接和IP路由。如果你在一个虚拟化环境中(如VMware, VirtualBox等),可能还需要配置虚拟机的网络设置以允许桥接模式。在VirtualBox中,你可以在虚拟机设置里选择“桥接适配器”。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. veth
  • 2. tuntap
    • 2.1. 概述
    • 2.2. tap
    • 2.3. tun
  • 3. bridge
  • 4. netns
  • 5. 案例
    • 5.1. 案例1: 创建vm,接口从ovs上创建
    • 5.2. 案例2:netns <-- veth --> bridge
      • 任务
      • 步骤
    • 5.3. 案例3:容器互联
    • 5.4. 案例4:容器访问宿主机外部网络
    • 5.5. 案例5:tap设备连接到bridge
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档