天天看點

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

學習 Neutron 系列文章:

    防火牆是依照特定的規則來控制進出它的網絡流量的網絡安全系統。一個典型的場景是在一個受信任的内網和不受信任的外網比如 Internet 之間建立一個屏障。防火牆可以是電腦上運作的軟體,也可以是獨立的硬體裝置。

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

與負載均衡器類似,按照其工作的網絡層次,防火牆可以分為:

網絡層防火牆(四層):網絡層防火牆可視為一種 IP 封包過濾器,運作在底層的TCP/IP協定堆棧上。我們可以以枚舉的方式,隻允許符合特定規則的封包通過,其餘的一概禁止穿越防火牆(病毒除外,防火牆不能防止病毒侵入)。這些規則通常可以經由管理者定義或修改,不過某些防火牆裝置可能隻能套用内置的規則。 我們也能以另一種較寬松的角度來制定防火牆規則,隻要封包不符合任何一項“否定規則”就予以放行。作業系統及網絡裝置大多已内置防火牆功能。較新的防火牆能利用封包的多樣屬性來進行過濾,例如:來源 IP位址、來源端口号、目的 IP 位址或端口号、服務類型(如 HTTP 或是 FTP)。也能經由通信協定、TTL 值、來源的網域名稱或網段...等屬性來進行過濾。

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

應用層防火牆(七層):應用層防火牆是在 TCP/IP 堆棧的“應用層”上運作,您使用浏覽器時所産生的資料流或是使用 FTP 時的資料流都是屬于這一層。應用層防火牆可以攔截進出某應用程式的所有封包,并且封鎖其他的封包(通常是直接将封包丢棄)。理論上,這一類的防火牆可以完全阻絕外部的資料流進到受保護的機器裡。 

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

按照防火牆的位置,可以分為:

主防火牆:如上面圖1所示,主防火牆位于網絡邊界,控制進出網絡的網絡包。Neutron FWaas 是一種主防火牆,安裝在網絡節點上。

分布式防火牆:分布式防火牆位于内部網絡節點上,比如終端計算機上,控制進出該計算機的網絡包。Neutron 安全組(Security Group)是一種分布式防火牆,安裝在計算節點上。

主防火牆的特點:

内部網絡和外部網絡之間的所有網絡資料流都必須經過防火牆。防火牆适用于使用者網絡系統的邊界,屬于使用者網絡邊界的安全保護裝置。

隻有符合安全政策的資料流才能通過防火牆。防火牆是一個類似于橋接或路由器的、多端口的(網絡接口>=2)轉發裝置,它跨接于多個分離的實體網段之間,并在封包轉發過程之中完成對封包的審查工作。

應用層防火牆具備更細緻的防護能力。下一代防火牆具備應用層分析的能力,能夠基于不同的應用特征,實作應用層的攻擊過濾,在具備傳統防火牆、IPS、防毒等功能的同時,還能夠對使用者和内容進行識别管理,兼具了應用層的高性能和智能關聯兩大特性,能夠更好的針對應用層攻擊進行防護。

防火牆的主要概念:

規則:隻有符合所制定的規則的網絡包才能通過防火牆。

政策:規則的邏輯集合。 

    正常情況下,二層資料幀的源IP 位址就是發出資料的機器的 IP 位址,對方計算機接收到以後,向該 IP 位址發出回複資料幀:

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

(該例子中,node1 發往 node2 的幀的 IP 位址就是 node1 的位址,是以 node2 能夠通過  ARP 擷取 node1 的 MAC,并将回複将發回到它)

如果源計算機的資料幀的源 IP 位址不是它自己的IP位址而是一個不存在的位址或者另外一台機器的位址,目的計算機接受到資料幀後,它就會一直不停的發出 ARP 廣播,最終也無法擷取到MAC位址,或者發送傳回幀到另一台的計算機。這就是所謂的(源) IP 位址欺騙。

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

(該例子中,node1 将它發往 node2 的資料幀的源IP設定為 node3 的IP,導緻 node2 的回複發到了node3)

如果大量的計算機使用另外一台計算機的 IP 作為源 IP 向很多的計算機發出 ping 指令,那麼那一台計算機将會收到很多的 ping 回複。這将導緻它的網絡帶寬被塞滿而不能對外提供網絡服務。

常見的防止IP位址欺騙的方法:

任何進入網絡的資料包不能把網絡内部的位址作為源位址。

任何進入網絡的資料包必須把網絡内部的位址作為目的位址。

任何離開網絡的資料包必須把網絡内部的位址作為源位址。

任何離開網絡的資料包不能把網絡内部的位址作為目的位址。

任何進入或離開網絡的資料包不能把一個私有位址(Private Address)或在RFC1918中列出的屬于保留白間(包括10.x.x.x/8、172.16.x.x/12 或192.168.x.x/16 和網絡回送位址127.0.0.0/8.)的位址作為源或目的位址。

阻塞任意源路由包或任何設定了IP選項的包。

Neutron 安全組針對 IP 位址欺騙,特别設定了相應的防火牆規則。

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

bridge 網絡幀,如果幀的目的 MAC 位址是在橋的另一側的某個網絡裝置上。

泛洪該網絡幀,如果幀的目的 MAC 對網橋是不認識的。

轉到更高一層的三層IP協定棧代碼處理,如果幀的目的位址是橋本身的或者它的某個端口的。

忽略它,如果幀的目的位址是位于它來自的橋的方向的同一側。

    要在 Linux bridge 上做防火牆(firewall packets as they are being bridged,或者說在 linux bridge 上應用 iptables 規則),必須滿足以下條件:

Linux 核心支援 bridge   (CONFIG_BRIDGE=m or CONFIG_BRIDGE=y).

Linux 核心支援 bridge/netfilter (CONFIG_BRIDGE_NETFILTER=y).

Linux 核心需要包含 Netfilter physdev match 支援 (CONFIG_IP_NF_MATCH_PHYSDEV=m or CONFIG_IP_NF_MATCH_PHYSDEV=y). 它在 2.6 版本的核心中開始作為标準子產品。

你的 iptables 工具需要支援 physdev match,以及支援在一條規則中使用多個 '-m physdev'. iptables 從 1.3.6 版本開始支援。

你需要安裝 bridge-utils 包。

    需要注意的,各個 Linux 發行版并不是都預設啟用了 netfilter for bridge,比如 Ubuntu 預設啟用了, 而 RedHat 預設沒啟用。Neutron 會執行下面的指令來啟用它:

    從Linux 2.6 核心版本上,iptables 1.3.6 版本以後就能夠過濾 Linux bridge 上的網絡包了。它使用如下參數:

參數

說明

-m physdev

比對橋端口的進入和出去的裝置。這隻在核心版本 2.5.44 以上有效 (This module matches on the bridge port input and output devices enslaved to a bridge device. This module is a part of the infrastructure that enables a transparent bridging IP firewall and is only useful for kernel versions above version 2.5.44.)

--physdev-in [!] name

Name of a bridge port via which a packet is received。(收到資料包的 bridge port 的名字,隻對 INPUT, FORWARD and PREROUTING 鍊有效)。可以添加 ”+“ 來做頭部部分比對。如果資料包不是從橋裝置接收到的,則比對不成功。

--physdev-out [!] name                                                                      

Name of a bridge port via which a packet is going to be sent.(資料包要發到的 bridge port name,隻對 FORWARD, OUTPUT and POSTROUTING 有效)

[!] --physdev-is-in

Matches if the packet has entered through a bridge interface (在資料包是通過一個橋interface進入的時候會比對成功)

[!] --physdev-is-out

Matches if the packet will leave through a bridge interface. (在資料包将要通過一個橋的interface出去時比對成功)

[!] --physdev-is-bridged

Matches if the packet is being bridged and therefore is not being routed (在資料包是正被橋接的而不是正被路由時比對成功。它隻對 FORWARD and POSTROUTING 有效。)

在一台 linux 機器上建立 linux bridge br0,連接配接 eth0 和 eth1.其中 eth0 是内網端口,eth1和 eth2是外網端口。

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

作為内網和外網之間的路由器,這些資料包經過 br0 時會被 iptables 的 filter 表的 FORWARD 鍊處理;

作為可以通路外網的終端機,外網的資料包通過 eth1 直接進出該計算機,進來的包會被 iptables 的 filter 表的 INPUT 鍊過濾,出去的包被 OUTPUT 鍊過濾。

可以建立如下的 iptables 規則來實作經過 br0 的網絡包:

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]
Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

  在 iptables 中,如果去比對多個 IP 位址的話,就會寫入多條 iptables 的規則(這些 IP 都是無規律性的),當如果需要比對幾百甚至上千個 IP 位址的話,那麼性能就會受到嚴重的影響。使用 ipset 的話,這種情況可以有很大的改善,其最主要是的在結構和規則的查找上面做了很大的改善。當出現上面的情況的時候,ipset 對性能就始終穩定在一個相對值上。根據提供的測試結果表明,當規則在300-1500之間的時候其對性能的影響基本是水準線。是以當你的防火牆規則過多的時候不妨試試看。 

使用:

(1). 首先 ipset 裡面好多的指令是和 iptables 一樣的,比如 -F ,-X, -A, -nL等等。

(2). 使用者如果什麼都沒有添加的話,這個時候 ipset list 就會發現都是空的。

(3) 這個時候我們試着添加一個 set,如:ipset -N test_policy ipmap --network 192.168.100.1/24。該指令:

test_policy:自定義set;

ipmap:自定義set的類型,表示是 IP 位址; bitmap:ip,mac 表示是 IP 或者 MAC 位址。

network 192.168.100.1/24:代表一個網段

(4) 自定義 set 建立好了後就需要在上面添加一些IP了,如:

ipset -A test_policy 192.168.100.1

ipset -A test_policy 192.168.100.2

ipset -A test_policy 192.168.100.3

ipset -A test_policy 192.168.100.4 

(5)這個時候你ipset -nL就會看到該 set 以及它的 members:

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]
Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

(6)把它加到 iptables 鍊裡面,比如說加到 FORWARD 鍊裡面。比如要拒絕該 ipset 中計算機的通路,則添加規則 iptables -A FORWARD -m set --match-set test_policy src -j DROP。其中:

src:也就是隻是比對的源位址,如果你需要比對目的位址的話那麼就寫成 dst 

    為了虛機和網絡安全,Neutron 提供安全組和 FWaas(firewall-as-a-service)。兩者的概念非常類似。一個安全組定義了哪些進入的網絡流量能被轉發給虛機。安全組包含一組防火牆政策,稱為安全組規則(Security Group Rule)。可以定義n個安全組,每個安全組可以有n個規則,可以給每個執行個體綁定n個安全組。FWaas 則作用于虛拟路由器上,對進出租戶網絡的網絡流量進行過濾。OpenStack 的相關的元件為:

Nova Security Group:Nova 項目提供給虛機的安全組。

Neutron Security Group:Neutorn 項目提供給虛機的安全組。

Neutron FWaas:基于 Neutron L3 Agent 實作的虛機防火牆的一個參考實作。 

這三個元件底層都通過控制 Linux iptables 來控制進出虛機或者租戶網絡的網絡包,但是在不同的位置使用不同的方法來實作不同的目的。三者之間的比較如下:

Nova Security Group

Neutron Security Group

Neutron FWaas 

作用

控制進入虛機的網絡包

控制進出虛機的網絡包

控制進出租戶網絡的網絡包。對不經過 Virutal Router 的網絡包不起作用。

防火牆節點

Nova 計算節點

Nova 計算節點(L2 Agent 節點)

L3 Agent 節點上該 firewall 所在的租戶的所有 router 的 namespace 中

IPV6 支援

支援。通過配置項 use_ipv6 來指定是否使用 IPV6,預設值為 false。

判斷 /proc/sys/net/ipv6/conf/default/disable_ipv6 檔案的内容。如果是 ”0“,表示支援 ipv6,否則不支援。如果支援的話,則同時往 iptables 和 ip6tables 中添加鍊和規則。

支援,同時往 iptables 和 ip6tables 中添加鍊和規則,但是似乎沒有判斷系統是否支援 IPV6.

控制粒度

虛機

Neutron port

租戶的所有 virtual router 的所有 Interface

控制實施者

Nova 計算節點的 IP 棧

Nova 計算節點的 qbr 橋

router 的 namespace 的 IP 棧

控制的網絡流量方向

ingress only (進入虛機的網絡包)

ingress 和 egress (進出虛機的網絡包)

ingress 和 egress (進出租戶網絡的網絡包)

比對的資料項

協定、源 IP 網段、目的端口号

協定、端口、網段、方向

協定、源端口、目的端口、源 IP 網段、目的 IP、方向

比對的結果行為

允許(allow)

允許(allow)和拒絕(deny)

使用

啟動虛機時指定安全組,不指定的話使用預設安全組。虛機啟動後,對所使用的安全組的變更會實時應用到虛機。可以向虛機添加和删除安全組。

動态(随時,啟動虛機時和啟動後)使用 neutron port-update 指令更新指定 port 的安全組。

動态(随時)應用到租戶的所有虛拟路由器。

沒有顯式配置安全組時的預設行為

使用預設安全組(Default Security Group  ),它允許使用同一個安全組的虛機通路該虛機 

禁止該機器的網絡通路,除了允許它通路 DHCP 服務 

沒有預設防火牆,防火牆沒有預設規則。配置了 firewall 但是沒添加規則的話,禁止所有網絡進出資料網絡。

允許的數目

多個,Security Group 數目(預設10)和 Security Group Rules 數目(預設100)受租戶的 quota 限制

最多一個,不允許多個。

CLI

#清單,增加,删除 虛機的安全組

add-secgroup: Add a Security Group to a server              

list-secgroup: List Security Group(s) of a server.             

remove-secgroup: Remove a Security Group from a server.          

#操作安全組 

secgroup-add-group-rule   

secgroup-add-rule         

secgroup-create           

secgroup-delete           

secgroup-delete-group-rule

secgroup-delete-rule      

secgroup-list             

secgroup-list-rules       

secgroup-update           

#啟動虛機時指定安全組

nova boot --flavor FLAVOR_ID --image IMAGE_ID --security-groups SEC_GROUP

#操作安全組

neutron security-group-create 

neutron security-group-list

neutron security-group-rule-create 

neutron security-group-rule-list

neutron security-group-rule-delete 

neutron security-group-delete

#建立 port 時指定安全組:

neutron port-create --security-group SECURITY_GROUP_ID1 --security-group SECURITY_GROUP_ID2 NETWORK_ID

#顯示 port 的安全組

neutron port-list -c security_groups -c id -c mac_address -c fixed_ips -c device_id

#删除 port 的安全組

neutron port-update --no-security-groups PORT_ID

#使用帶安全組的 port 啟動虛機

nova boot vm1 --flavor 6 --nic port-id=

#防火牆操作

firewall-create 

firewall-delete 

firewall-list 

firewall-show 

firewall-update

#防火牆政策操作

firewall-policy-create 

firewall-policy-delete 

firewall-policy-insert-rule

firewall-policy-list 

firewall-policy-remove-rule

firewall-policy-show 

firewall-policy-update

#防火牆規則操作

firewall-rule-create 

firewall-rule-delete 

firewall-rule-list 

firewall-rule-show 

firewall-rule-update

配置

見下文  

底層實作

見下文

    我們知道,每個網橋(bridge)都有若幹個端口(port)連接配接到它。從一個 port 進來的資料包都根據其目的 MAC 位址會被轉發到其他端口,或者被丢棄。同樣地,nova-compute 節點(計算節點)也充當兩個角色:資料網絡的轉發器(bridge)(它使用 qbr bridge 将外部通路虛機的流量轉發到虛機。當然了,在進入 qbr 橋之前,OVS 需要對 traffic 做一些操作)和 終端機(這個節點往往會配置多塊網卡,一塊用于資料網絡,一塊用于管理網絡,這樣,别的計算機通過管理網絡來通路該計算機,比如配置 nova-compute 等)。跟上面例子差別的是,qbr 網橋并沒有設定 IP 位址,是以需要别的網卡。而 qbr 橋是一個簡單的網橋,它一頭連接配接的是虛機網卡 eth0 的 tap 裝置(比如 tap59cfa0b8-2f),另一頭連接配接 veth pari 的一端(比如qvb59cfa0b8-2f),該 veth 裝置的另一端是 OVS 上的端口 qvo59cfa0b8-2f。可見,qbr bridge 連接配接了虛機的網卡和 OVS 橋。使用 qbr 後,進入 qvo 的網絡包都将被 qbr 轉發到 tap 裝置,而離開 tap 裝置的網絡包都将被轉發到 qvo 上。 Neutron 安全組就是作用在 qbr 橋上。

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

    至于為什麼不将虛機的網卡直接連接配接到 OVS 橋 br-int,官方說法是:“理想地,TAP 裝置最好能直接挂在 br-int 上。不幸的是,因為 OpenStack Security Group 的實作方式,這種挂載是不可能實作的。OpenStack 使用 TAP 裝置上的 iptables 規則來實作 Security Group,而 open vswitch 不支援在直接連到其網橋上的 TAP 裝置上使用 iptables。是以,不得不增加 Linux bridge qbr 來将 TAP 裝置連到 OVS bridge 上。”。簡單地說,OpenStack 需要在 qbr 橋上使用 iptables 過濾進出虛機的資料包,而 br-int 上無法做到這一點。 

節點

配置檔案

配置項

controller 

/etc/nova/nova.conf

security_group_api = neutron 

使得 nova secgroup* 指令使用的是 neutron 安全組的 API

/etc/neutron/plugins/ml2/ml2_conf.ini

enable_security_group = True

firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver

啟用 Neutron 安全組并指定驅動

nova-compute 

firewall_driver = nova.virt.firewall.NoopFirewallDriver

禁用 nova 安全組

enable_ipset = True

network

neutron 也提供兩種安全組的實作:IptablesFirewallDriver 和 OVSHybridIptablesFirewallDriver

neutron.agent.linux.iptables_firewall.IptablesFirewallDriver : iptables-based FirewallDriver implementation

neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver: subclass of IptablesFirewallDriver with additional bridge

預設值是 neutron.agent.firewall.NoopFirewallDriver,表示不使用 neutron security group。

清單 安全組:

s1@controller:~$ neutron security-group-list

+--------------------------------------+------------+-------------+

| id                                   | name       | description |

| 0aff643b-7b34-4384-b482-f37eccef5b90 | sg-all-ssh | allow ssh   |

| c98a2a3f-1b06-429d-b419-aa862662f116 | default    | default     |

| f5377a66-803d-481b-b4c3-a6631e8ab456 | default    | default     |

清單配置了某安全組的所有 port:

s1@controller:~$ neutron port-list -c security_groups -c id -c mac_address -c fixed_ips -c device_id | grep c98a2a3f-1b06-429d-b419-aa862662f116

| [u'c98a2a3f-1b06-429d-b419-aa862662f116'] | 29eaea66-6614-47e3-b251-0104ff9f12e2 | fa:16:3e:bc:52:eb | {"subnet_id": "d803eaa3-63c9-4c2b-834a-9780db31df70", "ip_address": "100.1.250.1"}   | 1214b1b4-7c3a-41ad-ad8e-1e520b9c2830                                          |

| [u'c98a2a3f-1b06-429d-b419-aa862662f116'] | a7e26c3e-c1ae-4c65-a0e4-2d81266a11b3 | fa:16:3e:b8:f9:ad | {"subnet_id": "4ac56c61-84f3-4d00-b87a-1ab2441e8437", "ip_address": "100.1.150.1"}   | 1214b1b4-7c3a-41ad-ad8e-1e520b9c2830

 s1@controller:~$ neutron port-list -c security_groups -c id -c mac_address -c fixed_ips -c device_id | grep 29eaea66-6614-47e3-b251-0104ff9f12e2

| [u'0aff643b-7b34-4384-b482-f37eccef5b90'] | 29eaea66-6614-47e3-b251-0104ff9f12e2 | fa:16:3e:bc:52:eb | {"subnet_id": "d803eaa3-63c9-4c2b-834a-9780db31df70", "ip_address": "100.1.250.1"}   | 1214b1b4-7c3a-41ad-ad8e-1e520b9c2830                                          |

删除指定 port 的安全組:

s1@controller:~$ neutron port-update --no-security-groups 29eaea66-6614-47e3-b251-0104ff9f12e2

Updated port: 29eaea66-6614-47e3-b251-0104ff9f12e2

删除後檢視:

s1@controller:~$ neutron port-list -c security_groups -c id -c mac_address -c fixed_ips -c device_id | grep 29eaea66-6614-47e3-b251-0104ff9f12e2

| []                                        | 29eaea66-6614-47e3-b251-0104ff9f12e2 | fa:16:3e:bc:52:eb | {"subnet_id": "d803eaa3-63c9-4c2b-834a-9780db31df70", "ip_address": "100.1.250.1"}   | 1214b1b4-7c3a-41ad-ad8e-1e520b9c2830                                          |

設定指定 port 的安全組:

s1@controller:~$ neutron port-update --security-group 0aff643b-7b34-4384-b482-f37eccef5b90 29eaea66-6614-47e3-b251-0104ff9f12e2               

設定後檢視

| [u'0aff643b-7b34-4384-b482-f37eccef5b90'] | 29eaea66-6614-47e3-b251-0104ff9f12e2 | fa:16:3e:bc:52:eb | {"subnet_id": "d803eaa3-63c9-4c2b-834a-9780db31df70", "ip_address": "100.1.250.1"}   | 1214b1b4-7c3a-41ad-ad8e-1e520b9c2830

    如上所述,Neutron 安全組提供兩種驅動,OVSHybridIptablesFirewallDriver 和 IptablesFirewallDriver。不幸的是,在 Juno 版本上使用 IptablesFirewallDriver 遇到下面的 bug 而無法使用:

下面的分析是基于 OVSHybridIptablesFirewallDriver 的。

    Neutron L2 Agent 承擔使用 iptables 維護鍊和規則的任務。它為虛機的每塊網卡的 tap 裝置建立 i(進)、o(出) 和 s(防IP欺騙)鍊和規則,來實作:

prepares, updates, removes firewall filters (準備、更新和删除防火牆過濾器)

drops all packets by default (預設丢棄所有包)

prevents IP spoofing based on port's mac address (compatible with allowed_address_pairs extension) (防 IP 欺騙)

allows incoming DHCP and ICMPv6 RA (允許進入虛機的 DHCP 包和 ICMPV6 RA)

blocks outgoing DHCP (禁止出虛機的 DHCP 包)

drops INVALID packets (丢棄無效狀态的包)

allows stateful, established connections (允許有狀态的并且已建立的連接配接,比如允許進來的 ICMP 的時候,從外面 ping 虛機時虛機的響應包是可以傳回的)

converts security group rules to iptables rules (IPv4, IPv6, TCP, UDP, ICMP, ICMPv6) (将使用者配置的規則轉化為 iptables 規則)

multiple TCP/UDP ports per iptables rule using multiport module

支援 IPV4 和 IPV6

來看看 Neutron 為了實作這些功能添加的 iptables 鍊:

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]
Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

這些鍊之間的關系:

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

     先補充兩個iptabels 的知識點:

-j RETURN:退出目前CHIAN,如果目前CHIAN是别的CHAIN調用的子CHIAN,那麼傳回到調用點下一條規則處開始執行,如果目前CHIAN不是子CHAIN,那麼就以預設政策執行。

-m state:比對連接配接的狀态。Linux 網絡連接配接的狀态包括:

狀态

NEW

NEW 說明這個包是我們看到的第一個包。意思就是,這是 conntrack 子產品看到的某個連接配接第一個包,它即将被比對了。比如,我們看到一個SYN 包,是我們所留意的連接配接的第一個包,就要比對它。第一個包也可能不是SYN包,但它仍會被認為是NEW狀态。這樣做有時會導緻一些問題,但對某些情況是有非常大的幫助的。例如,在我們想恢複某條從其他的防火牆丢失的連接配接時,或者某個連接配接已經逾時,但實際上并未關閉時。

ESTABLISHED                                                

ESTABLISHED 已經注意到兩個方向上的資料傳輸,而且會繼續比對這個連接配接的包。處于 ESTABLISHED 狀态的連接配接是非常容易了解的。隻要發送并接到應答,連接配接就是ESTABLISHED的了。一個連接配接要從NEW變為ESTABLISHED,隻需要接到應答包即可,不管這個包是發往防火牆的,還是要由防火牆轉發的。ICMP的錯誤和重定向等資訊包也被看作是ESTABLISHED,隻要它們是我們所發出的資訊的應答。

RELATED

RELATED 是個比較麻煩的狀态。當一個連接配接和某個已處于 ESTABLISHED 狀态的連接配接有關系時,就被認為是 RELATED 的了。換句話說,一個連接配接要想是 RELATED的,首先要有一個ESTABLISHED的連接配接。這個ESTABLISHED連接配接再産生一個主連接配接之外的連接配接,這個新的連接配接就是 RELATED的了,當然前提是conntrack子產品要能了解RELATED。ftp是個很好的例子,FTP-data 連接配接就是和 FTP-control 有 RELATED 的。還有其他的例子,比如,通過IRC的DCC連接配接。有了這個狀态,ICMP應答、FTP傳輸、DCC 等才能穿過防火牆正常工作。注意,大部分還有一些UDP協定都依賴這個機制。這些協定是很複雜的,它們把連接配接資訊放在資料包裡,并且要求這些資訊能被正确 了解。

INVALID

INVALID說明資料包不能被識别屬于哪個連接配接或沒有任何狀态。有幾個原因可以産生這種情況,比如,記憶體溢出,收到不知屬于哪個連接配接的ICMP 錯誤資訊。一般地,我們DROP這個狀态的任何東西。

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]
Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

可見,此時,虛機的網絡通路能力 = 基本網絡能力(DHCP通路、允許已建立的連接配接、防 IP 欺騙)。也就是說虛機此時是無法網絡通路和被網絡通路,比如 ping,ssh 都無法連接配接。

(1)建立如下的安全組規則

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

各條規則:

允許 ping 别的機器

允許别的機器 ping 它

允許通路别的機器 22 端口上的 tcp 服務 (ssh)

允許 别的機器通路它的80 端口上的 tcp 服務 (http)

允許通路别的機器的 80 端口上的 tcp 服務 (http)

允許 15.5.0.0/16 網段的機器通路它 110 端口上的 TCP 服務(pop3)

允許 100.1.100.0/24 網段上的機器通路它的 53 端口上的 UDP 服務 (DNS 伺服器)

(2)将安全組綁定到 port

(3)看看此時的 iptables filter 表的規則

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]
Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

 結論:

此時,虛機的網絡通路能力 = 基本網絡能力(DHCP通路、允許已建立的連接配接、防 IP 欺騙)+ 使用者自定義的規則允許的網絡能力。 

neutron 的 security-group-rule-create CLI 支援以兩種形式指定允許(被)通路的對象:

CIDR:待被比對的網段,使用 remote-ip-prefix 參數指定

Remote security group id 或者 name:表示允許所有使用該 security group 的 port 的 IP,使用 remote-group-id 參數。

--remote-ip-prefix REMOTE_IP_PREFIX          CIDR to match on.

--remote-group-id REMOTE_GROUP               Remote security group name or ID to apply rule.

比如下面的指令指定 remote security group 為 “default” security group:

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]
Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

這時候在 port 所在的計算節點上,有個新的 ipset set 被建立了。其命名規則為 protocol + remote-group-id 的一部分:

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]
Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

其 members 是應用了該規則的所有 port 的 IP:

然後該 port 所在的計算節點上的 iptables 中增加了一項:

這意味着該虛機允許上述 ipset chain 的members 通路。使用 “src” 是因為那條 rule 的方向是 “ingress”。

如果不使用 ipset 的話(設定 enable_ipset = False),iptables 規則為:

這就可以看出使用 ipset 的價值:

提高 neutron 操作 iptables 的性能

提高 linux 核心管理 iptables 規則的性能

出發點:Kilo 版本之前,安全組是必須應用于整個network的,包括防欺騙規則,而這個在保證安全的同時也限制了在虛機上運作某些網絡服務。

變化:增加 ML2PortSecurityExtensionDriver,應有該externsion dirver 後,可以指定某個 port 不使用安全組

效果圖:(在作為 router 的虛機 R1 和 R1 的端口上禁止安全組)

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]
Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]
Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

這種資料包來回共 4 次,seq 1 ~ 4。可以看到,達到 qbr 的網絡包已經經過了 DNAT。

(1)被 Forward 鍊處理的包進出各4個

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

(2)被 neutron-openvswi-i6e3f2eda-3 處理的進入虛機的 4 個包:第一各包被比對到符合要求的 icmp 協定類型,以後三個是比對到連接配接狀态是 ESTABLISHED。

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

(3)被 neutron-openvswi-o6e3f2eda-3 處理出虛機的 4 各網絡包:4 各皆通過 IP Spoofing 鍊的處理,然後被比對到連接配接狀态是 ESTABLISHED (連接配接應該是第一次有 icmp 包進來時被建立好的)

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

(4)沒有經過 qbr 的網絡包被 INPUT 鍊處理

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]
Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

(1)4個從虛機出去的包

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

(2)4個進入到虛機的包

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

(1)neutron server 和 ML2 Agent

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

(2)neutron server 在 DB 操作後通過 RPC 調用 ML2 Agent

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

(3)當 ML2 Agent 檢測到有新的虛機的 port 被 plug 到 OVS 後,它增加該 tap 裝置的 iptables 鍊和規則

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

(4)當 ML2 Agent 監測到有虛機的 port 已經被從 OVS plug out 時,它删除對應的 tap 裝置的 iptables 鍊和規則

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

(5)當安全組有更新的時候,Neutron Server 通過 RPC 通知 ML2 Agent 去更新 iptables rules

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

(6)當有安全組成員(policy)變更的時候,Neutron Server 通過 RPC 通知 ML2 Agent 去更新 iptables rules

Neutron 了解 (8): Neutron 是如何實作虛機防火牆的 [How Neutron Implements Security Group]

    本文轉自SammyLiu部落格園部落格,原文連結:http://www.cnblogs.com/sammyliu/p/4658746.html,如需轉載請自行聯系原作者

繼續閱讀