① 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下雙網卡橋接同時開啟生成樹保證網路拓撲不環路的方案就完成了。