玩转 OpenStack(八.3)Linux Bridge 实

2019-05-06  本文已影响0人  河码匠

上一节中主要介绍了 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。省略了很多

使用 DHCP namespace 对 test 虚拟机 进行 pingssh 测试

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

可以看到 pingssh 都无法通信,因为当前使用 “default” 安全组,所以所有 ingress 流量都被禁止。

2. 新的安全组

配置新的安全让 test 虚拟机能够被 ping 和 ssh。

点击管理规则。可以看到系统创建的两条默认规则。允许所有出口流量。删了也可以。


点击添加规则,添加两条,分别是 ICMP 和 SSH


ICMP SSH

编辑安全组


可以看到使用的默认安全组和新的安全组。


添加新的安全组 保存


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. 小节

二、Firewall as a Service(FWaaS)防火墙服务

让用户能够创建和管理防火墙,在 subnet 的边界上对 layer 3 和 layer 4 的流量进行过滤。
FWaaS 是在 Neutron 虚拟 router 上应用防火墙规则,控制进出租户网络的流量。

1. 概念

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

规则为:

其他数据处理
执行 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 和 安全组的比较

上一篇下一篇

猜你喜欢

热点阅读