OpenStack中的防火墙 ( by quqi99 )

版权声明:本文为博主原创文章,如需转载,请注明出处! https://blog.csdn.net/quqi99/article/details/7447233

                              OpenStack中的防火墙 ( by quqi99 )

作者:张华  发表于:2012-4-10
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明

( http://blog.csdn.net/quqi99 )

iptables提供了全面的协议状态跟踪、数据包的应用层检查、速率限制、过滤策略。

iptables策略是由一组有序的规则建立的,它告诉内核该如何处理数据包。而规则应用于表中的一个链,链是一个规则集。

iptable 的概念从大到小是:iptables > tables > chains > rules

表,表描述了iptables的功用大类,共有4个内置表:filter,nat, mangle,raw

filter, 默认表,有三个重要的内置链:INPUT, OUTPUT, FORWARD

nat,网络地址转换表,三个链,PREROUTING (DNAT), POSTROUTING(SNAT),OUTPUT(用于本地包的NAT)

mangle, 用于包的修改, PREOUTING, OUTPUT, FORWARD, INPUT, POSTROUTING

raw, 用于配置免除, PREROUTING, OUTPUT

下图显示了这些内置链的关系:


iptables包处理流程图如下:




例如:openstack中的floating-ips就是根据SNAT与DNAT规则实现的:

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 9.123.25.13
iptables -t nat -A PREROUTING -d 9.123.25.13 -j DNAT --to-destination 172.16.1.2

http://blog.csdn.net/bill_lee_sh_cn/article/details/4401896


匹配,即条件,每个iptables规则都包含一级匹配以及一个目标,后者告诉ipatables对于符合规则的数据包应该采取什么动作。最重要的iptables匹配如下:

--source (-s ), 配置源IP地址或网络

--destination (-d), 匹配目标IP或网络

--protocol (-p), 匹配IP

--in-interface (-i), 流入接口(如,eth0)

--out-interface (-o), 输出接口

--state,匹配一组连接状态

--string, 匹配应用层数据字节序列

--comment,在内核内存中为一个规则关联多达256个节字的注释数据

目标,即动作,它们用于在数据包匹配一条规则时触发的一个动作。如下:

ACCEPT, 充许数据包通过

DROP,丢弃数据包,不响应报文

REJECT, 丢弃数据包,响应报文

LOG,记录数据包信息到syslog

RETURN,在调用链中继续处理数据包


除了内置链以外,还可以自定义链表,自定义链表的一般过程是:

1, 创建一个新链表,iptables-t filter -N newchain

2, 往新链表中添加rulesiptables-t filter -A newchain -s 192.168.75.129 -j DROP

3, 通过-j参数使用自定义的链,iptables-A INPUT -j newchain


Neutron使用了自定义链,分包装链与非包装链两类,区别在于是否对链表添加组件名重新包装

(这样定名的目的是为了不和系统中其他应用设置的防火墙规则混淆

1)包装链,链名需要通过组件名重新包装,如neutron-l3-agent组件定义的OUTPUT链叫neutron-l3-agent-OUTPUT,也意味着,Neutron不会用内置链OUTPUT,它必须跳转到对应的包装链(iptables-t filter OUTPUT -j neutron-l3-agent-OUTPUT

2)非包装链,链名没有用组件名包装,例如,neutron-filter-top就是位于FOWARDOUTPUT顶部的非包装链,用于在不同OpenStack组件共享的链,

neutron-filter-top链的内容是:

iptables -t filter -N neutron-filter-top

iptables -t filter -A FORWARD -jneutron-filter-top

iptables -t filter -A OUTPUT -j neutron-filter-top


再添加一个包装链neutron-l3-agent-local,接管非包装链neutron-filter-top

iptables -t filter -N neutron-l3-agent-local

iptables -t filter -A neutron-filter-top -jneutron-l3-agent-local

对于IPv4,IPv6Neutronfilternat两张表里的INPUT,FORWARD, OUTPUT三个内置链都定义了相应的包装链:

iptables -t filter -A INPUT -jneutron-l3-agent-INPUT

iptables -t filter -A FORWARD -jneutron-l3-agent-FORWARD

iptables -t filter -A OUTPUT -jneutron-l3-agent-OUTPUT

iptables -t nat -A INPUT -j neutron-l3-agent-INPUT

iptables -t nat -A FORWARD -jneutron-l3-agent-FORWARD

iptables -t nat -A OUTPUT -jneutron-l3-agent-OUTPUT


还定义了一个名为neutron-postrouting-bottom的非包装类,用于POSTOURING链之后:

iptables -t filter -N neutron-postrouting-bottom

iptables -t filter -A POSTROUTING -jneutron-postrouting-bottom

neutron-postrouting-bottom链后再定义两个snat(neutron-l3-agent-snat)的包装类:

iptables -t filter -N neutron-l3-agent-snat

iptables -t filter -A neutron-postrouting-bottom-j neutron-l3-agent-snat

iptables -t filter -N neutron-l3-agent-float-snat

iptables -t filter -A neutron-postrouting-bottom-j neutron-l3-agent-float-snat


最后定义sg-fallback包装链

iptables -t filter -N neutron-l3-agent-sg-fallback

iptables -t filter -Aneutron-l3-agent-sg-fallback -j DROP


所以这些初始化链的关系是:



OpenStack为我们准备好了上面的包装链与非包装链,再添加添加防火墙规则的时候,就不要再往内置链上添加了,而是直接添加到包装链与非包装链上,我们来看一下怎么用吧(这些内容来自永生的博客,写得真不错,做笔记到这里了,http://www.ibm.com/developerworks/cn/cloud/library/cl-openstack-network/index.html )

1)元数据,


VM首先访问l3-agent节点上的网关,而l3-agent节点(dhcp-agent节点也会干这事)会在9697端口上启动neutron-ns-metadata-proxy代理,下面的iptables rules保证包通过(注意: 如果存在命名空间这些规则就在命名空间里)。

cirros$ ip route get 169.254.169.254
169.254.169.254 via 10.0.1.1 dev eth0  src 10.0.1.3

sudo ip netns exec qrouter-b0d4cbde-84c8-4883-a953-1d11bcc3c99b iptables-save | grep 169.254
-A neutron-vpn-agen-inbound -s 169.254.169.254/32 -j ACCEPT
-A neutron-vpn-agen-outbound -d 169.254.169.254/32 -j ACCEPT
-A neutron-vpn-agen-PREROUTING -d 169.254.169.254/32 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9697  #对于dhcp-agent的metdata代理没有这一条语句,直接使用80端口

ubuntu@neutron-gateway:~$ sudo ip netns exec qrouter-02c71d17-8186-4fde-8bfc-ee0bea0d44ba ss -sl4tp  | grep 9697
LISTEN     0      128                     *:9697                     *:*        users:(("neutron-ns-meta",58682,6))

ubuntu@neutron-gateway:~$ sudo ip netns exec qrouter-02c71d17-8186-4fde-8bfc-ee0bea0d44ba ps -f --pid 58682 | fold -w82 -s
UID        PID  PPID  C STIME TTY          TIME CMD
neutron  58682     1  0 Jun18 ?        00:00:48 /usr/bin/python 
/usr/bin/neutron-ns-metadata-proxy 
--pid_file=/var/lib/neutron/external/pids/02c71d17-8186-4fde-8bfc-ee0bea0d44ba.pid
 --metadata_proxy_socket=/var/lib/neutron/metadata_proxy 
--router_id=02c71d17-8186-4fde-8bfc-ee0bea0d44ba --state_path=/var/lib/neutron 
--metadata_port=9697 --metadata_proxy_user=109 --metadata_proxy_group=113 
--log-file=neutron-ns-metadata-proxy-02c71d17-8186-4fde-8bfc-ee0bea0d44ba.log 
--log-dir=/var/log/neutron

ubuntu@neutron-gateway:~$ ps -f --pid 26859 | fold -w 80 -s 
UID        PID  PPID  C STIME TTY          TIME CMD
neutron  26859 26747  2 Jun16 ?        2-23:44:43 /usr/bin/python 
/usr/bin/neutron-metadata-agent --config-file=/etc/neutron/neutron.conf 
--config-file=/etc/neutron/metadata_agent.ini 
--log-file=/var/log/neutron/neutron-metadata-agent.log
ubuntu@neutron-gateway:~$ sudo ss -slxp | grep metadata_proxy 
u_str  LISTEN     0      128    /var/lib/neutron/metadata_proxy 1460916               * 0     
  users:(("neutron-metadat",26859,5),("neutron-metadat",26858,5),("neutron-metadat",26857,5),("neutron-metadat",26856,5),
("neutron-metadat",26855,5),("neutron-metadat",26854,5),("neutron-metadat",26853,5),("neutron-metadat",26852,5),
("neutron-metadat",26747,5))

然后neutron-ns-metadata-proxy代理会通过http协议访问neutron metadata-agent,所以169.254.169.254应该是配置在metadata-agent节点的lo口上。neutron metadata-agent的机器上应该将169.254.169.254 DNAT实际布置metadata service的机器nova_metadata_ip (/etc/neutron/meatadata_agent.ini)上,如172.16.1.122 。(所以当nova-api与metadata agent不在同一机器上时,在metadata agent机器上应该配置metadata_host配置)

同时,在nova-api机器上要放行这类包。

-A nova-network-POSTROUTING -s 10.0.0.0/8 -d 172.16.1.122/32 -j ACCEPT


l3-agent上会为每一个namespace下的router创建一个neutron-ns-metadata-proxy进程(虚机和nova-api的路由不同才需要代理),  将请求元数据服务VM的源IP通过设置X-Forwarded-For, X-Neutron-Router-ID, X-Neutron-Network-ID 传给metadata_agent从而解决识别不同namespace下虚机的问题, 然后metadata-agent根据源IP找到port的相关信息(调用nova-api时需要这个port-id之类的信息来识别虚机, X-Forwarded-For , X-Instance-ID, X-Tenant-ID, X-Instance-ID-Signature). neutron-ns-metadata-proxy通过本地的unix-socket再交给本机的metadata-agent, 本机的metadata-agent再通过配置文件中的nova-metadata_host找到本机的nova-metadata-api.


如果使用外部网关,要使用metadata也应该启动dhcp-agent, 即: 

/etc/neutron/dhcp_agent.ini:
  enable_metadata_network = True
  enable_isolated_metadata = True

/neutron/l3_agent.ini:
  enable_metadata_proxy = False
有时候还要在nova.conf中设置use_forwarded_for = True. 这样虚机里会通过dhcp static host特性自动添加一条路由(ip route add 169.254.169.254/32 via 10.20.0.5  ), 然后在dhcp节点的qdhcp-XXX名空间的dhcp port应该同时具有两个IP (例如一个10.20.0.5, 一个是169.254.169.254),它会启动neutron-ns-metadata-proxy(它是隔离网络,此时的metadata_port是80,不是9697,不需要9697的那条iptables rule), 后面neutron-metadata-agent的部分和前面一样。

# ps -f --pid 27409 | fold -s -w 82        #pid可通过ip netns exec qdhcp-XXX netstat -4 -anpt 命令查看
UID PID PPID C STIME TTY TIME CMD 
root 27409 1 0 17:47 ? 00:00:00 python 
/usr/bin/neutron-ns-metadata-proxy 
--pid_file=/var/lib/neutron/external/pids/01cce415-8e2b-4096-92b5-7acc67163d79.pid 
--network_id=01cce415-8e2b-4096-92b5-7acc67163d79 --state_path=/var/lib/neutron 
--metadata_port=80 --debug --verbose 
--log-file=neutron-ns-metadata-proxy01cce415-8e2b-4096-92b5-7acc67163d79.log 
--log-dir=/var/log/neutron 

所以使用dhcp-agent的metadata代理时,必须是隔离网络(neutron subnet-create net1 172.17.17.0/24 --no-gateway --name=sub1),如果不是隔离网络可以考虑设置force_metadata=True.


有时候即想用物理路由器,还不想使用dhcp-agent,并且还想使用metadata那该怎么办? 好说,那必须启动l3-agent(如它的IP是10.0.0.1),那么物理路由器的IP必须是不同的IP如10.0.0.254。这样用下列静态路由将到169.254.169.254的走l3-agent上的namespace metadata proxy,其他流量走物理路由器。具体见: https://kimizhang.wordpress.com/2014/11/11/how-to-use-meta-data-service-for-vm-with-provider-network/

neutron subnet-create --name test-subnet --gateway 10.0.0.1  \
--host-route destination=169.254.169.254/32,nexthop=10.0.0.1 \
--host-route destination=0.0.0.0/0,nexthop=10.0.0.254 test-net 10.0.0.0/24


默认的security group会为每个port产生嗅探规则(即只允许匹配的ip, mac对的流量通过, 对于负载均衡或者 SLAC IPv6地址的port, 可能一个port(只有一个mac)但有多个IP, 所以可以通过allowed-address-pairs这个扩展来允许任何源IP的流量通过. 那我们可以用ipv6的本地链路地址LLAddr来查询上面的port呢, 于是有了BP, https://blueprints.launchpad.net/neutron/+spec/metadata-find-instance-by-lladdr ,  但是又有一种情况, 不同namespace下可能允许出现相关的mac地址的(overlapping mac), 这样根据mac地址将查询出两个port出来,

源IP及network_id (不同的tenant下是可以存在的subnet的)去查询port可能会有一个问题(找port是为了找到虚机的device_id和tenant_id信息), 如纯IPv6环境(一个同MAC的port会有多个IPv6地址),如虚机从外部获取IP时IP根本就不在port的fixed_ip字段里, 这样就会造成找不到port从而找不着device_id从而造成metadata服务不可用。(当然,可以通过allowed-address-pairs扩展将169.254.0.0/16加入虚机的port security里). 这种情况是不是可以用config-driver这种离线的元数据配置服务去代替在线的metadata服务. 或者搞一个所谓的serial port配置在fixed_ip list的源IP专门去读在线的metadata服务.

config-driver虚机注入见: http://niusmallnan.github.io/_build/html/_templates/openstack/vm_first_boot_fast.html, 即把nova boot传来的元数据写到iso中, 虚机启动时自动挂载iso, 然后init-cloud从光驱里读元数据并设置

allowed-address-pairs见: http://blog.csdn.net/matt_mao/article/details/19417451

默认为每一个虚机生成的反欺骗规则如下,这样VM的流量才能出去与外界通信。同样,metadata服务响应的流量要出来其源IP是169.254.0.0/16,也应为其添加allowed-address-pairs后流量才能出去

对于ipv6同样会有一个port有多个ipv6地址的情况,所以_select_ra_ips_for_network_ids方法就是使用ipv6的本地链路地址去为做网关的虚机生成默认的反欺骗规则从而允许其他虚机发过来的RA广播进来。

arget          prot    opt    in     out          source           destination

RETURN     all     --      *        *          <VM-IP>           0.0.0.0/0           MAC FA:16:3E:38:38:90
DROP
          all     --      *        *          0.0.0.0/0            0.0.0.0/0

 

2)访问dmz规则,FLAGS.dmz_cidr定义了一个dmz列表,虚机应该能访问它,例本例的dmz列表为:10.0.128.0/24

-Anova-network-POSTROUTING -s 10.0.0.0/8 -d 10.0.128.0/24 -j ACCEPT

3)两个虚机互通,从一个子网且不是DNAT的连接放行。

-Anova-network-POSTROUTING -s 10.0.0.0/8 -d 10.0.0.0/8 -m conntrack !--ctstate DNAT

-j ACCEPT

4)SNAT规则,例如从10.0.0.0/8虚机内网网络出去的包将源目址修改为外网IP9.123.1.12

-A nova-network-snat -s10.0.0.0/8 -j SNAT --to-source 9.123.1.122

5)创建网桥要做的事

1,网络节点,转发流量,充当网关

-A nova-network-FORWARD -i br100 -j ACCEPT
-A nova-network-FORWARD -o br100 -j ACCEPT
2, 若是计算节点要允许虚机与网络节点以及其他计算节点上的虚机相连
-A nova-compute-FORWARD -i br100 -j ACCEPT 
-A nova-compute-FORWARD -o br100 -j ACCEPT

,支持dhcp(67)dns(53)

-A nova-network-INPUT -i br100 -p udp -m udp --dport 67 -j ACCEPT 
-A nova-network-INPUT -i br100 -p tcp -m tcp --dport 67 -j ACCEPT
-A nova-network-INPUT -i br100 -p udp -m udp --dport 53 -j ACCEPT
-A nova-network-INPUT -i br100 -p tcp -m tcp --dport 53 -j ACCEPT
4,所以每个虚机的链和规则如下图:



相应的, neutron l2 agent上的规则如下:

neutron l2 agent上的iptables设置,当它发现有新增tap设备时,就会从DB中取出和tap设备关联的port信息来设置vlan及security group(调用plugin的security_group_rules_for_devices方法获取port的安全组规则信息,规则信息里面已经考虑了允许dhcp, address_pair等)相关设置。每个port对应两条链(iX-XXXX和oX-XXXX), 下面只显示iX-XXXX的作为例子,oX-XXXX的依此类推。实现了这些功能:

  •     prepares, updates, removes firewall filters (准备、更新和删除防火墙过滤器)
  •     drops all packets by default (默认丢弃所有包)
  •     prevents IP spoofing based on port's mac address (compatible with allowed_address_pairs extension) (防 IP 欺骗)
  •     allows incoming DHCP and ICMPv6 RA (允许进入虚机的 DHCP 包和 ICMPV6 RA)
  •     blocks outgoing DHCP (禁止出虚机的 DHCP 包)
  •     drops INVALID packets (丢弃无效状态的包)
  •     allows stateful, established connections (允许有状态的并且已建立的连接,比如允许进来的 ICMP 的时候,从外面 ping 虚机时虚机的响应包是可以返回的)
  •     converts security group rules to iptables rules (IPv4, IPv6, TCP, UDP, ICMP, ICMPv6) (将用户配置的规则转化为 iptables 规则)
  •     multiple TCP/UDP ports per iptables rule using multiport module
  •     支持 IPV4 和 IPV6

相应的链如下:

-N neutron-filter-top
-N neutron-openvswi-FORWARD #neutorn 定义的 FORWARD 链
-N neutron-openvswi-INPUT   #Neutron 定义的 INPUT 链
-N neutron-openvswi-OUTPUT  #Neutron 定义的 OUTPUT 链
-N neutron-openvswi-i6e3f2eda-3 #处理进入该虚机的网络包
-N neutron-openvswi-local
-N neutron-openvswi-o6e3f2eda-3 #处理出该虚机的网络包
-N neutron-openvswi-s6e3f2eda-3 #处理出该虚机的网络包的防IP欺骗
-N neutron-openvswi-sg-chain    
-N neutron-openvswi-sg-fallback
-A INPUT -j neutron-openvswi-INPUT #将 INPUT 链转到 neutron 的 INPUT 链
-A FORWARD -j neutron-filter-top
-A FORWARD -j neutron-openvswi-FORWARD #将 FORWARD 链转到 neutorn 的 forward 链
-A OUTPUT -j neutron-filter-top
-A OUTPUT -j neutron-openvswi-OUTPUT   #将 OUTPUT 链转到 neutron 的 output 链
-A neutron-filter-top -j neutron-openvswi-local




-A neutron-openvswi-FORWARD -m physdev --physdev-out tap6e3f2eda-32 --physdev-is-bridged -j neutron-openvswi-sg-chain #处理进入虚机的数据包
-A neutron-openvswi-FORWARD -m physdev --physdev-in tap6e3f2eda-32 --physdev-is-bridged -j neutron-openvswi-sg-chain  #处理出虚机的数据包
-A neutron-openvswi-INPUT -m physdev --physdev-in tap6e3f2eda-32 --physdev-is-bridged -j neutron-openvswi-o6e3f2eda-3 #处理出虚机的数据包

#处理进虚机的包
-A neutron-openvswi-i6e3f2eda-3 -m state --state INVALID -j DROP                               #丢弃无效连接
-A neutron-openvswi-i6e3f2eda-3 -m state --state RELATED,ESTABLISHED -j RETURN                 #允许已建立的连接  
-A neutron-openvswi-i6e3f2eda-3 -s 10.0.0.7/32 -p udp -m udp --sport 67 --dport 68 -j RETURN #允许 DHCP 服务器 10.0.0.3 的返回包
-A neutron-openvswi-i6e3f2eda-3 -s 10.0.0.2/32 -p udp -m udp --sport 67 --dport 68 -j RETURN #允许 DHCP 服务器 10.0.0.2 的返回包
-A neutron-openvswi-i6e3f2eda-3 -j neutron-openvswi-sg-fallback                                #其余包交给 fallback 链处理     

#处理出虚机的包
-A neutron-openvswi-o6e3f2eda-3 -p udp -m udp --sport 68 --dport 67 -j RETURN   #允许 DHCP 访问
-A neutron-openvswi-o6e3f2eda-3 -j neutron-openvswi-s6e3f2eda-3                 #防止 IP 欺骗
-A neutron-openvswi-o6e3f2eda-3 -p udp -m udp --sport 67 --dport 68 -j DROP     #不允许对外提供 DHCP 服务
-A neutron-openvswi-o6e3f2eda-3 -m state --state INVALID -j DROP                #禁止无效连接
-A neutron-openvswi-o6e3f2eda-3 -m state --state RELATED,ESTABLISHED -j RETURN  #允许已建立的连接
-A neutron-openvswi-o6e3f2eda-3 -j neutron-openvswi-sg-fallback                 #其余交给 fallback 链处理

#防 IP 欺骗规则:防止该虚机被利用来做 IP 欺骗攻击。
-A neutron-openvswi-s6e3f2eda-3 -s 10.0.0.14/32 -m mac --mac-source FA:16:3E:F3:1E:C0 -j RETURN #允许从虚机发出的MAC 和IP 同虚机的 MAC 和 IP 的包
-A neutron-openvswi-s6e3f2eda-3 -j DROP                                                           #禁止其余包

-A neutron-openvswi-sg-chain -m physdev --physdev-out tap6e3f2eda-32 --physdev-is-bridged -j neutron-openvswi-i6e3f2eda-3 #处理进入虚机的包
-A neutron-openvswi-sg-chain -m physdev --physdev-in tap6e3f2eda-32 --physdev-is-bridged -j neutron-openvswi-o6e3f2eda-3  #处理出虚机的包

-A neutron-openvswi-sg-chain -j ACCEPT
-A neutron-openvswi-sg-fallback -j DROP #丢弃其它包



l3-agent 上FWaaS 相关设置

-A neutron-l3-agent-iv4XXXXXXXX-XXXX -m state --state INVALID -j DROP  
-A neutron-l3-agent-iv4XXXXXXXX-XXXX -m state --state ESTABLISHED,RELATED -j ACCEPT  
-A neutron-l3-agent-iv4XXXXXXXX-XXXX … -j ACCEPT/DROP

-A neutron-l3-agent-ov4XXXXXXXX-XXXX -m state --state INVALID -j DROP  
-A neutron-l3-agent-ov4XXXXXXXX-XXXX -m state --state ESTABLISHED,RELATED -j ACCEPT  
-A neutron-l3-agent-ov4XXXXXXXX-XXXX … -j ACCEPT/DROP

-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-iv4XXXXXXXX-XXXX  
-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-ov4XXXXXXXX-XXXX  
-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-fwaas-default-policy  
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-fwaas-default-policy

5,nova-api一开始会在filter表内创建一个规则允许他人能访问它(如nova-apiip是: 172.16.1.122)

-A nova-api-INPUT -d 172.16.1.122/32 -p tcp -m tcp --dport 8775 -j ACCEPT
6, 浮动ip即外网ip设置在网络节点的外网网卡上
nova-manage floating create --ip_range=192.168.1.232/30
Nova floating-ip-create
nova add-floating-ip 8f773639-c04f-4885-9349-ac7d6a799843 192.168.1.233

-A nova-network-OUTPUT -d 192.168.1.233/32 -j DNAT --to-destination 10.10.10.2
-A nova-network-PREROUTING -d 192.168.1.233/32 -j DNAT --to-destination 10.10.10.2 
-A nova-network-float-snat -s 10.10.10.2/32 -j SNAT --to-source 192.168.1.233
6,如果想ping一个虚机的话,需设置一个安全组规则(nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0),它将产生如下防炎墙rules. 请记住,在此 nova-compute 主机上,针对每个实例必须有一个特定链;其内的规则只允许来自固定子集内的 IP 的流量。
-A nova-compute-inst-1 -p icmp -j ACCEPT


Neutron防火墙的定义位于:

vi/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini

[securitygroup]

firewall_driver =neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver

既然neutronOVSHybridIptablesFirewallDriver接管了计算节点上的防火墙,所以应该确保nova-computenova.conf配置:

[DEFAULT]

firewall_driver =nova.virt.firewall.NoopFirewallDriver


查看Neutron中定义防火墙信息命令如下:

[hua@laptop devstack]$ ip netns list

qrouter-a4a3f113-4c61-4f74-adb6-ea3b6855a7e7

qdhcp-8779fa7c-d8ea-4827-a15d-3c7f56cb3ac0

[hua@laptop devstack]$ sudo ip netns execqrouter-a4a3f113-4c61-4f74-adb6-ea3b6855a7e7 iptables-save

[hua@laptop devstack]$ sudo ip netns execqrouter-a4a3f113-4c61-4f74-adb6-ea3b6855a7e7 iptables-restore


下面是这篇文章《利用raw表实现iptables调试》http://blog.youlingman.info/debugging-iptables-with-raw-table/ 中的内容。



关于上面的这个图,先要说一个很重要的说法,上图显示,netfilter实际上既可以在L2层过滤,也可以在L3层过滤的。

所以在网桥中一般会有下面的参数,即要求iptables不对bridge的数据进行处理:

# cat >> /etc/sysctl.conf <<EOF
  net.bridge.bridge-nf-call-ip6tables = 0
  net.bridge.bridge-nf-call-iptables = 0
  net.bridge.bridge-nf-call-arptables = 0
  EOF
# sysctl -p /etc/sysctl.conf

或者改用下面的方法解决:

 iptables -t raw -I PREROUTING -i BRIDGE -s x.x.x.x -j NOTRACK.

如果net.bridge.bridge-nf-call-iptables=1,也就意味着二层的网桥在转发包时也会被iptables的FORWARD规则所过滤,这样就会出现L3层的iptables rules去过滤L2的帧的问题(packets don't cross nat table twice, In the bridging process, you don’t know the outgoing interface so the previous rule doesn’t work. He needs the interface because he’s using MASQUERADE. In the routing process, the packets go to iptables but they never cross NAT tables because the packet already crossed the table in the bridging process.http://www.woitasen.com.ar/2011/09/confusion-using-iptables-nat-and-bridge/),所以涉及一些dnat, snat就不生效了,举个例子,具体表现在openstack中就是metadata服务不好使了。这个说法可参见:https://bugzilla.redhat.com/show_bug.cgi?id=512206

所以这样下面的规则也就失效了,所以http://blog.youlingman.info/debugging-iptables-with-raw-table/这个文章上的作者调试iptables的方法挺好,但实际上网络为什么不通的问题实质没有找准。

-A quantum-l3-agent-POSTROUTING ! -i qg-91757ded-c4 ! -o qg-91757ded-c4 -m conntrack ! --ctstate DNAT -j ACCEPT

还有一种等价于上面bridge-nf-call-iptables的做法,即iptables允许bridge上的数据直接转发

# iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
# service iptables save
# service iptables restart

physdev是二层的东西,三层的接口用-i来匹配,但二层的需要用physdev模块的physdev-in这个match了


下列配置抓取所有经过本机的ICMP包:

iptables -t raw -A OUTPUT -p icmp -j TRACE
iptables -t raw -A PREROUTING -p icmp -j TRACE
modprobe ipt_LOG

调试信息记录在/var/log/message文件中


其他:

打开一个端口:

iptables -I INPUT -i eth0 -p tcp --dport 16509 -j ACCEPT
iptables  -I OUTPUT -o eth0 -p tcp --sport 16509 -j ACCEPT 
sudo iptables-save > /tmp/ipt.save
cat /tmp/ipt.save | sudo iptables-restore
lsof -i:16509


2014-04-25添加:

如果使用neutron中的security group的话,配置如下:

1, /etc/nova/nova.conf:
libvirt_vif_driver = nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver
linuxnet_interface_driver =nova.network.linux_net.LinuxOVSInterfaceDriver
security_group_api = neutron
firewall_driver = nova.virt.firewall.NoopFirewallDriver
2, /etc/neutron/ovs_neutron_plugin.ini:
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver


Allowed Address Pairs Extenstion, 除了默认的防火墙, 还有其他什么ip可以穿过, 这样实例就可以用任意的源IP来访问外部网络


资料:

Linux网络路由表处理及钩子(Iptables and Ebtables) http://blog.chinaunix.net/uid-23741326-id-3573470.html

metadata, http://techbackground.blogspot.jp/2013/06/metadata-via-quantum-router.html

https://vietstack.wordpress.com/2014/09/27/introduction-of-metadata-service-in-openstack/

http://techbackground.blogspot.ie/2013/06/metadata-via-quantum-router.html

没有更多推荐了,返回首页