iptables 入门篇 文章转自(小米运维)
本篇文章整理了 iptables 的基本概念及入门知识,旨在帮助大家快速了解和使用 iptables。
关于更多 iptables 的扩展和实践部分将在后续篇章推出,敬请期待。
iptables 简介
1
什么是 iptables?
iptables 是 Linux 防火墙工作在用户空间的管理工具,是 netfilter/iptables IP 信息包过滤系统是一部分,用来设置、维护和检查 Linux 内核的 IP 数据包过滤规则。
2
主要特点
1)列出数据包过滤器规则集的内容
2)添加 / 删除 / 修改数据包过滤器规则集中的规则
3)列出 / 清零数据包过滤器规则集的每个规则计数器
基本概念
iptables 可以检测、修改、转发、重定向和丢弃 IP 数据包。其代码已经内置于内核中,并且按照不同的目的被组织成表(table)的集合。表由一组预先定义的链 (chain) 组成,链包含遍历顺序规则。每一条规则包含条件匹配和相应的动作(称为目标),如果条件匹配为真,该动作会被执行。
下图简要描述了网络数据包通过 iptables 的过程(只包含 filter 和 nat 表):
图中在上面的小写字母代表表,在下面的大写字母代表链。从任何网络端口进来的每一个 IP 数据包都要从上到下的穿过这张图。一种常见的困扰是认为 iptables 对从内部端口进入的数据包和从面向互联网端口进入的数据包采取不同的处理方式,相反,iptabales 对从任何端口进入的数据包都会采取相同的处理方式。可以定义规则使 iptables 采取不同的方式对待从不同端口进入的数据包。当然一些数据包是用于本地进程的,因此在图中表现为从顶端进入,到 <Local Process> 停止,而另一些数据包是由本地进程生成的,因此在图中表现为从 <Local Process> 发出,一直向下穿过该流程图。关于该流程图如何工作的详细解释请参考《Iptables Tutorial》。
防火墙策略一般分为两种,一种叫通策略,一种叫堵策略。通策略,默认门是关着的,必须要定义谁能进。堵策略,门是打开的,但是你必须有身份认证,否则不能进。所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而堵,则是要选择。当我们定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filter 过滤的功能,而定义地址转换的功能的则是 nat 选项。为了让这些功能交替工作,我们制定出了 “表” 这个定义,来定义、区分各种不同的工作功能和处理方式。
1
表(tables)
iptables 包含 5 张表(优先级为:security > raw > mangle > nat > filter):
1)filter 表:用于存放所有有防火墙相关操作的默认表。
2)nat 表:用于网络地址转换(例如:DNAT 和 SNAT)
3)mangle 表:用于对特定数据包的修改
4)raw 表:用于配置数据包,raw 中的数据包不会被系统跟踪。
5)security 表:用于强制访问控制网络规则
(例如:selinux—详情可参考 https://lwn.net/Articles/267140/),该表是后来加上的。
在大多数情况下仅需要使用 filter 和 nat,不会用到 raw,mangle 和 security 表,这三张表用于更复杂的情况——包括多路由和路由判定。
2
链(chains)
表由链组成,链是一些按顺序排列的规则的列表。Iptables 一共包含 5 条链:
1)INPUT 链:用于处理进入本机的数据包
2)OUTPUT 链:用于处理从本机输出的数据包
3)FORWARD 链:用于转发数据包
4)PREROUTING 链:用于在路由决策前对数据包做相关操作,经常用来做 DNAT
5)POSTROUTING 链:用于在路由决策后对数据包做相关操作,经常用来做 SNAT
默认的 filter 表包含 INPUT、OUTPUT 和 FORWARD 3 条内建的链,这 3 条链作用于数据包过滤过程中的不同时间点,如下图所示。nat 表包含 PREROUTING、POSTROUTING 和 OUTPUT 链。mangle 表包含 PERROUTING、POSTROUTING、INPUT、OUTPUT 和 FORWARD 链。raw 表包含 PREROUTING 和 OUTPUT 链。
默认情况下,任何链中都没有规则。可以向链中添加自己想用的规则。链的默认规则通常设置为 ACCEPT,如果想要确保任何包都不能通过规则集,那么可以重置为 DROP。默认的规则总是在一条链的最后生效,所以在默认规则生效前数据包需要通过所有存在的规则。用户可以加入自己定义的链,从而使规则集更有效并且易于修改。如何使用自定义链请参考《Simple stateful firewall》。
默认的表、链结构示意图如下:
3
规则(rules)
数据包的过滤基于规则。规则由一个目标(数据包包匹配所有条件后的动作)和很多匹配(导致该规则可以应用的数据包所满足的条件)指定。一个规则的典型匹配事项是数据包进入的端口(例如:eth0 或者 eth1)、数据包的类型(ICMP、TCP 或者 UDP)和数据包的目的端口。
目标使用 -j 或者 --jump 选项指定。目标可以是用户定义的链(例如,如果条件匹配,跳转到之后的用户定义的链,继续处理)、一个内置的特定目标或者是一个目标扩展。内置目标是 ACCEPT, DROP, QUEUE 和 RETURN,目标扩展是 REJECT 和 LOG。如果目标是内置目标,数据包的命运会立刻被决定并且在当前表的数据包的处理过程会停止。如果目标是用户定义的链,并且数据包成功穿过第二条链,目标将移动到原始链中的下一个规则。目标扩展可以被终止(像内置目标一样)或者不终止(像用户定义链一样)。
数据包通过防火墙的时候是按顺序匹配规则的,从上往下依次匹配,一个包不符合某条规则,就会由后面的规则来处理,如果都不符合,就由缺省的规则处理。
4
遍历链(Traversing Chains)
下面的流程图描述了在任何接口上收到的网络数据包是按照怎样的顺序穿过表的交通管制链。第一个路由策略包括决定数据包的目的地是本地主机(这种情况下,数据包穿过 INPUT 链),还是其他主机(数据包穿过 FORWARD 链);中间的路由策略包括决定给传出的数据包使用那个源地址、分配哪个接口;最后一个路由策略存在是因为先前的 mangle 与 nat 链可能会改变数据包的路由信息。数据包通过路径上的每一条链时,链中的每一条规则按顺序匹配;无论何时匹配了一条规则,相应的 target/jump 动作将会执行。最常用的 3 个 target 是 ACCEPT, DROP , 或者 jump 到用户自定义的链。内置的链有默认的策略,但是用户自定义的链没有默认的策略。在 jump 到的链中,若每一条规则都不能提供完全匹配,那么数据包像这张图片描述的一样返回到调用链。在任何时候,若 DROP target 的规则实现完全匹配,那么被匹配的数据包会被丢弃,不会进行进一步处理。如果一个数据包在链中被 ACCEPT,那么它也会被所有的父链 ACCEPT,并且不再遍历其他父链。然而,要注意的是,数据包还会以正常的方式继续遍历其他表中的其他链。
5
模块(modules)
有许多模块可以用来扩展 iptables,例如 connlimit, conntrack, limit 和 recent。这些模块增添了功能,可以进行更复杂的过滤。
相关参数
1
语法
iptables(选项)(参数)
2
命令通用格式
iptables [-t tables] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
3
选项(options)
-t <表>:指定要操纵的表;
-A:向规则链中添加条目;
-D:从规则链中删除条目;
-i:向规则链中插入条目;
-R:替换规则链中的条目;
-L:显示规则链中已有的条目;
-F:清除规则链中已有的条目;
-Z:清空规则链中的数据包计算器和字节计数器;
-N:创建新的用户自定义规则链;
-P:定义规则链中的默认目标;
-h:显示帮助信息;
-p:指定要匹配的数据包协议类型;
-s:指定要匹配的数据包源 ip 地址;
-j <目标>:指定要跳转的目标;
-i <网络接口>:指定数据包进入本机的网络接口;
-o <网络接口>:指定数据包要离开本机所使用的网络接口;
4
目标(target)
ACCEPT:接收数据包;
DROP:丢弃数据包,不返回响应信息;
REDIRECT:重定向、映射、透明代理;
SNAT:源地址转换;
DNAT:目标地址转换;
MASQUERADE:IP 伪装(NAT),用于 ADSL;
LOG:日志记录;
MARK:做防火墙标记;
REJECT: 拒绝数据包通过,必要时会给数据发送端一个响应信息;
QUEUE: 防火墙将数据包移交到用户空间;
RETURN: 防火墙停止执行当前链中的后续 Rules,并返回到调用链;
常见实例
1
查看 iptables 规则
iptables –nvL –t [filter|nat|mangle|raw] #默认查看 filter 表
2
清除 iptables 规则
iptables -F -t [filter|nat|mangle|raw] #默认清除 filter 表
3
清空规则链中的数据包计算器和字节计数器
iptables -Z -t [filter|nat|mangle|raw] #默认清除 filter 表
4
定义规则链中的默认目标(动作)
iptables -P INPUT DROP #定义 filter 表的 INPUT 链默认目标为 DROP
iptables -P FORWARD ACCEPT #定义 filter 表的 FORWARD 链默认目标为 ACCEPT
iptables -P OUTPUT ACCEPT
#定义 filter 表的 OUTPUT 链默认目标为 ACCEPT
5
开放 IP / 协议 / port
iptables -A INPUT -s 192.168.1.2 -j ACCEPT
#允许源 192.168.1.2 的数据包进入本机
iptables -A INPUT -p ospf -j ACCEPT
#允许所有 ospf 协议数据包进入本机
iptables -A INPUT -p icmp -j ACCEPT
#允许所有 icmp 协议数据包进入本机
iptables -A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT
#允许本地回环
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#允许访问 22 端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允许访问 80 端口
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允许已建立的或相关的数据包通行
iptables -A FORWARD -i eth0 -m set ! --match-set white_list src -j DROP
#拒绝从 eth0 网卡进入,并且 IP 不在 white_list 中的数据包通过
6
记录日志
iptables -A PREROUTING -s 172.16.0.0/16 -i eth0 -j LOG
#所有从 eth0 网卡进入的源 172.16.0.0/16 的数据包记录在 log 日志中
7
启动网络转发规则
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127
#让内网192.168.188.0/24使用公网 IP 210.14.67.127上网
8
防止 SYN 洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
9
限速
iptables -I INPUT -p tcp -i eth0 -s 192.168.12.2 -m limit --limit=5000/s --limit-burst=100 -j ACCEPT
iptables -I INPUT -p tcp -i eth0 -s 192.168.12.2 -j DROP