iptables 要点总结 | JiaYu's Blog 

JerryXia 发表于 , 阅读 (0)

本文尽量不涉及诸如iptables规则编写之类的技术细节,那些都是可以通过短暂的学习和实践掌握的。本文主要偏重在整体概念的介绍,和技术细节之外容易忽略却又很重要的点(比如过滤规则设计时需要遵从的一些“原则”),掌握不好这些点,编写一串过滤规则可能还是漏洞百出。

1. 简述

1.1 Netfilter/iptables 介绍


防火墙系统根据其工作方式的不同,主要可以分为 包过滤防火墙(也称“网络层防火墙”) 和 应用层防火墙netfilter/iptables 包过滤系统是包过滤防火墙的代表。

网络流量由 IP 信息包(或,简称 信息包)— 以流的形式从源系统传输到目的地系统的一些小块数据 — 组成。 这些信息包有 ,即在每个包前面所附带的一些数据位,它们包含有关信息包的源、目的地和协议类型的信息。 防火墙根据一组规则检查这些头,以确定接受哪个信息包以及拒绝哪个信息包。该过程即为信息包过滤

netfilter/iptables 信息包过滤系统是一种功能强大的工具, 可用于添加、编辑和除去规则,这些规则是在做信息包过滤决定时,防火墙所遵循和组成的规则。这些规则存储在专用的信息包过滤表中, 而这些表集成在 Linux 内核中。 在信息包过滤表中,规则被分组放在 链(chain)中。

虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件 netfilter和 iptables 组成。

netfilter 组件也称为 内核空间(kernelspace),是Linux内核中实现包过滤防火墙的内部结构由一些信息包过滤表组成,不以程序或文件的形式存在, 这些表包含内核用来控制信息包过滤处理的规则集,属于“内核态”(KernelSpace,又称内核空间)的防火墙功能体系。

iptables 组件是一种工具,也称为 用户空间(userspace),指的是用来管理Linux防火墙的命令程序,通常位于/sbin/iptables,属于“用户态”(UserSpace,又称用户空间)的防火墙管理体系,它使插入、修改和除去信息包过滤表中的规则变得容易。

简单来说,Netfilter/iptables 是一套工具,Netfilter是“后台”,在内核空间里执行着防火墙的核心功能;iptables 是“前端”,在用户空间里与用户交互,是用户对Netfilter的管理与配置的“接口”

1.2 iptables 命令简介

iptables 书写规则的命令格式是:

1
iptables [-t table] command [match] [target/jump]

关于上述命令格式中的 commandmatch,可以分别参考下面链接:

  1. https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#COMMANDS
  2. https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#MATCHES

2. Netfilter/iptables 组成结构

2.1 概要


Netfilter 由多个表(table)组成,每个表又由多个链(chain)组成(此处可以脑补二维数组的矩阵了),链是存放过滤规则的“容器”,里面可以存放一个或多个iptables命令设置的过滤规则。目前的表有4个:raw table, mangle table, nat table, filter table。Netfilter 默认的链有:INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING,根据的不同功能需求,不同的表下面会有不同的链,链与表的关系可用下图直观表示:
Alt text

NOTE:
Netfilter各个表中的链,是可以由用户新建自定义的,命令 iptables -t <table> -N <new_chain> 即是在 table 表中新建一个用户自定义链new_chain

2.2 RAW 表


RAW 表是 Netfilter/iptables 新增的模块,在没打相关补丁的2.4与2.6版本Linux内核的系统上无法使用。

RAW表只用来实现一个功能:在数据包上做一个标记NOTRACK,该标记表明这个数据包不被后面启动的“连接状态跟踪机制”来跟踪这个数据包的状态。(后面会讲“连接状态”及其跟踪机制)。

要做到告诉“链接状态跟踪机制”不追踪某数据包,只能在该机制起作用之前在数据包上做一个标记,而其他的三个表都是工作在“链接状态跟踪机制”之中的,不能脱离该机制控制范围之外,所以唯一容易的做法就是这样额外单拉出一个表,工作在“链接状态跟踪机制”之外。

RAW表只有PREROUTINGOUTPUT 两个链。

2.3 Mangle 表


Mangle 表主要用来mangle数据包,你可以使用mangle匹配来改变包的 TOS/TTL 等属性,具体有:

  • TOS
  • TTL
  • MARK
  • SECMARK
  • CONNSECMARK

关于这几个属性的详细资料,可以参考:https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#MANGLETABLE

Mange表可以操作5个链中的任何一个。

2.4 NAT 表


顾名思义,这个表的功能主要实现 NAT(Network Address Translation,网络地址转换)的功能,实现的具体操作有以下4个:

  • DNAT
  • SNAT
  • MASQUERADE
  • REDIRECT

NOTE:
NAT 表处理数据包有一个特点:只处理一个数据流的第一个数据包,后续的数据包会被自动匹配并做相同处理。

DNAT 操作主要用在这样一种情况,你有一个合法的IP地址,要把对防火墙的访问 重定向到其他的机子上(比如DMZ)。也就是说,我们改变的是目的地址,以使包能重路由到某台主机。修改目的ip地址的原因一般就是为了改变包发送的目的地,让包走出去,而不是留下来,所以在iptables中,DNAT是在入口,也即 PREROUTING 链中发挥作用,以便让包进入 FORWARD 表。

SNAT 改变包的源地址,这在极大程度上可以隐藏你的本地网络或者DMZ等。一个 很好的例子是我们知道防火墙的外部地址,但必须用这个地址替换本地网络地址。有了这个操作,防火墙就 能自动地对包做SNAT和De-SNAT(就是反向的SNAT),以使LAN能连接到Internet。如果使用类似 192.168.0.0/24这样的地址,是不会从Internet得到任何回应的。因为IANA定义这些网络(还有其他的)为 私有的,只能用于LAN内部。修改源ip地址的目的一般都是为了让这个包能再回到自己这里,所以在iptables中,SNAT是在出口,也即 POSTROUTING 链发挥作用。

MASQUERADE 的作用和 SNAT 完全一样,只是计算机 的负荷稍微多一点。因为对每个匹配的包,MASQUERADE 都要查找可用的 IP 地址,而 不象 SNAT 用的 IP 地址是配置好的。当然,这也有好处,就是我们可以使用通过 PPP、 PPPOE、SLIP 等拨号得到的地址,这些地址可是由 ISP 的 DHCP 随机分配的。

NAT 表只包含 PREROUTINGPOSTROUTINGOUTPUT 3个链。

2.5 Filter 表


Filter 表用来过滤数据包,我们可以在任何时候匹配包并过滤它们,Netfilter/iptables 防火墙的包过滤功能主要由此实现。 我们就是在这里根据包的内容对包做DROP或ACCEPT的。当然,我们也可以预先在其他地方做些过滤,但是这 个表才是设计用来过滤的。几乎所有的target都可以在这儿使用。

Filter 表包含 INPUT, OUTPUTFORWARD 3个链。

3. 经过防火墙的数据流

当数据包到达防火墙时,如果MAC地址符合,就会由内核里相应的驱动程序接收,然后会经过一系列操作,从而决定是发送给本地的程序,还是转发给其他机器,或者其他操作。然而,防火墙对于以本地地址为目标以本地地址为源被转发三种情况的数据包,具体操作有细微的差别,这些差别主要体现在不同的数据包会经过不同的Table,也会被不同Table中的不同的Chain来处理。详情如下:

3.1 以本地地址为目标的数据包