① linux 创建虚拟网卡的几种方法
Linux添加虚拟网卡的多种方法
有时候,一台服务器需要设置多个ip,但又不想添加多块网卡,那就需要设置虚拟网卡.这里介绍几种方式在Linux服务器上添加虚拟网卡.
我们向eth0中添加一块虚拟网卡:
第一种方法:快递创建\删除虚拟网卡
sudo ifconfig eth0:0 192.168.10.10 up
以上的命令就可以在eth0网卡上创建一个叫eth0:0的虚拟网卡,他的地址是:192.168.1.63
如果不想要这个虚拟网卡了,可以使用如下命令删除:
sudo ifconfig eth0:0 down
重启服务器或者网络后,虚拟网卡就没有了.
hzhsan:但是发现添加的虚拟网卡和原网卡物理地址是一样的。
第二种方法:修改网卡配置文件
在ubuntu下,网卡的配置文件是/etc/network/interfaces,所以我们修改它:
sudo vim /etc/network/interfaces
在这个文件中增加如下内容并保存:
auto eth0:0
iface eth0:0 inet static
address 192.168.10.10
netmask 255.255.255.0
#network 192.168.10.1
#broadcast 192.168.1.255
保存后,我们需要重启网卡(重新加载配置文件)才会生效,使用如下命令重启:
sudo /etc/init.d/networking restart
他的优点是重启服务器或者网卡配置不会丢失。
-------------------------------------------
在linux中虚拟网卡的方法
第三种方法:创建tap
前两种方法都有一个特点,创建的网卡可有不同的ip地址,但是Mac地址相同。无法用来创建虚拟机。
添加虚拟网卡tap
tunctl -b
附上相关命令简介:
显示网桥信息
brctl show
添加网桥
brctl addbr virbr0
激活网桥
ip link set virbr0 up
添加虚拟网卡tap
tunctl -b
tap0 -------> 执行上面使命就会生成一个tap,后缀从0,1,2依次递增
激活创建的tap
ip link set tap0 up
将tap0虚拟网卡添加到指定网桥上。
brctl addif br0 tap0
给网桥配制ip地址
ifconfig virbr1 169.254.251.4 up
将virbr1网桥上绑定的网卡eth5解除
brctl delif virb1 eth5
给virbr1网桥添加网卡eth6
brctl addif virbr1 eth6
② 如何将linux虚拟机和主机之间连接 详细�0�3
将Linux虚拟机连接到主机的方法如下:
1、打开计算机中的虚拟机软件,然后打开Linux系统。
③ k8s 网络基础
author:sufei
说明:本文主要记录在学习k8s网络方面的相关知识
Linux在内核网络栈中引入网络命名空间,将 独立的网络协议栈隔离 到不同的命令空间中,彼此间无法通信;
1、Linux操作系统,解析和封装网络包是通过一个网络协议栈完成,下层为上层服务,这个 协议栈中即包括如软件也包括硬件网络设 备。网络命名空间就是以软件方式隔离出单独的网络栈信息;
2、不同network namespace的软硬件资源相互不可见,好像处在物理隔离的不同物理机上一样,彼此隔离;
3、不同的网络命名空间会有自己独立的网卡、路由表、ARP 表、iptables 等和网络相关的资源
4、实验:可以借助 ip netns 命令来完成对 Network Namespace 的各种操作,如:
问题 :什么是转移设备?
可以在不同的 Network Namespace 之间转移设备(如veth)。由于一个设备只能属于一个 Network Namespace ,所以转移后在这个 Network Namespace 内就看不到这个设备了。 veth设备属于可转移设备 ,而很多其它设备(如lo、bridge等)是不可以转移的。
veth pair 全称是 Virtual Ethernet Pair,是一个成对的端口,所有从这对端口一 端进入的数据包都将从另一端出来,反之也是一样。而veth pair就是为了在不同的 Network Namespace 直接进行通信,利用它可以直接将两个 Network Namespace 连接起来。
实验
veth pair打破了 Network Namespace 的限制,实现了不同 Network Namespace 之间的通信。但veth pair有一个明显的缺陷,就是只能实现两个网络接口之间的通信。如果我们想实现多个网络接口之间的通信,就可以使用下面介绍的网桥(Bridge)技术( 类似于物理交换机 )。
简单来说,网桥就是把一台机器上的若干个网络接口“连接”起来。其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去。以使得网口之间的报文能够互相转发。
网桥是一个二层网络设备,通过网桥可以将linux支持的不同的端口连接起来,并实现类似交换机那样的多对多的通信。
实验:
Netfilter负责在内核中执行各种挂接的规则(过滤、修改、丢弃等),运行在内核 模式中;Iptables模式是在用户模式下运行的进程,负责协助维护内核中Netfilter的各种规则表;通过二者的配合来实现整个Linux网络协议栈中灵活的数据包处理机制。
iptables/netfilter(简称iptables)组成了Linux平台下的包过滤防火墙,可以完成封包过滤、封包重定向和网络地址转换(NAT)等功能。这部分主要了解两部分知识:
应用层不管是要发送还是接收网络消息,都需要通过linux内核提供的一系列关卡。每个”关卡“担负着不同的工作。这里的”关卡“被称为”链“。如下图:
Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关(如上面的172.17.0.1)。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
下面具体来说说docker容器的几种网络模式,以便后续学习k8s网络。
在host模式下( –net=host),容器不会去建立新的网络命名空间,而直接使用宿主机的网络设备以及网络协议栈。这样自然不会虚拟出自己的网卡,配置自己的IP等。其特点如下:
这个模式就是在创建容器时,指定网络(–net=container:NAME_or_ID)与之前容器在同一个网络命名空间中,而不是和宿主机共享(这也就是k8s中pod内各容器的一种网络模式)。下面说明几点:
none模式(–net=none)Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
bridge模式是docker容器的默认模式,当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器在bridge模式下会连接到这个虚拟网桥上,并由网桥自动分配ip。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
下面说明这个模式下的工作方式:
首先我们来看看k8s想要一个什么样的网络,也就是k8s网络设计的要求,具体如下:
下面简单从几中不同的通信要求来看看k8s网络实现。
在 Kubernetes 的世界里,IP 是以 Pod 为单位进行分配的。一个 Pod 内部的所有容器共享一个网络堆栈。实际上就是docker container网络模式。可以直接通过本地localhost进行网络访问。这个模式在mysql容器化中就是agent容器与mysql容器的网络通信方式。
Pod1和Pod2都是通信veth pair连接到同一个docker0网桥上,它们的IP地址都是从docker0网段上动态获取的,它们和网桥本身的IP是同一个网段的。可以通过docker0作为交换机进行通信,也就是采用的docker bridge网络模式进行通信。
由于在同一个网桥docker0上即可以保证分配的pod IP不会冲突,且可以相互通信,而如果需要跨Node物理节点,则无法通过docker网络直接满足要求了,那这些要求具体有哪些呢?
解决方案
方法一:k8s中通过在etcd中记录正在运行中pod的IP分配信息,这样我们就可以满足Pod IP与Node IP之间映射关系的记录;
方法二:可以在etcd中规划配置好所有主机docker0网桥的子网范围,从而满足Pod IP不冲突的要求;如:
方法三:要实现Pod跨Node通信,以k8s默认网络Flannel为例,就是采用overlay(覆盖网络)实现。具体下面说明:
问题:什么是覆盖网络?
覆盖网络就是应用层网络,是指建立在另一个网络上的网络。怎么理解呢?简单理解就是将TCP数据包装在另一种网络包里面进行路由转发和通信,另一种网络包目前可以是UDP、VxLAN、AWS VPC和GCE路由等数据转发方式。默认以UDP为例来说明flannel工作方式。
下面看看具体实现
问题 :为保证各node内docker容器分配的ip地址不冲突,每个节点上的Docker会使用不同的IP地址段?如何实现的呢?
问题 :为什么在发送节点上的数据会从docker0路由到flannel0虚拟网卡,在目的节点会从flannel0路由到docker0虚拟网卡?
④ 玩转 OpenStack(八.1)Linux Bridge 实现 Neutron 网络之Local、Flat、VLAN、DHCP
Neutron 默认使用 ML2 作为 core plugin,配置文件 /etc/neutron/neutron.conf 中 core_plugin
计算节点和控制节点都需要在各自的 neutron.conf 中配置 core_plugin
然后配置 ML2 的配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini 中 mechanism_drivers
mechanism_drivers 可以同时指定多个。这里只指定了一个。
查看 linuxbridge 进程
控制节点:
计算节点:
在 Linux Bridge 环境中,一个数据包从 Instance 发送到物理网卡会经过下面几个类型的设备:
对于每个 local network,ML2 linux-bridge 会创建一个 bridge,Instance 的 tap 设备会连接到 bridge。位于同一个 local network 的 Instance 会连接到相同的 bridge,这样 Instance 之间就可以通讯了。
因为 local network 没有与物理网卡相连,所以 Instance 无法与宿主机之外的网络通信。
同时因为每个 local network 有自己的 bridge,bridge 之间是没有连通的,所以两个 local network 之间是不通的。
ML2 配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini
type_drivers ML2 加载网络类型。
tenant_network_types 普通用户在自己的 Tenant(Project)中创建网络时,默认创建哪种 type 的网络。
tenant_network_types = vlan, local 意思是当没有 vlan 可创建时,使用 local。
检测 Neutron Agent 是否正常 管理员 --> 系统 --> 系统信息 --> 网络代理
从用户管理创建网络
创建网络 项目 --> 网络 --> 网络
填写网络名称
填写子网信息。 网关 IP 可以不用填写。默认为子网地址的第一个 IP。即:172.16.10.1
添加子网 IP 范围。
点击网络名称,进去相信信息,可以看到子网和端口信息等。
可以看到在端口中已经创建了一个 port,名为 “(c45b69e6-04ba)”,IP 为 172.16.10.2。连接设备为 "network:dhcp"。
打开控制节点终端,使用 brctl show 查看 linux bridge 的状态。
可以看到 bridge 设备 brqd2fd4378-9e 和 tap 设备 tapc45b69e6-04
创建 Instance 并选择刚刚创建的网络。
创建 Instance 成功后可以发现已经分配 IP 地址。
在底层中 Neutron 会在 subnet 中创建一个 port,分配 IP 和 MAC 地址,并将 port 分配给 test。如下图
点进去可以看到详情
在宿主机上执行 brctl show 可以查看 bridge 的配置。
可以看到 bridge brqd2fd4378-9e 上连接了一个新的 tap 设备。
查看 Instance 信息。使用 virsh list 查看 Instance 运行中的列表。
使用 virsh edit 1 查看配置信息。
配置信息省略很多。重要的放在上面。
<mac address='fa:16:3e:19:e1:57'/> 是 Instance 网卡的 MAC 地址
<target dev='tapb337d11f-54'/> 是 Instance 虚拟网卡信息
ping test1 的 IP 地址发现是可以 ping 通。
查看 brctl show
发现 brqd2fd4378-9e 中又计入进来一个 VIF,因为两个 VIF 挂载在同一个 Linux Bridge 上,所以可以通讯。
结构如下:
如果新分的 Instance 在计算节点中。不在控制节点。他们之间将不在互通。
因为 DHCP agent 在控制节点上运行,test2 在计算节点的 local 网络上,两者位于不同物理节点。由于 local 网络的流量只能局限在本节点之内,发送的请求无法到达计算节点。
上图 物理网卡 eth1 桥接到 brqXXXX,为 Instance 提供 flat 网络。
下图 创建多个 flat Network,就要准备多个物理机网卡。
在 /etc/neutron/plugins/ml2/ml2.conf.ini 配置文件中,修改 tenant_network_types 参数为 flat
:这里是指定普通用户使用 flat。因为 flat 网络与物理网卡一一对应。一般情况下租户网络不采用 flat。
flat_networks 定义一个 flat 网络,label 为 “default”
通过 physical_interface_mappings 指名 default 对应的物理网卡为 ens35
例如:对于 label 为 “default” 的 flat network,节点 A 可能使用 ens35,配置为:
而 B 节点则可以使用 ens33,配置为:
创建 flat 网络
绑定子网
查看 控制节点网络状态
Neutron 自动新建了 flat_net 对应的网桥 brq9e3013c8-93,以及 dhcp 的 tap 设备 tap50802894-1a。
此时 tap50802894-1a 和物理网卡 ens35 都已经连接到网桥 brq9e3013c8-93 上。
可以看到 Instance 的 tap 设备 tapc1241c3f-cb 已经连接到网桥
配置文件 /etc/neutron/dhcp_agent.ini 中的 dhcp_driver 和 interface_driver
dnsmasq 是一个提供 DHCP 和 DNS 服务的开源软件。
在实现环境中使用 ps 命令可以查看到 dnsmasq 进程。
DHCP agent 会为每个 network 创建一个目录 /opt/stack/data/neutron/dhcp/xxxx 用于存放该 network 的 dnsmasq 配置文件。
在二层网络上,VLAN 可以将一个交换机分割成几个独立的虚拟交换机。
类似,在三层网络上,Linux Network Namespace 可以将一个物理三层网络分割成几个独立的虚拟三层网络。
每个 namespace 都有自己独立的网络栈,包括 route table,firewall rule,network interface device等
Neutron 通过 dnsmasq 为每个 Network 提供单独的 DHCP 和路由服务。
使用 ip 查看所有 namespcae
使用 neutron 查看 net-list
查看某个 namespace 的详细配置
3 个 Instance 通过 tap 设备连接到名为 “vrqXXXX” 的 Linux Bridge。
在物理网卡 eth1 上创建 eth1.100 的 valn interface,eth1.100 连接到 brqXXXX。
这样,Instance 通过 eth1.100 发送到 eth1 的数据包就会打上 vlan100 的 tag。
如果在创建个 network vlan101,eth1 上就会相应的创建多个 vlan interface eht1.101 并连接新的 Linux Bridge “brqYYYY”。
配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini 中设置 tenant_network_types 的值为 vlan
配置 vlan 的范围
意思是:配置定义了 lable 为 “default” 的 valn network,valn id 的范围是 3001~4000。这里配置的是普通用户使用的范围。
admin 可以使用 1~4096 的 valn network
再次指定 vlan network 与物理网卡的对应关系
配置子网
查看系统网桥
这里可以看到:
vlan100 对应的网桥为 brq2b85ebb9-a。
vlan interface 是 ens35.100 (我是用的是 Ubuntu 16.04 默认网卡名 ens 开始的。)
DHCP 的 tap 设备是 tapf85d61d8-c3。
在 计算节点查看 网桥信息
可以发现创建的 Instance 已经连接到 vlan100 对应的网桥 brq2b85ebb9-a 上。因为计算节点没有 DHCP 服务所以没有相应的 tap 设备。
另外 网桥的名字与控制节点是一样的,都是 brq2b85ebb9-a6,表示是在同一个 network 上。
下图是我创建 VLAN 后 两台 Instance 分别在控制节点和计算机点的网络图
此时两台 Instance 在同一 valn100 下。相互之间是可以 ping 通的。
如果在创建一个 vlan101。如果两台 Instance1 和 Instance2 分别连在 vlan100 和 vlan101。此时两台 Instance 是不能 ping 通的。
如下图两个 vlan
两台 Instance1 和 Instance2 分别连在 vlan100 和 vlan101。此时两台 Instance 是不能 ping 通的。
因为 vlan 在二层是隔离的。如果想要互通,只能在三层通过路由转发。
⑤ 在linux中建立了一个网桥br0,绑定了端口eth0和tap0,tap0为啥抓不到和eth0一样的包
如果你需要linux中网络互通,能传输数据,就把网络设置成局域网,内网IP一样,使用NAT的模式,如果你想修改IP,建议你使用易通加速器来修改你每台电脑的本地网络,可以使用网桥,设置物理网卡IP
⑥ 如何配置linux下双网卡桥接
linux下双网卡配置桥接如下
首先,配置linux服务器端,将两张网卡配置成桥接模式:
在/etc/sysconfig/network-scripts/文件夹下创建ifcfg-br0桥接接口配置文件,内容如下:
[root@N3 network-scripts]# vi ifcfg-br0
# Broadcom Corporation NetXtreme BCM5722 Gigabit Ethernet PCI Express
DEVICE=br0-----桥接接口命名为bro
TYPE=Bridge-----类型桥接模式
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.1.222----这部分是配置桥接接口的管理ip(类似svi口的ip)和网关等等。
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
NETWORK=192.168.1.0
将两个接口加入桥接端口:
[root@N3 network-scripts]# vi ifcfg-eth0
# Broadcom Corporation NetXtreme BCM5722 Gigabit Ethernet PCI Express
DEVICE=eth4
BOOTPROTO=none
HWADDR=00:21:5E:47:31:98
ONBOOT=yes
BRIDGE=br0---加入桥接端口
IPV6INIT=no
PEERDNS=yes
NM_CONTROLLED=no
TYPE=Ethernet
USERCTL=no
[root@N3 network-scripts]# vi ifcfg-eth1
# Broadcom Corporation NetXtreme BCM5722 Gigabit Ethernet PCI Express
DEVICE=eth5
BOOTPROTO=none
HWADDR=00:21:5E:47:31:A0
ONBOOT=yes
BRIDGE=br0
IPV6INIT=no
PEERDNS=yes
NM_CONTROLLED=no
TYPE=Ethernet
USERCTL=no
配置完成后,需要重启设备后,网卡桥接才能生效。
其次,在linux下开启生成树协议:
到目前为此我们可以看到,如果linux端配置成桥接模式,而交换机端也没有开启生成树,整个网络是环路状态。
我们要在交换机端开启生成树:spanning-tree
同时在linux端也开启生成树协议,通过如下命令开启:
[root@SERVER2 ~]# brctl stp br0 on
可以通过如下命令查看linux服务器生成树状态:brctl showstp br0
交换机端查看生成树状态:show spanning-tree summary
可以看到交换机端端口GI0/50被block了,两端生成树都生效了。
至此Linux下双网卡桥接同时开启生成树保证网络拓扑不环路的方案就完成了。