尝试使用博客来做读书笔记,《Linux防火墙(第4版)》这个是一本非常经典的讲iptables的书,虽然现在最新版的Centos已经不再使用iptables,但是比如k8s等等最新的serverless服务,底层还是基于Iptables,所以这本书还是有很高的阅读价值的。

第一部分 数据包的过滤以及基本的安全措施

数据包过滤防火墙的基础概念和机制,这些概念包括网络通信的参考架构、级域网络的服务是如何被识别的、什么是数据包,以及网络上的计算机互相发送消息和消息的类型。
OSI网络模型代表了基于层次的网络框架,每一层都提供了不同于其他层的功能,总共分为了7层。
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层,共七层。
OSI的物理层被传输介质所占据,它们传输比特,网络入侵检测人员通常不会关注物理层。
数据链路层在给定的物理介质上传输数据,并负责传输过程中的错误检测和恢复,物理硬件地址也定义在这一层,例如MAC地址。
网络层负责逻辑寻址和数据路由,IP协议是网络层的协议,路由器和一些交换机工作在第三层。
传输层是能够建立可靠性的重要一层,传输层的协议包含TCP和UDP等,在该层上,会话在两个端点之间建立。
第六层是表示层,主要是负责与上层的应用层进行通信,还定义了使用的加密方式等。
最后是应用层,它负责向用户或者应用程序展示数据。

IP协议,IP是互联网运行的基础,IP是无连接的协议,它提供第三层的路由功能。

1
2
3
4
# 特殊地址
0.0.0.0 代表默认路由
127.0.0.1 回环网络地址,不会被路由,指向本机
255.255.255.255 广播地址,会被路由,传递到物理网段的所有主机

有时IP数据报的大小比它将要通过的物理介质所允许的最大大小要大,这个所允许的最大大小是最大传输单元MTU,这时候将要在传输前分割成更小的块,这个过程称为分片。
分片在OSI的网络层(IP层)进行,因此它对于高层的协议(比如TCP、UDP)而言是透明的,如果分片的某个大片段丢失了,将会影响程序的性能。
在过去,分片是一种攻击方式,通讯路径中的任何中介路由都有可能导致分片。

广播和组播

除了寻址到这个数据本身的数据帧外,还有广播和组播这两种方式会导致接口接收数据。
广播会被所有接收到广播的设备处理,分直接广播和受限广播,目前前者更常见,因为地址解析协议(ARP)使用广播来获得子网中的一个IP地址对应的MAC地址。
通常一个路由接口遇到了一个直接广播,它不会将该数据报传递到可路由的其他子网中。大多数的路由可以进行配置以允许此行为,然而,应该谨慎些,以免造成网络风暴。
一个子网广播是发送给定子网的广播地址数据帧,该广播地址根据要发送的子网掩码不同而不同。

ICMP

ICMP通常用于ping服务。

传输层机制 TCP、UDP

UDP是无连接协议,用于DNS查询、SNMP(简单网络管理协议)和RADIUS(远程用户拨号认证系统)等。
TCP是面向连接等协议,意味着它向上提供可靠的服务。两个应用程序用TCP通信,必须建立一个连接。
TCP的三次建立连接握手分别是 SYN(SYN_SEND状态)>SYN-ACK(SYN_RCVD)>ACK(ESTABLISHED) 连接此时已经建立成功。
(SYN_SEND)SYN > (LISTEN)
(ESTABLISHED) < SYN-ACK(SYN_RCVD)
(ESTABLISHED) ACK > (ESTABLISHED)
TCP的四次挥手比建立连接多一次的原因是因为TCP连接的全双工特性,因为任何一遍都可能在任何时候发送数据。
断开分别是
(ESTABLISHED) FIN > (ESTABLISHED)
(FIN_WAIT1) < ACK (CLOSE_WAIT)
(FIN_WAIT2) < FIN (LAST_ACK)
(TIME_WAIT) FIN-ACK > (CLOSE)
(CLOSE)

数据包过滤防火墙概念

数据包过滤防火墙分两种,无状态防火墙(stateless firewall)和状态(stateful firewall)防火墙,无状态防火墙通常在OSI模型的IP层中执行一些数据包过滤,典型的例子如边界路由器。
状态防火墙会对看到一个会话中之前的数据包进行追踪,并基于此链接中已经看到的内容对于数据包应用访问策略,状态防火墙隐含无状态防火墙所拥有的数据包过滤能力。
应用层网关是另外一种形式的防火墙,主要是在第七层进行操作。

拒绝服务攻击

拒绝服务攻击分为TCP SYN泛洪(SYN Flood)、ping泛洪(ping-Flood)、UDP泛洪(UDP-Flood)、分片炸弹(frangmentation bombs)、缓存区溢出(buffer overflow)和ICMP路由重定向炸弹(ICMP routing redirect bomb)。

1、TCP SYN泛洪攻击会消耗您的系统资源直到无法接受更多的TCP连接。这种攻击利用建立连接过程中基本的三次握手协议,并结合IP源地址进行欺骗。
对于Linux用户来说,有一些急救办法可以使用,第一个是源地址过滤,他会过滤掉最常用于欺骗的源地址,但不能保证可以过滤在合法分类中的伪造的地址。
第二个便是启用内核中的SYN cookie模块,当连接队列被填满时,系统开始使用SYN cookies而非SYN-ACK来应答SYN请求,他会释放队列中的空间,因此队列永远不会被完全填满。
cookie的超时时间很短暂,客户端必须在很短的时间内进行应答,接下来服务器才会使用客户端期望的SYN-ACK来进行应答。cookie是一个基于SYN中的原是序列号、源地址、目的地址、端口号、密值而产生的序列号,如果对此cookie的响应与哈希算法的结果相匹配,服务端便可合理的确信这个SYN是合法的。
根据特定的发行版,你可能需要(或不需要)使用下面的命令打开内核中的保护功能:

1
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

也有一些发行版需要明确的使用make config来配置此选项到内核,并重新编译和安装新内核。

2、ping泛洪
任何会引起您的计算机发出响应的消息均可以被用于降低您的网络表现,其原理是强制系统消耗大多数时间进行无用的应答,通过PING来发送ICMP的ECHO请求消息也是一个常见的元凶。
解决办法:关闭ICMP响应。

3、UDP泛洪
UDP协议是无状态的,所以UDP协议格外适合Dos工具。许多站点禁用了所有非必要的UDP端口。

4、分片炸弹
一种是人为构造非常小的数据包,一个字节的数据包会导致一些操作系统但对崩溃,如今的操作系统通常会对这个进行测试。
另外一种是构造最初的分片,使得UDP或TCP的源地知和目的端口都包含在第二个分片中。数据包过滤防火墙通常会允许这些分片通过,因为他们过滤所基于的信息还未呈现。
分片炸弹的经典例子是泪滴攻击(Teardop attack)。

5、缓冲区溢出
缓冲区溢出无法通过过滤防火墙进行保护。一类是简单通过覆盖起数据空间或者运行时堆栈导致系统崩溃。
一种是需要专业技术以及对硬件、系统软件或被攻击的软件版本的了解。溢出的目的是为了覆盖程序的运行时堆栈,因此调用的返回对战会包含一个程序,并会跳转到哪里,这个程序通常是以ROOT权限启动一个SHEL。

6、ICMP重定向炸弹
ICMP重定向消息类型5会告知目标系统改变内存中的路由表以获得更短的路由。

Iptables数据包过滤防火墙

iptables使用了三个内置的过滤器链:INPUT、OUTPUT、FORWARD。传入数据包需要经过路由功能,它决定了数据包是传送到本地主机的INPUT规则链还是FORWARD规则链。
本地程序传出的数据包会被传递到OUTPUT规则链的规则处,如果数据包被接受,他被送到适当的接口。因此,每个数据包都被过滤了一次(回环数据包被过滤了两次)。
iptables防火墙是基于Netfilter建立的。iptables命令实现了创建防火墙并且管理防火墙行为。Netfilter防火墙有三个内置的表:filter、nat和mangle。

在默认的filter表中,有一条用于处理输入或即将传入防火墙的数据的规则链,一条用于处理输出或即将离开防火墙的数据的规则链,一条用于处理转发或通过防火墙送出的数据的规则链,和用户自定义规则链。
filter表是实现基本的防火墙的默认表,nat表用来提供NAT和相关的功能,mangle在数据包被防火墙修改的时候使用。

NAT表支持源NAT(SNAT)和目的NAT(DNAT)。nat表允许修改一个数据包的源地址或目的地址以及端口。它有三个内建规则链:PREOUTING规则链、OUTPUT规则链、POSTROUTING规则链。

mangle表包含了设置特殊数据包路由标志的规则。接这些规则接下来将在filter表中进行检查。mangle表有5个内建的链,PREOUTING规则链、OUTPUT规则链、POSTROUTING规则链、INPUT规则链、FORWARD规则链。