这里写目录标题
- 概述
- iptables的四表五链结构
- 包过滤的匹配过程
- iptables安装
- iptables语法
- 三种匹配规则
- 通用匹配
- 显示匹配
- 隐含匹配
概述
防火墙分为两类:硬件防火墙+软件防火墙
Linux的防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制。属于典型的包过滤防火墙。linux系统的防火墙体系基于内核编码实现,具有非常稳定的性能和极高的效率,因此获得广泛的应用。
在很多安全技术资料中,netfilter和iptables都用来指linux防火墙,区别如下:
netfilter:指的是linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于“内核态”又称内核空间的防火墙功能体系
iptables:指的是用来管理linux防火墙的命令程序,通常位于/sbin/iptables目录下,属于“用户态”又称用户空间的防火墙管理体系
iptables的四表五链结构
规则表
表的作用:容纳各种规则链
表的划分依据:防火墙规则的作用相似
默认四种规则表
raw表:确定是否对该数据包进行状态跟踪
mangle表:为数据包设置标记
nat表:修改数据包中的源、目标IP地址或端口
filter表:确定是否放行该数据包(过滤)
应用最多的是filter和nat
规则链
规则的作用:对数据包进行过滤或处理。
链的作用:容纳各种防火墙规则。
链的分类依据:处理数据包的不同时机。
默认五种规则链
INPUT:处理入站数据包
OUTPUT:处理出站数据包
FORWARD:处理转发数据包
POSTROUTING:在进行路由选择后处理数据包
PREROUTING:在进行路由选择前处理数据包
包过滤的匹配过程
规则表应用顺序:raw→mangle→nat→filter
规则链的应用顺序取决于数据的流向:
入站数据流向:PREROUTING→路由选择→INPUT→应用程序
转发数据流向:PREROUTING→路由选择→FORWARD→POSTROUTING
出站数据流向:OUTPUT→路由选择→POSTROUTING
规则链内部的处理规则:
1、按顺序依次检查,匹配即停止(LOG策略例外)
2、若找不到相匹配的规则,则按该链的默认策略(默认策略是放通)处理
iptables安装
//
[root@localhost ~]# systemctl stop firewalld.service
//关闭firewalld防火墙
[root@localhost ~]# systemctl disable firewalld.service
[root@localhost ~]# yum -y install iptables iptables-service
//安装iptables防火墙
[root@localhost ~]# systemctl start iptables.service
[root@localhost ~]# systemctl enable iptables.service
//设置iptables开机自启
iptables语法
iptables 【-t 表名】 管理选项{【链名】【匹配条件】 【-j 控制类型】
【-t 表名】如果不指定表名,默认是filter表
//
参数:
-A 在指定链末尾追加一条 iptables -A INPUT
-I 在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT
-R 修改、替换某一条规则 iptables -t nat -R INPUT
-D 删除 iptables -t nat -D INPUT
-L 查看 iptables -L -t nat
-F 清除所有规则 iptables -F
-P 指定默认规则 iptables -P
-n 以数字形式显示 iptables -L -n’,iptables -nL
-n --line-number 规则带编号 iptables -L -n --line-number -t nat
控制选项:
控制选项 含义
ACCEPT 允许数据包通过
REJECT 拒绝数据包通过,必要时会给数据包发送端一个响应信息
DROP 直接丢弃数据包,不给任何回应
LOG 在/var/log/messages文件中记录日志信息,然后将数据包给下一条规则,它本身不处理数据包
配置
//
[root@localhost ~]# iptables -t filter -S INPUT
//过滤出input链的规则 默认规则不在规则列表里面
[root@localhost ~]# iptables -t filter -L --line-number
//显示规则编号,每个链的规则编号
//
[root@localhost ~]# iptables -t filter -L
//看规则
[root@localhost ~]# iptables -L
//默认是filter表
[root@localhost ~]# iptables -t filter -s
//
[root@localhost ~]# iptables -t filter -L -v
//显示详情,多用于分析使用
[root@localhost ~]# iptables -vnL
//一般是这样子结合一起使用;
//
[root@localhost ~]# iptables -t filter -F
//清空所有
[root@localhost ~]# iptables -t filter -X
//清空自定义的链
[root@localhost ~]# iptables -t filter -Z
//清空计数器 (数据包的数,字节的数)
//一般是一键三连 清空的干干净净
;
三种匹配规则
通用匹配
协议匹配
iptables编写协议匹配的规则时用-p指定协议名,如tcp、udp、icmp和all
不允许其他主机ping本机
//
[root@firewall ~]# iptables -I INPUT -p icmp -j REJECT
[root@firewall ~]# iptables -n -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT icmp -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
网络接口匹配
iptables编写地址匹配的规则时用 -i 进站接口名和 -o 出站接口名的形式
丢弃来自192.168.100.0网段并且从ens33接口进入的数据包
//
[root@firewall ~]# iptables -A INPUT -i ens33 -s 192.168.100.0/24 -j DROP
;
地址匹配
iptables编写地址匹配的规则时用 -s:表示源地址,-d:表示目标地址
允许192.168.100.200这个主机ping本主机
//
[root@firewall ~]# iptables -I INPUT -s 192.168.100.200 -p icmp -j REJECT
[root@firewall ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT icmp -- 192.168.100.200 anywhere reject-with icmp-port-unreachable
显示匹配
配需要额外的内核模块提供支持,必须手动以‘-m 模块名称’的形式调用相应的模块
多端口匹配
编写多端口匹配时使用“-m multiport --dports 端口列表” “-m multiport --sports 端口列表” 的形式
例1:允许开放25,80,110,143端口,以便访问邮件和网站服务
//
iptables -A INPUT -p tcp -m multiport --dports 25,80,110,143 -j ACCEPT;
开放ftp访问,冒号表示端口的范围从20-21端口
//
[root@firewall ~]# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT;
开放ftp访问的另一种方法,写成多端口模式,端口之间用逗号分隔
//
[root@firewall ~]# iptables -A INPUT -p tcp -m multiport --dport 20,21 -j ACCEPT
ip范围匹配
编写ip地址范围匹配时使用“-m iprange --src-range IP范围” “-m iprange --dst-range IP范围” 的形式
例1:不允许192.168.100.110-192.168.100.150范围的主机经过防火墙转发数据包
//
[root@firewall ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.100.110-192.168.100.150 -j REJECT;
mac地址匹配
mac地址匹配:‘-m mac --mac-source MAC地址’
不允许mac地址为00:0c:29:52:c0:ae的任何访问
//
[root@firewall ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:52:c0:ae -j DROP;
修改一下规则,虽然拒绝访问但是会给一个主机无法到达的回应
//
[root@firewall ~]# iptables -R INPUT 1 -m mac --mac-source 00:0c:29:52:c0:ae -j REJECT;
-R修改某一条规则的时候,链名后面要加规则的数字,指定具体哪一条规则,并且把过滤的规则也要写上,哪怕只是修改控制类型也不能直接-j REJECT,否则它会视为拒绝所有
状态匹配
编写iptables规则时使用“-m state --state 连接状态(可以写多个用逗号隔开)”的形式
常用的连接状态:
NEW:想要新建立联机的封包状态。
ESTABLISHED: 已经联机成功的联机状态。
RELATED:表示这个封包是与我们主机发送出去的封包有关,可能是响应封包或者是联机成功之后的传送封包。
INVALID: 无效的封包,例如数据破损的封包状态。
允许响应请求的连接放行
//
iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT;
隐含匹配
端口匹配
编写端口匹配规则时使用“–port 源端口”或“–dport 目标端口”的形式,针对的协议为tcp或udp,单个端口号或者以冒号分隔的端口范围都是可以的,但是不连续的端口不可以用冒号表示
开放ssh接口
//
[root@firewall ~]# iptables -I INPUT -p tcp -dport 22 -j ACCEPT
[root@firewall ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
all -- anywhere anywhere
;
icmp类型匹配
编写icmp类型匹配规则时使用“–icmp-type ICMP类型”的形式,针对的协议是icmp
允许本机ping别的主机但是不允许别的主机ping本机
//
[root@firewall ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
[root@firewall ~]#
[root@firewall ~]#
[root@firewall ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
all -- anywhere anywhere
icmp类型:
Echo-Request:代码为8
Echo-Reply:代码为0
Destination-Unreachable:代码为3