一、防火墙简介
防火墙分为网络防火墙和应用层防火墙
1、网络防火墙
网络防火墙就是一个位于计算机和它所连接的网络之间的防火墙。该计算机流入流出的所有网络通信均要经过此防火墙。防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些***,以免其在目标计算机上被执行。防火墙还可以关闭不使用的端口。而且它还能禁止特定端口的流出通信,封锁特洛伊***。最后,它可以禁止来自特殊站点的访问,从而防止来自不明***者的所有通信。
2、应用层防火墙
应用层防火墙是在 TCP/IP 堆栈的“应用层”上运作,您使用浏览器时所产生的数据流或是使用 FTP 时的数据流都是属于这一层。应用层防火墙可以拦截进出某应用程序的所有封包,并且封锁其他的封包(通常是直接将封包丢弃)。理论上,这一类的防火墙可以完全阻绝外部的数据流进到受保护的机器里。
因为应用层防火墙的算法会更复杂,过虑更为严格,所以在部署防火墙的时候,要把应用层防火墙部署到网络防火墙的里边。
Linux防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙(网络层防火墙)。
二、iptables的表链结构
1、iptables简介
平时说iptables是防火墙,其实iptables是iptables/netfilter组合中的一个,只有iptables/netfilter才应该叫做防火墙,它是基于软件方式工作的网络防火墙。iptables工作于用户空间,是防火墙的规则编写工具,使用iptables编写规则并且发送到netfilter;防火墙的规则刚放到netfilter中,它是一个能够让规则生效的网络架构,工作于内核空间。
2、iptables的表、链结构
iptables是由四表五链组成的,想要配置iptables必须先了解这四表五链
一个规则可以出现在多个表中,谁先谁后呢?所以在这四个表中是存在优先级关系的:
1)四表
优先级:raw表 > mangle表 > nat表 > filter表
①、raw表
RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。
RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。
raw内含有两个链:PREROUTING和OUTPUT
②、mangle表
mangle表一般是对数据包进行修改用的
比如在网络的转发过程中,数据包要从X到Z,中间夹了一个Y,当数据从X到Y的时候,Y要运行拆包,看是不是自己的,如果是就收下了,如果不就是重新封装,把源IP改为自己的,而不再是X的了,再进行转发。
mangle表中含五个链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
③、nat表
用于nat功能(端口映射,地址映射等)
主要用来处理一些将要到达本机路由和将要离开本机路由的数据包,修改数据包中的源、目标IP地址或端口;其对应的模块为iptable_nat。
nat表内含三个链:PREROUTING、POSTROUTING、OUTPUT
④、filter表
一看名字就知道是用来做过滤用的。filter表是iptables的默认表,如果在设置规则时,不指定表,则默认就是在filter表上操作
filter表内含三个链:INPUT、FORWARD、OUTPUT
2)五链
这五条链其实就是针对防火墙策略的规则
①、PREROUTING
路由前,数据包在经过防火墙前应做如何处理
②、INPUT
在数据包进行进入本机前就做何处理,目标是本机,不是网络内的主机
③、OUTPUT
在数据包离开本机时做何处理,源是本机,目标是其它主机
④、FORWARD
对于转发数据包做如何处理,因为本机可能是一台代理服务器,网络内的其它主机在与互联网通信时都需要经过这台服务器的转发
⑤、POSTROUTING
在数据包离开防火墙时做如何处理
INPUT、OUTPUT链主要用在“主机型防火墙”中,即主要针对服务器本机进行保护的防火墙;而FORWARD、PREROUTING、POSTROUTING链多用在“网络型防火墙”中,
三、iptables数据包的过滤流程
为了更直观的表现数据包的过滤流程,请参考第二步及下图
四、iptables使用规则
iptables规则=检查条件+处理机制
1)检查条件
(1)IP:源IP,目标IP
(2)Protocal:TCP、UDP、ICMP
TCP:源端口、目标端口、Flags
UDP:源端口、目标端口
ICMP:ICMP-TYPE
TCP Flags:基于标记的TCP包匹配经常被用于过滤试图打开新连接的TCP数据包,共有六个标志位,UDP没有
①、URG
如为1,则表示本数据包中含有紧急数据
②、ACK
确认标志们
③、PSH
PUSH操作,所谓PUSH操作就是批数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队
④、RST
表示连接复位请求,用来复位那些产生错误的连接;当PST=1时,表示出现严重错误,必须释放连接,然后再重新建立
⑤、SYN
表示同步序号,用来建立连接。
SYN=1,ACK=0 表示连接请求
SYN=1,ACK=1 表示连接请求被响应
⑥、FIN
表示数据已经发送完毕,希望释放连接
2)处理机制、动作 -j target
ACCEPT:将包放行,进行完此处理动作后,将不再匹配其它规则,直接跳往下一个规则链
DENY:拒绝,委婉式的拒绝
DROP:丢弃数据包,进行完此处理动作后,将不再匹配其它规则,直接中断过滤程序
REJECT:阻拦该数据包,并通知对方(ICMP消息)
SNAT:改定数据包源IP
DNAT:改定数据包目标IP
RETURN:结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自定义规则链看成是一个子程序,那么这个动作,就相当于提前结束子程序并返回到主程序中。
REDIRECT:将数据包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续匹配其它规则
LOG:记录日志
五、iptables语法
1)创建一条自定义的规则链
iptables [-t table] -N chain
2)删除一条自定义的规则链,必须为空链
iptables [-t table] -X [chain]
3)修改自定义链名
iptables [-t table] -E old-chain-name new-chain-name
4)为链指定默认策略,指定默认规则
iptables [-t table] -P chain target
5)iptables [-t talbe] {-F|-L|-Z} [chain[rulenum]][options...]
-F:flush,清空链中的规则,不指链则清空表中的所有规则,规则有编号,自上而下从1开始
-L:list,列出表中的所有规则
-n:只和-L一块用,数字格式显示IP和PORT
-v:verbose,以详细格式显示
-vvv
-x:exactly,精确值,不执行单位换算
--line-numbers:显示各规则的行号
-Z:zero,清零,把规则的计数器清零
6)iptables [-t table] {-A|-D} chain rule-specification
-A:append,附加一条规则,添加到现在规则链的最下面(-I:默认添加到最前面)rule-specification
匹配条件 -j 处理机制
(1)通用匹配:
-s:source,匹配源地址,可以是IP,也可以是网络地址;可以使用!操作符取反
-d:匹配目标地址,可以是IP,也可以是网络地址;可以使用!操作符取反
-p:匹配协议,通常只使用{TCP|UDP|ICMP}三者之一
-i:数据报文流入接口;通常只用于INPUT、FORWARD和PREROUTING
-o:数据报文流出接口;通常只用于OUTPUT、FORWARD和POSTROUTING
(2)扩展匹配:
①隐含扩展:使用-p{tcp|udp|icmp}指定某特定服务后,自动能够对协议进行扩展
-p tcp
--dport m[-n]:匹配的目标端口,可以是连续的多个端口
--sport m[-n]:匹配的源端口,可以是连续的多个端口
--tcpflags (6个标志们:URG、PSH、RST、SYN、ACK、FIN)
--tcp-flags rst,syn,ack,fin syn = --syn
ALL,NONE
-p udp udp没有标志位,所以只有源端口和目标端口可选
--dport
--sport
-p icmp
--icmp-type
8:ping 请求
0:ping响应
②显示扩展:必须要明确指定的扩展模块
-m 扩展模块名称 --专用选项1 --专用选项2
multiport:多端口匹配,一次指定多个(15个以内)离散端口
--source-ports, --sports
--destination-ports, --dports
--ports
iprange:ip地址范围
[!] --src-range from[-to]
[!] --dst-range from[-to]
time:指定时间范围
datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
datestop
timestart hh:mm[:ss]
timestop hh:mm[:ss]
[!]--weekdays day[,day...]
string:字符串匹配
--algo{bm|kmp}:字符匹配查找时使用算法
--string "STRING":要查找的字符串
--hex-string "HEX-STRING":要查找的字符,先编码成16进制格式
connlimit:第IP对指定服务的最大并发连接数
[!]--connlimit-above [n]
limit:报文速率控制
--limit #[/second|/minute|/hour|/day]
--limit-burst #
state:状态匹配
ip_conntrack,nf_conntrack
--state
NEW
ESTABLISHED
RELATED
INVALID
-D 删除规则
iptables [-t table] -D chain rulenum
-I 插入规则
iptables [-t table] -I chain [rulenum] rule-specification
-R 替换指定规则
iptables [-t table] -Rchain rulenum rule-specification
-S 只显示指定链上的规则添加命令
iptables [-t table] -S [chain [rulenum]]
六、保存规则
写好规则后,别忘了保存到配置文件哈,否则一重启就啥也没了,切记切记!