iptables
1,iptables的组成概述
netfilter/iptables:IP 信息包过滤系统,它实际上由两个组件 netfilter 和 iptables组成。 主要工作在网络层,针对IP数据包,体现在对包内的IP地址、端口等信息的处理。
netfilter/iptables关系:
netfilter:
属于“内核态”又称内核空间(kernel space)的防火墙功能体系。linux 好多东西都是内核态 用户态,那我们运维人员关注的是用户态, 内核我们关注不是很多,内核基本是我们开发人员关心的事情是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables :
属于“用户态”(User Space, 又称为用户空间)的防火墙管理体系。是一种用来管理Linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常位于/sbin/iptables目录下。 netfilter/iptables后期简称为iptables。iptables是基于内核的防火墙,其中内置了raw、mangle、 nat和filter四个规则表。表中所有规则配置后,立即生效,不需要重启服务。
iptables由五个表table和五个链chain以及一些规则组成
五个表
table:filter、nat、mangle、raw、security
filter | 过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表 |
---|---|
nat | 地址转换规则表 |
mangle | 修改数据标记位规则表 |
raw | 关闭启用的连接跟踪机制,加快封包穿越防火墙速度 |
security | 用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现 (了解) |
优先级由高到低的顺序为:
security –>raw–>mangle–>nat–>filter
总结
规则表的作用:容纳各种规则链; 表的划分依据:防火墙规则的作用相似
规则链的作用:容纳各种防火墙规则;规则的作用:对数据包进行过滤或处理 ;链的分类依据:处理数据包的不同时机
总结:表里有链,链里有规则
五链:
INPUT | 处理入站数据包,匹配目标IP为本机的数据包。 |
---|---|
OUTPUT | 处理出站数据包,一般不在此链上做配置。 |
FORWARD | 处理转发数据包,匹配流经本机的数据包。 |
PREROUTING | 在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网服务器的IP和端口映射到路由器的外网IP和端口上。 |
POSTROUTING | 在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网。 |
内核中数据包的传输过程
-
当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要 转送出去
-
如果数据包是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后, 任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达
-
如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出
2,实际操作
CentOS7默认使用firewalld防火墙,没有安装iptables,若想使用iptables防火墙。必须先关闭firewalld防火墙,再安装iptables
前期准备工作
systemctl stop firewalld.service
systemctl disable --now firewalld.service
##开机不自启 并且立即关闭
systemctl enable --now firewalld.service
##开机自启 并且 立即开启
yum -y install iptables iptables-services
systemctl start iptables.service
systemctl enable iptables.service
2.1 iptables的配置方法
-
使用iptables命令行。
-
使用图形化管理工具system- config- firewall
2.2使用iptables命令行配置规则
命令格式:
md-fences md-end-block ty-contain-cm modeLoaded highlighter- css iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
注意事项:
-
不指定表名时,默认指filter表
-
不指定链名时,默认指表内的所有链
-
除非设置链的默认策略,否则必须指定匹配条件
-
控制类型使用大写字母,其余均为小写
常用控制类型:
ACCEPT | 允许数据包通过 |
---|---|
DROP | 直接丢弃数据包,不给出任何回 应信息。 |
REJECT | 拒绝数据包通过,必要时会给数据发送端一个响应信息。 |
LOG | 在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则。LOG只是一种辅助动作,并没有真正处理数据包 |
SNAT | 修改数据包的源地址。 |
DNAT | 修改数据包的目的地址 |
MASQUERADE | 伪装成一个非固定公网IP地址。 |
常用管理选项:
-A | 在指定链的末尾追加(–append)一条新的规则 |
---|---|
-I(大写i) | 在指定链的开头插入(–insert)一条新的规则,未指定序号时默认作为第一条规则 |
-R | 修改、替换(–replace) 指定链中的某一条规则,可指定规则序号或具体内容 |
-P | 设置指定链的默认策略(–policy) |
-D | 删除(–delete) 指定链中的某一条规则,可指定规则序号或具体内容 |
-F | 清空(–flush)指定链中的所有规则,若未指定链名,则清空表中的所有链 |
-L | 列出(–list) 指定链中所有的规则,若未指定链名,则列出表中的所有链 |
-n | 使用数字形式(–numeric) 显示输出结果,如显示IP地址而不是主机名 |
-v | 显示详细信息,包括每条规则的匹配包数量和匹配字节数 |
–line-numbers | 查看规则时,显示规则的序号 |
匹配条件:
-p | 指定要匹配的数据包的协议类型 |
---|---|
-s | 指定要匹配的数据包的源IP地址 |
-d | 指定要匹配的数据包的目的IP地址 |
-i | 指定数据包进入本机的网络接口 |
-o | 指定数据包离开本机做使用的网络接口 |
–sport | 指定源端口号 |
–dport | 指定目的端口号 |
2.3规则配置示例
示例1:查看规则 -nL
[root@localhost ~]# iptables -L //不指定默认查看filter表中所有规则
[root@localhost ~]# iptables -nL //以数字形式显示
[root@localhost ~]# iptables -nL -t nat //查看nat表规则
[root@localhost ~]# iptables -nL --line-numbers //显示序列号
[root@localhost ~]# iptables -t filter -F 清空 filter表内所有规则
[root@localhost ~]# iptables -nL //查看filter为空
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
[root@localhost ~]# iptables -F //清空所有规则链中的所有规则
1、 iptables -L,列出表中所有链。不指定表名则默认查看filter表。
2、 iptables -L -n,以数字形式显示输出结果。-L -n 合在一起写时,必须n在前,要写成 -nL。
3、iptables -nL -t nat,查看nat表。
4,显示序列号
5、iptables -t filter -F,清空 filter表内所有规则。
6,执行 iptables -F
后,所有的规则链(包括默认的链)中的规则都会被删除,但是默认策略(默认动作)不会被改变。
示例2:添加规则 -A -I
-A,在末尾追加规则。
-I,在指定位置前插入规则。如果不指定,则在首行插入
[root@localhost ~]# iptables -t filter -A INPUT -p icmp -j REJECT
#//不允许任何主机ping本主机
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 58 packets, 3088 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
[root@localhost ~]# iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT
# //允许主机ssh端口 通过我的
[root@localhost ~]# iptables -nL --line-numbers
#--line-numbers显示行号
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
3删除、清空、替换规则
替换:
iptables -A INPUT -s 192.168.1.200 -j DROP
iptables -nvL --line-numbers
iptables -R INPUT 1 -s 192.168.1.200 -j ACCEPT
iptables -nvL --line-numbers
删除规则 -D
1、按序号删除,比较准确。
2、按内容删除,如果有2条相同内容,会删除序号小的那个。
[root@localhost ~]# iptables -nL --line-number //显示规则序号
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 192.168.1.200 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@localhost ~]# iptables -D INPUT 1 删除INPUT规则连中的第1条规则
[root@localhost ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@localhost ~]# iptables -D INPUT -p tcp -j DROP
//删除INPUT链中tcp协议ACCEPT的规则
清空指定链或表中的所有防火墙规则,使用管理选项“-F”。例如,若要清空 filter 表 INPUT
[root@localhost ~]# iptables -F INPUT
[root@localhost ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
设置默认策略 -P
未修改的状况下,默认策略为ACCEPT(允许)。
注意:
将默认策略修改为DROP前,一定要检查清楚链内是否设置了允许tcp协议22端口进行连接的规则。否则一旦修改为DROP,会导致ssh断连。
iptables -P INPUT DROP //将默认策略修改为DROP
3 匹配条件
通用匹配
可直接使用, 不依赖于其他条件或扩展包括网络协议、IP地址、网络接口等条件。
协议匹配 | -p 协议名 |
---|---|
地址匹配 | -s 源地址、-d 目的地址 。可以是IP、网段、域名、空(任何地址) |
接口匹配 | -i 入站网卡、-o 出站网卡 |
iptables -A INPUT ! -p icmp -j ACCEPT
#没有-t指定表,就是指默认表filter表
# !代表条件取反,不是icmp的都放通
iptables -A INPUT -s 192.168.1.100 -j REJECT
#拒绝从哪个主机发数据包过来(-s指定了源地址)
iptables -I INPUT -i ens33 -s 192.168.1.0/24 -j DROP
#在行首插入规则,丢弃该网段从ens33网卡进来的数据包
示例1:
! 取反时需要注意。
“不是icmp的都放通”,即放通的协议中不包括icmp,这条规则没有针对icmp。那么icmp协议会向下查找匹配,如果匹配不到规则,那么就会取默认策略ACCEPT,则此时其他主机可以ping通本机。
使用其他主机ping本机,可以ping通。
2 隐含匹配
要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类 型等条件。
2.1 端口匹配
端口匹配:–sport 源端口、–dport 目的端口。
可以是个别端口或者端口范围。
格式 | 含义 |
---|---|
–sport 1000 | 匹配源端口是1000的数据包 |
–sport 1000:3000 | 匹配源端口是1000-3000的数据包 |
–sport 1000: | 匹配源端口是1000及以上的数据包 |
–sport :3000 | 匹配源端口是3000及以下的数据包 |
注意: –sport 和 –dport 必须配合 -p <协议类型> 使用
2.2 TCP标记匹配
–tcp-flags TCP标记
#TCP三次握手时的第一次握手,放行SYN为1的报文,拒绝其他包。
iptables -I INPUT -P tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
#第二次握手放行SYN、ACK为1的报文,拒绝其他包。
iptables -I OUTPUT -P tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
2.3 ICMP类型匹配
–icmp-type ICMP类型
ICMP类型可以是字符串、数字代码
ICMP类型 | 含义 |
---|---|
Echo-Request (代码为8 | 表示请求 |
Echo- -Reply (代码为0) | 表示回显 |
Dest ination-Unreachable (代码为3) | 表示目标不可达 |
注: 其他可用的icmp协议类型,可以执行iptables -p icmp -h 查看帮助信息。
--icmp-type 8 //表示请求(ping),即其他主机向本机请求(ping本机)
--icmp-type 0 //表示回显(pong),即本机向其他主机发数据包(本机ping其他主机)
--icmp-type 3 //当本机ping不通其他主机时,提示目标不可达。
例子:
#丢弃icmp的包,别人ping不通本机,本机也ping不通别人
iptables -A INPUT -p icmp -j DROP
#丢弃icmp的请求,禁止其他主机ping本机,但本机可以ping其他主机
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
#当本机ping不通其它主机时提示目标不可达,此时其它主机需要配置关于icmp协议的控制类型为REJECT
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
示例:
丢弃icmp协议的请求,禁止其他主机ping本机,但本机可以ping其他主机。
3 显示匹配
要求以“-m扩展模块”的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件
3.1 多端口匹配
-
-m multiport –sport 源端口列表
-
-m multiport –dport 目的端口列表
iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
.3.2 IP范围匹配
-
-m iprange –src-range 源IP范围
-
-m iprange –dst-range 目的IP范围
iptables -A FORWARD -p udp -m iprange --src-range 192.168.72.100-192.168.72.200 -j DROP
# 禁止转发源地址位于192.168.72.100——192.168.72.200的udp数据包
3.3 状态匹配
格式:
-m state --state连接状态
常见的连接状态:
状态 | 含义 |
---|---|
NEW | 主机连接目标主机,在目标主机上看到的第一个想要连接的包 |
ESTABLISHED | 主机已与目标主机进行通信,判断标准只要目标主机回应了第一个包,就进入该状态 |
主机已与目标主机进行通信,判断标准只要目标主机回应了第一个包,就进入该状态 | 主机已与目标主机进行通信,目标主机发起新的链接方式,一般与ESTABLISHED配合使用 |
INVALID | 无效的封包,例如数据破损的封包状态 |
示例:
iptables -I INPUT -M state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#第一个包我只看22端口的包
#-p tcp是隐含匹配,可以省略-m tcp
iptables -A INPUT -p tcp -m multiport --dport 443,80,22,21,20,53 -j ACCEPT
#允许放通tcp的这些端口号
#-m multiport加载多个端口模块
iptables -A INPUT -p udp --dport 53 -j ACCEPT
#放通UDP的53端口进来的包(DNS服务器返回信息时默认使用UDP的53端口)
iptables -A INPUT -p tcp -m state --state ESTABLISHED ,RELATED -j ACCEPT
#对进来的包的状态进行检测。已经建立tcp连接的包以及该连接相关的包允许通过。简单来说就是只允许所有自己发出去的包进来。
#比如我和你做生意,我们谈成了生意,到了支付的时候,就可以直接调用与这笔生意相关的支付功能。
iptables -P INPUT DROP
#默认关闭,将以上的设置设为白名单
4 总结
1、Linux防火墙的两个组件:
-
内核态 netilter(保存包过滤处理的规则集)
-
用户态 iptables(防火墙规则管理工具)
2、数据包五要素:
源IP,目的IP,源端口,目的端口 ,协议UDP/TCP
3、四表:
-
raw 对数据包进行状态跟踪
-
mangle 修改数据包内容,给数据包设置标记
-
nat 地址转换,转换源/目的IP或者端口
-
fileter 过滤数据包 放行 丢弃
4、五链:
-
INPUT 入站
-
OUTPUT 出站
-
FORWARD 转发
-
PREROUTING 路由前修改目的地址
-
POSTROUTING 路由后修改源IP
5、匹配顺序
1)数据包到达防火墙时,规则表之间的优先顺序:raw >mangle > nat > filter。
2)规则链之间的匹配顺序:
主机型防火墙
-
入站数据(来自外界的数据包,且目标地址是防火墙本机):PREROUTING –> INPUT –>本机的应用程序
-
出站数据(从防火墙本机向外部地址发送的数据包):本机的应用程序—->OUTPUT —–>POSTROUTING;
网络型防火墙
-
转发数据(需要经过防火墙转发的数据包):PREROUTING –>FORWARD –>POSTROUTING
3)链中的规则集:从上往下一次匹配,匹配到规则即停止,若都没有匹配到则按默认策略处理
6、管理选项
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
-
增:-A 在末尾添加,-I 在指定位置插入
-
删:-D 删除指定规则,-F 清空所有规则
-
改:-R,或者-A 添加后 -D 删除
-
查:-nL 以数字形式显示,–line-numbers 显示规则的序号
-
设置默认规则:-P
注意:
删除规则前,以及将默认规则修改为DROP之前,一定要先想清楚会不会导致ssh断连。
7、 匹配条件
-
-p tcp|udp|icmp
-
-s 源IP
-
-d 目的IP
-
-i 入站网卡
-
__EOF__