写点什么

详解网络知识:iptables 规则

  • 2024-02-19
    广东
  • 本文字数:2626 字

    阅读完需:约 9 分钟

详解网络知识:iptables规则

本文分享自华为云社区《【理解云容器网络】1-基础篇-iptables介绍》,作者: 可以交个朋友。

iptables 规则


下图为数据包到达 linux 主机网卡后,内核如何处理数据包的大致流程


什么是规则


规则是管理员对数据包制定的一种触发机制,即当数据包达到某种条件,就执行指定的动作。条件:可以是数据包源地址、目的地址、协议等动作:可以是拒绝、接受、丢弃等;详细介绍见下表



使用 iptables 命令写入规则示例:


iptables -t filter -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 -m multiport --dports 443,80 -j ACCEPT#-t:操作那个表#-A:在表末追加规则;-I为表首插入规则、-D为删除规则#INPUT:链名称;该规则在那条链上生效#-j:数据包处理动作;比如接受、拒绝等
复制代码


整条命令解释:允许经过本机网卡 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,局域网内的设备访问外网时统一走路由器出口,路由器此时需要做两件事:


  1. 数据包从出口出去之前,将数据包的源地址和源端口改成公网 ip 和随机端口

  2. 同时将转换关系记录保存,响应数据包返回时根据记录转发给局域网内的设备


SNAT 示例:


iptables -t nat -A POSTROUTING -d 192.168.1.11 -p tcp --dport 88 -j SNAT --to-source 122.9.3.47:88# -j:值为SNAT需要静态指定修改后的值,值为MASQUERADE表示动态修改源地址为出口网卡地址# --to-source:将数据包的源地址转换成指定值# 整条命令解释:将发给192.168.1.11:88的数据包,其源地址改为122.9.3.47
复制代码


DNAT(目的地址转换) 主要用于修改数据包目的地址和端口路由器,一般在 nat 表中的 PREROUTING 链中增加规则:接收到数据包后,将目的地址和目的端口根据转换规则修改为实际的内网地址,规则需要提前在路由器上手动添加,如下图:将访问公网 ip 100...155:10022 的数据包转发给内网设备 172.30.100.136:22



DNAT 示例:


iptables -t nat -A PREROUTING -d 202.12.10.100 -p tcp --dport 20022 -j DNAT --to-destination 192.168.10.11:22# --to-destination:修改数据包的目的地址# 整条命令解释:将发给202.12.10.100:20022的数据包,其目的地址改为192.168.10.11:22
复制代码


注意:linux 内核使用 CONNTRACK 表(连接跟踪)记录 NAT 转换关系,一个连接仅在首次经过 iptables 链条时会计算 nat 表,一旦 conntrack 记录下这次的改写关系,后续无论是去程包还是回程包都是依据 conntrack 表进行改写关系的处理,不会再重复执行 nat 表中的 DNAT/SNAT 规则


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 5
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
详解网络知识:iptables规则_开发_华为云开发者联盟_InfoQ写作社区