目录
一、Linux 防火墙基础
1.概述
2.netfilter 与 iptables
①netfilter
②iptables
3.iptables的表、链结构
①四表五链
②四表
③五链
④数据包过滤的匹配流程
⑤规则表之间的匹配顺序
⑥规则链之间的顺序
⑦规则链内部各条防火墙规则之间的顺序
二、编写防火墙规则
1.安装iptables
2.基本语法
3.常用的控制类型
4.常用的管理选项
①添加新的规则
②查看规则表
③删除、清空规则
④设置默认策略
5.规则的匹配条件
①通用匹配
②隐含匹配
③显示匹配
iptables的作用是为包过滤机制的实现提供规则(或称为策略),通过各种不同的规则,告诉 netfilter 对来自某些源、前往某些目的或具有某些协议特征的数据包应该如何处理
netfilter/iptables 后期简称为 iptables
为了更方便地组织和管理防火墙规则,iptables 采用了“表”和“链”的分层结构,且表中所有规则配置后,立即生效,不需要重启服务
#关闭firewalld防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
#安装iptables防火墙
[root@localhost ~]# yum -y install iptables iptables-services.x86_64
#设置iptables开机自启
[root@localhost ~]# systemctl start iptables.service
[root@localhost ~]# systemctl enable iptables.service
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
注意事项:
对于防火墙,数据包的控制类型非常关键,直接关系到数据包的放行、封堵及做相应的日志记录等。在 iptables 防火墙体系中,最常用的几种控制类型如下。
选项名 |
功能及特点 |
---|---|
-A |
在指定链的末尾追加(–append)一条新的规则 |
-I |
在指定链的开头插入(–insert) 一条新的规则,未指定序号时默认作为第一条规则 |
-R |
修改、替换(–replace)指定链中的某一条规则,可指定规则序号或具体内容 |
-P |
设置指定链的默认策略(–policy) |
-D |
删除(–delete)指定链中的某一条规则,可指定规则序号或具体内容 |
-F |
清空(–flush)指定链中的所有规则,若未指定链名,则清空表中的所有链 |
-L |
列出(–list)指定链中所有的规则,若未指定链名,则列出表中的所有链 |
-n |
使用数字形式(–numeric)显示输出结果,如显示IP地址而不是主机名 |
-v |
显示详细信息,包括每条规则的匹配包数量和匹配字节数 |
–line-numbers |
查看规则时,显示规则的序号 |
[root@localhost ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT #允许主机ssh端口
#基本格式:
iptables [-t 表名] -n -L [链名] [--line-numbers]
#或
iptables - [vn]L
[root@localhost ~]# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
2 ACCEPT icmp -- anywhere anywhere
3 ACCEPT all -- anywhere anywhere
4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
5 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
6 ACCEPT tcp -- anywhere anywhere
7 ACCEPT tcp -- anywhere anywhere
[root@localhost ~]# iptables -n -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0
[root@localhost ~]# iptables -F INPUT
[root@localhost ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
iptables -F
iptables -t nat -F
iptables -t mangle -F
#基本格式
iptables [-t 表名] -p <链名> <控制类型>
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -p tcp --sport 1000:3000 -j REJECT
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
--tcp-flags TCP标记
iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT
#丢弃SYN请求包,放行其他包
要求以“-m扩展模块”的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件
多端口匹配:
“-m multiport --dports 端口列表”
“-m multiport --sports 端口列表”
iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
-m iprang --src-rang IP范围
iptables -A FORWARD -p udp -m iprange --src-range 192.168.80.100-192.168.80.200 -j DROP
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP(MAC地址)
#禁止来自某MAC地址的数据包通过本机转发
用来检查数据包的源MAC地址
由于MAC地址本身的局限性,此类匹配条件一般只适用于内部网络
状态匹配
-m state --state 连接状态
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT
iptables -I INPUT -p tcp -m state --state ESTABLISHD -j ACCEPT
iptables -P INPUT DROP