上一节中主要介绍了 OpenStack 的 Router 和 VXLAN。
本节将介绍 OpenStack Neturon 的其他几个网络功能:安全组、防火墙服务。
一、Security Group 安全组
安全组的原理是通过 iptables 对 Instance 所在计算节点的网络流量进行过滤。
1. 默认安全组
每个(Project)租户都有一个默认的名为 “default” 的默认安全组。
点击 “管理规则” 查看详情
四条规则的意思是:允许所有出口(Egress)的流量,但禁止所有入口(Ingress)的流量。
当创建 Instance 时如果只有一个默认安全组 “default” 那么 Instance 的安全组,强制使用 “default”。
使用 iptables-save
查看相关规则
iptables 的规则较多,可以参考iptables(一)链、表的简介和表的基本操作
root@controller:/opt/stack/devstack# iptables-save
-A neutron-linuxbri-ie1e6eefa-b -d 192.168.10.7/32 -p udp -m udp --sport 67 --dport 68 -j RETURN
-A neutron-linuxbri-ie1e6eefa-b -d 255.255.255.255/32 -p udp -m udp --sport 67 --dport 68 -j RETURN
-A neutron-linuxbri-ie1e6eefa-b -m set --match-set NIPv4b09171c4-731c-4db2-a04c- src -j RETURN
-A neutron-linuxbri-PREROUTING -m physdev --physdev-in tape1e6eefa-bd -m comment --comment "Set zone for 1e6eefa-bd" -j CT --zone 4097
-A neutron-linuxbri-FORWARD -m physdev --physdev-out tape1e6eefa-bd --physdev-is-bridged -m comment --comment "Direct traffic from the VM interface to the security group chain." -j neutron-linuxbri-sg-chain
-A neutron-linuxbri-FORWARD -m physdev --physdev-in tape1e6eefa-bd --physdev-is-bridged -m comment --comment "Direct traffic from the VM interface to the security group chain." -j neutron-linuxbri-sg-chain
-A neutron-linuxbri-INPUT -m physdev --physdev-in tape1e6eefa-bd --physdev-is-bridged -m comment --comment "Direct incoming traffic from VM to the security group chain." -j neutron-linuxbri-oe1e6eefa-b
-A neutron-linuxbri-sg-chain -m physdev --physdev-out tape1e6eefa-bd --physdev-is-bridged -m comment --comment "Jump to the VM specific chain." -j neutron-linuxbri-ie1e6eefa-b
-A neutron-linuxbri-sg-chain -m physdev --physdev-in tape1e6eefa-bd --physdev-is-bridged -m comment --comment "Jump to the VM specific chain." -j neutron-linuxbri-oe1e6eefa-b
这里面只查看了 test 虚拟机的 iptables 规则,test 的 tap Interface 为 tape1e6eefa-bd。省略了很多
- iptables 的规则是应用在 Neutron port 上的,port 在这里是 test 虚拟机的虚拟网卡 tape1e6eefa-bd
- ingress(入口)规则集中定义在命名为 “neutron-linuxbri-ie1e6eefa-b” 的 chain 中。
- egress(出口)规则集中定义在明明为 “neutron-linuxbri-ie1e6eefa-b” 的 chain 中。
使用 DHCP namespace 对 test 虚拟机 进行 ping
和 ssh
测试
root@controller:~# ip netns
qdhcp-3ba4f0a1-06a7-410f-bdae-4cb14048447d (id: 0)
root@controller:~# ip netns exec qdhcp-3ba4f0a1-06a7-410f-bdae-4cb14048447d ping 192.168.10.7
PING 192.168.10.7 (192.168.10.7) 56(84) bytes of data.
^C
--- 192.168.10.7 ping statistics ---
98 packets transmitted, 0 received, 100% packet loss, time 97174ms
可以看到 ping
和 ssh
都无法通信,因为当前使用 “default” 安全组,所以所有 ingress 流量都被禁止。
2. 新的安全组
配置新的安全让 test 虚拟机能够被 ping 和 ssh。
-
创建新的安全组
点击管理规则。可以看到系统创建的两条默认规则。允许所有出口流量。删了也可以。
点击添加规则,添加两条,分别是 ICMP 和 SSH
ICMP SSH
-
设置 test 虚拟机使用新的安全组
编辑安全组
可以看到使用的默认安全组和新的安全组。
添加新的安全组 保存
iptables 会立即更新。多出来 tcp 和 icmp
-A neutron-linuxbri-ie1e6eefa-b -p icmp -j RETURN
-A neutron-linuxbri-ie1e6eefa-b -p tcp -m tcp --dport 22 -j RETURN
再次测试 ping 和 ssh
root@controller:/opt/stack# ip netns exec qdhcp-3ba4f0a1-06a7-410f-bdae-4cb14048447d ping 192.168.10.7
PING 192.168.10.7 (192.168.10.7) 56(84) bytes of data.
64 bytes from 192.168.10.7: icmp_seq=1 ttl=64 time=6.78 ms
64 bytes from 192.168.10.7: icmp_seq=2 ttl=64 time=0.347 ms
root@controller:/opt/stack# ip netns exec qdhcp-3ba4f0a1-06a7-410f-bdae-4cb14048447d ssh cirros@192.168.10.7
The authenticity of host '192.168.10.7 (192.168.10.7)' can't be established.
RSA key fingerprint is SHA256:S0nedluJhcwWmYr1Lv4/M7iWNFA2MRTKkmIKy1IMm2c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.7' (RSA) to the list of known hosts.
cirros@192.168.10.7's password:
$ ifconfig
eth0 Link encap:Ethernet HWaddr FA:16:3E:6B:74:67
inet addr:192.168.10.7 Bcast:192.168.10.255 Mask:255.255.255.0
inet6 addr: fe80::f816:3eff:fe6b:7467/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:53 errors:0 dropped:0 overruns:0 frame:0
TX packets:150 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7473 (7.2 KiB) TX bytes:9845 (9.6 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:57 errors:0 dropped:0 overruns:0 frame:0
TX packets:57 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5136 (5.0 KiB) TX bytes:5136 (5.0 KiB)
3. 小节
- 通过宿主机上 iptables 规则控制进出 Instance 的流量
- 安全组作用在 Instance 的 port 上
- 安全组的规则都是 allow,不能定义 deny 的规则
- Instance 可以应用多个安全组叠加使用这些安全组中的规则
二、Firewall as a Service(FWaaS)防火墙服务
让用户能够创建和管理防火墙,在 subnet 的边界上对 layer 3 和 layer 4 的流量进行过滤。
FWaaS 是在 Neutron 虚拟 router 上应用防火墙规则,控制进出租户网络的流量。
1. 概念
-
Firewall
租户能够创建和管理的逻辑防火墙资源。
Firewall 必须关联某个 Policy,因此必须先创建 Policy。 -
Firewall Policy
Policy 是 Role 的集合,Firewall 会按照 Policy 中指定的顺序应用这些 Rule。 -
Firewall Rule
Rule 即访问控制的规则,包括源和目的 layer 3 子网 IP、源和目的 layer 4 端口、协议、allow 或 deny 动作等。 -
FWaaS 和 安全组
安全组的应用对象是虚拟网卡,由 L2 Agent 来实现,如:neutron_linuxbridge_agent,安全组会在计算节点上通过配置 iptables 规则来限制虚拟网卡的进出访问,即安全组保护的是 Instance。
FWaaS 是应用对象是 router,可以在安全组之前隔离外部过来的恶意流量,但是对于同一个 subnet 内部不同虚拟网卡间的通信不做限制,即 FWaaS 保护的是 subnet。
2. 实验
-
创建两台虚拟机 test-1 和 test-2 分别加入 vxlan100 和 vxlan101
-
在 vlan100-vlan101 这个路由上没有任何 FWaaS 的情况下,text-1 可以通过 ping 和 ssh 跨网络访问 test-2 。如下图
-
创建一个不含任何 rule 的 firewall ‘test-firewall’ 并应用到 vlan100-vlan101 上。此时 FWaaS 生效,默认情况下会阻止任何侉子网的流量。然后创建 rule 允许 ssh,并将其添加到 test-firewall。此时 test-1 应该能够 ssh test-2。操作如下
(1)创建 Firesall Policies
此时的 test_policy 不含任何规则
(2)创建 Firewall
选择上面创建的 policy
将路由加入到 Firewall 中
状态为 Active,此时 vlan100-blan101 已经成功应用 test_policy。如下图
(3)通过 iptables-save
查看 router namespace 的 iptables 规则
root@controller:/dev# ip netns
qrouter-652109fc-748a-4559-b31e-8bad171a6ee6 (id: 2) <--- 这里刚刚创建的 router
qdhcp-77ff4b36-5727-45a2-89db-a84c475f81df (id: 0)
qdhcp-21de5c53-217d-415b-a92e-b3f537bed74a (id: 1)
root@controller:/dev# ip netns exec qrouter-652109fc-748a-4559-b31e-8bad171a6ee6 iptables-save
# Generated by iptables-save v1.6.0 on Fri May 3 12:51:00 2019
*raw
:PREROUTING ACCEPT [211:18390]
:OUTPUT ACCEPT [101:10030]
:neutron-l3-agent-OUTPUT - [0:0]
:neutron-l3-agent-PREROUTING - [0:0]
-A PREROUTING -j neutron-l3-agent-PREROUTING
-A OUTPUT -j neutron-l3-agent-OUTPUT
COMMIT
# Completed on Fri May 3 12:51:00 2019
# Generated by iptables-save v1.6.0 on Fri May 3 12:51:00 2019
*mangle
:PREROUTING ACCEPT [117:10675]
:INPUT ACCEPT [93:7644]
:FORWARD ACCEPT [23:2960]
:OUTPUT ACCEPT [50:4989]
:POSTROUTING ACCEPT [73:7949]
:neutron-l3-agent-FORWARD - [0:0]
:neutron-l3-agent-INPUT - [0:0]
:neutron-l3-agent-OUTPUT - [0:0]
:neutron-l3-agent-POSTROUTING - [0:0]
:neutron-l3-agent-PREROUTING - [0:0]
:neutron-l3-agent-float-snat - [0:0]
:neutron-l3-agent-floatingip - [0:0]
:neutron-l3-agent-mark - [0:0]
:neutron-l3-agent-scope - [0:0]
-A PREROUTING -j neutron-l3-agent-PREROUTING
-A INPUT -j neutron-l3-agent-INPUT
-A FORWARD -j neutron-l3-agent-FORWARD
-A OUTPUT -j neutron-l3-agent-OUTPUT
-A POSTROUTING -j neutron-l3-agent-POSTROUTING
-A neutron-l3-agent-PREROUTING -j neutron-l3-agent-mark
-A neutron-l3-agent-PREROUTING -j neutron-l3-agent-scope
-A neutron-l3-agent-PREROUTING -m connmark ! --mark 0x0/0xffff0000 -j CONNMARK --restore-mark --nfmask 0xffff0000 --ctmask 0xffff0000
-A neutron-l3-agent-PREROUTING -j neutron-l3-agent-floatingip
-A neutron-l3-agent-PREROUTING -d 169.254.169.254/32 -i qr-+ -p tcp -m tcp --dport 80 -j MARK --set-xmark 0x1/0xffff
-A neutron-l3-agent-float-snat -m connmark --mark 0x0/0xffff0000 -j CONNMARK --save-mark --nfmask 0xffff0000 --ctmask 0xffff0000
-A neutron-l3-agent-scope -i qr-33ca2505-0a -j MARK --set-xmark 0x4000000/0xffff0000
-A neutron-l3-agent-scope -i qr-89aeb7cf-df -j MARK --set-xmark 0x4000000/0xffff0000
COMMIT
# Completed on Fri May 3 12:51:00 2019
# Generated by iptables-save v1.6.0 on Fri May 3 12:51:00 2019
*nat
:PREROUTING ACCEPT [7:538]
:INPUT ACCEPT [34:2088]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [3:228]
:neutron-l3-agent-OUTPUT - [0:0]
:neutron-l3-agent-POSTROUTING - [0:0]
:neutron-l3-agent-PREROUTING - [0:0]
:neutron-l3-agent-float-snat - [0:0]
:neutron-l3-agent-snat - [0:0]
:neutron-postrouting-bottom - [0:0]
-A PREROUTING -j neutron-l3-agent-PREROUTING
-A OUTPUT -j neutron-l3-agent-OUTPUT
-A POSTROUTING -j neutron-l3-agent-POSTROUTING
-A POSTROUTING -j neutron-postrouting-bottom
-A neutron-l3-agent-PREROUTING -d 169.254.169.254/32 -i qr-+ -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9697
-A neutron-l3-agent-snat -j neutron-l3-agent-float-snat
-A neutron-postrouting-bottom -m comment --comment "Perform source NAT on outgoing traffic." -j neutron-l3-agent-snat
COMMIT
# Completed on Fri May 3 12:51:00 2019
# Generated by iptables-save v1.6.0 on Fri May 3 12:51:00 2019
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:neutron-filter-top - [0:0]
:neutron-l3-agent-FORWARD - [0:0]
:neutron-l3-agent-INPUT - [0:0]
:neutron-l3-agent-OUTPUT - [0:0]
:neutron-l3-agent-fwaas-defau - [0:0]
:neutron-l3-agent-iv4aa2d2f11 - [0:0]
:neutron-l3-agent-local - [0:0]
:neutron-l3-agent-ov4aa2d2f11 - [0:0]
:neutron-l3-agent-scope - [0:0]
-A INPUT -j neutron-l3-agent-INPUT
-A FORWARD -j neutron-filter-top
-A FORWARD -j neutron-l3-agent-FORWARD
-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 -j neutron-l3-agent-scope
-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-iv4aa2d2f11
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-ov4aa2d2f11
-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-fwaas-defau
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-fwaas-defau
-A neutron-l3-agent-INPUT -m mark --mark 0x1/0xffff -j ACCEPT
-A neutron-l3-agent-INPUT -p tcp -m tcp --dport 9697 -j DROP
-A neutron-l3-agent-fwaas-defau -j DROP
-A neutron-l3-agent-iv4aa2d2f11 -m state --state INVALID -j DROP
-A neutron-l3-agent-iv4aa2d2f11 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A neutron-l3-agent-ov4aa2d2f11 -m state --state INVALID -j DROP
-A neutron-l3-agent-ov4aa2d2f11 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A neutron-l3-agent-scope -o qr-33ca2505-0a -m mark ! --mark 0x4000000/0xffff0000 -j DROP
-A neutron-l3-agent-scope -o qr-89aeb7cf-df -m mark ! --mark 0x4000000/0xffff0000 -j DROP
COMMIT
# Completed on Fri May 3 12:51:00 2019
(4)规则分析
route 在转发数据包时会使用 chain:
-A FORWARD -j neutron-l3-agent-FORWARD
neutron-l3-agent-FORWARD 的规则如下
-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-iv4aa2d2f11
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-ov4aa2d2f11
-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-fwaas-defau
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-fwaas-defau
第一条含义为:从 router namespace 任何一个 qr-*interface 发出的流量都会应用 neutron-l3-agent-iv4aa2d2f11,该 chain 定义如下:
-A neutron-l3-agent-iv4aa2d2f11 -m state --state INVALID -j DROP
-A neutron-l3-agent-iv4aa2d2f11 -m state --state RELATED,ESTABLISHED -j ACCEPT
规则为:
- 如果数据包的状态为 INVALID, 则 DROP
- 如果数据包的状态为 RELATED 或 ESTABLISHED,则 ACCEPT
其他数据处理
执行 neutron-l3-agent-FORWARD chain 的下一个规则
-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-fwaas-defau
neutron-l3-agent-fwaas-defau 内容为:
-A neutron-l3-agent-fwaas-defau -j DROP
丢弃数据
(5)以上流程结论
在没有定义任何 firewall rule 的情况下,进入 router 的数据包都会被丢弃。
此时 test-1 使用 ping 和 ssh 都无法与 test-2 通信
(6)允许 ssh 的规则
在 Firewall Rule 中添加规则
将规则添加到 policy 中
规则添加成功 如下:
(7)再次查看 iptables
可以发现多了两个 tcp ACCEPT 的规则
-A neutron-l3-agent-iv4aa2d2f11 -p tcp -m tcp --dport 22 -j ACCEPT
-A neutron-l3-agent-ov4aa2d2f11 -p tcp -m tcp --dport 22 -j ACCEPT
含义是:进入 router 的 tcp 数据包,如果目标端口是 22 (ssh),则一律 ACCEPT。
测试 text-1 ping 和 ssh test-2。结果如下
3. 小节
FWaaS 用于加强 Neutron 网络的安全性,与安全组可以配合使用
FWaaS 和 安全组的比较
-
相同点
底层都是用过 iptables 实现。 -
不同点
FWaaS 的 iptables 规则应用在 router 上,保护整个租户网络;安全组则应用在虚拟网卡上,保护单个 Instance。
FWaaS 可以定义 allow 或者 deny 规则;安全组只能定义 allow 规则。
目前 FWaaS 规则不能区分进出流量,对双向流量都起作用;安全组规则可以区分 ingress 和 egress。
网友评论