Iptables

Writen By Lindsay On Jul 06, 2019

0.前言

   这篇文章和前面的 滴水算法 一开始是作为大作业写的,可能跟博文的风格有些差异,见谅。

1. 简介

   iptables是一个配置 Linux内核 防火墙的命令行工具,是 netfilter 项目的一部分。术语 iptables 也经常代指该内核级防火墙。
   iptables其实应该叫netfilter/iptables,它实际上由两个组件netfilter 和 iptables 组成。iptables本身并不算是防火墙。它定义的规则,可以让内核空间当中的 netfilter 来读取,并且实现让防火墙工作。
   netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
   iptables 组件是一种规则编写工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。

2. 结构

   iptables 中具有三个基本的抽象概念,表、链、规则,理解这三个概念是弄清楚 iptables 工作方式的基础。
   iptables 中具有5张表,分别是 raw, filter, nat, mangle, escurity,表的划分依据是其负责的不同功能,如 filter 表主要负责包的过滤,nat 表负责源地址、目的地址转换等功能,表的具体功能在本文第三部分介绍。值得一提的是,虽然也能在表中添加不符合其功能的规则,如在 nat 表或 mangle 表中使用过滤规则,但可能会产生一定的副作用,而且可能无法正确的过滤所有包。在实际使用中应该尽量避免这种用法。
   iptables 的表又由链组成,默认的 filter 表包括 INPUT, OUTPUT, FORWARD 3条默认链,nat 表包含 PREROUTING, POSTROUTING 和 OUTPUT 链。链的划分依据是工作的流程。如目的地址为本地的包会通过 INPUT 链,源地址为本地的包会通过 OUTPUT 链,转发的包会通过 FORWARD 链等。具体在本文第四部分介绍。
   要让 iptables 生效,需要在链中添加具体的规则。可以使用命令 iptables 添加规则,也可以通过 iptables-restore 从文件导入规则。规则和命令行的使用方法见本文第五部分。

   下图展示了三种包的工作步骤

tables_traverse

3. 表

   iptables 的五张表,根据其处理顺序的不同,具有不同的优先级,优先级从大到小为 raw > mangle > nat > filter > security

   raw表:raw 表的优先级最高,这张表内的规则会赶在 iptables 的 ip_conntrack 模块进行连接跟踪处理,通常应用于负载较高的服务器,免去 nat 表处理的过程,以提高服务器的性能。
   mangle 表: mangle表的主要功能是根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由。
   nat 表:nat 表通常包含三个功能 SNAT (源地址修改), DNAT(目的地址修改), PNAT(端口修改)
   filter 表:顾名思义,filter 表对数据包进行过滤
   security 表:sercurity 表用于 强制访问控制(Mandarotry Access Control, MAC),如启用 SECMARK 和 CONNSECMARK 标志位,需要配合 SELinux 等安全软件使用。实际中使用并不多。

4. 链

   PREROUTING:在进入路由表之前,处理转发或是目的地为本机的数据包
   INPUT:处理通过路由表后目的地为本机的数据包
   FORWARDING:处理通过路由表后,目的地不为本机的数据包
   OUTPUT:处理由本机产生,向外转发的数据包
   POSTROUTIONG:发送到网卡接口之前,处理转发或是源地址为本机的数据包

   iptables 在拥有默认的 5 条链以外,还可以通过 iptables -N 命令添加自定义的链,便于规则的分类和管理,这部分内容在本文的第五部分说明。

5. 命令与参数

iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
# 在 filter 表, INPUT 链中添加一条规则,接收所有目的端口为 80 的 tcp 包

iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 2333
# 在 nat 表的 PREROUTING 链中添加一条规则,将目标端口为 53 的 udp 包全部转发至 2333 端口

iptables -t nat -N MYCHAIN
iptables -t nat -A MYCHAIN -d 192.168.0.0/16 -j RETURN
iptables -t nat -A MYCHAIN -p tcp -j REDIRECT --to-ports 8118
iptables -t nat -A PREROUTING -p tcp -j MYCHAIN
# 新建自定义链并添加相应规则

-t: 指定规则添加到哪个表中
-A: 指定规则添加到哪个链中
-p: 只处理指定协议的数据包,包括 tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp, mh 或者匹配全部协议的 "all"
-dport: 只处理发送至指定端口的数据包
-j: 处理行为,根据具体的规则有不同的有效取值,进行包过滤时有 ACCEPT(接收), REJRCT(拒绝), DROP (丢弃)三种行为,还包括 RETURN(跳过链),REDIRCT (转发)。也可以将自定义的链作为参数,意味着将自定义链中的所有规则附加在目标链中。
--to-ports: 将符合规则的数据包转发至指定端口
-N: 新建自定义链
-d: 匹配源ip地址