netfilter与iptables
不同内核版本下的Linux下防火墙
- 在Linux 2.0.X 内核版本中,防火墙功能由 ipfwadm 提供。ipfwadm 是一个基于规则的防火墙工具,可以设置过滤规则来控制数据包的流动。它使用一组规则集来定义允许或拒绝特定的IP数据包。
- 在Linux 2.2.X 内核版本中,ipchains 取代了 ipfwadm。ipchains 提供了更强大和灵活的防火墙功能,包括更多的过滤选项和功能。它使用类似于 ipfwadm 的规则集来控制数据包的流动。
- 在Linux 2.4.X 内核版本中,引入了 netfilter 框架和 iptables 工具。netfilter 是一个内核框架,提供了对数据包进行处理和过滤的功能。iptables 是基于 netfilter 的用户空间工具,用于配置和管理防火墙规则。netfilter/iptables 提供了更强大和灵活的防火墙功能,可以根据IP地址、端口、协议等多个因素进行过滤和处理。
- 在Linux 2.6.16以上的内核版本中,netfilter/iptables经历了重新设计和改进。这些改进包括性能优化、新的内核模块、更灵活的匹配和动作选项等。通过这些改进,netfilter/iptables在高负载环境下能够更好地处理数据包,提供更高的性能和可靠性。
netfilter
netfilter工作在内核空间(Kernel Space)
Netfilter是Linux内核中的一个框架,用于处理网络数据包。它提供了一组钩子函数,允许用户空间程序在数据包经过系统网络栈的不同阶段进行处理。Netfilter可以用于实现数据包的过滤、网络地址转换(NAT)、连接跟踪等功能。
iptables
iptables工作在用户空间(User Space)
iptables则是一个用户空间的命令行工具,用于配置和管理Netfilter规则集。它利用Netfilter框架提供的钩子函数,可以在数据包经过网络栈的不同阶段插入规则,并根据这些规则对数据包进行过滤、修改或重定向。
通过iptables,管理员可以定义不同的规则,如允许或阻止特定的数据包通过、进行端口转发、设置网络地址转换规则等。这些规则由iptables解析并传递给Netfilter,然后由Netfilter在数据包经过网络栈时应用这些规则。
四表五链
四表
每个表由若干个规则链组成。
- Raw表:
- Raw表用于配置数据包的原始处理,它主要用于确定是否对数据包进行状态跟踪(connection tracking)。
- Raw表包含两个规则链:
- PREROUTING链:处理数据包在进入网络栈之前的阶段。
- OUTPUT链:处理从本地系统发出的数据包。
- Mangle表:
- Mangle表用于修改数据包的内容,常用于实现流量整形、设置数据包标记等功能。
- Mangle表包含五个规则链:
- PREROUTING链:处理数据包在进入网络栈之前的阶段。
- INPUT链:处理进入本地系统的数据包。
- FORWARD链:处理通过本地系统进行转发的数据包。
- OUTPUT链:处理从本地系统发出的数据包。
- POSTROUTING链:处理数据包离开网络栈之后的阶段。
- Nat表:
- Nat表用于网络地址转换,常用于修改数据包中的源、目标IP地址或端口。
- Nat表包含三个规则链:
- PREROUTING链:处理数据包在进入网络栈之前的阶段。
- OUTPUT链:处理从本地系统发出的数据包。
- POSTROUTING链:处理数据包离开网络栈之后的阶段。
- Filter表:
- Filter表用于过滤数据包,确定是否放行该数据包(过滤)。
- Filter表包含三个规则链:
- INPUT链:处理进入本地系统的数据包。
- FORWARD链:处理通过本地系统进行转发的数据包。
- OUTPUT链:处理从本地系统发出的数据包。
五链
每个链由若干个规则组成。
- INPUT链:
- INPUT链处理入站数据包,即目标IP地址为本机的数据包。
- 在INPUT链中配置的规则用于对入站数据包进行过滤和处理,决定是否接受或拒绝这些数据包。
- OUTPUT链:
- OUTPUT链处理出站数据包,即从本机发出的数据包。
- 一般情况下,不需要在OUTPUT链上配置规则,因为通常出站数据包不会在本机上进行进一步的处理,而是直接发送到网络。
- FORWARD链:
- FORWARD链处理转发数据包,即流经本机的数据包。
- 如果Linux系统被配置为路由器或网关,转发数据包会经过FORWARD链进行处理。在FORWARD链中配置的规则用于对转发数据包进行过滤和处理,决定是否允许转发这些数据包。
- PREROUTING链:
- PREROUTING链在进行路由选择之前处理数据包。
- PREROUTING链通常用于修改数据包的目的地址,例如进行目的网络地址转换(DNAT),将内网服务器的IP和端口映射到路由器的外网IP和端口上。
- POSTROUTING链:
- POSTROUTING链在进行路由选择之后处理数据包。
- POSTROUTING链通常用于修改数据包的源地址,例如进行源网络地址转换(SNAT),实现内网主机通过一个公网IP地址上网。
匹配顺序
规则表中的匹配顺序
数据包到达防火墙时,在iptables中的规则表之间的处理顺序:
Raw表(raw)——> Mangle表(mangle)——> Nat表(nat)——> Filter表(filter)
数据包首先经过Raw表的处理,然后是Mangle表、Nat表和最后是Filter表。每个规则表中的规则链按照预定义的顺序依次处理数据包。在每个表中,数据包将按照规则链的顺序进行处理,直到匹配到适用的规则或到达链的末端。如果数据包匹配到某个规则,将根据规则定义的操作进行处理,否则将继续在下一个规则链中进行匹配和处理。
规则链中的匹配顺序
主机型防火墙和网络型防火墙是两种不同类型的防火墙。
- 主机型防火墙是安装在单个主机上的防火墙软件或硬件设备。它通过在主机上运行防火墙软件来监控和控制该主机与网络之间的通信,通常针对特定主机进行配置,可以根据主机的特定需求和策略进行细粒度的访问控制。它可以检测和阻止针对该主机的入侵尝试,提供主机级别的安全保护。
- 网络型防火墙是位于网络边界的设备,用于保护整个网络免受未经授权的访问和网络攻击。它可以是硬件设备(如防火墙路由器)或软件实现(如软件防火墙)。网络型防火墙通过监控和控制进出网络的流量来实施访问控制和安全策略。它可以根据预定义的规则和策略,对数据包进行过滤、阻止、重定向等操作,以保护网络资源和数据的安全性。
对于主机型防火墙通常只处理入站和出站数据,入站数据的匹配流程:PREROUTING --> INPUT -->本机的应用程序,出站数据:本机的应用程序---->OUTPUT ----->POSTROUTING。
对于网络型防火墙,除了处理入站和出站数据,还需要处理转发数据,转发数据的匹配流程:PREROUTING -->FORWARD -->POSTROUTING。
整体流程如下图所示,加重的规则表链表示该链的规则通常在这个表上配置。当一个数据包进入网络接口时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是转发该数据包还是接收该数据包。如果数据包目的IP为本机,数据包就会到达INPUT链,本机上的应用进程就会收到该数据包。本机上的进程发送数据包,发送的数据包经过OUTPUT链,然后发送到目的地。如果数据包目的IP不是本机,且内核转发该数据包,数据包就会经过FORWARD链,然后到达POSTROUTING链输出。
在规则链内部匹配规则,自上向下按顺序依次进行检查,找到相匹配的规则即停止(LOG策略例外,表示记录相关日志)若在该链内找不到相匹配的规则,则按该链的默认策略处理(未修改的状况下,默认策略为允许)。
规则配置
命令行语法
iptables的命令格式,如果不指定表名,则默认操作filter表。
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
常用管理选项
-A :在指定链的末尾追加(--append)一条新的规则
-I :在指定链的开头插入(--insert)一条新的规则,未指定序号时默认作为第一条规则
-R :修改、替换(--replace)指定链中的某一条规则,可指定规则序号或具体内容
-P :设置指定链的默认策略(--policy)
-D :删除(--delete)指定链中的某一条规则,可指定规则序号或具体内容
-F :清空(--flush)指定链中的所有规则,若未指定链名,则清空filter表中的所有链
-L :列出(--list)指定链中所有的规则,若未指定链名,则列出表中的所有链
-X : 删除用户自定义的规则链
-n :使用数字形式(--numeric)显示输出结果,如显示 IP 地址而不是主机名
-v :显示详细信息,包括每条规则的匹配包数量和匹配字节数
--line-numbers:查看规则时,显示规则的序号
……
常用参数
-p 协议
-s 源地址
-d 目的地址
-i 入站网络接口
-o 出站网络接口
--sport 源端口
--dport 目的端口
--tcp-flags TCP标记匹配
--icmp-type ICMP类型匹配
……
常用控制类型
ACCEPT:允许数据包通过
DROP:直接丢弃数据包,不给出任何回应信息
REJECT:拒绝数据包通过,会给数据发送端一个响应信息
SNAT:修改数据包的源地址
DNAT:修改数据包的目的地址
MASQUERADE:伪装成一个非固定公网IP地址
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,并没有真正处理数据包
语法总结
实操
编写脚本功能如下:
1、iptest.sh清空所有存在的规则
2、只开放22号端口(ssh、tcp)
3、禁止发送icmp包
4、INPUT默认规则为DROP
5、OUTPUT默认规则为ACCEPT
6、FORWARD默认规则为DROP
#!/bin/sh
# 清空所有规则
iptables -F
iptables -X
# *INPUT默认策略为DROP
iptables -P INPUT DROP
# *OUTPUT默认策略为ACCEPT
iptables -P OUTPUT ACCEPT
# *FORWARD默认策略为DROP
iptables -P FORWARD DROP
# 允许SSH连接(22号端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 禁止发送ICMP包
iptables -A OUTPUT -p icmp -j DROP
# 显示规则列表
iptables -L -v
iptables -F
清空指定链中的规则,若未指定链名,则清空filter表中的所有链。iptables -X
删除用户自定义的规则链。
#!/bin/sh
# 清空所有规则
iptables -F
iptables -X
默认策略的设置。-P
选项设置指定链的默认策略(--policy)。设置入栈默认策略为DROP,出站默认策略为ACCEPT,转发默认策略为DROP。
# 设置默认策略
# *INPUT默认策略为DROP
iptables -P INPUT DROP
# *OUTPUT默认策略为ACCEPT
iptables -P OUTPUT ACCEPT
# *FORWARD默认策略为DROP
iptables -P FORWARD DROP
然后添加两条规则。-A
在指定链的末尾追加(--append)一条新的规则。在入站规则链添加一条规则,接收协议为TCP、目的端口为22的数据包。在出站规则链添加一条规则,丢弃所有协议为ICMP的出站数据包。
# 允许SSH连接(22号端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 禁止发送ICMP包
iptables -A OUTPUT -p icmp -j DROP
运行这段sh脚本
chomod +x shell.sh
sudo ./shell.sh
列出规则,如下图所示
sudo iptables -L -v
删除刚刚添加的两条规则,再列出规则,删除成功。
# 删除规则
sudo iptables -D OUTPUT -p icmp -j DROP
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -L -v
编写脚本第二个脚本,功能如下:
1、不清空所有存在的规则的情况下
2、只允许icmp通过
3、禁止22号服务
可以编写第二个脚本,如下
#!/bin/sh
# 删除规则
iptables -D OUTPUT -p icmp -j DROP
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# 允许ICMP包通过
iptables -A INPUT -p icmp -j ACCEPT
# 禁止22号服务(SSH)
iptables -A INPUT -p tcp --dport 22 -j DROP
运行这段脚本
chmod +x shell2.sh
sudo ./shell2.sh
sudo iptables -L -v
可知成功删除了规则并设置了两条新规则——只允许icmp通过、禁止22号服务