目录
一、概述
1.1.为什么要使用防火墙
对于没有防火墙存在的一条网络路线中,主机A发送给主机B的任何一个数据包,主机B都会照单全收,即使是包含了病毒、木马等的数据也一样会收。虽说害人之心不可有,但是在网络上,你认为是害你的行为在对方眼中是利他的行为。所以防人之心定要有,防火墙就可以提供一定的保障。
1.2.两种防火墙的介绍
- netfilter
位于Linux内核中的包过滤功能体系,主要提供功能模块,称为Linux防火墙的“内核态” - iptables
用来管理防火墙规则的工具,称为Linux防火墙的"用户态”;centos7需要安装服务,安装完位于/sbin/iptables
1.3.包过滤的工作层次
- 主要是网络层,针对IP数据包
- 体现在对包内的IP地址、端口等信息的处理上
1.4.iptables的四表五链
1.4.1.四表
- 表的作用:容纳各种规则链
- 表的划分依据:防火墙规则的作用相似
表名 | 特性 |
---|---|
raw表 | 确定是否对该数据包进行状态跟踪 |
mangle表 | 为数据包设置标记;数据包的服务类型是否需要标记 |
nat表 | 修改数据包中的源、目标IP地址或端口时,查看此表 |
filter表 | 确定是否放行该数据包(过滤);对具体的某些数据包的策略进行具体的规则匹配 |
1.4.2.五链
- 规则的作用:对数据包进行过滤或处理
- 链的作用:容纳各种防火墙规则
- 链的分类依据 :处理数据包的不同时机
链名 | 特性 |
---|---|
INPUT | :处理入站数据包;重点是防火墙,外部服务器访问防火墙,目标是防火墙 |
OUTPUT | 处理出站数据包;防火墙去访问别人,防火墙为源,目标是B |
FORWARD | 处理转发数据包;仅处理经过防火墙的数据包 |
POSTROUTING | 在进行路由选择后处理数据包 |
PREROUTING | 在进行路由选择前处理数据包 |
1.5.数据传输过程
1.5.1.概要叙述
其实,进程间数据传输的方式有多种:共享内存、命名管道、套接字、消息队列、信号量等。上面描述的OSI通信模型只是数据传输的一种方式,它特指网络数据传输,是基于套接字(ip+port)的,所以既可以是主机间进程通信,也可以是本机服务端和客户端进程间的通信。
无论如何,网络数据总是会流入、流出的,即使是本机的客户端和服务端进程间通信,也需要从一个套接字流出、另一个套接字流入,只不过这些数据无需路由、无需经过物理网卡(走的是LoopBack)。当接收外界发送的数据时,在数据从网卡流入后需要对它做路由决策,根据其目标决定是流入本机数据还是转发给其他主机,如果是流入本机的数据,则数据会从内核空间进入用户空间(被应用程序接收、处理)。当用户空间响应(应用程序生成新的数据包)时,响应数据包是本机产生的新数据,在响应包流出之前,需要做路由决策,根据目标决定从哪个网卡流出。如果不是流入本机的,而是要转发给其他主机的,则必然涉及到另一个流出网卡,此时数据包必须从流入网卡完整地转发给流出网卡,这要求Linux主机能够完成这样的转发。但Linux主机默认未开启ip_forward功能,这使得数据包无法转发而被丢弃。Linux主机和路由器不同,路由器本身就是为了转发数据包,所以路由器内部默认就能在不同网卡间转发数据包,而Linux主机默认则不能转发。
1.5.2.数据包的匹配流程
- 规则表之间的顺序
raw→mangle→nat→filter
- 规则链之间的顺序
入站: PREROUTING→INPUT
出站: OUTPUT→POSTROUTING
转发:PREROUTING→FORWARD→POSTROUTING
- 规则链内的匹配顺序
按顺序依次检查,匹配即停止;若找不到相匹配的规则,则按该链的默认策略处理,默认策略是放空
二、基础命令
2.1.准备工作
#Centos7 关闭firewalld
systemctl stop firewalld
systemctl disable firewalld
#安装防火墙iptables
yum -y install iptables-services
#设置iptables开机自启动
systemctl start iptables
systemctl enable iptables
2.2.基础语法
2.2.1.语法结构
iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
#不指定表名时,默认指filter表
#不指定链名时,默认指表内的所有链
#除非设置链的默认策略,否则必须指定匹配条件选项、链名、控制类型使用大写字母,其余均为小写
2.2.2.控制类型
- ACCEPT 允许通过
- DROP 直接丢弃
- REJECT 拒绝通过
- LOG 记录日志信息
2.2.3.选项
-A在指定链末尾追加一条iptables -AINPUT
-I在指定链中插入一条新的,未指定序号默认作为第一条iptables -I INPUT
-P指定默认规则iptables -POUTPUT ACCEPT
-D删除 iptables -t nat -D INPUT
-R修改、替换某一条规则iptables -t nat -R INPUT
-L查看iptables -t nat -L
-n所有字段以数字形式显示(比如任意ip地址是e0.0.0.0而不是anywhere,比如显示协议端口号而不是服务名)iptables -L -n,iptables -nL,iptables -vnL
-v查看时显示更详细信息,常跟-L一起使用
--line-number规则带编号iptables -t nat -L -n --line-number /iptables -t nat -L --line-number-F清除链中所有规则iptables -F
-X清空自定义链的规则,不影响其他链iptables -x
-Z清空链的计数器(匹配到的数据包的大小和总和) iptables -Z
-s查看链的所有规则或者某个链的规则/某个具体规则后面跟编号
三、案列展示
3.1.查看规则编号
[root@nw-server3 ~]# iptables -t filter -L --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere udp dpt:domain
2 ACCEPT tcp -- anywhere anywhere tcp dpt:domain
3 ACCEPT udp -- anywhere anywhere udp dpt:bootps
4 ACCEPT tcp -- anywhere anywhere tcp dpt:bootps
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere 192.168.122.0/24 ctstate RELATED,ESTABLISHED
3.2.查看详情
[root@nw-server3 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 744K packets, 1361M bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED
0 0 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0
0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0
0 0 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT 727K packets, 110M bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT udp -- * virbr0 0.0.0.0/0 0.0.0.0/0 udp dpt:68
3.3.清空列表
3.4清空自定义的链 -X
3.5.删除指定序列的链
3.6.添加指定ip地址不能访问tcp协议的所有端口
[root@nw-server3 ~]# iptables -t filter -A INPUT -p tcp -s 192.168.1.100 -j DROP
[root@nw-server3 ~]#
[root@nw-server3 ~]#
[root@nw-server3 ~]#
[root@nw-server3 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 192.168.1.100 anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@nw-server3 ~]#
3.7.设置默认的规则
- 添加所有拒绝(默认的时候)无需要 -j DROP 而是直接DROP
3.8.修改-R的时候需要加上-j 且需要指定规则序号
3.9 icmp类型规则
icmp类型匹配:编写icmp类型匹配规则时使用“--icmp-type ICMP类型”的形式,针对的协议是icmp
icmp类型:
- Echo-Request:代码为8
- Echo-Reply:代码为0
列子如:
[root@nw-server3 ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
[root@nw-server3 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 192.168.1.100 anywhere
DROP icmp -- anywhere anywhere icmp echo-request
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
3.10 设置范围
显示匹配:这种匹配方式要求有额外的内核模块提供支持,必须手动以“-m模块名称"的形式调用相应的模块多端口匹配、ip范围匹配、mac地址匹配、状态匹配.
3.10.1.端口范围
#多端口匹配:编写多端口匹配时使用“-m multiport --dports端口列表”“-m multiport --sports 端口列表”的形式
iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACEPT 允许开放25,80,110,143端口,以便访问邮件和网站服务
iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT开放ftp访问,冒号表示端口的范围从20-21端口
iptables -AINPUT -p tcp -m multiport --dport 20,21-j ACCEPT开放ftp访问的另一种方法,写成多端口模式,端口之间用逗号分*这里--dport和--dports都可以
iptables -A INPUT -p tcp -m multiport --dport 80,22 -s 192.168.245.0/24 -j ACCEPT
3.10.2.ip范围
ip范围匹配:编写ip地址范围匹配时使用-m iprange --src-range IP范围”“-m iprange --dst-range IP范围”的形式
iptables -A FORWARD -p tcp -m iprange --snc-range 192.168.100.110-192.168.100.150 -j REJECT不允许192.168.100.110-192.1
[rootClocalhost ~]# iptables -A INPUT -p icmp -m iprange --src-range 192.168.245.1-192.168.245.211-j ACCEPT
3.10.3.mac地址
mac地址匹配:编写mac地址匹配规则时使用“-m mac --mac-source MAC地址”
iptables -A INPUT -m mac--mac-source 00:0c:29:52:c0:ae -j DROP不允许mac地址为e0:0c:29:52:c0:ae的任何访问
iptables -R INPUT 1 -m mac --mac-source 00:0c:29:52:cO:ae -j REJECT
3.10.4状态匹配
状态匹配:编写iptables规则时使用-m state --state连接状态”的形式常用的连接状态:
NEW:想要新建立联机的封包状态
ESTABLISHED:已经联机成功的联机状态
RELATED:表示这个封包是与我们主机发送出去的封包有关,可能是响应封包或者是联机成功之后的传送封包!这个状态很常被设定,因关
INVALID:无效的封包,例如数据破损的封包状态
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 允许响应请求的连接放行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
3.11.防火墙规则的保存
防火墙规则的保存
iptables-save /查看当前规则
默认存放路径:/etc/sysconfig/iptables
iptables-save >/etc/sysconfig/iptables//保存到默认配置文件下次重启不会丢失
[root@localhost ~]# systemctl stop iptables.service//停止iptables服务会清空所有规则