Neutron 为 instance 提供了两种管理网络安全的方法:
安全组(Security Group)和虚拟防火墙。
安全组的原理是通过 iptables 对 instance 所在计算节点的网络流量进行过滤。
虚拟防火墙则由 Neutron Firewall as a Service(FWaaS)高级服务提供。其底层也是使用 iptables,在 Neutron Router 上对网络包进行过滤。
这里先介绍安全组。
默认安全组
每个 Project(项目)都有一个命名为 “default” 的默认安全组。
点击菜单 项目 -> 计算 -> 访问 & 安全,查看 Security Group 列表。
点击“管理规则”按钮,查看 “default” 安全组的规则。
“default” 安全组有四条规则,其作用是:允许所有外出(Egress)的流量,但禁止所有进入(Ingress)的流量。
当我们创建 instance 时,可以在 “访问 & 安全” 标签页中选择安全组。如果当前只有 “default” 这一个安全组,则会强制使用 “default” 。
当前在 compute2 上有 instance “test2”。
在 compute2上执行 iptables-save 命令查看相关规则。iptables 的规则较多,这里我们节选了 test2 相关的规则。
这些规则是 Neutron 根据安全组自动生成的。
test2 的 TAP interface 为 tap700eb1c9-8c,可以看到:
1. iptables 的规则是应用在 Neutron port 上的,port 在这里是 test2 的虚拟网卡 tap700eb1c9-8c。
2. ingress 规则集中定义在命名为 “neutron-openvswi-i700eb1c9-8” 的 chain 中。
3. egress 规则集中定义在命名为 “neutron-openvswi-o700eb1c9-8” 的 chain 中。
下面我们通过 dhcp namespace 对 test2 进行 ping 和 ssh 测试。
root@controller:~# ip netns
qrouter-d0945bdd-e860-4f17-b386-80d4ddbb9d3c
qdhcp-838d7441-7c25-4b02-8698-18d76ef670be
qdhcp-f66a4f50-6ce1-452f-a618-5ecf17f1f3e7
root@controller:~# ip netns exec qdhcp-f66a4f50-6ce1-452f-a618-5ecf17f1f3e7 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
11: tap80b8cf90-b7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether fa:16:3e:d1:ca:2a brd ff:ff:ff:ff:ff:ff
inet 172.16.100.10/24 brd 172.16.100.255 scope global tap80b8cf90-b7
valid_lft forever preferred_lft forever
inet 169.254.169.254/16 brd 169.254.255.255 scope global tap80b8cf90-b7
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fed1:ca2a/64 scope link
valid_lft forever preferred_lft forever
root@controller:~# ip netns exec qdhcp-f66a4f50-6ce1-452f-a618-5ecf17f1f3e7 ping 172.16.100.19
PING 172.16.100.19 (172.16.100.19) 56(84) bytes of data.
^C
--- 172.16.100.19 ping statistics ---
7 packets transmitted, 0 received, 100% packet loss, time 5999ms
root@controller:~# ip netns exec qdhcp-f66a4f50-6ce1-452f-a618-5ecf17f1f3e7 ssh 172.16.100.19
^C
无法 ping 和 ssh test2 (172.16.100.19),可见当前的规则实现了 “default” 安全组,所有 ingress 流量都被禁止。
修改安全组规则
Neutron 默认的安全组规则会禁止掉所有从外面访问 instance 的流量。
下面我们修改安全组的配置,允许 ping 和 ssh instance。
有两种方法可以达到这个目的:
1. 修改“default” 安全组。
2. 为 test2 添加新的安全组。
这里我们采用第二种方法。
在安全组列表页面点击“ 创建安全组”按钮。
为安全组命名并点击 “创建安全组”。新的安全组 “allow ping & ssh” 创建成功。
点击“管理规则”按钮,查看 “allow ping & ssh” 的规则。
系统默认定义了两条规则,允许所有的外出流量。为清晰起见,可以点击按钮“删除规则”删除这两条规则。
点击“添加规则”按钮,添加允许 ping 的规则。
“规则” 选择 “所有 ICMP 协议”,“方向” 选择 “入口”,然后点击 “添加” 按钮。
同样的方式添加 ssh 规则。
在列表中查看添加成功的规则。
接下来设置 test2,使用新的安全组。进入 instance 列表页面,点击 test2 下拉操作列表中的 “编辑安全组”
可以看到 test2 当前使用的安全组为 “default”,可选安全组为 “allow ping & ssh”。
点击安全组 “allow ping & ssh” 后面的 “+” 按钮。
点击 “保存”。
iptables 会立即更新,下面通过 对比 查看 iptables 前后的变化。
“allow ping & ssh” 安全组引入了下面两条 iptables 规则。作用是运行 ingress 的 ssh 和 ping 流量。
-A neutron-openvswi-i700eb1c9-8 -p icmp -j RETURN
-A neutron-openvswi-i700eb1c9-8 -p tcp -m tcp --dport 22 -j RETURN
测试一下,现在能够 ping 和 ssh test2 了。
root@controller:~# ip netns exec qdhcp-f66a4f50-6ce1-452f-a618-5ecf17f1f3e7 ping 172.16.100.19
PING 172.16.100.19 (172.16.100.19) 56(84) bytes of data.
64 bytes from 172.16.100.19: icmp_seq=1 ttl=64 time=1.45 ms
64 bytes from 172.16.100.19: icmp_seq=2 ttl=64 time=0.631 ms
64 bytes from 172.16.100.19: icmp_seq=3 ttl=64 time=0.642 ms
64 bytes from 172.16.100.19: icmp_seq=4 ttl=64 time=0.641 ms
^C
--- 172.16.100.19 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.631/0.841/1.451/0.352 ms
root@controller:~# ip netns exec qdhcp-f66a4f50-6ce1-452f-a618-5ecf17f1f3e7 ssh cirros@172.16.100.19
The authenticity of host '172.16.100.19 (172.16.100.19)' can't be established.
RSA key fingerprint is 9a:b5:80:77:5d:46:d9:f7:ac:47:44:43:7d:e1:97:69.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.100.19' (RSA) to the list of known hosts.
cirros@172.16.100.19's password:
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether fa:16:3e:eb:47:85 brd ff:ff:ff:ff:ff:ff
inet 172.16.100.19/24 brd 172.16.100.255 scope global eth0
inet6 fe80::f816:3eff:feeb:4785/64 scope link
valid_lft forever preferred_lft forever
$
小结
安全组有以下特性:
1. 通过宿主机上 iptables 规则控制进出 instance 的流量。
2. 安全组作用在 instance 的 port 上。
3. 安全组的规则都是 allow,不能定义 deny 的规则。
4. instance 可应用多个安全组叠加使用这些安全组中的规则。
文章参考每天5分钟玩转OpenStack安全组相关内容,为学习笔记:
http://www.cnblogs.com/CloudMan6/p/6081430.html
http://www.cnblogs.com/CloudMan6/p/6089335.html