iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
DevOps

在OpenStack Neutron的ovn-networking裡挖呀挖呀挖系列 第 23

Day-23: Security Group 原理

  • 分享至 

  • xImage
  •  

昨天建立floating IP後,想要透過網際網路(實際上是由network-controller node的10.0.2.0/24網段)存取floating ip前,我們必需先設定security group允許外部的存取。如果沒有特別設定,VM建立完成後,會採用default 的security group,這預設的行為是:

  1. VM可以對外上網;
  2. 外部無法直接存取
  3. 同一個project下的VM可益互相存取。

gh

然而,實際上封包能不能進出VM, 都是透過ovs上的規則去控制。今天我們就來看看Security Group與OVN之間的關係吧。


建立Security Group

今天的架構系昨天是完全相同,只是今天我們在圖中,特別將OpenStack的Security Group呈現出來。

gh

  1. 建立Security Group
# create sg for icmp
openstack security group create allow-icmp
openstack security group rule create --protocol icmp --remote-ip 0.0.0.0/0 allow-icmp

# add sg to instances
openstack server add security group vm_1 allow-icmp

2.查看OpenStack上的資訊,確實與圖中預期要建立的長像是相同.

  • vm_1 有使用二個security group,其中一個是default, 一個是剛才建立的allow-icmp. 這是因為OpenStack對每個VM預設都會套用default 這個sg.
openstack server show vm_1 --format table -c security_groups -c name

+-----------------+-------------------+
| Field           | Value             |
+-----------------+-------------------+
| name            | vm_1              |
| security_groups | name='allow-icmp' |
|                 | name='default'    |
+-----------------+-------------------+
  • 每個security group 都是由多個rule組成的,來看一下vm_1使用的allow-icmp sg上有什麼rule。每個sg預設對外的egress都不會有任何限制之外,再加上我們所建立的allow icmp rule。
openstack security group rule list -c ID -c 'IP Protocol' -c Ethertype -c 'IP Range' -c  'Direction' -c 'Remote Security Group' -c  'Security Group' | grep da83 | abbrev

+--------+-------------+-----------+-----------+-----------+------------------------+------------------+
| ID     | IP Protocol | Ethertype | IP Range  | Direction | Remote Security Group  | Security Group   |
+--------+-------------+-----------+-----------+-----------+------------------------+------------------+
| 29ee2e | icmp        | IPv4      | 0.0.0.0/0 | ingress   | None                   | da83cb           |
| be5117 | None        | IPv4      | 0.0.0.0/0 | egress    | None                   | da83cb           |
| fdbb51 | None        | IPv6      | ::/0      | egress    | None                   | da83cb           |
+--------+-------------+-----------+-----------+-----------+------------------------+------------------+
  • 再來看看vm_1使用的default sg,除了二個對外的egress外,還有二個允許的ingress rule。而這二個ingress rule透過指定Remote Security Group,而不是IP range, 使得在同一個Project裡的instance可以通訊。
openstack security group rule list -c ID -c 'IP Protocol' -c Ethertype -c 'IP Range' -c  'Direction' -c 'Remote Security Group' -c  'Security Group' | grep f88 | abbrev

+--------+-------------+-----------+-----------+-----------+-----------------------+------------------+
| ID     | IP Protocol | Ethertype | IP Range  | Direction | Remote Security Group | Security Group   |
+--------+-------------+-----------+-----------+-----------+-----------------------+------------------+
| 095bf1 | None        | IPv6      | ::/0      | ingress   | f88835                | f88835           |
| 6be621 | None        | IPv4      | 0.0.0.0/0 | ingress   | f88835                | f88835           |
| 6c7c10 | None        | IPv6      | ::/0      | egress    | None                  | f88835           |
| a459fd | None        | IPv4      | 0.0.0.0/0 | egress    | None                  | f88835           |
+--------+-------------+-----------+-----------+-----------+-----------------------+------------------+

OpenStack 與OVN 元件關係

我們再來看看建立security group時,在OVN上會產生那些東西吧。OpenStack的Security Group 對應到OVN 上的Port Group;Security Group Rule會對應到 OVN 上的ACL。

gh

可以用ovn-nbctl將OVN上所有的port group 列出來,在port-group裡,有一個ports的欄位,這個欄位表示這個port group被套用在那一個logical switch port上。以我們的圖為例,vm_1是接用名稱為0bece6的logical switch port上,而這個port的id是5c765c. 所以,可以發覺,目前共有三個port-group被套用在 5c765c上。而每一個port-group設定那些acl,則是顯示在acls欄位里。

ovn-nbctl list port-group | abbrev

# drop all packate
_uuid               : 2db2f0
acls                : [d4acd4, febd6a]
external_ids        : {}
name                : neutron_pg_drop
ports               : [5c765c]

# mapping to allow-icmp
_uuid               : efaedc
acls                : [6504e8, 77e573, a0349f]
external_ids        : {"neutron:security_group_id"="da83cb"}
name                : pg_da83cb
ports               : [5c765c]

# mapping to default
_uuid               : ad1dfc
acls                : [4e65fd, 5d74c3, 63d69a, 80ca87]
external_ids        : {"neutron:security_group_id"="f88835"}
name                : pg_f88835
ports               : [5c765c]

我們這裡以pg_da83cb port group為例,把pg_da83cb所用的acl列出來,ACL的數量和security group 裡的rule數量是相同的,再仔細一看,也可以發現ACL的條件(match)、ingress/egress、action,都和security group rule是對應的喔。

ovn-nbctl --format table --columns _uuid,action,direction,match list acl | abbrev |grep pg_da83cb

_uuid    action          direction    match
------   -------------   ----------   -----------------------
77e573   allow-related   to-lport     "outport == @pg_da83cb && ip4 && ip4.src == 0.0.0.0/0 && icmp4"
a0349f   allow-related   from-lport   "inport == @pg_da83cb && ip4"
6504e8   allow-related   from-lport   "inport == @pg_da83cb && ip6"

但是和OpenStack相比,有一點比較特殊,對於每個logical switch port,OVN都會有一個neutron_pg_drop 的port group,用途是deny any ,所以在沒有任何的 allow 規則的port group的話,VM是都無法上網的。


logical flow

在ovn-nbctl上查到的port group 與 acl等資訊,必需在South bound DB上的logical flow也有相對應的設定,logical switch會依照這些flow 規則決定封包的走向。從SB檢查logical flow

ovn-sbctl lflow-list n1 | abbrev | grep -Ev hint |grep -E 'ls_out_acl|ls_in_acl' |grep @pg
  1. 在security group 加到vm_1上之前,可以看到logical flow上的規則,都是與 default security group 對應的port group (pg)f88835)有關。

gh

  1. security group 加到vm_1之後,可以看到allow-icmp 相對應的port group pg_da83cb 出現在logical flow上。

gh


Reference

  1. Implementing Security Groups in OpenStack using OVN Port Groups
  2. OpenStack Security Groups using OVN ACLs
  3. Working with Security Groups

上一篇
Day-22: VM 的 Flaoting IP
下一篇
Day-24: VM 直接利用實體網路上網
系列文
在OpenStack Neutron的ovn-networking裡挖呀挖呀挖30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言