深入理解openstack之public network
在上一篇文章中,我們介紹了openstack中的路由,了解到openstack如何通過namespace實現(xiàn)的router將兩個 network連通。本文中,我們進(jìn)一步分析路由功能,說明實現(xiàn)內(nèi)部internal network和public network的路由(而不僅僅是internal network之間)。
我們還會分析neutron如何將浮動IP配置給虛擬機(jī),從而實現(xiàn)public network與虛擬機(jī)的連通。
Use case #5: Connecting VMs to the public network
所謂“public network”,指openstack部署環(huán)境以外的網(wǎng)絡(luò)。這個網(wǎng)絡(luò)可以是datacenter中的另一個網(wǎng)絡(luò)、internet、或者一個不被openstack控制的私有網(wǎng)絡(luò)。
與public network通信,我們需要在openstack中創(chuàng)建一個network并設(shè)置為public。這個network用于虛擬機(jī)與public network通信。虛擬機(jī)不能直接連接到這個新創(chuàng)建的屬性為public的network,所有網(wǎng)絡(luò)流量必須使用openstack創(chuàng)建的router 從private network路由到public network。在openstack中創(chuàng)建public network,我們只需要使用neutron net-create 命令,并將router:external設(shè)置為True。
在我們的例子中,public newtork叫做“my-public”。
- # neutron net-create my-public --router:external=True
- Created a new network:
- +---------------------------+--------------------------------------+
- | Field | Value |
- +---------------------------+--------------------------------------+
- | admin_state_up | True |
- | id | 5eb99ac3-905b-4f0e-9c0f-708ce1fd2303 |
- | name | my-public |
- | provider:network_type | vlan |
- | provider:physical_network | default |
- | provider:segmentation_id | 1002 |
- | router:external | True |
- | shared | False |
- | status | ACTIVE |
- | subnets | |
- | tenant_id | 9796e5145ee546508939cd49ad59d51f |
- +---------------------------+--------------------------------------+
在我們的環(huán)境中,控制節(jié)點的eth3是一個沒有綁定IP的網(wǎng)卡。我們使用它接入外部public network。因此我們將eth3加入OVS網(wǎng)橋"br-ex",Neutron會將虛擬機(jī)向外部網(wǎng)絡(luò)的發(fā)送的網(wǎng)絡(luò)包路由到這個bridge。
- # ovs-vsctl add-port br-ex eth3
- # ovs-vsctl show
- 8a069c7c-ea05-4375-93e2-b9fc9e4b3ca1
- .
- .
- .
- Bridge br-ex
- Port br-ex
- Interface br-ex
- type: internal
- Port "eth3"
- Interface "eth3"
- .
- .
- .
我們在eth3上創(chuàng)建了一個IP范圍是180.180.180.0/24的public network。這個public network存在于datacenter中,通過gateway 180.180.180.1可以連接到datacenter網(wǎng)絡(luò)。為了將這個網(wǎng)絡(luò)與Openstack環(huán)境相連,我們需要在“my-public"這個 network,上創(chuàng)建一個有相同IP范圍的subnet,并告訴neutron這個network的gateway。
- # neutron subnet-create my-public 180.180.180.0/24 --name public_subnet --enable_dhcp=False --allocation-pool start=180.180.180.2,end=180.180.180.100 --gateway=180.180.180.1
- Created a new subnet:
- +------------------+------------------------------------------------------+
- | Field | Value |
- +------------------+------------------------------------------------------+
- | allocation_pools | {"start": "180.180.180.2", "end": "180.180.180.100"} |
- | cidr | 180.180.180.0/24 |
- | dns_nameservers | |
- | enable_dhcp | False |
- | gateway_ip | 180.180.180.1 |
- | host_routes | |
- | id | ecadf103-0b3b-46e8-8492-4c5f4b3ea4cd |
- | ip_version | 4 |
- | name | public_subnet |
- | network_id | 5eb99ac3-905b-4f0e-9c0f-708ce1fd2303 |
- | tenant_id | 9796e5145ee546508939cd49ad59d51f |
- +------------------+------------------------------------------------------+
然后,我們需要將router接入我們新創(chuàng)建的public network,使用下列命令創(chuàng)建:
- # neutron router-gateway-set my-router my-public
- Set gateway for router my-router
注意:我們在兩種情況下使用術(shù)語“public network",一個是datacenter中真實的public network,為了區(qū)分我們把它(180.180.180.0/24)叫做"external public network"。另一個是openstack中我們使用的"public network",我們稱之為“my-public"的接口網(wǎng)絡(luò)。我們還涉及兩個”gateways“,一個是外部Public network用的gateway(180.180.180.1),另一個是router中的gateway接口(180.180.180.2)。
執(zhí)行上述的操作后,router上(之前已經(jīng)擁有兩個網(wǎng)絡(luò)接口,連接兩個不同的internal network)增加了第三個網(wǎng)絡(luò)接口(被稱作gateway)。router可以有多個網(wǎng)絡(luò)接口,連接普通的internal subnet或者作為gateway連入“my-public"網(wǎng)絡(luò)。一個經(jīng)常犯的錯誤是,試圖以通常網(wǎng)絡(luò)接口的方式接入public network,操作可能成功,但是卻并不能與外部網(wǎng)絡(luò)連通。在我們創(chuàng)建一個public network,subnet并接入router,網(wǎng)絡(luò)拓?fù)淇雌饋硎沁@樣的:
進(jìn)入router的namespace中,我們看到其中增加了一個180.180.180.0/24網(wǎng)段IP的網(wǎng)絡(luò)接口,IP為180.180.180.2:
- # ip netns exec qrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11 ip addr
- .
- .
- 22: qg-c08b8179-3b: mtu 1500 qdisc noqueue state UNKNOWN
- link/ether fa:16:3e:a4:58:40 brd ff:ff:ff:ff:ff:ff
- inet 180.180.180.2/24 brd 180.180.180.255 scope global qg-c08b8179-3b
- inet6 2606:b400:400:3441:f816:3eff:fea4:5840/64 scope global dynamic
- valid_lft 2591998sec preferred_lft 604798sec
- inet6 fe80::f816:3eff:fea4:5840/64 scope link
- valid_lft forever preferred_lft forever
- .
- .
在這里router的gateway地址180.180.180.2與虛擬機(jī)是聯(lián)通的,虛擬機(jī)可以ping到它。我 們也能從虛擬機(jī)ping到外部網(wǎng)絡(luò)的gateway180.180.180.1以及這個gateway所連的網(wǎng)絡(luò)。如果我們查看router namespace,發(fā)現(xiàn)iptables的NAT talbe中有以下兩行規(guī)則。
- # ip netns exec qrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11 iptables-save
- .
- .
- -A neutron-l3-agent-snat -s 20.20.20.0/24 -j SNAT --to-source 180.180.180.2
- -A neutron-l3-agent-snat -s 10.10.10.0/24 -j SNAT --to-source 180.180.180.2
- .
- .
因此,從net1或net2向外網(wǎng)發(fā)出的網(wǎng)絡(luò)包,其源IP地址會被修改為180.180.180.2。我們可以在虛擬機(jī)中ping外網(wǎng)的某個地址,看下請求包的IP地址是否是這個IP地址。
namespace中的路由表會把所有外部流量路由到外網(wǎng)的gateway(180.180.180.1)。
- # ip netns exec qrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11 route -n
- Kernel IP routing table
- Destination Gateway Genmask Flags Metric Ref Use Iface
- 0.0.0.0 180.180.180.1 0.0.0.0 UG 0 0 0 qg-c08b8179-3b
- 10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 qr-15ea2dd1-65
- 20.20.20.0 0.0.0.0 255.255.255.0 U 0 0 0 qr-dc290da0-0a
- 180.180.180.0 0.0.0.0 255.255.255.0 U 0 0 0 qg-c08b8179-3b
虛擬機(jī)中發(fā)出的流向public network的請求,會被NAT映射為源地址為180.180.180.2,然后發(fā)給public network的gateway。同樣,我們可以看到在namespace中ip forward功能是啟動的。
- # ip netns exec qrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11 sysctl net.ipv4.ip_forward
- net.ipv4.ip_forward = 1
Use case #6: Attaching a floating IP to a VM
現(xiàn)在,虛擬機(jī)可以訪問public network。下一步,我們嘗試允許外部客戶訪問Openstack環(huán)境中的虛擬機(jī),通過floating IP可以完成這個功能。 Floating IP由外部網(wǎng)絡(luò)提供,用戶可以將它設(shè)置給虛擬機(jī),從而允許外部客戶接入虛擬機(jī)。
創(chuàng)建Floating IP,***步是按照上一個usecase的講解,將虛擬機(jī)連入外部網(wǎng)絡(luò)。第二步時使用命令行,產(chǎn)生一個浮動IP。
- # neutron floatingip-create public
- Created a new floatingip:
- +---------------------+--------------------------------------+
- | Field | Value |
- +---------------------+--------------------------------------+
- | fixed_ip_address | |
- | floating_ip_address | 180.180.180.3 |
- | floating_network_id | 5eb99ac3-905b-4f0e-9c0f-708ce1fd2303 |
- | id | 25facce9-c840-4607-83f5-d477eaceba61 |
- | port_id | |
- | router_id | |
- | tenant_id | 9796e5145ee546508939cd49ad59d51f |
- +---------------------+--------------------------------------+
根據(jù)"my-public" network的能力,用戶可以創(chuàng)建很多這樣的IP。將浮動IP與虛擬機(jī)關(guān)聯(lián),可以通過命令行或者GUI完成。下圖是GUI的例子:
在router namespace中我們可以看到,新增加了3跳iptabales規(guī)則:
- 在router namespace中我們可以看到,新增加了3跳iptabales規(guī)則:
這些規(guī)則主要是對Floating IP進(jìn)行NAT操作。對于router收到的目的地址為180.180.180.3的請求,會被轉(zhuǎn)換成目標(biāo)地址為20.20.20.2。反之亦然。綁定Floating IP后,我們可以連接到虛擬機(jī)。需要確認(rèn)安全組規(guī)則已經(jīng)被設(shè)置,從而允許這樣連接:
- 這些規(guī)則主要是對Floating IP進(jìn)行NAT操作。對于router收到的目的地址為180.180.180.3的請求,會被轉(zhuǎn)換成目標(biāo)地址為20.20.20.2。反之亦然。
- 綁定Floating IP后,我們可以連接到虛擬機(jī)。需要確認(rèn)安全組規(guī)則已經(jīng)被設(shè)置,從而允許這樣連接:
這兩條規(guī)則,允許ping和ssh。
Iptables是一個復(fù)雜而強(qiáng)大的工具。如果想更好的理解iptables規(guī)則,可以查看iptables的幫助文件。
Summary
本文介紹了如何將openstack環(huán)境中的虛擬機(jī)與public network連通。通過namespace和routing table,虛擬機(jī)不僅能在openstack環(huán)境內(nèi)的不同網(wǎng)絡(luò)間實現(xiàn)消息路由,還能與外部網(wǎng)絡(luò)連通。
本 文是這個系列文章的***一篇。網(wǎng)絡(luò)是opesntack最復(fù)雜的部分,是理解openstack的一個關(guān)鍵。閱讀這四篇文章,對理解和分析 openstack各種網(wǎng)絡(luò)拓?fù)涫呛芎玫娜腴T。使用我們提到的這些內(nèi)容,可以更好的理解諸如Firewall as a service、Load Balance as a service、Metadata service這些網(wǎng)絡(luò)概念?;镜膶W(xué)習(xí)方式是,進(jìn)入namespace中,看究竟是如何利用Linux網(wǎng)絡(luò)能力實現(xiàn)這些功能的。
我們在最 開始說過,這些use case中我們只是使用了openstack眾多網(wǎng)絡(luò)配置方法的一種。我們的例子都是用了open vswitch 插件,可以獨(dú)立于網(wǎng)絡(luò)設(shè)備使用。通過與這里的例子對比,有助于分析其他的插件和功能。很多情況下,商業(yè)插件會使用open vswitch/bridges/namespace以及一些類似的方法和原理。
本系列文章的目的,在于讓大多數(shù)用戶了解 oepnstack網(wǎng)絡(luò)。文章中自下而上,使用一下簡單的usecase,試著分析了openstack network 的整個結(jié)構(gòu)以及如何工作的。與網(wǎng)上的其他一些資料不同,我們沒有介紹各種openstack網(wǎng)絡(luò)agent以及他們的功能,而是講了他們做什么以及如何做 的。下一步,你可以查閱這些資料,試著了解不同的agents是如何實現(xiàn)這些功能的。
原文出自:http://blog.csdn.net/halcyonbaby/article/details/41628891