keepalived vip ping不通_【干貨分享】OpenStack LVS負載均衡為什么不通?

a0c027336ed617712521fd22b71778db.png

f7bc4ec74e8ae8357d9934ac3f03a764.png

OpenStack環境Neutron 的安全組會向虛擬機默認添加?anti-spoof?的規則,將保證虛擬機只能發出/接收以本機Port為原地址或目的地址(IP、MAC)的流量,提高了云的安全性。但是LVS等需要綁定VIP的場景,默認流量是被攔截的。需要做allow pairs設置才能放通流量。

02

業務拓撲

36400c4f4b4056491b386911daae8e80.png

● Director Server分發器

VIP:xx.xx.xx.241

內網IP 主xx.xx.xx.5

? ? ? ? ? ? 備xx.xx.xx.7

Keepalived配置文件路徑 /etc/keepalived/keepalived.conf

● 真實服務器RS關閉ARP,并添加lo:0 IP為VIP

內網(專網)IP xx.xx.xx.8?? xx.xx.xx.10

? ? ? ? ? ? ? ? ? ? ? xx.xx.xx.11 ??xx.xx.xx.13

以上六臺虛擬機都對VIP做過allowed_address_pairs(僅對VIP做的,后面會詳述)。

03

問題現象

配置了LVS的DR模式,配置完成后Client ping VIP可以通,但是發送HTTP請求,沒有反應。抓包發現,Director收到了Client的報文,但是RS沒有收到HTTP請求,只有VRRP報文。

04

排除過程

4.1懷疑是LVS配置問題

1a0e3d7bfa6549f3b1b89010e171e236.png

Client能ping通VIP,CURL VIP沒響應,LVS 處在SYN_RECV狀態,抓包發現,LB端有進來的VIP報文,RS沒有。問題應該是LB端發不出去,或RS收不到報文。

結果

反復檢查keepalived和RS配置,沒有問題。同樣的配置在非openstack上跑,可以跑通。排除配置問題。

4.2?懷疑是宿主機防火墻問題

4.2.1 懷疑是宿主機本地防火墻規則問題

在查看宿主機防火墻cat /etc/sysconfig/firewalld的時候,發現有一條規則影響業務,注掉并重啟防火墻就可以跑通業務。

88bafdfb4ba8f50c9ca7bef4b3e24332.png

重啟宿主機iptables后:

72ce1b516448b3b24062ccbc95afae4a.png

結果

其實并不是這個問題,是重啟防火墻之后,啟用了本地防火墻規則,把原先Neutron的防火墻規則沖掉了,iptables幾乎都空了,所以業務感覺通了。等Neutron同步規則后,還是會不通。

4.2.2懷疑是虛機防火墻問題

一開始出現不通的時候, iptables -F清空虛機里面的iptables規則,發現并沒有實質作用

還是必須重啟宿主機的iptables。

虛機iptables規則:

53ca4d5394d63a38d04ba4276be7ab35.png

結果

其實虛機的iptables已經幾乎沒有規則了,也并沒有影響業務的條目。重啟宿主機iptables通,實則還是上一個問題,把宿主機本地Neutron的iptables規則給沖了。

4.2.3懷疑是Neutron安全組問題

后期排查主要是在Neutron安全組方向。必現的場景是,在刪除增加后端或者重啟Neutron-openvswitch-agent的時候,業務就不通了。

● 嘗試分別對LVS節點(xx.xx.xx.5、xx.xx.xx.7)和RS節點(xx.xx.xx.8、xx.xx.xx.10、xx.xx.xx.11、xx.xx.xx.13)做了allow_pairs,但是業務不通。

Dump宿主機防火墻的時候,發現如下規則:

69683e98062bfed5ddbbba6540b70295.png

這些條目出現的原因是對Port和VIP做了allow_pairs綁定。會生成對應條目的iptables。由Chain ID追溯,是Neutron-openvswi-FORWARD規則,屬于虛機Port轉發鏈規則,問題應該就是出在這邊。

● 嘗試對LVS的Port加了80端口的放通規則后,業務通了:

bb1d6736957dd533a2cce5724e8fdd0f.png

結果

確實是安全組導致iptables把流量給drop了,有多個辦法可以規避這個問題:

● 在iptables對應子鏈加規則放行。但是在界面更新或’neutron-openvswitch-agent’重啟的時候,Neutron重新下發規則,會刷掉本地手動加的規則,不可以完全保證業務不通。

● 把端口的port-curity-enable設置成false,但是安全組不再生效

● 寫腳本探測iptables重載,再添加規則。但是規則沒有添加的瞬間,也會出現業務短時間斷的情況。

●? 在’neutron-openvswitch-agent’里添加規則放行,但是需要修改Agent,太麻煩。

●??在安全組設置這個規則,但是沒找到相應的入口。

05

解決方案

5.1 LVS DR模式模型原理

5fe4801939ff4655c228822e532ca247.png

DR模式的工作過程

●??Client 發送Request包到LB服務器的VIP上

●??負載均衡服務器根據VIP選擇對應的RS。然后修改報文目的MAC為RS的MAC地址,將Client的請求發給RS

●??被選擇的RS把應答包直接傳給Client

5.2 問題根本原因

上面的DR模式過程可以看出,LVS轉發過程中不修改IP,只修改DST MAC,Source IP沒變。而由上面的截圖可以看出,allow_pairs在iptables里是用一組IP和MAC的組合規則來放通流量。所以只綁定VIP為allow_pairs,實際是VIP和自己網卡的MAC的規則,而目的MAC在經過LVS的時候已經被修改成后端MAC了,流量自然就過不去。而VRRP報文能出去的原因是IP和MAC都是本機的,在iptables里。

5.3 解決辦法

● 負載均衡器設置

1. 一種辦法,因為Client的CIP是任意的,負載均衡器需要轉發Source IP為CIP的報文,所以可以讓allow_pairs綁定IP為0.0.0.0/0,讓所有的IP可以從Director出去。原理是放開了基于本機MAC的所有IP報文。如:neutron port-update port_id --allowed-address-pairs type=dict list=true ip_address=0.0.0.0/02. 另一種辦法,負載均衡器修改的目的MAC是后端服務器的,可以把后端服務器的MAC都加到allow_pairs。如果MAC不確定的情況,直接設成0:0:0:0:0:0,放開所有的MAC。如:neutron port-update port_id --allowed-address-pairs type=dict list=true ip_address=$VIP mac_address=$RSMAC● 后端設置因為RS需要轉發Source IP為VIP的報文,所以應該對RS對應PORT 做放開VIP的allow_pairs。如:neutron port-update port_id --allowed-address-pairs type=dict list=true ip_address=$VIP

添加后的iptables會出現如下的規則:

f8a32597871e9013c445495409282e83.png

問題解決

5.4 可能出現的安全問題

因為上述規則實際上是放開了對應虛機的流量限制,DR模式可以讓任意IP或者MAC能訪問VIP,流量從LVS節點透傳過來,這個對虛機和應用的安全性會有一定的隱患,這里有幾條安全建議:

1.搭建前端硬件防火墻

2.虛機操作日志記錄,權限管理

3.虛機安裝安全軟件

4.虛機arp_announce設置成2(總是使用最合適的網卡來響應)

5.虛機iptables設置,只允許VRRP和對應TCP+PORT的規則

6.更換NAT/TUNNEL/FULLNAT,可以做內外網隔離的模式

06

總結

LVS的特點是需要在Port添加VIP,內部去進行地址的轉換,再發給后端。單純在iptables層去修改問題,還是會被Neutron刷新。可以在安全組里面去修改,也可以在Neutron命令行設置,才能保證設置持久化,不會出現iptables被刷新的問題。

OpenStack的網絡環境iptables規則比較復雜,出現問題的時候,應該在iptables找到自己的IP:Port,NIC Dev ID, 子Chain ID,向上追溯屬于哪條鏈、哪個表,再結合網絡拓撲和業務場景去規劃和設置確定問題在哪。

單純考慮到VIP是不夠的。類似問題解決辦法不是一成不變的,除了剛才提到的,還有多種辦法,可以關閉Port安全組,也可以在安全組添加條目,或者修改agent代碼關閉Port的firewall或者添加accept條目等等,方法有很多,需要權衡利弊根據需求選擇。

End

往期推薦

【干貨分享】|??深度解析python之生成器

【干貨分享】|??大云彈性計算產品BC-EC全面支持跨版本升級

【干貨分享】|??為啥熱遷移總是斷網呢?

39386933a1eaebc40ccfc54f431d55f1.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396864.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396864.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396864.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker安裝ssh,supervisor等基礎工具

2019獨角獸企業重金招聘Python工程師標準>>> Docker安裝ssh,supervisor等基礎工具 需要提前下載好官方的ubuntu鏡像,我這里使用的是ubuntu:14.04版本,這里安裝了一些基礎的工具ssh,curl,wget,vi…

中南大學 oracle試卷,數據庫原理期末復習(中南大學)數據庫原理、技術及應用2.ppt...

2014 春季 信息11,12 DB P,T&A-張祖平 數據庫原理、技術及應用 張祖平/Zhang Zuping 電子信息工程系 School of Information Science and Engineering,Central South University , zpzhangmail.csu.edu.cn 本章小結 關系模型中的相關概念 關系(集合),性質&#…

Pandas時間差(Timedelta)

時間差(Timedelta)是時間上的差異,以不同的單位來表示。例如:日,小時,分鐘,秒。它們可以是正值,也可以是負值。可以使用各種參數創建Timedelta對象,如下所示 - 字符串 通過傳遞字符串&#xff0…

nginx集群_windows環境下搭建簡單Nginx+Tomcat集群

通俗點將,負載均衡就是因為訪問流量太大,導致項目訪問不流暢、甚至宕掉,所以通過一種分流的方式來緩解這種情況。一、 工具nginx-1.8.0apache-tomcat-6.0.33二、 目標實現高性能負載均衡的Tomcat集群:三、 步驟1、首先下載Nginx&a…

顏色傳感器TCS230及顏色識別電路(轉)

摘要 TCS230是美國TAOS公司生產的一種可編程彩色光到頻率的傳感器。該傳感器具有分辨率高、可編程的顏色選擇與輸出定標、單電源供電等特點;輸出為數字量,可直接與微處理器連接。文中主要介紹TCS230的原理和應用,以及色光和白平衡的知識&…

自定義對話框 提示:Unable to add window token null is not for an application

這是因為在new Dialog(context);的時候傳入的context是通過getApplicationContext()獲得的,這樣就會報錯。 把context的獲得方式改為MainActivity.this就好了。 轉載于:https://www.cnblogs.com/qlong8807/p/5167560.html

[51Nod 1218] 最長遞增子序列 V2 (LIS)

傳送門 Description 數組A包含N個整數。設S為A的子序列且S中的元素是遞增的,則S為A的遞增子序列。如果S的長度是所有遞增子序列中最長的,則稱S為A的最長遞增子序列(LIS)。A的LIS可能有很多個。例如A為:1 3 2 0 4&#…

linux如何全局搜索目錄,Linux 全目錄全文搜索

文件內容搜索1grep -r root /home/ray/dev/media/wyquery/*通過這種方法來尋找數據庫配置文件的目錄其他$ grep “被查找的字符串” 文件名例子:在當前目錄里第一級文件夾中尋找包含指定字符串的.in文件grep “thermcontact” */*.in從文件內容查找與正則表達式匹配…

mysql命令行導入和導出數據

首先打開命令窗口,輸入命令:mysql -h localhost -u selffabu -p 連接成功后,進行下面的操作 MySQL中導出CSV格式數據的SQL語句樣本如下: Sql代碼select * from test_info into outfile /tmp/test.csv fields terminated by , optionally enclosed by " esc…

Python 拷貝對象(深拷貝deepcopy與淺拷貝copy)

http://www.jb51.net/article/15714.htm 1. copy.copy 淺拷貝 只拷貝父對象,不會拷貝對象的內部的子對象。2. copy.deepcopy 深拷貝 拷貝對象及其子對象 一個很好的例子: 1 import copy2 a [1, 2, 3, 4, [a, b]] #原始對象3 4 b a #賦值&#xff0c…

7.組件連線(貝塞爾曲線)--從零起步實現基于Html5的WEB設計器Jquery插件(含源碼)...

上節講到如何創建組件,清除設計器視圖,以及設計視圖的持久化和恢復,本節將重點講如何實現組件間的連線,前面章節有提到為了方便從持久化文件中恢復,組件和連線是分別存放的:nodes和lines對象,兩…

linux bind命令,LINUX命令bind-系統管理-顯示或設置鍵盤按鍵與其相關的功能

bind命令 用于顯示和設置命令行的鍵盤序列綁定功能。通過這一命令,可以提高命令行中操作效率。您可以利用bind命令了解有哪些按鍵組合與其功能,也可以自行指定要用哪些按鍵組合。語法bind(選項)選項-d:顯示按鍵配置的內容;-f&…

定位排查工作流的計算結果數據量不符合預期的方法

近期有發現一些用戶在咨詢,為什么數據從數據源出來后,經過了一些計算,結果不符合預期了。最常見的是說,為什么我的數據在Mysql里有xx條,怎么到MaxCompute里算了下結果變了。因為這是兩個不同的系統,我們又沒…

canvas 插件_基于canvas的JavaScript 二維碼生成工具——QRCanvas

介紹在我們日常的開發中,特別是在現代的社會環境下,二維碼的應用可謂是豐富多彩,各種各樣讓人眼花繚亂的二維碼,可見二維碼已經滲透進我們生活的方方面面,也可以說目二維碼確確實實方便了我們的生活。因為作為開發人員…

spring cloud feign 上傳文件報not a type supported by this encoder解決方案

上傳文件調用外部服務報錯: not a type supported by this encoder 查看SpringFormEncoder類的源碼: 1 public class SpringFormEncoder extends FormEncoder2 {3 4 public SpringFormEncoder()5 {6 this(((Encoder) (new feign.codec.…

counter 計數器

包含了兩個屬性和一個方法: 1. counter-reset2. counter-increment3. counter()/counters()counter-reset(主要作用就是給計數器起個名字。如果可能,順便告訴下從哪個數字開始計數。默認是0):.xxx { counter-reset: sm…

linux中的變量文件路徑,Linux庫文件和Shell可執行程序命令文件搜索路徑變量的設置...

一、庫文件的搜索路徑:1、在配置文件/etc/ld.so.conf中指定動態庫搜索路徑(需要添加其它庫文件的路徑,在文件的最后添加具體的路徑即可 [ 如:/usr/local/lib ],添加后保存退出,然后在命令行ldconfig2、通過環境變量LD_…

消息隊列NetMQ 原理分析2-IO線程和完成端口

目錄 前言介紹目的IO線程初始化IO線程Proactor啟動Procator線程輪詢處理socketIOObject總結前言 介紹 [NetMQ](https://github.com/zeromq/netmq.git)是ZeroMQ的C#移植版本,它是對標準socket接口的擴展。它提供了一種異步消息隊列,多消息模式,消息過濾(訂閱&#xf…

django——url(路由)配置

URL是Web服務的入口,用戶通過瀏覽器發送過來的任何請求,都是發送到一個指定的URL地址,然后被響應。 在Django項目中編寫路由,就是向外暴露我們接收哪些URL的請求,除此之外的任何URL都不被處理,也沒有返回。…

VC連接mysql數據庫錯誤:libmysql.lib : fatal error LNK1113: invalid machine 解決方法

VC連接MySQL的配置過程在上一篇博文中,不過當你設置好,以為萬事大吉的時候,運行卻出現這個錯誤:libmysql.lib : fatal error LNK1113: invalid machine type。 無效的機器類型,真的是很讓人捉急。 發生這個錯誤的原因是…