1. 程式人生 > >OpenStack Neutron FWaaS 學習( by quqi99 )

OpenStack Neutron FWaaS 學習( by quqi99 )

OpenStack Neutron FWaaS 學習 ( by quqi99 )

作者:張華  發表於:2013-06-24
版權宣告:可以任意轉載,轉載時請務必以超連結形式標明文章原始出處和作者資訊及本版權宣告

 ( http://blog.csdn.net/quqi99 )

      OpenStack的網路元件已經從Quantum更名為Neutron了。之前Quantum就有一個安全組的實現,它執行在每一個計算節點上,能夠做到:

1)過濾進入到計算節點上虛機的流量

2)過濾從虛機出來的流量(nova-network並不能實現這一點)

3)過濾虛機之間的流量

        安全組的一般用法及實現框圖如下:

$nova secgroup-create mygroup description

$nova secgroup-add-rule mygroup tcp 22 22 192.168.1.0/24

$nova boot --flavor 1 --image f16f1d2d-71d6-41b7-98a5-319f142d61f5--security_groups mygroup i1



         上述一個安全組由一系列的iptable rule組成,rule都是針對soure/dest iptcp port的,它不能像下一代的防火牆一樣來表達應用特性像audited rules,也不能提供邊緣防火牆的特性。所以在Neutron提供L4/L7層框架之際,也將推出了FWaaS服務(https://docs.google.com/document/d/1PJaKvsX2MzMRlLGfR0fBkrMraHYF0flvl0sqyZ704tA/edit?pli=1

)

         FWaaS中,tenant可以建立多個Firewall instances,而每一個virtual firewall instance和多個Firewall Policies關聯,每個firewall policies由多個Firewall rules按序組成。不能直接應用一個rule,它必須先加入到一個policy中,因為它需要先審計。如下圖:


         多層防火牆的應用場景如下圖:



       Neutron L3 agent執行在gateway host上,它通過linuxnamespace特性例項化多個neutron router,一個tenant能用多個

router。見下圖,router中的qr-XXX虛擬介面用於和tenant網路相連,qg-XXX虛擬介面用於跟外部網路相連,防火牆服務應該是過濾出入tenant網路的所有流量,所以firewallpolicy應該是應用在qr-XXX虛擬介面上(iptables出口rule中新增”-oqr-+” a即可,入口規則新增”-iqr-+”即可如果對所以tenant網路都適用的話可以運用在qg-XXX介面上(havana的這一版本不會實現這一點,並且也不會實現Zones的概念,一組像上面的qr-XXX介面可以組成一個Zone,也不會檢查address sppofing所以防火牆規則不僅應該像之前的安全組那個運用到計算節點上,也應該運用在相應的tenant'srouter的主機相應的namespace下(這即是所謂的邊緣防火牆規則).

參考實現將會有4chains,出和入各一個,ipv4ipv6各一個。




        所以相應地在FWaaSAgent中會有幾個方法:

  1. create_firewall(apply_list, fireall),fireall是指一組上面的防火牆規則,apply_list指一些networknamespace

  2. update_firewall(apply_list, fireall)

  3. delete_firewall(apply_list, fireall)


      關於將上面的firewallinstance在哪裡應用到VM應涉及到L4/L7服務框架了。以前Neutron只有一級外掛結構(像OVS外掛,像LinuxBridge外掛),但現在引入了L4/L7層服務框架之後變成了兩層,即實現了在一個核心外掛(像OVS外掛)下再能新增若干個服務(像LBaaS,FWaaS)。可參見:https://docs.google.com/document/d/1iLzieNKxM7xip_lRidmalAhF_6-Yf1b_cePF4yeAnkQ/edit?pli=1,

# ip netns exec qrouter-e438bebe-6795-4b68-a613-ec0df38d3064 iptables -t filter -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N neutron-filter-top
-N neutron-l3-agent-FORWARD
-N neutron-l3-agent-INPUT
-N neutron-l3-agent-OUTPUT
-N neutron-l3-agent-fwaas-defau           #新增的 firewall chain
-N neutron-l3-agent-iv4aa85bd66         #新增的 firewall chain
-N neutron-l3-agent-local
-N neutron-l3-agent-ov4aa85bd66        #for firewall
-A INPUT -j neutron-l3-agent-INPUT
-A FORWARD -j neutron-filter-top
-A FORWARD -j neutron-l3-agent-FORWARD #將 forward 轉到 neutron 的chain
-A OUTPUT -j neutron-filter-top
-A OUTPUT -j neutron-l3-agent-OUTPUT
-A neutron-filter-top -j neutron-l3-agent-local
-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-iv4aa85bd66 #進資料網路的包
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-ov4aa85bd66 #出資料網路的包

-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-fwaas-defau #進資料網路的包的預設處理 chain
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-fwaas-defau #出資料網路的包的預設處理 chain
-A neutron-l3-agent-INPUT -d 127.0.0.1/32 -p tcp -m tcp --dport 9697 -j ACCEPT
-A neutron-l3-agent-fwaas-defau -j DROP                             #預設丟棄沒有被以上規則處理的所有包

-A neutron-l3-agent-iv4aa85bd66 -m state --state INVALID -j DROP
-A neutron-l3-agent-iv4aa85bd66 -m state --state RELATED,ESTABLISHED -j ACCEPT #接受狀態為 RELATED, ESTABLISHED (已建立的連線)的包
-A neutron-l3-agent-iv4aa85bd66 -p tcp -m tcp --dport 80 -j ACCEPT             #根據定義的 FWaas rule,接受目的埠為 80 的 tcp 包

-A neutron-l3-agent-ov4aa85bd66 -m state --state INVALID -j DROP
-A neutron-l3-agent-ov4aa85bd66 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A neutron-l3-agent-ov4aa85bd66 -p tcp -m tcp --dport 80 -j ACCEPT             #根據 FWaas rule,接收目的埠為 80 的 tcp 包

       相關進階的程式碼和BP:

2)  FwaaS agent,https://blueprints.launchpad.net/quantum/+spec/quantum-fwaas-agent

3)  FwaaS Plugin, https://blueprints.launchpad.net/quantum/+spec/quantum-fwaas-plugin  
4)  FwaaS ip tables driver https://blueprints.launchpad.net/quantum/+spec/quantum-fwaas-iptables-driver