防火墙是用于将信任网络和非信任网络隔离的一种技术,它通过制定相应的安全策略,可检测、限制、更改跨越防火墙的数据流,来保护信任网络以防止发生不可预测的、具有潜在破坏性的侵入。
当防火墙位于内部网络和外部网络之间时,需要将防火墙和内部网络、外部网络以及DMZ(两个防火墙之间的空间)三个区域相连的接口分别配置成不同网段的IP地址,重新规划原有的网络拓扑,此时相当于一台路由器。
采用路由模式时,可以完成ACL 包(用来控制端口进出的数据包)过滤、ASPF (aspf能够检测试图通过防火墙的应用层协议会话信息,阻止不符合规则的数据报文穿过。针对应用层的包过滤)动态过滤、NAT 转换等功能。然而,路由模式需要对网络拓扑进行修改(内部网络用户需要更改网关、路由器需要更改路由配置等)
如果防火墙采用透明模式进行工作,则可以避免改变拓扑结构造成的麻烦,此时防火墙对于子网用户和路由器来说是完全透明的。也就是说,用户完全感觉不到防火墙的存在。
采用透明模式时,只需要在网络中像放置网桥(交换机)一样插入该防火墙设备即可,无需修改任何已有的配置。与路由模式相同,IP 报文同样经过相关的过滤检查(但是IP 报文中的源或目的地址不会改变),内部网络用户依旧受到防火墙的保护。
如果防火墙既存在工作在路由模式的接口(接口具有IP 地址),又存在工作在透明模式的接口(接口无IP 地址),则防火墙工作在混合模式下。混合模式主要用于透明模式作双机备份的情况,此时启动VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)功能的接口需要配置IP 地址,其它接口不配置IP地址。
自主访问控制:
强制访问控制(MAC)
服务控制:确定哪些服务可以被访问
方向控制:对于特定的服务,可以确定允许哪个方向能够通过防火墙
用户控制:根据用户来控制对服务的访问
行为控制:控制一个特定的服务的行为。
记录进出流量,可作为审核入侵检测系统、系统日志的有效补充。
应用层防护:
支持常见协议、基于误用的自定义规则、大都支持碎片重组。
URL过滤:
利用黑名单、白名单、自定义区分URL
对网页挂马、钓鱼网站有很好的效果
目前VPN主要采用四项技术来保证安全,这四项技术分别是隧道技术(Tunneling)、加解密技术(Encryption & Decryption)、密钥管理技术(Key Management)、使用者与设备身份认证技术(Authentication)。
1.隧道技术:
隧道技术是VPN的基本技术类似于点对点连接技术,它在公用网建立一条数据通道(隧道),让数据包通过这条隧道传输。隧道是由隧道协议形成的,分为第二、 三层隧道协议。第二层隧道协议是先把各种网络协议封装到PPP中,再把整个数据包装入隧道协议中。这种双层封装方法形成的数据包靠第二层协议进行传输。第 二层隧道协议有L2F、PPTP、L2TP等。L2TP协议是目前IETF的标准,由IETF融合PPTP与L2F而形成。
第三层隧道协议是把各种网络协议直接装入隧道协议中,形成的数据包依靠第三层协议进行传输。第三层隧道协议有VTP、IPSec等。IPSec(IP Security)是由一组RFC文档组成,定义了一个系统来提供安全协议选择、安全算法,确定服务所使用密钥等服务,从而在IP层提供安全保障。
2.加解密技术:
加解密技术是数据通信中一项较成熟的技术,VPN可直接利用现有技术。
3.密钥管理技术:
密钥管理技术的主要任务是如何在公用数据网上安全地传递密钥而不被窃取。现行密钥管理技术又分为SKIP与ISAKMP/OAKLEY两种。SKIP主要 是利用Diffie-Hellman的演算法则,在网络上传输密钥;在ISAKMP中,双方都有两把密钥,分别用于公用、私用。
4.使用者与设备身份认证技术:
使用者与设备身份认证技术最常用的是使用者名称与密码或卡片式认证等方式。
Iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理将用户的安全设定执行到对应的“安全框架”中,这个安全框架才是真正的防火墙,叫netfilter。
netfilter是防火墙真正的安全框架,位于内核空间,Iptables是一个命令行工具,位于用户空间,我们用这个工具来操作真正的框架。
netfilter/iptables组成Linux下的包过滤防火墙,他可以完成封包过滤、封包重定向、和网络地址转换(NAT)等功能
netfilter是Linux核心层内部的一个数据包处理模块,他可以NAT、数据包内容修改、数据包过滤的防火墙功能。
所以说,虽然我们使用service iptables start启动iptables"服务",但是其实准确的来说,iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。
当客户端访问服务器的web服务时,客户端发送报文到网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的信息会通过内核的TCP协议传输到用户空间中的web服务中,而此时,客户端报文的目标终点为web服务所监听的套接字(IP:Port)上,当web服务需要响应客户端请求时,web服务发出的响应报文的目标终点则为客户端,这个时候,web服务所监听的IP与端口反而变成了原点,我们说过,netfilter才是真正的防火墙,它是内核的一部分,所以,如果我们想要防火墙能够达到"防火"的目的,则需要在内核中设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止,于是,就出现了input关卡和output关卡,只不过在iptables中不叫“关卡“而叫“链”。
其实我们上面描述的场景并不完善,因为客户端发来的报文访问的目标地址可能并不是本机,而是其他服务器,当本机的内核支持IP_FORWARD时,我们可以将报文转发给其他服务器,所以,这个时候,我们就会提到iptables中的其他"链",他们就是 "路由前"、"转发"、"路由后",他们的英文名是PREROUTING、FORWARD、POSTROUTING
也就是说,当我们启用了防火墙功能时,报文需要经过如下关卡,也就是说,根据实际情况的不同,报文经过"链"可能不同。如果报文需要转发,那么报文则不会经过input链发往用户空间,而是直接在内核空间中经过forward链和postrouting链转发出去的。
到本机某进程的报文:PREROUTING --> INPUT
由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING
当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了"链",每个经过这个"关卡"的报文,都要将这条"链"上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。
我们把具有相同功能的规则的集合叫做"表",所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4种表,每种表对应了不同的功能,而我们定义的规则也都逃脱不了这4种功能的范围。
链是数据包传输的路径,表示功能的集合。
filter表:负责过滤功能,防火墙;内核模块:iptables_filter
nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
mangle表:拆解报文,做出修改,并重新封装 的功能;内核模块:iptable_mangle
raw表:关闭nat表上启用的连接追踪机制;内核模块:iptable_raw
raw表中的规则可以被哪些链使用:PREROUTING、OUTPUT
mangle表中的规则可以被哪些链使用:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat表中的规则可以被哪些链使用:PREROUTING、OUTPUT、FORWARD(centos7中还有INPUT,centos6中没有)
filter表中的规则可以被哪些链使用:INPUT、FORWARD、OUTPUT
四个表中的规则处于同一条链的目前只有output链,他就是传说中的神圣万能关卡。
其实我们还需要注意一点,因为数据包经过一个"链"的时候,会将当前链的所有规则都匹配一遍,但是匹配时总归要有顺序,我们应该一条一条的去匹配,而且我们说过,相同功能类型的规则会汇聚在一张"表"中,那么,哪些"表"中的规则会放在"链"的最前面执行呢,这时候就需要有一个优先级的问题。
优先级:raw---->mangle---->nat---->filter
命令格式:
iptables [-t table] command chain-name [match][target/jump]
iptables -P chain-name DROP/ACCEPT/REJECT
-t 参数用来指定规则表,内建的规则表有三个,分别是:nat、mangle 和 filter,
当未指定规则表时,则一律视为是 filter。
-P :定义默认策略。
-L:查看iptables规则列表
-A:在规则列表的最后添加一条规则
-I:在指定的位置插入一条规则
-D:从规则列表中删除一条规则
-R:替换规则列表中的某条规则
-F:删除表中的所有规则
-Z:数据包计数器和流量计数器归零。
-X:删除自定义链
-i (后跟网络接口号):指定数据包流入的网络接口
-o(后跟网络接口号) :指定数据包流入的网络接口
-p:指定匹配的协议,如TCP/UDP/ICMP等
-s:指定数据包匹配的源地址(或子网)
--tcp-flags TCP连接标记:指定对TCP连接的标记进行匹配
--sport(后跟源端口号):指定数据包匹配的源端口号
--dport(后跟目的端口号):指定数据包匹配的目的端口号
-j:指定了当前的条件都满足时,iptables执行的动作。
-m(后跟匹配的模块):指定数据包规则所使用的过滤模块
常见-m模块有:
state:状态模块
xt_mac.ko:硬件地址
--state:一些数据包的状态主要有:INVALID:无效的数据包,比如资料破损的数据包状态。
ESTABLISHED:已经连线成功的连线状态。
NEW:想要新建立连线的数据包状态。
RELATED:表示这个数据包是与我们主机发送出去的数据包有关。