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