1. 程式人生 > >解除openstack中instance對IP的限制(在虛擬機器中飄VIP)

解除openstack中instance對IP的限制(在虛擬機器中飄VIP)

最近公司的幾個關鍵業務跑在openstack中的虛擬機器中,想把幾個虛擬機器做成負載均衡和高可用叢集。

對於負載均衡,G版本已經集成了haproxy外掛,對haproxy的配置做了一層封裝,可以很方便的通過quantum去建立一個負載均衡池,為相同或者不同宿主機上的虛擬機器提供負載均衡的能力。

在這個模式下,haproxy是執行在宿主機上的。

遺憾的是,目前還不能通過openstack做到haproxy的高可用。

想要做高可用,只能在虛擬機器中去飄VIP了

但是建立了虛擬機器之後,在這個虛擬機器例項中只能使用指定的IP。

這就導致想在虛擬機器中部署高可用去飄VIP是不可行的。

可以理解,在公有云環境下,是不可能讓使用者在虛擬機器中隨意去配置額外地址的。

但我們是私有云環境,這個規則對私有云環境下很是麻煩。

在openstack中建立虛擬機,通過nova boot的--nic選項指定網絡卡和IP地址:

--nic net-id=${NETWORK_ID},v4-fixed-ip=${Host_IP}

之前一直以為是iptables規則導致的。於是去看了一遍宿主機中的iptables規則

[email protected]:~# iptables -vnL

Chain INPUT (policy ACCEPT 3556K packets, 744M bytes)

pkts bytes target prot opt in out source destination

1778K 372M nova-compute-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

pkts bytes target prot opt in out source destination

150 13488 nova-filter-top all -- * * 0.0.0.0/0 0.0.0.0/0

6 1392 nova-compute-FORWARD all -- * * 0.0.0.0/0 0.0.0.0/0

Chain OUTPUT (policy ACCEPT 4208K packets, 567M bytes)

pkts bytes target prot opt in out source destination

4202K 567M nova-filter-top all -- * * 0.0.0.0/0 0.0.0.0/0

2106K 284M nova-compute-OUTPUT all -- * * 0.0.0.0/0 0.0.0.0/0

Chain nova-compute-FORWARD (1 references)

pkts bytes target prot opt in out source destination

4 1312 ACCEPT udp -- * * 0.0.0.0 255.255.255.255 udp spt:68 dpt:67

2 80 ACCEPT all -- brq3eefcd79-07 * 0.0.0.0/0 0.0.0.0/0

0 0 ACCEPT all -- * brq3eefcd79-07 0.0.0.0/0 0.0.0.0/0

Chain nova-compute-INPUT (1 references)

pkts bytes target prot opt in out source destination

2 656 ACCEPT udp -- * * 0.0.0.0 255.255.255.255 udp spt:68 dpt:67

Chain nova-compute-OUTPUT (1 references)

pkts bytes target prot opt in out source destination

Chain nova-compute-inst-15 (1 references)

pkts bytes target prot opt in out source destination

0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID

0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

0 0 nova-compute-provider all -- * * 0.0.0.0/0 0.0.0.0/0

0 0 ACCEPT udp -- * * 10.16.0.102 0.0.0.0/0 udp spt:67 dpt:68

0 0 ACCEPT all -- * * 10.16.0.0/24 0.0.0.0/0

0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 1:65535

0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 1:65535

0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0

0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 code 8

0 0 nova-compute-sg-fallback all -- * * 0.0.0.0/0 0.0.0.0/0

Chain nova-compute-inst-17 (1 references)

pkts bytes target prot opt in out source destination

0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID

0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

0 0 nova-compute-provider all -- * * 0.0.0.0/0 0.0.0.0/0

0 0 ACCEPT udp -- * * 10.16.0.102 0.0.0.0/0 udp spt:67 dpt:68

0 0 ACCEPT all -- * * 10.16.0.0/24 0.0.0.0/0

0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 1:65535

0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 1:65535

0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0

0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 code 8

0 0 nova-compute-sg-fallback all -- * * 0.0.0.0/0 0.0.0.0/0

Chain nova-compute-local (1 references)

pkts bytes target prot opt in out source destination

0 0 nova-compute-inst-15 all -- * * 0.0.0.0/0 10.16.0.111

0 0 nova-compute-inst-17 all -- * * 0.0.0.0/0 10.16.0.131

Chain nova-compute-provider (2 references)

pkts bytes target prot opt in out source destination

Chain nova-compute-sg-fallback (2 references)

pkts bytes target prot opt in out source destination

0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0

Chain nova-filter-top (2 references)

pkts bytes target prot opt in out source destination

2106K 284M nova-compute-local all -- * * 0.0.0.0/0 0.0.0.0/0

分析一下這些openstack自動生成的規則,可以看到input,forword和output鏈預設都是accept狀態。分析每條鏈對資料包的跳轉和過濾,如果在虛擬機器中配置新的地址,是不會被過濾的。

經過一番折騰,最終發現限制IP的原因是ebtables在起作用

[email protected]:~# ebtables -t nat -L

Bridge table: nat

Bridge chain: PREROUTING, entries: 2, policy: ACCEPT

-i tap0678bf1d-41 -j libvirt-I-tap0678bf1d-41

-i tap496fa038-9e -j libvirt-I-tap496fa038-9e

Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

Bridge chain: POSTROUTING, entries: 0, policy: ACCEPT

Bridge chain: libvirt-I-tap0678bf1d-41, entries: 4, policy: ACCEPT

-j I-tap0678bf1d-41-mac

-p IPv4 -j I-tap0678bf1d-41-ipv4-ip

-p ARP -j I-tap0678bf1d-41-arp-mac

-p ARP -j I-tap0678bf1d-41-arp-ip

Bridge chain: I-tap0678bf1d-41-mac, entries: 2, policy: ACCEPT

-s fa:16:3e:a6:5f:70 -j RETURN

-j DROP

Bridge chain: I-tap0678bf1d-41-ipv4-ip, entries: 3, policy: ACCEPT

-p IPv4 --ip-src 0.0.0.0 --ip-proto udp -j RETURN

-p IPv4 --ip-src 10.16.0.131 -j RETURN

-j DROP

Bridge chain: I-tap0678bf1d-41-arp-mac, entries: 2, policy: ACCEPT

-p ARP --arp-mac-src fa:16:3e:a6:5f:70 -j RETURN

-j DROP

Bridge chain: I-tap0678bf1d-41-arp-ip, entries: 2, policy: ACCEPT

-p ARP --arp-ip-src 10.16.0.131 -j RETURN

-j DROP

Bridge chain: libvirt-I-tap496fa038-9e, entries: 4, policy: ACCEPT

-j I-tap496fa038-9e-mac

-p IPv4 -j I-tap496fa038-9e-ipv4-ip

-p ARP -j I-tap496fa038-9e-arp-mac

-p ARP -j I-tap496fa038-9e-arp-ip

Bridge chain: I-tap496fa038-9e-mac, entries: 2, policy: ACCEPT

-s fa:16:3e:58:1:ac -j RETURN

-j DROP

Bridge chain: I-tap496fa038-9e-ipv4-ip, entries: 3, policy: ACCEPT

-p IPv4 --ip-src 0.0.0.0 --ip-proto udp -j RETURN

-p IPv4 --ip-src 10.16.0.111 -j RETURN

-j DROP

Bridge chain: I-tap496fa038-9e-arp-mac, entries: 2, policy: ACCEPT

-p ARP --arp-mac-src fa:16:3e:58:1:ac -j RETURN

-j DROP

Bridge chain: I-tap496fa038-9e-arp-ip, entries: 2, policy: ACCEPT

-p ARP --arp-ip-src 10.16.0.111 -j RETURN

-j DROP


ebtables是linux專門做二層資料鏈路層過濾的。

在通過nova建立虛擬機器後,會生成libvirt的一個xml配置檔案

路徑在:/etc/libvirt/nwfilter/nova-base.xml

裡面定義了以下規則,這些規則限制了在虛擬機器上的地址,在二層上就做了過濾

<filter name='nova-base' chain='root'>

<uuid>12ec8693-253a-7db0-7cd3-f8cc0a1e1b02</uuid>

<filterref filter='no-mac-spoofing'/>

<filterref filter='no-ip-spoofing'/>

<filterref filter='no-arp-spoofing'/>

<filterref filter='allow-dhcp-server'/>

</filter>

然後為每個虛擬機器建立一個xml檔案,每個虛擬機器的xml配置中包含了nova-base.xml中的配置

開啟其中一個虛擬機器的xml配置,可以看到,這個配置檔案中只放行了指定IP在二層上可以通過,所以其它手動配置的地址是不可用的。

cat /etc/libvirt/nwfilter/nova-instance-instance-0000000f-fa163e5801ac.xml

<filter name='nova-instance-instance-0000000f-fa163e5801ac' chain='root'>

<uuid>972d18be-2db0-4bf2-2853-a0a61beac036</uuid>

<filterref filter='nova-base'>

<parameter name='DHCPSERVER' value='10.16.0.102'/>

<parameter name='IP' value='10.16.0.111'/>

<parameter name='PROJMASK' value='255.255.255.0'/>

<parameter name='PROJNET' value='10.16.0.0'/>

</filterref>

</filter>

libvirt可以通過在這些xml配置的規則,去生成ebtables規則,最終是ebtables做出限制。

如何破解?

修改nova-base.xml檔案

註釋掉以下三行

<filterref filter='no-mac-spoofing'/>

<filterref filter='no-ip-spoofing'/>

<filterref filter='no-arp-spoofing'/>

然後重啟libvirt程序,libvirt會重新讀取xml中的配置,生成新的ebtables規則。

修改後,我通過新建虛擬機器,重啟nova-computer程序,或者直接重啟宿主機,這個base檔案都不會發生變化了。

還有就是修改nova原始碼(未測試)

原始碼位置在

/usr/lib/python2.7/dist-packages/nova/virt/libvirt/firewall.py

第198行(G版本中)

151457483.jpg

去掉no-mac-spoofing,no-ip-spoofing,no-arp-spoofing這三行,以後生成nova-base.xml檔案就可以不包含這3個選項了。

相關推薦

解除openstackinstanceIP限制虛擬機器VIP

最近公司的幾個關鍵業務跑在openstack中的虛擬機器中,想把幾個虛擬機器做成負載均衡和高可用叢集。 對於負載均衡,G版本已經集成了haproxy外掛,對haproxy的配置做了一層封裝,可以很方便的通過quantum去建立一個負載均衡池,為相同或者不同宿主機上的虛

kvm命令qemu-system-x86_64啟動虛擬機器過程記錄虛擬機器啟動虛擬機器、建立映象

1.環境:vmware workstation10、虛擬機器Ubuntu14.04、Centos7-1511; 後記:我的Mac筆記本裝的雙系統、我登入win10系統、安裝vmware workstation10、新建虛擬機器、安裝Ubuntu14.04作業系統、開機進入

Windows下搭建IOS開發環境虛擬機器VMware和VirtualBox

虛擬機器VMware內安裝Mac OS10.12系統安裝方式:安裝VMware並破解以增加對Mac OS的支援建立虛擬機器,載入預安裝映象初始化MacOS,設定語言和網路等;安裝VMware Tools元件下載:安裝流程:虛擬機器安裝......(省略)破解虛擬機器支援Mac

Ubuntn系統忘記密碼的解決方法虛擬機器下同樣處理

不知道你有沒有遇到過忘記了ubuntn系統密碼的情況,反正我都了,一段時間沒用就很容易忘記密碼的,此時無奈只能修改密碼了!下面分享一個簡單實用的方法: 版本號為: (我用的是V-BOX虛擬機器安裝的ubuntn作業系統) 1、重啟ubuntu系統,開機時長按shift按鍵進入GRUB選單,選擇第二個

JVM系列八虛擬機器效能監控命令.

## jps JVM Process Status Tool,顯示指定系統內所有的 HotSpot 虛擬機器程序。顯示資訊包括虛擬機器執行主類名稱以及這些程序的本地虛擬機器唯一ID(Local Virtual Machine Identifier,LVMID)。 ``` jps [-q] [-mlvV] []

Linux設定\修改IP地址

1. 如果要讓IP地址永久生效,需要編輯網絡卡配置檔案 使用VI編輯器設定,如 vi /etc/sysconfig/network-scripts/ifcfg-eth0 2. 說明一下這個檔案:DEVICE=eth0 網絡卡對應的裝置別名,如ifcfg-eth0第一塊網絡

虛擬機器Centos6網路配置固定IP

Centos在虛擬機器中安裝完之後,一般是不能訪問外網的,我們需要配置相關網路資訊。首先虛擬機器安裝完成之後,我們的介面卡選項中一般有幾個網路介面卡資訊,其中就包括兩塊虛擬網絡卡,分別是VMnet1和VMnet8,同時我們把目前上網的網絡卡設定為共享屬性,共享物件選擇VMne

淺析JS的模塊規範CommonJS,AMD,CMD http://www.2cto.com/kf/201411/348276.html

cpu 重要 mat 只有一個 targe () actor cti 最重要的 如果你聽過js模塊化這個東西,那麽你就應該聽過或CommonJS或AMD甚至是CMD這些規範咯,我也聽過,但之前也真的是聽聽而已。 現在就看看吧,這些規範到底是啥東西,幹嘛的。

uboot make xxx_config 的作用以make smdk2410_config為例

mdk nbsp xxx cpu clu samsung uboot 作用 頭文件 1、創建到目標板相關文件的鏈接 ln -s asm-arm asm ln -s arch-s3c24x0 asm-arm/arch ln -s proc-armv asm-arm/pr

Hadoop的配置過程虛擬的偽分布模式

關鍵字 系統默認 ati out source 網絡設置 道理 發包 啟動 1引言 hadoop如今已經成為大數據處理中不可缺少的關鍵技術,在如今大數據爆炸的時代,hadoop給我們處理海量數據提供了強有力的技術支撐。因此,了解hadoop的原理與應用方法是必要的技術知識。

android一些特殊字符如:←↑→↓等箭頭符號的Unicode碼值

lin gb2312 ring clu itl app lan orien lam 在項目中,有時候在一些控件(如Button、TextView)中要添加一些符號,如下圖所示: 這個時候可以使用圖片的方式來顯示,不過這

從給數組象去重看Javascript的reduce()

[] 一個數 true 新增 ava index filter 設有 指定 假設有這樣一個數組: let person = [ {id: 0, name: "小明"}, {id: 1, name: "小張"}, {id: 2, na

關於Yii2的MVC的視圖總結持續更新

gif pre lis frontend dbo register front reg open 一、首先在控制器中,將處理好的數據發送給前臺: $this->layout = ‘base‘; 這裏填寫視圖的模板文件(可以不寫這行代碼,如果不寫,默認為views/la

理解JS的模塊規範CommonJS,AMD,CMD

site 繼續 arr 包管理器 color sea 文件依賴 避免 說我   隨著互聯網的飛速發展,前端開發越來越復雜。本文將從實際項目中遇到的問題出發,講述模塊化能解決哪些問題,以及如何使用 Sea.js 進行前端的模塊化開發。 惱人的命名沖突   我們從一個簡單的習慣

如何在linux系統添加win10引導centos和win10雙系統

雙系統vim /boot/grub2/grub.cfg ####BEGIN /etc/grub.d/30_os-prober menuentry ‘Win10‘ { ##引導菜單顯示的名字set root=(hd0,1)

JAVA循環刪除list元素的方法總結跳格刪除問題解決

今天 src log 觸發 導致 spi als exceptio spa  印象中循環刪除list中的元素使用for循環的方式是有問題的,但是可以使用增強的for循環,然後今天在使用時發現報錯了,然後去科普了一下,再然後發現這是一個誤區。下面就來講一講。。伸手黨可直接跳至

JS正則象 RegExp有變量的時候使用,用來匹配搜索關鍵字標紅

() replace pla 匹配標簽 span sea var style his 1,平常我們寫js正則規則的時候,一般是這樣寫: var reg = /abc/; 然而,這樣寫的話,如果abc是一個變量這樣就不行,我們需要下面這種寫法: var abc =

網頁和自然語言處理的字符問題半角和全角

字符轉換 處理 unicode 指點 介紹 合並 圖片 十六進制 文本   先來看一個截圖,爬蟲得到的結果,裏面99的字體貌似有點奇怪,剛開始以為是不同的字體,在Excel裏選中調整字體時發現沒有變化,後來經過大佬指點,才知道是全角數字(原諒我小白無知)。為了統一起見,把所

SQL的條件判斷語句case when zhen if,ifnull用法

簡介: case具有兩種格式。簡單case函式和case搜尋函式。這兩種方式,可以實現相同的功能。簡單case函式的寫法相對比較簡潔,但是和case搜尋函式相比,功能方面會有些限制,比如寫判定式。還有一個需要注重的問題,case函式只返回第一個符合條件的值,剩下的case部分將會被自動忽略。

720. 詞典最長的單詞any()和all()的用法

any()是所有內容全是0,空,false才返回False。一旦有一個元素不是其中之一,就返回True。 all()是要求全部元素都不是0,空,false,一旦有一個元素是其中之一,就返回False。  python獲取最長單詞的方法:https://b