从逻辑上分类
主机防火墙:针对单个主机防护
网络防火墙:出于网络入口或边缘,针对网络入口防护,服务于防火墙背后的本地局域网
从物理上分类
软件防火墙
硬件防火墙
iptables包过滤防火墙 (在用户空间)
netfilter(真正意义上防火墙)在内核空间的
内核空间:也叫内核态,操作系统占据的内核区域
用户空间:也叫用户态,用户进程所在的内存区域
防火墙是按照规则办事的,我们就来说说规则 (rules) ,规则其实就是网络管理员预定义的条件,规则一般的定义为"如果数据包头符合这样的条件,就这样处理这个数据包’。规则存储在内核空间的信息包过滤表中,这些规则
分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP) 和服务类型(如HTTP、FTP和SMTP) 等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行 (accept)、拒绝(reject) 和丢弃(drop) 等。配置防火墙的主要工作就是添加、修改和删除这些规则。
当客户端访问服务器的web服务时,客户端发送报文到网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的信息会通过内核的TCP协议传输到用户空间中的web服务中,而此时,客户端报文的目标终点为web服务所监听
的套接字 (P:Port)上,当veb服务需要响应客户端请求时,web服务发出的响应报文的目标终点则为客户端,这个时候,web服务所监听的1P与端口反而变成了原点,我们说过,netfiter才是真正的防火墙,它是内核的一部分,
所以,如果我们想要防火墙能够达到"防火"的目的,则需要在内核中设置关卡,所有进出的报文都要通过这些关卡经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止,于是,就出现了input关卡和output关卡,
而这些关卡在iptables中不被称为 “关卡"而被称为"链”。
报文的流向:到本机某进程的报文,PREROUNTING–>INPUT 由本机转发的报文:PREROUNTING–>FORWARD–>POSTROUTING 由本机的某进程发出报文(通常为响应报文):OUTPUT–>POSTROUTING
规则:源地址 目标地址 源端口 目标端口 协议 服务类型
处理:accept reject(拒绝) drop(丢弃)
iptables 添加 删除 修改
链:INPUT UOTPUT PREROUTING(路由前) FORWARD POSTROUTING(路由后)
表:filter表:负责过滤:INPUT UOTPUT FORWARD
nat表:网络地址转换:UOTPUT PREROUTING POSTROUTING(centos7之后INPUT也有)
mangle表:拆解、封装报文:这张表在所有链上都有
raw表:关闭在nat上启用的连接机制:UOTPUT PREROUTING
其实我们还需要注意一点,因为数据包经过一个"链"的时候,会将当前链的所有规则都匹配一遍,但是匹配时总归要有顺序,我们应该一条一条的去匹配,而且我们说过,相同功能类型的规则会汇聚在一张"表”中,那么这些"表"中的规则会放在"链"的最前面执行呢,这时候就需要有一个优先级的问题,那些表应该优先匹配呢?
iptables为我们定义了4张"表”,当他们处于同一条"链"时,执行的优先级如下:
优先级次序(由高到低): raw—>mangle---->nat—>filter
iptables基本用法规则:根据指定的匹配条件尝试匹配每一条流经此处的报文,一旦匹配成功,则由规则后边指定的处理动作进行处理
匹配条件:地址 目标地址 源端口 目标端口 协议 服务类型
处理动作:ACCEPT REJECT(拒绝) DROP(丢弃) SNAT DNAT REDRECT LOG
匹配条件加上处理动作共同组成了规则
匹配条件
| 基本匹配条件 | 扩展匹配条件 |
|---|---|
| 源地址Source IP | 源端口Source Port |
| 目标地址Destintion | m目标端口Destintion Port |
处理动作
| 动作 | 含义 |
|---|---|
| ACCEPT | 允许数据包通过 |
| REJECT | 拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息 |
| DROP | 直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入大海了,过了超时时间才会有反应 |
| DNAT | 目标地址转换 |
| SNAT | 源地址转换,解决内网用户用同一个公网地址上网的问题 |
| MASQUERADE | 是SNAT的一种特殊形式,适用于动态的、临时会变得ip上 |
| REDIRECT | 在本机做端口映射 |
| LOG | 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配 |
-F:清理 删除规则(慎用!!!)
-A:在指定的链的尾部添加
-I:在指定位置插入规则(大写i)
-L/S:列出链上的规则、
-D:删除匹配的规则
-R:替换匹配的规则 -R INPUT NUM
-n:ip地址和端口以数字显示
-N:创建用户自定义链
-X:删除自定义链
-P:为指定链修改默认规则
-E:更改自定义链名
-Z:链计数器清零
-t:指定表
-j:指定处理动作
!:取反操作,用于匹配条件
-p:tcp udp icmp all
-s addr 匹配源地址
-d addr 匹配目标地址
–sport 匹配源端口
–dport 匹配目标端口
-o:指定匹配出口网卡
-i:指定匹配入口网卡 eth0
–icmp-type 匹配icmp类型
–tcp-flags mask(6个标志位) comp(匹配的标志)
策略iptables -t 表 -A|I 链 匹配条件 处理动作
iptables -t 表 -R 链 序列 匹配条件 处理动作
iptables -t 表 -D 链 序列 匹配条件 处理动作
iptables -t 表 -D 链 序号
保存 (centos6) service iptables save
(centos7) 先关闭fiewalld systemctl stop firewalld systemctl disable firewalld
安装 yum install iptables
保存 iptables-save > /etc/sysconfig/iptables
恢复 iptables-restore < /etc/sysconfig/iptables
扩展匹配条件 隐式匹配:-p
显式匹配:-p -m
-p tcp -m tcp --sport 指定连续端口 22:80
-p tcp -m tcp --dport 指定连续端口 22:80
multiport 指定离散的端口 22,80
-p tcp -m multiport --sport 22,80
-p tcp -m multiport --dport 22,80
进阶用法: iprange 模块 指定一段地址
--src-range:
--dst-range:
-m iprange --src-range
-m iprange --dst-range
匹配字符串 关键字 指定匹配算法 --algo kmp
-m string
--string
-m string --algo kmp --string
默认使用UTC时区时间 东八区需要减8小时
centos6 --locatetz --使用本地内核时间
centos7 --kerneltz --使用本地内核时间
-m time
--timestart
--timestop
--weekdays 1-7
--datestart
--datestop
--monthdays
connlimit 模块2、每周一到周五9点-17点允许来自192.168.100.0/24 访问本机,且每秒数据访问不超过20个
iptables -t filter -I OUTPUT -p tcp --s 192.168.100.0/24 -m time --kerneltzb --timestart 9:00:00 --timestop 17:00:00 --weekdays 1,2,3,4,5 -m limit --limit 20/second -j ACCEPT
显示每个IP地址链接到server的数量 如果不指定ip地址,则指所有的地址
-m connlimit
--connlimit-above 连接上限
--connlimit-mask 子网掩码 网段连接上限
每一个连接上的最多连三次:
-m limit
--limit
--limit-burst 定义令牌桶大小
tcp-flags 模块 SYN、ACK、FIN、RST、URG、PSH SYN(要匹配的是谁)
匹配第一次握手
iptables规则配置在配置之前,先将系统的环境清零
[root@localhost ~]# iptables -F #清理规则
[root@localhost ~]# iptables -nvL #查看时已经没有任何规则
Chain INPUT (policy ACCEPT 6 packets, 384 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 4 packets, 368 bytes)
pkts bytes target prot opt in out source destination
#当清理之后,可以看到 INPUT 、FORWARD、OUTPUT默认策略都是ACCEPT,也就是说默认当前所有发往本机的报文,都将放行
两台服务器演示
服务器A:192.168.163.139
服务器B:192.168.163.157
#增加规则,拒绝所有来自192.168.163.157的所有报文
[root@localhost ~]# iptables -t filter -I INPUT -s 192.168.163.157 -j REJECT
[root@localhost ~]# ping 192.168.163.157
PING 192.168.163.157 (192.168.163.157) 56(84) bytes of data.
^C
— 192.168.163.157 ping statistics —
5 packets transmitted, 0 received, 100% packet loss, time 4762ms
[root@localhost ~]# ping 192.168.163.157 #已经无法ping通
PING 192.168.163.157 (192.168.163.157) 56(84) bytes of data.
^C
选项说明
-t:指定操作的表
-I:指定插入规则到哪个链中
-s:指定“匹配条件”中的源地址
-j:指定“匹配条件”中的动作
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 72 packets, 4608 bytes)
pkts bytes target prot opt in out source destination
5 420 REJECT all – * * 192.168.163.157 0.0.0.0/0 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 48 packets, 4356 bytes)
pkts bytes target prot opt in out source destination
[root@localhost ~]# iptables -t filter -I INPUT 2 -s 192.168.192.157 -j ACCEPT
[root@localhost ~]# ping 192.168.162.157
PING 192.168.162.157 (192.168.162.157) 56(84) bytes of data.
^C
#在这里加了一个2 表示新增规则编号是2
#在这里有一个规则顺序问题,所有的匹配从第一条规则开始,如果前面已经REJECT了,也就不存在放行了。



