iptables

Iptables 很早就已经集成到了Linux 的内核中,它由转发表 和 规则链 组成,通过表和链的组合,能适应各种场景下的安全需求功能。

iprable默认包含了表,每个表都有不同的用途,比如 Filter 表用来过滤数据 包,发往主机内部的包,和发往主机外部的包都由 filter 表中相应规则链来处 理。主机中默认的表有:

  • Raw:数据包最先经过的表,一般用来配置需要绕过iptable处理的流量。在安全组和防火墙功能中都没有使用到该表。
  • Filter :默认用于过滤数据包的表。neutron安全组和防火墙都是通过该表的不同链来实现的。
  • NAT:用于网络地址转换。
  • Mangle: 可以修改数据包的特定字段,常用来标记流量(如用来实现策略路由功能),也没有被安全组或防火墙使用。

chains

chains in iptables

链这个概念指的是一组规则,这些规则会在不同的场景下生效。默认有5种规则 链,规则链内部的规则详细地定义了数据包的处理方 式(转发或丢弃等等)。一旦开启iptables后,所有进出接口的数据包都需要经 过至少一条规则链。规则允许数据包从一个规则链跳转到另一条规则链。如果跳 转后没有匹配上任何规则,数据包将回到跳转之前的位置,并继续向下匹配规则。

  • Prerouting:跟名字一样,在数据包执行路由的策略之前会进入该规则链。除 了Filter以外,其他表都有用到该策略链。比如NAT,在数据包路由之前修改 数据包的源地址或目的地址。

  • Input:所有发往本地主机的数据包(即目的地址是本地的地址)都会经该规则链处理。Mangle 和 Filter 中都有用到。

  • Forward:所有目的地址非本机的数据包都用到该规则链。Mangle 和 Filter都有用到。

  • Output:由本地主机发往外部的数据包都使用该规则链。Raw、Filter、NAT、Mangle都有用到。

  • Postrouting:所有完成了路由选择的数据包都将通过该规则链。安全组的功 能没有使用到这个规则链,但浮动ip则有使用。Mangle和NAT表有使用。

注意,报文会经过每个表的链。比如output链,nat、filter、raw、mangle表都 有这个链。因此报文会分别经过这四个表的output链处理。

package path in iptables

数据报文的路径如下:

  • 数据进入计算节点
  • prerouteing处理阶段,一般是nat等功能处理
  • 查路由,根据目的地址看是否上送本机,如果上送,走input链
  • 转发报文发送到forward链
  • 如果主机收到报文,主机对收到的报文处理,发送出去
  • 出接口报文查路由
  • 送到output链处理
  • postrouting链,处理对应的nat等

参考:https://www.cnblogs.com/pmyewei/p/7609259.html

iptables in neutron

neutron相关的链

neutron-filter-top
加在原生的Forward和output链上
neutron-openvswi-FORWARD
neutron 定义的 FORWARD 链
neutron-openvswi-INPUT
neutron 定义的 INPUT 链
neutron-openvswi-OUTPUT
neutron 定义的 OUTPUT 链
neutron-openvswi-local
一般为空
neutron-openvswi-sg-chain
挂的neutron-openswi-FORWARD下,安全组实现的入口
neutron-openvswi-sg-fallback
默认为drop

neutron主要用的是filter表和nat表。对filter表的INPUT,OUTPUT,FORWARD链 进行包装,将到达原链的数据包转发到包装链,还增加一个包装的local链。 对于nat表,PREROUTING,OUTPUT,POSTROUTING链进行包装,另外在 POSTROUTING链之后加了snat链。

filter table

  • 增加一个链neutron-filter-top,增加规则:

    • -A FORWARD -j neutron-filter-top
    • -A OUTPUT -j neutron-filter-top
  • 增加一个包装链neutron-l3-agent-local,增加规则:

    • -A neutron-filter-top -j neutron-l3-agent-local
  • 包装链neutron-l3-agent-INPUT,neutron-l3-agent-OUTPUT,neutron-l3-agent-FORWARD,添加规则:

    • -A INPUT -j neutron-l3-agent-INPUT
    • -A OUTPUT -j neutron-l3-agent-OUTPUT
    • -A FORWARD -j neutron-l3-agent-FORWARD

nat table

  • 包装链neutron-l3-agent-PREROUTING,neutron-l3-agent-OUTPUT,neutron-l3-agent-POSTROUTING,添加规则:

    • -A PREROUTING -j neutron-l3-agent-PREROUTING
    • -A OUTPUT -j neutron-l3-agent-OUTPUT
    • -A POSTROUTING -j neutron-l3-agent-POSTROUTING
  • nat表中添加neutron-postrouting-bottom链,增加规则:

    • -A POSTROUTING -j neutron-postrouting-bottom
  • nat表中添加包装链neutron-l3-agent-snat,增加规则:

    • -A neutron-postrouting-bottom -j neutron-l3-agent-snat
  • nat表中添加包装链neutron-l3-agent-float-snat,增加规则:

    • -A neutron-l3-agent-snat -j neutron-l3-agent-float-snat

    这部分表,我在实验环境没找到,应该是需要开启某些功能。

neutron链在iptables中的位置

filter表和nat表中的表。

neutron的链之间的关系

neutron的iptables规则是在filter表实现

主要是在in和out两个表中实现。in表是安全组的入规则,out是安全组的出规则。

虚拟机访问宿主机

我们已经知道,安全组是在filter表的FORWARD链上实现的,但如果虚拟机的包 是去往宿主机时,由于内核判断目标地址就是自己,因此不会流到FORWARD链而 是发往INPUT链,那这样岂不就是绕过安全组规则了吗?

解决办法很简单,只需要把neutron的out链再挂到INPUT链就可以了。

安全组问题排查

  • 先找到虚机的port

  • 在对应的计算节点,查看所有的安全组规则

  • 查看安全组规则是否正确,重点看in和out链是否有drop