快捷搜索:
来自 67677新澳门手机版 2019-12-01 11:15 的文章
当前位置: 67677新澳门手机版 > 67677新澳门手机版 > 正文

防火墙和iptables

基础服务类系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html**

防火墙和iptables,防火墙iptables


本文目录:

6.1 为什么需要防火墙

6.2 数据传输流程

6.2.1 网络数据传输过程

6.2.2 本机数据路由决策

6.3 TCP三次握手、四次挥手以及syn攻击

6.3.1 三次握手建立tcp连接

6.3.2 四次挥手端口tcp连接

6.3.3 syn flood攻击

6.4 各种文件分布

6.4.1 从链路层来判断是否处理

6.4.2 从网络层来判断是否处理

6.4.3 从传输层来判断是否处理

6.4.4 从应用层来判断是否处理

6.4.5 特殊的防火墙判断

6.4.6 数据包过滤

6.4.7 iptables和netfilters的关系

6.5 Linux上防火墙相关基础

6.5.1 netfilter与其模块

6.5.2 netfilter的结构

6.5.3 INPUT、OUTPUT、FORWARD链

6.5.4 防火墙布线示例

6.6 filter表

6.7 iptables命令书写规则

6.7.1 iptables语法

6.7.2 ip_conntrack功能和iptstate命令

6.7.3 -m state状态解释

6.7.4 filter-iptables命令示例

6.7.5 合并规则以及调整规则的顺序

6.8 规则的管理方法

6.8.1 保存规则

6.8.2 规则的管理方法

6.9 自定义链

6.10 NAT

6.10.1 配置网关以及转发

6.10.2 配置网关式防火墙

6.10.3 SNAT和DNAT


本文介绍防火墙知识和Linux主机处理数据包的过程,同时介绍了iptables管理防火墙的方法。


6.1 为什么需要防火墙

对于没有防火墙存在的一条网络路线中,主机A发送给主机B的任何一个数据包,主机B都会照单全收,即使是包含了病毒、木马等的数据也一样会收。虽说害人之心不可有,但是在网络上,你认为是害你的行为在对方眼中是利他的行为。所以防人之心定要有,防火墙就可以提供一定的保障。

有了简单的防火墙之后,在数据传输的过程中就会接受"入关"检查,能通过的数据包才继续传输,不能通过的数据包则拒绝或者直接丢弃。

从上面的图中可以看出,防火墙至少需要两个网卡,其中一块控制流入数据包,另一块网卡控制流出数据包。即使是软件防火墙,要实现完整的防火墙功能,也需要至少两块网卡。

所谓防火墙就是"防火的墙",如果过来的是"火"就得挡住,如果过来的不是"火"就放行,但什么是"火",这由人们自行定制。

但无论如何,所谓的"火"都是基于OSI七层模型的,简单的划分为四层:最高的应用层(如HTTP/FTP/SMTP),往下一层是传输层(TCP/UDP),再往下一层是网络层,最后是链路层。可以基于整个7层模型的每一层来定制防火墙,但是默认防火墙(没有编译内核源码定制七层防火墙)一般认为工作在以上的4层中。

在网上和很多书籍上都详细解释了OSI七层模型各层的行为和作用,我个人推荐一本《计算机网络原理创新教程》,里面的OSI模型是我学习过最通俗易懂且完整详细的教程。

本文介绍防火墙知识和Linux主机处理数据包的过程,同时介绍了iptables管理防火墙的方法。

6.2 数据传输流程

6.1 为什么需要防火墙

对于没有防火墙存在的一条网络路线中,主机A发送给主机B的任何一个数据包,主机B都会照单全收,即使是包含了病毒、木马等的数据也一样会收。虽说害人之心不可有,但是在网络上,你认为是害你的行为在对方眼中是利他的行为。所以防人之心定要有,防火墙就可以提供一定的保障。

67677新澳门手机版 1

有了简单的防火墙之后,在数据传输的过程中就会接受"入关"检查,能通过的数据包才继续传输,不能通过的数据包则拒绝或者直接丢弃。

67677新澳门手机版 2

从上面的图中可以看出,防火墙至少需要两个网卡,其中一块控制流入数据包,另一块网卡控制流出数据包。即使是软件防火墙,要实现完整的防火墙功能,也需要至少两块网卡。

所谓防火墙就是"防火的墙",如果过来的是"火"就得挡住,如果过来的不是"火"就放行,但什么是"火",这由人们自行定制。

但无论如何,所谓的"火"都是基于OSI七层模型的,简单的划分为四层:最高的应用层(如HTTP/FTP/SMTP),往下一层是传输层(TCP/UDP),再往下一层是网络层,最后是链路层。可以基于整个7层模型的每一层来定制防火墙,但是默认防火墙(没有编译内核源码定制七层防火墙)一般认为工作在以上的4层中。

在网上和很多书籍上都详细解释了OSI七层模型各层的行为和作用,我个人推荐一本《计算机网络原理创新教程》,里面的OSI模型是我学习过最通俗易懂且完整详细的教程。

6.2.1 网络数据传输过程

首先看看网络数据传输的基本流程。

数据从上层进入到传输层,加上源端口和目标端口成为数据段(如果是UDP则成为数据报),再进入网络层加上源IP和目标IP成为数据包,再进入链路层加上源MAC地址和目标MAC地址成为数据帧,这段过程是一种"加头"封装数据的过程。数据经过网络传输到达目标主机后,逐层"剃头"解包,最终得到data纯数据内容。

6.2 数据传输流程

6.2.2 本机数据路由决策

其实,进程间数据传输的方式有多种:共享内存、命名管道、套接字、消息队列、信号量等。上面描述的OSI通信模型只是数据传输的一种方式,它特指网络数据传输,是基于套接字(ip port)的,所以既可以是主机间进程通信,也可以是本机服务端和客户端进程间的通信。

无论如何,网络数据总是会流入、流出的,即使是本机的客户端和服务端进程间通信,也需要从套接字的一端流出、套接字的另一端流出,只不过这些数据无需路由、无需经过网卡。当向外界主机发送数据时,在它从网卡流入后需要对它做路由决策,根据其目标决定是流入本机数据还是转发给其他主机,如果是流入本机的数据,则数据会从内核空间进入用户空间(被应用程序接收、处理)。当用户空间响应(应用程序生成新的数据包)时,响应数据包是本机产生的新数据,在响应包流出之前,需要做路由决策,根据目标决定从哪个网卡流出。如果不是流入本机的,而是要转发给其他主机的,则必然涉及到另一个流出网卡,此时数据包必须从流入网卡完整地转发给流出网卡,这要求Linux主机能够完成这样的转发。但Linux主机默认未开启ip_forward功能,这使得数据包无法转发而被丢弃。Linux主机和路由器不同,路由器本身就是为了转发数据包,所以路由器内部默认就能在不同网卡间转发数据包,而Linux主机默认则不能转发。

67677新澳门手机版 ,下图可以很好地解释上面的过程:

本文是为了介绍防火墙的,充当防火墙的主机需要至少两块网卡,所以有必要解释下数据流入和流出时,Linux主机是如何处理的。

首先要说明的是,IP地址是属于内核的(不仅如此,整个tcp/ip协议栈都属于内核,包括端口号),只要能和其中一个地址通信,就能和另一个地址通信(这么说不严谨,准确地说是能路由这两个地址),而不管是否开启了数据包转发功能。例如某Linux主机有两网卡eth0:172.16.10.5和eth1:192.168.100.20,某192.168.100.22主机网关指向192.168.100.20,它能ping通192.168.100.20,但也一样能ping通172.16.10.5,因为地址属于内核,从eth1进来的数据包被内核分析时,发现目标地址为本机地址,直接就产生新数据包回应192.168.100.22,根据路由决策,该响应包应从eth1出去,于是192.168.100.22能收到回复完成整个ping过程。

在此过程中,没有进行数据包转发过程,因为流出的响应包是新产生的,而非原来流入的数据包。如果流入和流出的包是一样的(或者稍作修改),则数据流入后不能进入用户空间,而是直接通过内核转发给另一个网卡。数据包从网卡1交给网卡2,这个过程就是转发,在Linux主机上由ip_forward进行控制。例如,网卡1所在网段主机ping网卡2所在主机时,数据包流入网卡1后就需要转交给网卡2,然后从网卡2流出。

在后文中有实验专门测试和说明上面的过程:配置网关以及转发。

6.2.1 网络数据传输过程

首先看看网络数据传输的基本流程。

67677新澳门手机版 3

数据从上层进入到传输层,加上源端口和目标端口成为数据段(如果是UDP则成为数据报),再进入网络层加上源IP和目标IP成为数据包,再进入链路层加上源MAC地址和目标MAC地址成为数据帧,这段过程是一种"加头"封装数据的过程。数据经过网络传输到达目标主机后,逐层"剃头"解包,最终得到data纯数据内容。

6.3 TCP三次握手、四次挥手以及syn攻击

每次TCP会话的建立都需要经过三次握手,断开时都需要四次挥手。

6.2.2 本机数据路由决策

其实,进程间数据传输的方式有多种:共享内存、命名管道、套接字、消息队列、信号量等。上面描述的OSI通信模型只是数据传输的一种方式,它特指网络数据传输,是基于套接字(ip port)的,所以既可以是主机间进程通信,也可以是本机服务端和客户端进程间的通信。

无论如何,网络数据总是会流入、流出的,即使是本机的客户端和服务端进程间通信,也需要从一个套接字流出、另一个套接字流入,只不过这些数据无需路由、无需经过物理网卡(走的是LoopBack)。当接收外界发送的数据时,在数据从网卡流入后需要对它做路由决策,根据其目标决定是流入本机数据还是转发给其他主机,如果是流入本机的数据,则数据会从内核空间进入用户空间(被应用程序接收、处理)。当用户空间响应(应用程序生成新的数据包)时,响应数据包是本机产生的新数据,在响应包流出之前,需要做路由决策,根据目标决定从哪个网卡流出。如果不是流入本机的,而是要转发给其他主机的,则必然涉及到另一个流出网卡,此时数据包必须从流入网卡完整地转发给流出网卡,这要求Linux主机能够完成这样的转发。但Linux主机默认未开启ip_forward功能,这使得数据包无法转发而被丢弃。Linux主机和路由器不同,路由器本身就是为了转发数据包,所以路由器内部默认就能在不同网卡间转发数据包,而Linux主机默认则不能转发。

下图可以很好地解释上面的过程:

67677新澳门手机版 4

本文是为了介绍防火墙的,充当防火墙的主机需要至少两块网卡,所以有必要解释下数据流入和流出时,Linux主机是如何处理的。

首先要说明的是,IP地址是属于内核的(不仅如此,整个tcp/ip协议栈都属于内核,包括端口号),只要能和其中一个地址通信,就能和另一个地址通信(这么说不严谨,准确地说是能路由这两个地址),而不管是否开启了数据包转发功能。例如某Linux主机有两网卡eth0:172.16.10.5和eth1:192.168.100.20,某192.168.100.22主机网关指向192.168.100.20,它能ping通192.168.100.20,但也一样能ping通172.16.10.5,因为地址属于内核,从eth1进来的数据包被内核分析时,发现目标地址为本机地址,直接就产生新数据包回应192.168.100.22,根据路由决策,该响应包应从eth1出去,于是192.168.100.22能收到回复完成整个ping过程。

在此过程中,没有进行数据包转发过程,因为流出的响应包是新产生的,而非原来流入的数据包。如果流入和流出的包是一样的(或者稍作修改),则数据流入后不能进入用户空间,而是直接通过内核转发给另一个网卡。数据包从网卡1交给网卡2,这个过程就是转发,在Linux主机上由ip_forward进行控制。例如,网卡1所在网段主机ping网卡2所在主机时,数据包流入网卡1后就需要转交给网卡2,然后从网卡2流出。

在后文中有实验专门测试和说明上面的过程:配置网关以及转发。

6.3.1 三次握手建立TCP连接

如图。

(1).客户端和服务端都处于CLOSED状态。(发起TCP请求的称为客户端,接受请求的称为服务端)

(2).服务端打开服务端口,处于listen状态。

(3).客户端发起连接请求。首先发送SYN(synchronous)报文给服务端,等待服务端给出ACK报文回应。发送的SYN=1,ACK=0,表示只发送了SYN信号。此时客户端处于SYN-SENT状态(SYN信号已发送)。

(4).服务端收到SYN信号后,发出ACK报文回应,并同时发出自己的SYN信号请求连接。此时服务端处于SYN-RECV状态(syn recieved,在图中显示的是SYN-RCVD)。发送的SYN=1 ACK=1,表示发送了SYN ACK。

(5).客户端收到服务端的确认信号ACK后,再次发送ACK信号给服务端以回复服务端发送的syn。此时客户端进入ESTABLISHED状态,发送的SYN=0,ACK=1表示只发送了ACK。

(6).服务端收到ACK信号后,也进入ESTABLISHED状态。

此后进行数据的传输都通过此连接进行。其中第3、4、5步是三次握手的过程。这个过程通俗地说就是双方请求并回应的过程:①A发送syn请求B并等待B回应;②B回应A,并同时请求A;③B回应A。

6.3 TCP三次握手、四次挥手以及syn攻击

每次TCP会话的建立都需要经过三次握手,断开时都需要四次挥手。

6.3.2 四次挥手断开TCP连接

假设是客户端请求的断开。初始状态,双方都处于ESTABLISHED状态。

(1).客户端发送FIN(finally)报文信号,请求断开。此后客户端进入FIN-WAIT-1状态。

(2).服务端收到FIN信号,给出确认信号ACK,表示同意断开。此时服务端进入CLOSE-WAIT状态。此过程结束后表示从客户端到服务端方向的TCP连接已经关闭了,也就是说整个TCP连接处于半关闭状态。

(3).客户端收到服务端的ACK后进入FIN-WAIT-2状态,以等待服务端发出断开信号FIN。在客户端的FIN-WAIT-2状态的等待过程中,服务端再发出自己的FIN信号给客户端。此时服务端进入LAST-ACK状态。

(4).客户端收到服务端的FIN信号,给出回应信号ACK,表示接受服务端的断开请求,此时客户端进入TIME-WAIT状态,此时客户端已脱离整个TCP,只需再等待一段时间(2*MSL)就自动进入CLOSED状态。

(5).服务端收到客户端的回应ACK信号,知道客户端同意了服务端到客户端方向的TCP断开,直接进入CLOSED状态。

以上的1、2、3、4步是四次挥手阶段。从中可以看出,四次挥手和三次握手的过程其实是类似的,都是双方发出断开请求并回应对方,只不过四次挥手的过程是将服务端发送的ACK和FIN分开发送了,而三次握手的过程中服务端发送的ACK和SYN是放在一个数据包内发送的。

6.3.1 三次握手建立TCP连接

如图。

67677新澳门手机版 5

(1).客户端和服务端都处于CLOSED状态。(发起TCP请求的称为客户端,接受请求的称为服务端)

(2).服务端打开服务端口,处于listen状态。

(3).客户端发起连接请求。首先发送SYN(synchronous)报文给服务端,等待服务端给出ACK报文回应。发送的SYN=1,ACK=0,表示只发送了SYN信号。此时客户端处于SYN-SENT状态(SYN信号已发送)。

(4).服务端收到SYN信号后,发出ACK报文回应,并同时发出自己的SYN信号请求连接。此时服务端处于SYN-RECV状态(syn recieved,在图中显示的是SYN-RCVD)。发送的SYN=1 ACK=1,表示发送了SYN ACK。

(5).客户端收到服务端的确认信号ACK后,再次发送ACK信号给服务端以回复服务端发送的syn。此时客户端进入ESTABLISHED状态,发送的SYN=0,ACK=1表示只发送了ACK。

(6).服务端收到ACK信号后,也进入ESTABLISHED状态。

此后进行数据的传输都通过此连接进行。其中第3、4、5步是三次握手的过程。这个过程通俗地说就是双方请求并回应的过程:①A发送syn请求B并等待B回应;②B回应A,并同时请求A;③A回应B。

6.3.3 syn flood攻击

syn洪水攻击是一种常见的DDos攻击手段。攻击者可以通过工具在极短时间内伪造大量随机不存在的ip向服务器指定端口发送tcp连接请求,也就是发送了大量syn=1 ack=0的数据包,当服务器收到了该数据包后会回复并同样发送syn请求tcp连接,也就是发送ack=1 syn=1的数据包,此后服务器进入SYN-RECV状态,正常情况下,服务器期待收到客户端的ACK回复。但问题是服务器回复的目标ip是不存在的,所以回复的数据包总被丢弃,也一直无法收到ACK回复,于是不断重发ack=1 syn=1的回复包直至超时。

在服务器被syn flood攻击时,由于不断收到大量伪造的syn=1 ack=0请求包,它们将长时间占用资源队列,使得正常的SYN请求无法得到正确处理,而且服务器一直处于重传响应包的状态,使得cpu资源也被消耗。总之,syn flood攻击会大量消耗网络带宽和cpu以及内存资源,使得服务器运行缓慢,严重时可能会引起网络堵塞甚至系统瘫痪。

因此,防范syn flood攻击非常重要。当然,首先需要判断出是否受到了syn flood攻击。可以通过抓包工具或者netstat等工具获取处于SYN_RECV状态的半连接,如果有大量处于SYN_RECV且源地址都是乱七八糟的说明受到了syn洪水攻击。

例如使用netstat工具判断的方法如下:

[[email protected] ~]# netstat -tnlpa | grep tcp | awk '{print $6}' | sort | uniq -c
      1 ESTABLISHED
      7 LISTEN
    256 SYN_RECV

6.3.2 四次挥手断开TCP连接

断开之前,双方都处于ESTABLISHED状态。假设是客户端请求断开连接。

67677新澳门手机版 6

(1).客户端发送FIN(finally)报文信号,请求断开。此后客户端进入FIN-WAIT-1状态。

(2).服务端收到FIN信号,给出确认信号ACK,表示同意断开。此时服务端进入CLOSE-WAIT状态。此过程结束后表示从客户端到服务端方向的TCP连接已经关闭了,也就是说整个TCP连接处于半关闭状态。

(3).客户端收到服务端的ACK后进入FIN-WAIT-2状态,以等待服务端发出断开信号FIN。在客户端的FIN-WAIT-2状态的等待过程中,服务端再发出自己的FIN信号给客户端。此时服务端进入LAST-ACK状态。

(4).客户端收到服务端的FIN信号,给出回应信号ACK,表示接受服务端的断开请求,此时客户端进入TIME-WAIT状态,此时客户端已脱离整个TCP,只需再等待一段时间(2*MSL)就自动进入CLOSED状态。

(5).服务端收到客户端的回应ACK信号,知道客户端同意了服务端到客户端方向的TCP断开,直接进入CLOSED状态。

以上的1、2、3、4步是四次挥手阶段。从中可以看出,四次挥手和三次握手的过程其实是类似的,都是双方发出断开请求并回应对方,只不过四次挥手的过程是将服务端发送的ACK和FIN分开发送了,而三次握手的过程中服务端发送的ACK和SYN是放在一个数据包内发送的。

以上所述是客户端请求的断开,服务端也可以请求断开,这时过程是完全一致的,只不过角色互换了。还需注意的是,如果是客户端请求断开,那么服务端就是被动断开端,可能会保留大量的CLOSE-WAIT状态的连接,如果是服务端主动请求断开,则可能会保留大量的TIME_WAIT状态的连接。由于每个连接都需要占用一个文件描述符,高并发情况下可能会耗尽这些资源。因此,需要找出对应问题,做出对应的防治,一般来说,可以修改内核配置文件/etc/sysctl.conf来解决一部分问题。

6.4 防火墙的判断范围

从设备上分类,防火墙分为软件防火墙、硬件防火墙、芯片级防火墙。后文所说的可能是软件防火墙、也可能是硬件防火墙,在理解上它们没什么区别,只是将防火墙剥离成了独自的服务器而已。

从技术上分类,防火墙分为数据包过滤型防火墙、应用代理型防火墙。这是因为四层模型的每一层都可以应用防火墙。

6.3.3 syn flood攻击

syn洪水攻击是一种常见的DDos攻击手段。攻击者可以通过工具在极短时间内伪造大量随机不存在的ip向服务器指定端口发送tcp连接请求,也就是发送了大量syn=1 ack=0的数据包,当服务器收到了该数据包后会回复并同样发送syn请求tcp连接,也就是发送ack=1 syn=1的数据包,此后服务器进入SYN-RECV状态,正常情况下,服务器期待收到客户端的ACK回复。但问题是服务器回复的目标ip是不存在的,所以回复的数据包总被丢弃,也一直无法收到ACK回复,于是不断重发ack=1 syn=1的回复包直至超时。

在服务器被syn flood攻击时,由于不断收到大量伪造的syn=1 ack=0请求包,它们将长时间占用资源队列,使得正常的SYN请求无法得到正确处理,而且服务器一直处于重传响应包的状态,使得cpu资源也被消耗。总之,syn flood攻击会大量消耗网络带宽和cpu以及内存资源,使得服务器运行缓慢,严重时可能会引起网络堵塞甚至系统瘫痪。

因此,防范syn flood攻击非常重要。当然,首先需要判断出是否受到了syn flood攻击。可以通过抓包工具或者netstat等工具获取处于SYN_RECV状态的半连接,如果有大量处于SYN_RECV且源地址都是乱七八糟的,说明受到了syn洪水攻击。

例如使用netstat工具判断的方法如下:

[root@xuexi ~]# netstat -tnlpa | grep tcp | awk '{print $6}' | sort | uniq -c
      1 ESTABLISHED
      7 LISTEN
    256 SYN_RECV

6.4.1 从链路层来判断是否处理

基于链路层的防火墙是控制MAC的。例如,可以将公司内网员工电脑的MAC地址全部记录到防火墙上,从而限制他们上外网。再例如,可以将公司电脑的MAC地址全部记录到防火墙使他们能够上网,但是非本公司的电脑就无法从本公司上网。

但是,基本上不会有公司这样做,这样的行为太死板,而且记录MAC地址本身就是一件很麻烦的事。

6.4 防火墙的判断范围

从设备上分类,防火墙分为软件防火墙、硬件防火墙、芯片级防火墙。后文所说的可能是软件防火墙、也可能是硬件防火墙,在理解上它们没什么区别,只是将防火墙剥离成了独自的服务器而已。

从技术上分类,防火墙分为数据包过滤型防火墙、应用代理型防火墙。这是因为四层模型的每一层都可以应用防火墙。

6.4.2 从网络层来判断是否处理

网络层的核心是IP(也包括icmp等)。所以从网络层来判断,可以基于源IP、目标IP来指定防火墙的规则。例如,来自38.68.100.61的主机不能穿过防火墙;访问目标是192.168.109.19的服务器的请求不能让其穿过防火墙;还可以设置icmp协议作为判断依据,使得外网人员的ping包被挡住。

在网络层可以用来制定防火墙规则的内容有很多。如下表。最常用的也就是后三个而已。

6.4.1 从链路层来判断是否处理

基于链路层的防火墙是控制MAC的。例如,可以将公司内网员工电脑的MAC地址全部记录到防火墙上,从而限制他们上外网。再例如,可以将公司电脑的MAC地址全部记录到防火墙使他们能够上网,但是非本公司的电脑就无法从本公司上网。

但是,基本上不会有公司这样做,这样的行为太死板,而且记录MAC地址本身就是一件很麻烦的事。

6.4.3 从传输层来判断是否处理

可以从TCP或者UDP来判断。以TCP为例,例如限制目标端口是22端口的请求,这样SSH就无法连接上服务器了。

下表是TCP数据包中可以用来制定防火墙规则的字段。

6.4.2 从网络层来判断是否处理

网络层的核心是IP(也包括icmp等)。所以从网络层来判断,可以基于源IP、目标IP来指定防火墙的规则。例如,来自38.68.100.61的主机不能穿过防火墙;访问目标是192.168.109.19的服务器的请求不能让其穿过防火墙;还可以设置icmp协议作为判断依据,使得外网人员的ping包被挡住。

在网络层可以用来制定防火墙规则的内容有很多。如下表。最常用的也就是后三个而已。

67677新澳门手机版 7

6.4.4 从应用层来判断是否处理

到了这一层的处理就属于应用代理型的防火墙了。他需要解开数据包并还原数据,也就是说它可以获取到数据包中的所有内容,但也因此负担很重,所需CPU和内存较大。它的适用面较窄。

6.4.3 从传输层来判断是否处理

可以从TCP或者UDP来判断。以TCP为例,例如限制目标端口是22端口的请求,这样SSH就无法连接上服务器了。

下表是TCP数据包中可以用来制定防火墙规则的字段。

67677新澳门手机版 8

6.4.5 特殊的防火墙判断

除了以上4种判定方式,还有几种特殊的判断方式也较为常用。

◇ 根据数据包内容判断

例如,不允许内网的客户端连上taobao.com上的任何主机,可以在防火墙上检查DNS的解析包中是否包含"taobao.com"这个字符串,如果有就丢弃,这样就可以让DNS对任何taobao.com上的主机解析失败达到限制上该网的目的。

注意:虽说数据部分是应用层的,但是有些防火墙在网络层就可以进行检查。Linux默认自带的iptables/netfilters就是其中一种。

◇ 根据关联状态判断

假如现在不允许任何internet上的主机进入到公司内部,但是允许企业内的计算机可以上网。这样的设定目的是为了防止来自外网的攻击。但是如果"禁止源地址为外网的所有地址穿过防火墙、允许源地址为公司内部的地址穿过防火墙"来设置防火墙,将导致一个问题:内网连上internet后请求某个网页,要能正常上网,内网计算机必然要接收外网网页的返回数据。但外网数据包无法穿过防火墙,这样并没有实现内网主机上网的目的。

现在假设内网某机器上外网时的套接字为192.168.100.8:9000,想要访问10.0.0.5:80,也即是说数据流向是192.168.100.8:9000→10.0.0.5:80,那么返回的数据包流向必定是10.0.0.5:80→192.168.100.8:9000。根据这种关联性,防火墙可以设定允许这样的数据包通过。

这属于连接跟踪的行为。FTP服务器对于防火墙的设置是一个考验,如果没有连接跟踪的功能,数据通道的端口不固定性将导致防火墙设置极其困难。

6.4.4 从应用层来判断是否处理

到了这一层的处理就属于应用代理型的防火墙了。他需要解开数据包并还原数据,也就是说它可以获取到数据包中的所有内容,但也因此负担很重,所需CPU和内存较大。它的适用面较窄。

6.4.6 数据包过滤

以下是协议栈(TCP/IP协议栈)底层大致机制。数据包都要通过A流入,再根据路由决策决定数据包的流向(网络层)。如果是流入本机,则经过B进入用户空间层,对于每个从本机流出的数据包,也都要经过路由决策来决定从哪个网络接口出去,然后路经D,从E出去。如果不是流入本机则流向C,然后顺着E点出去。

上图有一处容易理解错误,从用户空间层出去的数据包是本机新产生的数据包,可能是对流入数据包的响应数据,也可能是本机应用向外发出的请求数据包。总之,数据包走不完A-->B点-->User Space-->D-->E这条路,在数据包进入用户空间层时已经被处理了,从用户空间层出来的数据已经不是原流入的数据,所以在上图中我将用户空间的两个箭头断开了。

用英文来说明ABCDE这5个点就比较浅显易懂:

A表示:altering packets as soon as they come in,

B表示:destined to local sockets,

C表示:be routed through the box,

D表示:locally-generated packets,

E表示:altering packets as they are about to go out。

在上图中的ABCDE这五个点,其实就是防火墙发挥作用的点。在Linux主机上,防火墙是由内核空间的netfilter实现的,其中作用在ABCDE这五个点的分别称为PREROUTING链、INPUT链、FORWARD链、OUTPUT链和POSTROUTING链。这几个术语在后文会做非常详细的说明。

6.4.5 特殊的防火墙判断

除了以上4种判定方式,还有几种特殊的判断方式也较为常用。

◇ 根据数据包内容判断

例如,不允许内网的客户端连上taobao.com上的任何主机,可以在防火墙上检查DNS的解析包中是否包含"taobao.com"这个字符串,如果有就丢弃,这样就可以让DNS对任何taobao.com上的主机解析失败达到限制上该网的目的。

注意:虽说数据部分是应用层的,但是有些防火墙在网络层就可以进行检查。Linux默认自带的iptables/netfilters就是其中一种。

◇ 根据关联状态判断

假如现在不允许任何internet上的主机进入到公司内部,但是允许企业内的计算机可以上网。这样的设定目的是为了防止来自外网的攻击。但是如果"禁止源地址为外网的所有地址穿过防火墙、允许源地址为公司内部的地址穿过防火墙"来设置防火墙,将导致一个问题:内网连上internet后请求某个网页,要能正常上网,内网计算机必然要接收外网网页的返回数据。但外网数据包无法穿过防火墙,这样并没有实现内网主机上网的目的。

现在假设内网某机器上外网时的套接字为192.168.100.8:9000,想要访问10.0.0.5:80,也即是说数据流向是192.168.100.8:9000→10.0.0.5:80,那么返回的数据包流向必定是10.0.0.5:80→192.168.100.8:9000。根据这种关联性,防火墙可以设定允许这样的数据包通过。

这属于连接跟踪的行为。FTP服务器对于防火墙的设置是一个考验,如果没有连接跟踪的功能,数据通道的端口不固定性将导致防火墙设置极其困难。

6.4.7 iptables和Netfilter的关系

防火墙起作用的是Netfilter,而iptables只是管理控制netfilter的工具,可以使用该工具进行相关规则的制定以及其他的动作。iptables是用户层的程序,netfilter是内核空间的,在netfilter刚加入到Linux中时,netfilter是一个Linux的一个内核模块,要实现其他的防火墙行为还需要加载其他对应的模块,到了后来netfilter一部分必须的模块已经加入到内核中了。

也就是说,iptables命令工具操作的netfilter,真正起"防火"作用的是netfilter。

6.4.6 数据包过滤

以下是协议栈(TCP/IP协议栈)底层大致机制。数据包都要通过A流入,再根据路由决策决定数据包的流向(网络层)。如果是流入本机,则经过B进入用户空间层,对于每个从本机流出的数据包,也都要经过路由决策来决定从哪个网络接口出去,然后路经D,从E出去。如果不是流入本机则流向C,然后顺着E点出去。

67677新澳门手机版 9

上图有一处容易理解错误,从用户空间层出去的数据包是本机新产生的数据包,可能是对流入数据包的响应数据,也可能是本机应用向外发出的请求数据包。总之,数据包走不完A-->B点-->User Space-->D-->E这条路,在数据包进入用户空间层时已经被处理了,从用户空间层出来的数据已经不是原流入的数据,所以在上图中我将用户空间的两个箭头断开了。

用英文来说明ABCDE这5个点就比较浅显易懂:

A表示:altering packets as soon as they come in,

B表示:destined to local sockets,

C表示:be routed through the box,

D表示:locally-generated packets,and altering before routing,

E表示:altering packets as they are about to go out。

在上图中的ABCDE这五个点,其实就是防火墙发挥作用的点。在Linux主机上,防火墙是由内核空间的netfilter实现的,其中作用在ABCDE这五个点的分别称为PREROUTING链、INPUT链、FORWARD链、OUTPUT链和POSTROUTING链。这几个术语在后文会做非常详细的说明。

67677新澳门手机版 10

6.5 Linux上防火墙相关基础

6.4.7 iptables和Netfilter的关系

防火墙起作用的是Netfilter,而iptables只是管理控制netfilter的工具,可以使用该工具进行相关规则的制定以及其他的动作。iptables是用户层的程序,netfilter是内核空间的,在netfilter刚加入到Linux中时,netfilter是一个Linux的一个内核模块,要实现其他的防火墙行为还需要加载其他对应的模块,到了后来netfilter一部分必须的模块已经加入到内核中了。

也就是说,iptables命令工具操作的netfilter,真正起"防火"作用的是netfilter。

6.5.1 netfilter与其模块

Linux是一个极其模块化的内核。netfilter也是以模块化的形式存在于Linux中,所以每添加一个和netfilter相关的模块,代表着netfilter就多一个功能。

但是有些模块是使用netfilter所必须的,所以这些模块已经默认编译到内核中而非需要时加载。

存放netfilter模块的目录有三个:/lib/modules/$kernel_ver/net/{netfilter,ipv4/netfilter,ipv6/netfilter}。$kernel_ver代表内核版本号。

其中ipv4/netfilter/存放的ipv4的netfilter,ipv6/netfilter/存放的ipv6的netfilter,/lib/modules/$kernel_net/kernel/netnetfilter/存放的是同时满足ipv4和ipv6的netfilter。在最后一个目录中放入更多的模块,是netfilter团队发展的目标,因为要维护ipv4和ipv6两个版本挺累的。

6.5 Linux上防火墙相关基础

6.5.2 netfilter的结构

要使netfilter能够工作,就需要将所有的规则读入内存中。netfilter自己维护一个内存块,在此内存块中有4个表:filter表、NAT表、mangle表和raw表。在每个表中有相应的链,链中存放的是一条条的规则,规则就是过滤防火的语句或者其他功能的语句。也就是说表是链的容器,链是规则的容器。实际上,每个链都只是一个hook函数(钩子函数)而已。

说到这里,需要纠正一个概念,Linux上的防火墙是由netfilter实现的,但是netfilter的功能不仅仅只有"防火",一般可以认为"防火"的功能只是filter表的功能。

关于这4个表,它们的结构如下:

◇ filter表:netfilter中最重要的表,负责过滤数据包,也就是防火墙实现"防火"的功能。filter表中只有OUTPUT/FORWARD/INPUT链。

◇ NAT表:实现网络地址转换的表。可以转换源地址、源端口、目标地址、目标端口。NAT表中的链是PREROUTING/POSTROUTING/OUTPUT。

◇ mangle表:一种特殊的表,通过mangle表可以实现数据包的拆分和还原。mangle表中包含所有的链。

◇ raw表:加速数据包穿过防火墙的表,也就是增强防火墙性能的表。只有PREROUTING/OUTPUT表。

由于这几个表中有重复的链,所以数据被不同链中规则处理时是由顺序的。下图是完整的数据包处理流程。

本文由67677新澳门手机版发布于67677新澳门手机版,转载请注明出处:防火墙和iptables

关键词: