目录
一、防火墙的基本认识
浅提一下iptables
二、防火墙的分类
三、netfilter中的五个勾子函数和报文流向
四、netfilter/iptables的简介
五、iptables的原理讲解和四表五链
内核中数据包传输的过程:
六、iptables
iptables的语法:
七、实操
七、设置默认策略
八、通用匹配
九、隐含扩展
十、显示扩展模块
10.1multiport扩展(multiple port是多个端口)
10.2iprange扩展(表示ip范围)
10.3mac地址模块
10.4string字符串
10.5time模块
10.6connlimit模块
10.7state模块
一、防火墙的基本认识
Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间,集成在linux内核中
Netfilter 是Linux 2.4.x之后新一代的Linux防火墙机制,是linux内核的一个子系统。Netfilter采用模块化设计,具有良好的可扩充性,提供扩展各种网络服务的结构化底层框架。Netfilter与IP协议栈是无缝契合,并允许对数据报进行过滤、地址转换、处理等操作
##查看内核中的netfilter有那些相关配置
[root@localhost ~]#grep -i netfilter /boot/config-3.10.0-693.el7.x86_64
# IP: Netfilter Configuration
# IPv6: Netfilter Configuration
# iptables trigger is under Netfilter config (LED target)
##表明iptables是建立在netfilter配置之下的
浅提一下iptables
由软件包iptables提供的命令行工具,工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
个人理解netfilter是内核态的,iptables是接近用户态的,人为设定防火墙策略,由内核netfilter去生效
二、防火墙的分类
按保护范围划分:
- 主机防火墙:服务范围为当前一台主机
- 网络防火墙:服务范围为防火墙一侧的局域网
按实现方式划分:
- 硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现,如:华为, 山石hillstone,天融信,启明星辰,绿盟,深信服, PaloAlto , fortinet, Cisco, Checkpoint, NetScreen(Juniper2004年40亿美元收购)等,本身就是一台服务器
- 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件,Windows 防火墙 ISA --> Forefront
按网络协议划分:数据封装的是mac头部、ip头部、协议和端口号、应用层协议、数据
- 网络层防火墙:(4层原理)OSI模型下四层,又称为包过滤防火墙(可以处理四层以内的数据)
- 应用层防火墙/代理服务器:(7层原理)proxy 代理网关,OSI模型七层(不仅可以处理四层一下,还可以处理真实数据,比如过滤关键字)
包过滤防火墙
网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否 允许该数据包通过
优点:对用户来说透明,处理速度快且易于维护
缺点:无法检查应用层数据,如病毒等
应用层防火墙
应用层防火墙/代理服务型防火墙,也称为代理服务器(Proxy Server)
将所有跨越防火墙的网络通信链路分为两段
内外网用户的访问都是通过代理服务器上的“链接”来实现优点:在应用层对数据进行检查,比较安全
缺点:增加防火墙的负载
提示:现实生产环境中所使用的防火墙一般都是二者结合体,即先检查网络数据,通过之后再送到应用 层去检查
三、netfilter中的五个勾子函数和报文流向
netfilter在内核中选取五个位置放了五个勾子,function(INPUT OUTPUT FORWARD PREROUTING POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具向其写入规则。(iptables就是一种命令工具)
四、netfilter/iptables的简介
iptables的组成概述
linux的防火墙体系主要是工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙(或者说是网络层防火墙,4层原理的防火墙)。linux系统的防火墙体系是基于内核编码实现的,是非常稳定和高效的,所以应用广泛;
netfilter/iptables:ip信息包过滤系统,实际上是由两个组件组成:netfilter和iptables;
主要工作在网络层,针对ip数据包,体现在对包内的ip地址、端口信息处理。
netfilter/iptables关系:
netfilter:属于内核态,又称内核空间的防火墙功能体系。linux好多东西都是内核态、用户态,那我们作为运维,更加关注的是用户态,内核关注较少,内核是由开发人员比较关注的。这里存在了一些过滤表,这些表包含了内核用来控制信息包过滤出来的规则集合。
iptables:数据用户态,又称为是用户空间的防火墙管理体系。是一种用来管理linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常是在/sbin/iptables目录下。
netfilter/iptables后期简称为iptables。iptables是基于内核的防火墙,其中内置了raw、mangle、 nat和filter四个规则表。表中所有规则配置后,立即生效。
五、iptables的原理讲解和四表五链
原本是五表五链:
五表:raw、mangle、nat、filter、security(用得少)
五链:prerouting、postrouting、input、output、forward
详解:
【四表】
raw:主要用来决定是否对数据包进行状态跟踪 包含两个规则链,OUTPUT、PREROUTING
mangle:修改数据包内容,用来做流量整形的,给数据包设置标记。包含五个规则链,INPUT、 OUTPUT、 FORWARD、 PREROUTING、 POSTROUTING
nat:负责网络地址转换,用来修改数据包中的源、目标IP地址或端口。包含三个规则链,OUTPUT、PREROUTING、POSTROUTING。
filter:负责过滤数据包,确定是否放行该数据包(过滤)。包含三个链,即即INPUT、OUTPUT、FORWARD
【五链】
PREROUTING:路由判断前,在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网服务器的IP和端口映射到路由器的外网IP和端口上。
POSTROUTING:路由判断后,在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网。
FORWARD:转发规则,处理转发数据包,匹配流经本机的数据包
INPUT:进入本机前
OUTPUT:进入本机后,一般不在此链上做配置(string模块使用的在output链)
总结:
表中有链,链中有规则
表的优先级:
security -->raw-->mangle-->nat-->filter
链:表示在什么时机处理流量
表的用处:存放链和规则,控制流量
内核中数据包传输的过程:
首先:当一个数据进入网卡的时候,数据包会先进入prerouting链,内核根据数据包的目的ip来判断是否需要转发至下一个链表——forward或者input;
如果是到本机的:到达数据包会到INPUT链,到达之前先查规则,看是否放行,允许的话继续往下就进入了本机,任何进程都会受到该数据。本机上处理数据包的程序会发送数据包到output链,也是根据output的链表规则查看是否放行;最后如果ouput允许的话,再根据数据包的目的ip来进行转发,有一个路由判断,数据包会到到达postrouting,再次查询策略表,放行的话就继续,不行就丢弃;
另一方面,如果是需要进行转发的数据包,此时本机是一台路由功能的服务器,一次匹配forward、postrouting规则链表,允许则转发,不允许则丢弃;
三种报文流向
-
流入本机:PREROUTING --> INPUT-->用户空间进程
-
流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
-
转发:PREROUTING --> FORWARD --> POSTROUTING
六、iptables
centos7是默认使用firewalld防火墙,需要永久关闭。
##需要安装iptables
[root@localhost test]#rpm -q iptables
iptables-1.4.21-18.0.1.el7.centos.x86_64
iptables的语法:
##iptables的语法:
iptables [-t 表名] -命令选项 链表 规则设置 -j 策略
##详解:
1、表名不写,默认是filter过滤表,其他表增删改查时候需要写上
2、命令选项有:
-A:-A 链 编号,表示追加,不写编号默认是在最后一行添加
-I:-I 链 编号,表示插入,不写编号默认是在第一行插入
-P:-P 链,表示修改链的默认策略,ACCEPT和DROP两种
-D:-D 链 编号,表示删除某一条策略
-F:表示清空
-L:表示查看,-vnL,v表示详细,n表示数字化,L表示列表且L必须写到最后
-R:-R 链 编号,表示替换某一条规则
-Z:清空链的计数器(匹配到的数据包的大小和总和)iptables -Z
-N:新加自定义链
-X:清空自定义链的规则,不影响其他链 iptables -X
-S:看链的所有规则或者某个链的规则/某个具体规则后面跟编号
--line-num:表示显示编号
查询的命令:
iptables -vnL [-t 表名]
查询并显示规则编号:
iptables -vnL [-t 表名] --line-num
##详解:
1、表名不写,默认是filter过滤表,其他表增删改查时候需要写上
2、命令选项有:
-A:-A 链 编号,表示追加,不写编号默认是在最后一行添加
-I:-I 链 编号,表示插入,不写编号默认是在第一行插入
-P:-P 链,表示修改链的默认策略,ACCEPT和DROP两种
-D:-D 链 编号,表示删除某一条策略
-F:表示清空
-L:表示查看,-vnL,v表示详细,n表示数字化,L表示列表且L必须写到最后
-R:-R 链 编号,表示替换某一条规则
-Z:清空链的计数器(匹配到的数据包的大小和总和)iptables -Z
-N:新加自定义链
-X:清空自定义链的规则,不影响其他链 iptables -X
-S:看链的所有规则或者某个链的规则/某个具体规则后面跟编号
--line-num:表示显示编号
查询的命令:
iptables -vnL [-t 表名]
查询并显示规则编号:
iptables -vnL [-t 表名] --line-num
规则设置与策略选项:
##iptables的语法:
iptables [-t 表名] -命令选项 链表 规则设置 -j 策略
##相关规则有:可以理解为五元组加流入流出网卡
-s:源ip地址,或者源网段
-d:表示目标ip地址,或者目标网段
-p:指定协议,如tcp、udp、icmp、dhcp等等
--sport:表示源端口,基于协议的,所以是-p的子命令选项
--dport:表示目标端口,基于协议的,所以是-p的子命令选项
-i:表示流量流入的网卡
-o:表示流量流出的网卡
-j后面跟着跳转策略
ACCEPT:表示接收
DROP:表示拒绝,且无回复
REJECT:表示拒绝,但是有回复
LOG:表示标记,在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则
SNAT:修改数据包的源ip地址
DNAT:修改数据包的目标ip地址
MASQUERADE:伪装成一个非固定公网IP地址
##相关规则有:可以理解为五元组加流入流出网卡
-s:源ip地址,或者源网段
-d:表示目标ip地址,或者目标网段
-p:指定协议,如tcp、udp、icmp、dhcp等等
--sport:表示源端口,基于协议的,所以是-p的子命令选项
--dport:表示目标端口,基于协议的,所以是-p的子命令选项
-i:表示流量流入的网卡
-o:表示流量流出的网卡
-j后面跟着跳转策略(需要大写,命令可以补全)
ACCEPT:表示接收
DROP:表示拒绝,且无回复
REJECT:表示拒绝,但是有回复
LOG:表示标记,在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则
SNAT:修改数据包的源ip地址
DNAT:修改数据包的目标ip地址
MASQUERADE:伪装成一个非固定公网IP地址
一张图总结:
七、实操
##拒绝来自192.168.20.6主机访问本机的22端口
[root@localhost ~]#iptables -A INPUT -s 192.168.20.6 -p tcp --dport 22 -j DROP
##查看filter规则表
[root@localhost ~]#iptables -vnL
##查看filter规则表,并显示规则编号
[root@localhost ~]#iptables -vnL --line-num
##删除规则编号2
[root@localhost ~]#iptables -D INPUT 2
[root@localhost ~]#iptables -vnL --line-num
[root@localhost ~]#iptables -F
##清空
七、设置默认策略
iptables 的各条链中,默认策略是规则匹配的最后一个环节——当找不到任何一条能够匹配数据包的规则时,则执行默认策略。默认策略的控制类型为 ACCEPT(允许)、DROP(丢弃)两种。
语法:iptables [-t表名] -P <链名> <控制类型>
[root@localhost ~]#iptables -t filter -P INPUT DROP
##修改默认input为drop
添加允许连接本机回环网卡
[root@localhost ~]#iptables -A INPUT -i lo -j ACCEPT
##添加允许流量进入本机回环网卡
[root@localhost ~]#iptables -A INPUT -s 192.168.20.1 -j ACCEPT
##192.168.20.1代表的是电脑真机
默认是DROP的时候,拒绝所有,那么需要设置白名单,同时iptables -F清空命令失效
改为
当ACCEPT的时候,允许所有,需要设置黑名单,那么想要有与DROP一样的效果,就在最后一条加上拒绝所有!!
##先在accept基础上设置黑名单,等同于iptables -P INPUT DROP
[root@localhost ~]#iptables -A INPUT -j DROP
[root@localhost ~]#iptables -vnL
##在第一行插入,添加允许xshell连接本机
[root@localhost ~]#iptables -I INPUT -s 192.168.20.1 -j ACCEPT
[root@localhost ~]#iptables -vnL
八、通用匹配
直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件。
协议匹配: -p协议名
地址匹配: -s 源地址、-d目的地址
#可以是IP、网段、域名、空(任何地址)
接口匹配: -i入站网卡、-o出站网卡
iptables -A FORWARD ! -p icmp -j ACCEPT
iptables -A INPUT -s 192.168.20.30 -j DROP
iptables -I INPUT -i ens33 -s 192.168.91.0/24 -j DROP
iptables -I INPUT -p icmp -j DROP
iptables -A FORWARD ! -p icmp -j ACCEPT //感叹号”!”表示取反
[root@localhost ~]#iptables -I INPUT 2 -s 192.168.20.0/24 -p icmp -j DROP
九、隐含扩展
man iptables-extensions
查看扩展帮助
iptables在使用-p的时候是指明了特定的协议,无需在使用-m指明拓展的模块机制,不需要动手去加载扩展模块,要求以特定的协议匹配,包括端口,tcp标记,icmp类型等条件;
端口匹配:--sport源端口;--dport 目标端口
##可以是个别端口,端口范围
[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口连续范围
[!] --destination-port,--dport port[:port]:匹配报文目标端口,可为连续范围
[!] --tcp-flags mask comp
mask 需检查的标志位列表,用,分隔 , 例如 SYN,ACK,FIN,RST
comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔tcp协议的扩展选项
--tcp--flags SYN,ACK,FIN,RST SYN 表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0,第一次握手
--tcp-flags SYN,ACK,FIN,RST SYN,ACK 第二次握手,表示检查四个确认位,需要SYN和ACK都为1
--sport 1000 ##表示匹配源端口是1000的数据包
--sport 1000:3000 ##匹配源端口是1000至3000的数据包
--sport :3000 ##表示匹配端口是3000以内的数据包
--sport 1000: ##表示匹配端口是1000以上的数据包
注意: --sport和--dport 必须配合-p <协议类型>使用,因为要有协议才有端口号啊
端口可以使用的范围 0-65535 因为tcp和udp的端口是16字节,表示2的16次方为65535
[root@localhost ~]#iptables -A INPUT -p tcp --sport 20:80 -j REJECT
#20到80端口 全部被拒
TCP标记匹配: --tcp-flags TCP标记:SYN,RST,ACK,SYN
[root@localhost ~]#iptables -I INPUT -i ens33 -p tcp --tcp-flags FIN,RST,ACK SYN -j ACCEPT
#丢弃SYN请求包,放行其他包
[root@localhost html]#iptables -A INPUT -p tcp --dport 20:80 -j DROP
[root@localhost ~]#iptables -I INPUT -s 192.168.20.1 -j ACCEPT
拓展,允许本机去访问192.168.20.8,不允许192.168.20.8访问本机;
思路,如果是禁止源ip地址的话,数据是有去有回,本机也无法ping另一台主机;那么往底层思考,根据icmp的请求和回复包的type来进行限制,请求是type和code分别是80,回复包type和code分别是00,那就是允许192.168.20.8回复00包,不允许发80请求包,也就是说限制icmp 的type为8即可
[root@localhost ~]#iptables -I INPUT -s 192.168.20.8 -p icmp --icmp-type 8 -j DROP
#####icmp 协议的扩展选项
[!] --icmp-type {type[/code]|typename}
type/code
0/0 echo-reply icmp应答
8/0 echo-request icmp请求
十、显示扩展模块
显示扩展即必须使用-m选项指明要调用的扩展模块名称,需要手动加载扩展模块
语法:[-m matchname [per-match-options]]
10.1multiport扩展(multiple port是多个端口)
支持以离散的方式匹配不同的端口
[!] --source-ports,--sports port1,port2,port3,port4:port5...
#指定多个源端口 逗号隔开
[!] --destination-ports,--dports port1,port2,port3,port4:port5...
# 指定多个目标端口 逗号隔开
[root@localhost ~]#iptables -A INPUT -s 192.168.20.8 -p tcp -m multiport --dport 22,80 -j REJECT
拒绝来自192.168.20.8主机访问本机的22和80端口
10.2iprange扩展(表示ip范围)
指明连续的(但一般不是整个网络)ip地址范围,iprange模块只能用于连续的IP地址范围,而不能用于离散的IP地址。
[!] --src-range ip1-ip2 源IP地址范围
[!] --dst-range ip1-ip2 目标IP地址范围
##注意分隔符是-,表示从ip1到ip2的所有ip
[root@localhost ~]#iptables -A INPUT -m iprange --src-range 192.168.20.6-192.168.20.8 -j REJECT
##注意分隔符,iprange模块只允许连续的ip地址,不可以是离散的ip
10.3mac地址模块
mac 模块可以指明源MAC地址,,适用于:PREROUTING, FORWARD,INPUT
首先因为目标mac地址是变化的,与路由转发原理相关。只有这三种链能见到源mac头部
##语法记忆,source是全拼
-m mac [!] --mac-source XX:XX:XX:XX:XX:XX
10.4string字符串
对报文中的应用层数据做字符串模式匹配检测
--algo {bm|kmp} 字符串匹配检测算法
bm:Boyer-Moore 算法
kmp:Knuth-Pratt-Morris 算法
--from offset 开始查询的地方
--to offset 结束查询的地方
[!] --string pattern 要检测的字符串模式
[!] --hex-string pattern要检测字符串模式,16进制格式
[root@localhost ~]#echo hello> /var/www/html/index.html
[root@localhost ~]#echo baidu> /var/www/html/index1.html
##不大明白这个62具体是怎么算出来的
[root@localhost ~]#iptables -A OUTPUT -d 192.168.20.6 -m string --algo bm --from 62 --string "hello" -j REJECT
[root@localhost ~]#iptables -A OUTPUT -d 192.168.20.6 -m string --algo bm --from 1 --string "hello" -j REJECT
[root@localhost ~]#iptables -A OUTPUT -d 192.168.20.6 -m string --algo bm --string "hello" -j REJECT
##这个也可以偷懒不写字节,这样可以匹配速度回慢一些
##使用这个模块需要思考清楚,过滤的是服务器回复给客户端的内容,那么限制的应该是目的ip地址
##这是使用模块必须要有的
-m string
--algo bm ##也可以是另一种算法
--string
10.5time模块
根据将报文到达的时间与指定的时间范围进行匹配(有 bug ubuntu没问题)
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss] 时间
--timestop hh:mm[:ss]
[!] --monthdays day[,day...] 每个月的几号
[!] --weekdays day[,day...] 星期几,1 – 7 分别表示星期一到星期日
--kerneltz:内核时区(当地时间),不建议使用,CentOS 7版本以上系统默认为 UTC
注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)
man iptables-extensions
[root@localhost ~]#iptables -A INPUT -s 192.168.20.6 -m time --timestart 14:00 --timestop 14:20 -j REJECT
##表示启用time模块
10.6connlimit模块
根据每客户端IP做并发连接数数量匹配
可防止Dos(Denial of Service,拒绝服务)攻击
--connlimit-upto N #连接的数量小于等于N时匹配
--connlimit-above N #连接的数量大于N时匹配
##表示不允许访问本机超过2个
[root@localhost ~]#iptables -A INPUT -m connlimit --connlimit-above 2 -j REJECT
[root@localhost ~]#iptables -vnL
拓展:限制连接的除了这个模块以外,还有内核本身的参数
/proc/sys/net/netfilter/nf_contrack_max这里可以进行调优
10.7state模块
-
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
-
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
-
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
-
INVALID:无效的连接,如flag标记不正确
-
UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪
--state state
ipatables -A INPUT -m state --state NEW -j REJECT
ipatables -A INPUT -m state --state ESTABLISHED -j ACCEPT
新用户不可以访问 老用户可以继续访问 老用户退出不可以访问了
[root@localhost ~]#iptables -A INPUT -m state --state NEW -j REJECT
[root@localhost ~]#iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT