負載均衡器 OpenELB ARP 欺騙技術解析

作者:大飛哥,視源電子運維工程師,KubeSphere 用戶委員會廣州站站長,KubeSphere Ambassador。

K8s 對集羣外暴露服務有三種方式:NodePort,Ingress 和 Loadbalancer。NodePort 用於暴露 TCP 服務 (4 層),但限於對集羣節點主機端口的佔用,不適合大規模使用;Ingress 用於暴露 HTTP 服務 (7 層),可對域名地址做路由分發;Loadbalancer 則專屬於雲服務,可動態分配公網網關。

對於私有云集羣,沒有用到公有云服務,能否使用 LoadBalancer 對外暴露服務呢?

答案當然是肯定的,OpenELB 正是爲裸金屬服務器提供 LoadBalancer 服務而生的!

應用安裝與配置

安裝 OpenELB

參考官方安裝文檔 [1]

$ kubectl apply -f https://raw.githubusercontent.com/openelb/openelb/master/deploy/openelb.yaml

添加 EIP 池

EIP 地址要與集羣主機節點在同一網段內,且不可綁定任何網卡;

apiVersion: network.kubesphere.io/v1alpha2
kind: Eip
metadata:
  name: eip-sample-pool
  annotations:
    eip.openelb.kubesphere.io/is-default-eip: "true"
spec:
  address: 192.168.0.91-192.168.0.100
  protocol: layer2
  interface: eth0
  disable: false

配置 Service 爲 LoadBalancer

把 Service 類型修改爲 LoadBalancer,同時 annotations 中添加如下三行:

lb.kubesphere.io/v1alpha1: openelb
protocol.openelb.kubesphere.io/v1alpha1: layer2
eip.openelb.kubesphere.io/v1alpha2: layer2-eip

總體配置清單如下:

kind: Service
apiVersion: v1
metadata:
  name: layer2-svc
  annotations:
    lb.kubesphere.io/v1alpha1: openelb
    protocol.openelb.kubesphere.io/v1alpha1: layer2
    eip.openelb.kubesphere.io/v1alpha2: layer2-eip
spec:
  selector:
    app: layer2-openelb
  type: LoadBalancer
  ports:
    - name: http
      port: 80
      targetPort: 8080
  externalTrafficPolicy: Cluster

Layer2 模式中的黑客技術

ARP 欺騙技術: 應用程序主動回覆路由器 ARP 請求,讓路由器以爲該應用是合法終端,從而劫持網絡流量包。

OpenELB 正是利用 ARP 欺騙技術,從而獲取路由器流量,再由 kube-proxy 將流量轉發到 Service 網絡。OpenELB Layer2 模式需要配置 EIP,如上圖所示的 EIP 爲 192.168.0.91

當請求 EIP 地址時,路由器會在局域網內發起 ARP 協議廣播,哪個終端設備響應,就把數據包發送給誰;配置 EIP 時有要求,EIP 地址不能綁定任何網卡,也就是說正常情況下,不會有任何物理硬件設備響應。此時的 OpenELB,就趁虛而入,捕獲到 ARP 廣播信息後,對路由器廣播進行響應,把自己僞裝成終端設備。OpenELB 獲得流量後,再經由 kube-proxy 轉發入 Service 網絡。

可以在其中一臺 Node 上面抓包看一下:

$ tcpdump -i any arp -nn -vvv | grep 192.168.0.91

17:33:01.398722 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.168.0.91 (ff:ff:ff:ff:ff:ff) tell 192.168.0.91, length 46
17:33:01.398793 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.168.0.91 is-at 52:54:22:3a:e6:6e, length 46

路由器的 ARP 緩存每過一段時間就會失效,重新發起 ARP 協議廣播,使用 tcpdump 一直監聽就可以抓到相關的數據包。可以看到 OpenELB 響應的 MAC 地址是 Kubernetes 的其中一臺節點的 MAC 地址。

改善與建議

OpenELB Layer2 模式因其實現簡單,而且對物理硬件和網絡沒有額外要求,所以實際生產中經常會用到。但目前仍存在單點故障風險,即如果 OpenELB 實例因資源不足故障,則整個對外流量將中斷。

萬幸的是 OpenELB 官方已有新的解決方案,即 Layer2 VIP 模式,該模式的使用方式可以參考官方文檔 [2]。有時間我會再寫一篇 Layer2 VIP 模式的詳細使用方案,敬請期待。

引用鏈接

[1]

官方安裝文檔: https://openelb.io/docs/getting-started/installation/install-openelb-on-kubernetes/

[2]

官方文檔: https://openelb.io/docs/concepts/vip-mode-beta/

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/CEz9Pq5sZquWh-g1ERAdgg