详解网络知识:iptables 规则
本文分享自华为云社区《【理解云容器网络】1-基础篇-iptables介绍》,作者: 可以交个朋友。
iptables 规则
下图为数据包到达 linux 主机网卡后,内核如何处理数据包的大致流程
什么是规则
规则是管理员对数据包制定的一种触发机制,即当数据包达到某种条件,就执行指定的动作。条件:可以是数据包源地址、目的地址、协议等动作:可以是拒绝、接受、丢弃等;详细介绍见下表
使用 iptables 命令写入规则示例:
整条命令解释:允许经过本机网卡 eth0,访问协议是 TCP,源地址是 192.168.1.0/24 段的数据包访问本地端口是 80 和 443 的服务
什么是表
表主要用来存放具体的防火墙规则,而规则具有功能性,比如修改数据包源/目的 ip、拒绝来自某个网段的数据包访问本机等;所以我们可以对规则进行分类,不同的功能存入不同的表
raw 表:主要用于决定数据包是否被状态跟踪机制处理
mangle 表:主要用于拆解报文修改数据包的 IP 头信息
nat 表:主要用于修改数据包的源地址和目的地址、端口号等信息(实现网络地址转换,如 SNAT、DNAT、MASQUERADE、REDIRECT)。
filter 表:主要用于对过滤流入和流出的数据包,根据具体的规则决定是否放行该数据包
security 表:最不常用的表,用在 SELinux 上;用于强制访问控制(MAC)网络规则,由 Linux 安全模块(如 SELinux)实现
其中 nat 表和 filter 表最常用
什么是链
上文提到表主要存放具体的规则,但是规则什么时候生效呢?比如客户端访问 VIP,数据包到达本机后必须先用 DNAT(网络地址转换)将 vip 转换成实际的后端实例 ip,然后才能路由判断,因为后端实例可能有多个且分布在不同主机,直接用 vip 进行路由判断肯定是不行的。所以规则有生效时机,根据生效时机可以分为:
PREROUTING:在数据包到达防火墙时,进行路由判断之前执行的规则
INPUT:路由判断之后确定数据包流入本机,应用其规则
FORWARD:路由判断之后确定数据包要转发给其他主机,应用其规则;linux 主机需要开启 ip_forward 功能才支持转发,在/etc/sysctl.conf 文件中配置参数 net.ipv4.ip_forward=1
OUTPUT:本机应用向外发出数据包时,应用其规则
POSTROUTING:在数据包离开防火墙时进行路由判断之后执行的规则
在每条链中,规则按照从上到下的顺序进行匹配,当一个数据包与某个规则匹配成功后,就会按照该规则的动作进行处理,并且后续的规则将不再被考虑。
表、链、规则三者的关系是什么
表是区分相同链的上下顺序,规则在每条链中的上下顺序确定规则执行顺序:
如果规则来自不同表,通过表的优先级确定链的优先级: 比如完整的 PREROUTING 链中有来自 raw 表、mangle 表、nat 标的 PREROUTING 链规则,通过表优先级 (raw>mangle>nat>filter>security) 区分优先级。所以一个报文发送到某台虚拟机后,被虚拟机网卡接收,会进入的虚拟机网络协议栈处理,先经过 PREROUTING 链处理,具体来说先走 raw 表的 PREROUTING 规则、再走 mangle 表、最后在走 nat 表 PREROUTING 规则。
如果规则来自同一个表,则按规则插入表的顺序自上而下。
数据报文进/出节点经过哪些规则
对于客户端来说,发送报文过程先进入 OUTPUT 链处理(raw、mangle、nat、filter、security 表对应的 PREROUTING 规则依次匹配),如果没有被拦截则根据路由选择出网口,再进入 POSTROUTING 链处理(mangle、nat 表对应的 POSTROUTING 规则依次匹配),最后从网卡出去
对于服务端来说,发送报文过程先进入 PREROUTING 链处理(raw、mangle、nat 表对应的 PREROUTING 规则依次匹配),根据路由判断数据报文发给本机,报文进入 INPUT 链处理(mangle、nat、filter、security 表对应的 INPUT 规则依次匹配),如果没有被拦截则报文被应用程序处理
对于转发场景,发送报文过程先进入 PREROUTING 链处理(raw、mangle、nat 表对应的 PREROUTING 规则依次匹配),根据路由判断数据报文不是发给本机,报文进入 FORWARD 链处理(mangle、filter、security 表对应的 FORWARD 规则依次匹配),如果没有被拦截则进入 POSTROUTING 链处理(mangle、nat 表对应的 POSTROUTING 规则依次匹配),最后从网卡出去
*补充:转发场景需要 Linux 开启转发功能,否则数据报文进入 FORWARD 链直接丢弃;临时开启执行命令
sysctl net.ipv4.ip_forward=1
或者echo "1" >/proc/sys/net/ipv4/ip_forward
;永久生效需要修改/etc/sysctl.conf,增加内容 net.ipv4.ip_forward = 1 保存,再执行命令:sysctl -p
NAT(网络地址转换)介绍
NAT 应用最广的场景就是解决局域网内设备访问互联网的问题。SNAT(源地址转换) 主要用于修改数据包的源 IP 和源端口,一般在 nat 表的 PREROUTING 链中增加规则:局域网内所有设备要上外网,如果每个设备都分配一个公网 ip 成本太大,可以在路由器出口分配一个公网 ip,局域网内的设备访问外网时统一走路由器出口,路由器此时需要做两件事:
数据包从出口出去之前,将数据包的源地址和源端口改成公网 ip 和随机端口
同时将转换关系记录保存,响应数据包返回时根据记录转发给局域网内的设备
SNAT 示例:
DNAT(目的地址转换) 主要用于修改数据包目的地址和端口路由器,一般在 nat 表中的 PREROUTING 链中增加规则:接收到数据包后,将目的地址和目的端口根据转换规则修改为实际的内网地址,规则需要提前在路由器上手动添加,如下图:将访问公网 ip 100...155:10022 的数据包转发给内网设备 172.30.100.136:22
DNAT 示例:
注意:linux 内核使用 CONNTRACK 表(连接跟踪)记录 NAT 转换关系,一个连接仅在首次经过 iptables 链条时会计算 nat 表,一旦 conntrack 记录下这次的改写关系,后续无论是去程包还是回程包都是依据 conntrack 表进行改写关系的处理,不会再重复执行 nat 表中的 DNAT/SNAT 规则
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/b824a4582d378b31c52d05db7】。文章转载请联系作者。
评论