Home Archives Categories Tags

Linux tap/tun 介绍

发布时间: 更新时间: 总字数:750 阅读时间:2m 作者: 分享
专栏文章
  1. Linux tap/tun 介绍(当前)
  2. Linux Veth Pair 介绍
  3. Linux 网桥介绍
  4. Linux Net Namespace 介绍
  5. 通过 Linux ip_forward 实现两个 netns 通信

本文介绍Linux虚拟网络设备 tap/tun,该部分是云计算容器等虚拟化技术网络部分的基础。

tap/tun

tap/tunLinux 内核 2.4.x 后实现的虚拟网络设备tap/tun 虚拟网卡实现了物理网卡的所有功能,可以配置 IP,都归 Linux 网络设备管理模块统一管理,tap工作在数据链路层,也称虚拟以太设备

tap/tun 驱动包括两部分:

  • 字符设备驱动
  • 网卡驱动

tap/tun 对应的字符设备文件分别为:

  • tap:/dev/tap0
  • tun:/dev/net/tun

tap/tun 设备文件像一个管道,一端连接着用户空间,一端连接着内核空间。当用户程序向文件 /dev/net/tun/dev/tap0 写数据时,内核就可以从对应的 tunXtapX 接口读到数据。简单的说:操作系统 通过 TUN/TAP 设备向绑定该设备的 用户空间的程序 发送数据,反之,用户空间的程序 也可以像操作 硬件网络设备 那样,通过 TUN/TAP 设备发送数据。

tap/tun 的区别:

  • tap 是二层设备(或者以太网设备),只处理二层的以太网帧
  • tun 是一个点对点的三层设备(或网络层设备),只处理三层的 IP 数据包

tun/tap 常用于隧道通信,比如 VPN

tun/tap

查看

查看命令:

$ modinfo tun
filename:       /lib/modules/3.10.0-1160.6.1.el7.x86_64/kernel/drivers/net/tun.ko.xz
alias:          devname:net/tun
alias:          char-major-10-200
license:        GPL
author:         (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
description:    Universal TUN/TAP device driver
retpoline:      Y
rhelversion:    7.9
srcversion:     E26A36A927427B2BAE3FB17
depends:
intree:         Y
vermagic:       3.10.0-1160.6.1.el7.x86_64 SMP mod_unload modversions
signer:         CentOS Linux kernel signing key
sig_key:        6A:DD:D0:96:21:8C:B2:B4:3D:F9:3C:C9:56:82:39:8F:4D:F6:B1:DB
sig_hashalgo:   sha256

Linux使用tun模块实现了tuntap

  • 加载tun
lsmod | grep tun
# 未加载,触发加载
modprobe tun

工具

ip tuntap

$ ip tuntap help
Usage: ip tuntap { add | del | show | list | lst | help } [ dev PHYS_DEV ]
          [ mode { tun | tap } ] [ user USER ] [ group GROUP ]
          [ one_queue ] [ pi ] [ vnet_hdr ] [ multi_queue ] [ name NAME ]

Where: USER  := { STRING | NUMBER }
       GROUP := { STRING | NUMBER }
  • 创建 tap/tun 设备
$ ip tuntap add dev tap0 mod tap  # 创建 tap 
$ ip tuntap add dev tun0 mod tun  # 创建 tun
$ ip tuntap show
tap0: tap UNKNOWN_FLAGS:800
tun0: tun UNKNOWN_FLAGS:800
  • 删除 tap/tun 设备:
$ ip tuntap del dev tap0 mod tap  # 删除 tap 
$ ip tuntap del dev tun0 mod tun  # 删除 tun

tunctl

yum -y install http://rpmfind.net/linux/opensuse/distribution/leap/15.3/repo/oss/x86_64/tunctl-1.5-1.26.x86_64.rpm
  • 创建 tap0
$ tunctl -t tap0 -u root
$ ifconfig tap0 192.168.0.1 netmask 255.255.255.0 promisc
$ ip a show tap0
17: tap0: <NO-CARRIER,BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 6a:ed:1c:56:95:63 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 brd 192.168.0.255 scope global tap0
       valid_lft forever preferred_lft forever
  • 将 tap0 添加到网桥 br0
$ brctl addbr br0
$ brctl addif br0 tap0
$ brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.06d935e09ee1	no		tap0
$ brctl showmacs br0
port no	mac addr		is local?	ageing timer
  3	6a:ed:1c:56:95:63	yes		   0.00
  3	6a:ed:1c:56:95:63	yes		   0.00
专栏文章
  1. Linux tap/tun 介绍(当前)
  2. Linux Veth Pair 介绍
  3. Linux 网桥介绍
  4. Linux Net Namespace 介绍
  5. 通过 Linux ip_forward 实现两个 netns 通信
最新评论
加载中...