【 Linux 網絡虛擬化 】Openvswitch


openvswitch:
    openvswitch: 開放的虛擬交換機,虛擬交換就是利用虛擬平台,通過軟件的方式形成交換機部件。跟傳統的物理交換機相比,虛擬交換機同樣具備眾多優點:
        1. 配置靈活;
        2. 成本更低

接下來通過openvswitch + netns 實現如下虛擬網絡架構:

    這里通過vmware來實現:

    系統:centos7.2 x64
    主機1 一張網卡,模式:僅主機模式
    主機2 兩張網卡,1: 模式:橋接模式;2: 模式:僅主機模式

    主機1:
        eno16777736: 192.168.190.128
    主機2:
        eno16777736: 192.168.190.130  eno33554992: 192.168.1.167

 

本文中所需附件下載:

鏈接:http://pan.baidu.com/s/1qYQ4BeO 密碼:4h4h

 

1、安裝Openvswitch,創建主機1的虛擬網絡

    Create the repository config file /etc/yum.repos.d/naulinux-extras.repo:

    [naulinux-extras]
    name=NauLinux Extras
    baseurl=http://downloads.naulinux.ru/pub/NauLinux/7/$basearch/Extras/RPMS/
    enabled=0
    gpgcheck=1
    gpgkey=http://downloads.naulinux.ru/pub/NauLinux/RPM-GPG-KEY-linux-ink

    Install openvswitch rpm package:

    # yum --enablerepo=naulinux-extras install openvswitch

安裝openvswith官方說的很清楚了 。

但是這里,我們的主機1是僅主機模式無法下載安裝。

這里直接使用下載好的rpm包安裝。

主機1配置:

# tar xf openvswitch.tar.gz
# rpm -ivh openvswitch/*.rpm
# systemctl start openvswitch ; systemctl enable openvswitch

創建虛擬交換機br-in
# ovs-vsctl add-br br-in

# ovs-vsctl show de08faca-8165-4fe7-88d9-459796b5deec Bridge br-in Port br-in Interface br-in type: internal ovs_version: "2.5.0"

創建port vx0,並且設置vx0的類型為vxlan,vxlan相關聯的對端主機是192.168.190.130(主機2)
# ovs-vsctl add-port br-in vx0 -- set interface vx0 type=vxlan options:remote_ip=192.168.190.130


ovs-vsctl show de08faca-8165-4fe7-88d9-459796b5deec Bridge br-in Port "vx0" Interface "vx0" type: vxlan options: {remote_ip="192.168.190.130"} Port br-in Interface br-in type: internal ovs_version: "2.5.0"

主機2配置:

# tar xf openvswitch.tar.gz
# rpm -ivh openvswitch/*.rpm
# systemctl start openvswitch ; systemctl enable openvswitch

創建虛擬交換機br-in
# ovs-vsctl add-br br-in

# ovs-vsctl show de08faca-8165-4fe7-88d9-459796b5deec Bridge br-in Port br-in Interface br-in type: internal ovs_version: "2.5.0"

創建port vx0,並且設置vx0的類型為vxlan,vxlan相關聯的對端主機是192.168.190.128(主機1)
# ovs-vsctl add-port br-in vx0 -- set interface vx0 type=vxlan options:remote_ip=192.168.190.128
# ovs-vsctl show e43bbb36-5e1f-4178-8dbc-a87bf11332ed Bridge br-in Port br-in Interface br-in type: internal Port "vx0" Interface "vx0" type: vxlan options: {remote_ip="192.168.190.128"} ovs_version: "2.5.0"

 

這樣兩台主機之間就建立其了vxlan的隧道傳輸。

2. 在主機1上創建虛擬機vm1

主機1配置:

# mkdir -pv /images/linux

通過xmanager將鏡像文件上傳到/images/linux目錄

# cp -a cirros-0.3.5-i386-disk.img vm1.img
# yum install libvirt libvirt-client qemu-kvm virt-install -y

這里要注意,用libvirt安裝虛擬機前,需要首先配置libvirt網絡,因為openvswitch和brctl是不兼容的,libvirt是無法自動發現的。

# cd /etc/libvirt/qemu/networks/
不需要默認nat模式
# mv default.xml default.xml_bak

創建br-in網絡
# vim br-in.xml
# vim br-in.xml 

<network>
    <name>br-in</name>
    <forward mode='bridge'/>
    <bridge name='br-in'/>
    <virtualport type='openvswitch'/>
</network>

# systemctl start libvirtd ; systemctl enable libvirtd
# virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 br-in                inactive   no            yes

啟動br-in網絡
# virsh net-start br-in
# virsh net-autostart br-in

創建vm1
# virt-install --name vm1 --ram 128 --vcpus=1 --disk path=/images/linux/vm1.img --network network:br-in,model=virtio --import --force --nographics --serial=pty --console=pty

 

3. 在主機2上實現netns

主機2配置:

首先將第二張做橋接。
# cd /etc/sysconfig/network-scripts/
# cp -a ifcfg-eno33554992 ifcfg-br-out
# vim ifcfg-eno33554992
修改如下:

TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eno33554992
UUID=2269e064-1260-426a-ba84-7d1c06e6ab0a
DEVICE=eno33554992
ONBOOT=yes
BRIDGE=br-out     # 主要添加這行

# vim ifcfg-br-out

TYPE=Bridge     # 修改類型
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=br-out     # 修改名稱
DEVICE=br-out     # 修改設備名
ONBOOT=yes
IPADDR=192.168.1.167
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=192.168.1.1

# systemctl restart network 

物理網卡此時就作為橋設備
# ifconfig eno33554992 
eno33554992: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:0c:29:d9:13:e7  txqueuelen 1000  (Ethernet)
        RX packets 270  bytes 28571 (27.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 23  bytes 2812 (2.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


br-out就作為本機的網卡通信
# ifconfig br-out
br-out: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.167  netmask 255.255.255.0  broadcast 192.168.1.255
        ether 00:0c:29:d9:13:e7  txqueuelen 0  (Ethernet)
        RX packets 194  bytes 15399 (15.0 KiB)
        RX errors 0  dropped 65  overruns 0  frame 0
        TX packets 10  bytes 676 (676.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

安裝bridge工具
# yum install bridge-utils -y
# brctl show
bridge name    bridge id        STP enabled    interfaces
br-out        8000.000c29d913e7    no        eno33554992

這樣,我們的物理橋設備就完成了,接下來創建netns虛擬網絡空間。

創建虛擬網絡空間為ns1
# ip netns add ns1
開啟本地回環網絡
# ip netns exec ns1 ifconfig lo up
打開網卡間轉發功能
# ip netns exec ns1 sysctl -w net.ipv4.ip_forward=1

我們需要創建兩張虛擬網卡,這里的虛擬網卡可以理解成網線。

如圖:

    就是圖中紅色的兩段。

首先將netns和openvswitch連接起來。

創建一對網卡,net-in是前半段,net-out是后半段,就像網線一樣,前半段我們接到openvswitch上,后半段接到netns上,這樣就在同一個網絡里面了

# ip link add net-in type veth peer name net-out
# ifconfig net-in up
# ifconfig net-out up

將net-in添加到openvswitch

# ovs-vsctl add-port br-in net-in
# ovs-vsctl show
e43bbb36-5e1f-4178-8dbc-a87bf11332ed
    Bridge br-in
        Port br-in
            Interface br-in
                type: internal
        Port net-in
            Interface net-in
        Port "vx0"
            Interface "vx0"
                type: vxlan
                options: {remote_ip="192.168.190.128"}
    ovs_version: "2.5.0"

將net-out添加到ns1中

# ip link set dev net-out name eth0 netns ns1

該網卡現在連接到了openvswitch上,配置和vm1中通網段的ip地址。

登錄上vm1主機

# ifconfig lo up
# ifconfig eth0 10.0.0.2 netmask 255.255.255.0 up

在主機2上配置:

# ip netns exec ns1 ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up
# ip netns exec ns1 ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=16.2 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=1.77 ms

現在主機1中的虛擬機vm1和netns虛擬網絡空間是互通了。

再次,創建一對網卡,net1-in是前半段,net1-out是后半段,就像網線一樣,前半段我們接到netns上,后半段接到br-out上,這樣就在同一個網絡里面了

# ip link add net1-in type veth peer name net1-out
# ifconfig net1-in up
# ifconfig net1-out up

將net1-in 添加到netns中
# ip link set dev net1-in name eth1 netns ns1
將net1-out 添加到br-out中
# brctl addif br-out net1-out

因為這里是和第二張物理網卡連接的,這張網卡直接對外網,所以netns 的第二張網卡需要配置主機同網段內地址。

# ip netns exec ns1 ifconfig eth1 192.168.1.130 netmask 255.255.255.0 up

為主機1中的vm1配置路由地址:

# ip route add default via 10.0.0.1
# ping 192.168.1.130
PING 192.168.1.130 (192.168.1.130): 56 data bytes
64 bytes from 192.168.1.130: seq=0 ttl=64 time=18.684 ms
64 bytes from 192.168.1.130: seq=1 ttl=64 time=1.212 ms

這樣,就說明vm1已經達到netns中的第二張對外的網卡上。

 

為netns配置路由地址並添加源地址轉發:

# ip netns exec ns1 ip route add default via 192.168.1.1
# ip netns exec ns1 iptables -t nat -A POSTROUTING -s 10.0.0.2/32 -j SNAT --to-source 192.168.1.130
# ip netns exec ns1 iptables -t nat -A PREROUTING -d 192.168.130/32 -j DNAT --to-destination 10.0.0.1

 

從vm1中ping公網地址:

# ping qq.com
PING qq.com (101.226.103.106): 56 data bytes
64 bytes from 101.226.103.106: seq=0 ttl=50 time=48.198 ms
64 bytes from 101.226.103.106: seq=1 ttl=50 time=49.612 ms

這樣我們就實現了內網主機中的虛擬主機訪問外網。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM