當前位置:
首頁 > 最新 > linux內核將用BPF給iptables「換心」

linux內核將用BPF給iptables「換心」

Linux內核社區最近發布了bpfilter,一個使用Linux BPF提供的高性能網路過濾內核模塊,用來替代netfilter作為iptables的長期支持的內核底層的實現,實現Linux用戶的無痛向BPF過渡的換心手術。

BPF可能我們比較生疏,但是我說起tcpdump、Wireshark等流行的網路抓包和分析工具你一定聽說並可能使用過,他們底層的包過濾實現就是用的BPF。所以他不是一個新的技術,也已經陪伴我們很久了。

目前,BPF已經成長為一個高度靈活的和豐富功能的框架,它可以以不犧牲系統性能和安全性為前提下,大幅度擴展Linux的功能。BPF強大的靈活性、穩定性和豐富的功能,使得業界翹楚比如谷歌,facebook和Netflix等Linux內核前瞻性大企業用戶紛紛對其伸出橄欖枝,用BPF來實現網路安全、負載均衡,還有性能監控、故障排查等大量的用途。 Netflix的Brendan Gregg首先稱其為Linux的BPF Superpowers。

本文將介紹這些大企業實踐中由於如何超負荷使用iptables內核子系統,從而導致的冗餘、性能低下等問題,以及新內核如何利用新特性優雅地從底層解決這些問題。

在過去15年類,Linux內核社區構建了很多內核子系統,包括TPC/IP棧,iptables(netfiter)等等,在此過程中我們也看到了BPF一步步發展、成長、壯大。現在內核的新轉變讓我們意識到了BPF不僅僅是另一個功能,而是代表了一個根本的技術轉型,它將及時改變Linux從網路到安全的各個方面。從iptables到bpfilter的轉變,只是BPF為振興Linux網路棧領域,使其更現代化的重要一步。為了解釋為什麼會有這激動人心的一步轉變,首先我們介紹下內核中iptables的歷史演變。

iptables及順序過濾的起源

多年來iptables一直是Linux上實現防火牆和網路數據包過濾器的最主要的工具。從最初的ipchains,很多linux老司機最初可能都接觸ipchains,他是iptables前身,是在linux 內核 2.2.10引入。然後是在2001年linux內核版本2.4.0開始引入了iptables。從此,多少年一來,iptables一直給用戶帶來了便利和麻煩兩重天。一方面享受的靈活性和快速修復。另一方面,又為了在調試5000條沉沉的過濾規則而犯難,想為此罵娘。

在業界有一句笑話:"在任何團隊,你都的需要一個坦克(武力輸出),一個治療師(奶媽),一個傷害輸出(DPS),一個擁有控制群眾能力的人(會長),還要一個知道iptables的人"。

當iptables在20年前取代其前身ipchains時,開始其生命周期時,防火牆功能的範圍還很簡單明確:

保護本地應用程序免受不需要的網路通信(INPUT鏈)

保護本地應用程序發送不需要的網路通信(OUTPUT鏈)

過濾由Linux系統(FORWARD鏈)轉發/路由的網路流量。

那時後網路速度很慢,日子過的很慢。還記得用宿舍用Modem,201卡撥號情形么?那是iptables最初被設計和開發的時代。

用iptables實現訪問控制列表(ACLs)的標準做法是使用連續的規則列表,即每個接收或發送的網路數據包都要逐一與規則列表進行匹配,直到匹配或者全不匹配。

然而,逐行的處理有明顯的缺陷:過濾數據包的成本,隨著添加的規則數量線性增加。

權衡處理:ipset

一段時間過去了,網路速度開始提高了,iptables的設置規則,也從十幾條增加到數千條規則。從性能和延遲角度來看,遍歷順序的iptables列表已經變得不可忍受。

社區很快發現了瓶頸所在:長長的規則列表要麼拒絕,要麼允許單獨的IP地址和埠組合。為此引進了ipset對IP地址進行管理。 ipset允許將與IP地址和埠組合存儲到散列表中,在iptables只需引用ipset中的散列的鍵名就可以,極大的減少iptables規則的數量,而且ipset散列中的IP地址信息常駐內存,匹配非常快。但這也只是"頭疼醫頭,腳疼治腳"的治表不治本的暫時權衡之策。

更不幸的是,ipset還不能適用於所有情況。近些年,隨著容器技術的崛起,一個明顯的問題是kube-proxy,他是Kubernetes的一個組件,容器要使用iptables和-j DNAT規則為服務提供負載均衡。它要為為每個後端服務要添加多條iptables規則。對於添加到Kubernetes的每個服務,要遍歷的iptables規則列表呈指數增長。

最近的KubeCon議題中詳細研究kube-proxy的性能表現細節。研究結果顯示,隨著服務數量的增長,網路延遲和性能下降無法估量。還披露了iptables的另一個主要缺點,無法實現增量更新。每次添加新規則時,必須更新整個規則列表。結果是對2萬個Kubernetes服務16萬條的iptables規則,裝配這些規則需要耗時5個小時。

使用基於IP/埠的機制一般還有許多其他明顯的缺點,特別是在容器應用環境下。容器需要經常部署和刪除。這可能導致個別IP地址的使用快速變化。一個IP地址可能被一個容器使用幾秒鐘,然後在幾秒鐘之後會換到一個容器使用。這使得依靠使用IP地址進行安全過濾的系統受到壓力,因為集群中的所有節點都必須始終知道最新的IP到容器的映射。雖然在一個集群內部這幾乎沒有什麼難度,但它在如果在分散式的跨集群應用中就會很有挑戰性。關於這些這兒不在贅述,可以參考docker,k8s等相關的官方文檔。

BPF的興起

近年來,BPF一直以瘋狂的速度發展,這次內核將其內置的變化,給BPF可自由飛翔的翅膀,給它帶來強大功能和高效的可編程性。以前需要自定義內核開發和重新編譯內核的任務現在可以通過高效BPF程序在BPF沙箱安全邊界內的來實現。

下面的列出了BPF在各種項目和公司使用實例:

Cilium, 是BPF在容器領域的鋒芒初現,提供強大而高效的網路,安全,以及3-7層的負載均衡。

Facebook公司用BPF/XDP負載均衡架構取代了IPVS。該架構還支持緩解DDoS邏輯。儘管與iptables相比,IPVS是一個不錯的進步,Facebook則更進了一步從IPVS轉移到BPF,使其性能提高了10倍。eBPF性能非常誘人,社區中有人用XDP編寫的一個簡單的入口防火牆就可以輕鬆實現每秒處理1100萬個數據包的性能。

Netflix,特別是Brendan Gregg,一直利用BPF的功能進行性能分析和跟蹤。bbc(github /iovisor/bcc)項目為用戶提供了訪問BPF的介面。例如,可用於生成令神奇的火焰圖:

谷歌,一直致力於bpfd,可使用eBPF實現強大的Linux跟蹤遠程目標。基於BPF的上游參與,他們也在考慮將各種內部項目都遷移到BPF。

Cloudflare正在使用BPF來緩解DDoS攻擊,並發布了多篇博文,並就該主題進行了多次公開演講。

Suricata是一個入侵檢測系統 (Intrusion Detection System,IDS),項目開始使用BPF和XDP來替換老的基於iptables的來監聽數據的nfqueue的基礎架構。

Open vSwitch一直在使用eBPF驅動的數據路徑。

還有大量例子,限於篇幅在此不在多列,可以參考BPF官方指南列表(github:cilium/ )

用BPF統一一切

BPF革命性開發的新進展更令人興奮,即通過用戶完全透明的方式用BPF完全替換iptables的內核部分(netfiter),即現有iptables客戶端和庫無需任何改動。

感興趣的同學可以去linux 內核郵件列表中找到相關的討論。該提案由Daniel Borkmann(Covalent),網路維護部分由David Miller(Red Hat)和Alexei Starovoitov(Facebook)撰寫。

Quentin Monnet在FRnOG 30上提供的以下圖表顯示了與iptables和nftables相比較bpfilter的一些早期測試結果。該結果顯示了僅僅通過BPF軟體實現以及空載硬體的對比測試:

這些早期的測試數據展示了令人乍舌的性能優勢,也是BPF強大的一個實例。我們唯一要注意的是bpfilter和BPF本身並不能解決由iptables使用順序過濾引起的性能問題,要徹底解決這個問題必須使用BPF底層內核及原生的BPF應用,關於BPF原生應用可以關注Cilium項目。

內核社區響應?

Linux內核郵件列表歷來以簡單粗暴、火藥味濃而聞名。那麼在用BPF替換iptables這件事情上,社區吵炸裂了么?沒有,實際上,社區反應很平靜和積極。核心iptables維護人員立即給BPF提出了建設性的建議。

Florian Westphal提出了一個運行在bpfilter上框架,通過框架並將nftables轉換為BPF。框架允許保持特定領域nftables語句,而且還可以帶有JIT編譯器,硬體卸載和工具集等BPF運行時的所有優點。

Pablo Neira Ayuso似乎一直在研究類似的提案,並發表了一系列將nftables翻譯成BPF的系列文章。和Florian Westphal方法的主要區別是Pablo打算將翻譯操作放到內核中。任何需要注入BPF的程序都必須通過用戶空間進行,並通過BPF驗證程序來保證BPF的安全行為。

概要

BPF是很多年以來Linux開發出來最令人興奮的特性。我們幾乎沒有錯過任何發揮最大潛力的機會,它仍在不斷發展進化。用BPF替換iptables的內核部分是合乎邏輯的第一步。真正的轉變將是BPF原生工具以及背離傳統的IP地址/埠為中心的基礎架構徹底更換,但是萬里長城要一步一步的走,而不是一口氣吃個胖子,導致消化不良,三高啥的!你說呢?


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 蟲蟲搜奇 的精彩文章:

2018 10佳Linux桌面環境
破解Windows掃雷遊戲

TAG:蟲蟲搜奇 |