【转】Linux虚拟网络基础——tap

原文:https://blog.csdn.net/chengqiuming/article/details/80071073

-------------------------------------------------------------------

一 介绍
Linux中谈到tap,经常会和tun并列谈论。两者都是操作系统内核中的虚拟网络设备。tap位于二层,tun位于三层。需要说明的是,这里所说的设备是Linux的概念,并不是我们平时生活中所说的设备。比如,生活中,我们常常把一台物理路由器称为一台设备。
而Linux所说的设备,其背后指的是一个类似于数据结构、内核模块或设备驱动着样的含义。像tap/tun这样的设备,它的数据结构如下:
struct tun_struct {
char name[8]; //设备名
unsigned long flags; //区分tun和tap设备
struct fasync_struct *fasync; //文件异步通知结构
wait_queue_head_t read_wait; //等待队列
struct net_device dev; //linux 抽象网络设备结构
struct sk_buff_head txq; //网络缓冲区队列
struct net_device_stats stats; //网卡状态信息结构
};
我们看到,甚至连数据结构,tap和tun的定义都是一个,两者仅仅是通过一个Flag来区分。不过从背后所承载的功能而言,两者还是有比较大的区别:tap位于网络OSI模型的二层(数据链路层),tun位于网络的三层。
本篇只介绍tap。
tap从功能上讲,位于数据链路层,数据链路层的主要协议有:
1 点对点协议(Point-to-Point Protocol)
2 以太网(Ethernet)
3 高级数据链路协议(High-Level Data Link Protocol)
4 帧中继(Frame Relay)
5 异步传输模式(Asynchronous Transfer Mode)
但是tap只是与其中一种协议以太网(Ethernet)协议对应。所以,tap有时也称为“虚拟以太设备”。

二 实战
#要想使用Linux命令行操作一个tap,首先得有tun模块(Linux使用tun模块实现了tun/tap),检查方法如下:
[[email protected] ~]# modinfo tun
filename: /lib/modules/3.10.0-327.el7.x86_64/kernel/drivers/net/tun.ko
alias: devname:net/tun
alias: char-major-10-200
license: GPL
author: (C) 1999-2004 Max Krasnyansky <[email protected]>
description: Universal TUN/TAP device driver
rhelversion: 7.2
srcversion: B59BCB1255A36FBC7557FC3
depends:
intree: Y
vermagic: 3.10.0-327.el7.x86_64 SMP mod_unload modversions
signer: CentOS Linux kernel signing key
sig_key: 79:AD:88:6A:11:3C:A0:22:35:26:33:6C:0F:82:5B:8A:94:29:6A:B3
sig_hashalgo: sha256
#当Linux版本具有tun模块时,还得看看其已经加载,检查方法如下:
[[email protected] ~]# lsmod|grep tun
tun 27141 1
#如果已经加载,则会出现上述的“tun ***”那一行。如果没有加载,则使用如下命令进行加载:
[[email protected] ~]# modprobe tun
#当我们确认Linux加载了tun模块以后,我们需要确认Linux是否有操作tun/tap的命令行工具tunctl。在Linux命令行中输入以下命令
[[email protected] ~]# tunctl help
#输入这个命令后,如果Linux有输入,则说明OK,否则下面网站进行安装
#https://blog.csdn.net/lopng/article/details/72821438
#具备了tun和tunctl以后,我们就可以创建一个tap设备,命令行如下:
[[email protected] yum.repos.d]# tunctl -t tap_test
Set ‘tap_test‘ persistent and owned by uid 0
#我们通过如下命令查看刚刚创建的tep(tap_test)
[[email protected] yum.repos.d]# ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether 08:00:27:12:f4:ac brd ff:ff:ff:ff:ff:ff
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT qlen 500
link/ether 52:54:00:1b:2a:d5 brd ff:ff:ff:ff:ff:ff
5: tap_test: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 500
link/ether 36:c3:5e:1a:6d:f7 brd ff:ff:ff:ff:ff:ff
#我们也可以通过如下命令查看
[[email protected] yum.repos.d]# ifconfig -a
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.101 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::a00:27ff:fe12:f4ac prefixlen 64 scopeid 0x20<link>
ether 08:00:27:12:f4:ac txqueuelen 1000 (Ethernet)
RX packets 6364 bytes 8271654 (7.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1770 bytes 172967 (168.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 8 bytes 1104 (1.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 1104 (1.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
tap_test: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether 36:c3:5e:1a:6d:f7 txqueuelen 500 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 00:00:00:00:00:00 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0-nic: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether 52:54:00:1b:2a:d5 txqueuelen 500 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#通过上面的命令行的输出,我们看到,这个tap_test还没有绑定IP地址。执行如下命令,给其绑定IP地址:
[[email protected] yum.repos.d]# ip addr add local 192.168.100.1/24 dev tap_test
#使用ifconfig -a命令再查看一下
[[email protected] yum.repos.d]# ifconfig -a
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.101 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::a00:27ff:fe12:f4ac prefixlen 64 scopeid 0x20<link>
ether 08:00:27:12:f4:ac txqueuelen 1000 (Ethernet)
RX packets 6500 bytes 8282430 (7.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1845 bytes 183755 (179.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 8 bytes 1104 (1.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 1104 (1.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
tap_test: flags=4098<BROADCAST,MULTICAST> mtu 1500
inet 192.168.100.1 netmask 255.255.255.0 broadcast 0.0.0.0
ether 36:c3:5e:1a:6d:f7 txqueuelen 500 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 00:00:00:00:00:00 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0-nic: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether 52:54:00:1b:2a:d5 txqueuelen 500 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#到此,一个tap设备就创建完了
————————————————
版权声明:本文为CSDN博主「cakincqm」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengqiuming/article/details/80071073

原文地址:https://www.cnblogs.com/oxspirt/p/12064955.html

时间: 2024-10-06 05:54:16

【转】Linux虚拟网络基础——tap的相关文章

史上最详细的原理+实验——Linux Centos7 网络基础设置

一.网络基础设置 1.ifconfig 查看网卡详细信息 ifconfig :查看ip地址信息mtu 1500 数据包字节inet 192.168.17.134 :ip地址netmask 255.255.255.0 :子网掩码broadcast 192.168.17.255:广播地址inet6 fe80::e3c7:14af:6e4d: ipv6地址ether 00:0c:29:c9:dd:05 :mac地址lo: flags回访网卡 2.hostname查看主机名 hostnamectl se

Linux之网络基础?

网络基础 网络模型有两种基本类型:协议模型和参考模型.TCP/IP 模型描述了 TCP/IP 协议簇中每个协议层实现的功能,因此属于协议模型.开放式系统互联 (OSI) 模型是最广为人知的网际网络参考模型,用于数据网络设计.操作规范和故障排除. 一段数据在任意协议层的表示形式称为协议数据单元 (PDU) 数据 - 一般术语,泛指应用层使用的 PDU数据段 - 传输层 PDU数据包 - 网络层 PDU帧 - 网络接入层 PDU比特(位) - 通过介质实际传输数据时使用的 PDU OSI 参考模型各

linux之网络基础

转自 http://www.cnblogs.com/shijiaqi1066/p/3840284.html Linux网络接口 Linux网络接口,包含了网卡的概念. 在Linux系统中,命名规律: eth0为第一个接口(Ethernet Card),eth1为第二个. lo为本地环回接口,它的IP地址固定为127.0.0.1,掩码8位. ifconfig命令 ifconfig命令常用来显示系统中的网络接口(网卡)信息,也可以用来配置网络接口(configure a network interf

Linux系统管理-网络基础集锦及Linux网络配置、高级使用

1.网络通信术语 1.1.三种通信模式     单播:         多播:     广播: 1.2.LAN 组成     Computers             PCs         Servers     Interconnections         NICs         Media     Network devices         Hubs         Switches         Routers     Protocols         Ethernet

谢烟客---------Linux之网络基础知识

本地网络通信 跨网络通信 主机间通信 互联网通信 ISO的OSI模型 网络:是什么,用什么设备 IPV4 IPV6 是什么 ipv4/ipv6首部格式 tcp首部/udp首部 通信的细节.拥塞控制.划动窗口 tcp有限状态机的转换 网络:将多个主机用通信线缆连接起来,实现通信.资源共享 硬盘与主板通信用基于工业标准的线缆和控制器即可完成 网络通信,同轴线缆 1)多个主机共用一个线缆,如何确定谁发和谁收:唯一的标识,IANA国际组织规范 2)硬件生产的规范 局域网: parc (鼠标.LAN,GU

Linux之网络基础TCP/IP以及网络属性配置

计算机网络区域范围: 局域网络 (Local Area Network, LAN):节点之间的传输距离较近 广域网 (Wide Area Network, WAN):传输距离较远,网络应用方面大多为类似 email, FTP, WWW 浏览等功能 计算机网络协议:网络连接过程分成数个阶层 (layer),每个阶层都有特别的独立的功能,不会互相干扰的. 目前的OSI七层协定(Open System Interconnection) OSI模型自上而下,分为以下: 应用层:文件传输,电子邮件,文件服

Linux:网络基础配置

一.修改主机名 hostname 查看主机名 1.hostname   zy 修改主机名为zy,临时生效,重新登录系统生效. 2.想要永久修改,,需修改配置文件:  vi   /etc/sysconfig/network.然后重启系统才可以reboot 一般我们也不可能重启,所以有第三种方法 3.分三步 1)hostname zylinux 2)修改配置文件:  vi   /etc/sysconfig/network 3)修改vi /etc/hosts 中127.0.0.1对应的主机名 然后推出

十六、linux系统网络基础

1.网络是由IP构成的:network + host,以至于我们使用网络向外发信息,不会发错. 2.子网掩码这里要知道两点: 1)子网掩码不可能出现交叉部分,换句话说不会出现01010101的交叉现象,前面是都是1,后面都是0 2) 前面有多少位子网掩码,前面就有多少位网络号(newwork) 3.心算IP:记住 128.64.32.16.8.4.2.1 4.IP地址的划分: Class A: 网络地址 8位  ,且子网掩码是255.0.0.1,第一个号为0,则范围0-127 Class B:

linux学习 --- 网络基础知识

1.1  IP地址 IP地址由两部分组成  网络号和主机号 .网络号为IP地址的高位组成,而主机号是IP地址的低位组成,两个的大小取决于网络的类型. IP地址根据网络的地址不同分为:A类,B类,C类,D类,E类. (1)A类IP地址类型 A类IP地址由一个字节的网络号和三个字节的主机号组成.网络地址的最高位必须为“0”,地址范围为:1.0.0.0 到 126.0.0.0. (2)B类IP地址类型 B类IP地址由两个字节的网络号和两个字节的主机号组成.网络地址的最高位必须为“10”,地址范围为:1