美文网首页
玩转 OpenStack(八.3)Linux Bridge 实

玩转 OpenStack(八.3)Linux Bridge 实

作者: 河码匠 | 来源:发表于2019-05-06 15:25 被阅读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。省略了很多

    • iptables 的规则是应用在 Neutron port 上的,port 在这里是 test 虚拟机的虚拟网卡 tape1e6eefa-bd
    • ingress(入口)规则集中定义在命名为 “neutron-linuxbri-ie1e6eefa-b” 的 chain 中。
    • egress(出口)规则集中定义在明明为 “neutron-linuxbri-ie1e6eefa-b” 的 chain 中。

    使用 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
    • 设置 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。

    相关文章

      网友评论

          本文标题:玩转 OpenStack(八.3)Linux Bridge 实

          本文链接:https://www.haomeiwen.com/subject/pdgcgqtx.html