iptables/netfilter:工作在linux内核中的网络防火墙,是一组工具。
netfilter:正真起作用的是netfilter,它是一个框架;
iptanles:是生成防火墙规则,并且将其附加在netfilter上真正实现数据报文过滤、nat、mangle等规则生成的工具。
1、一些网络知识:
ip报文首部,Tcp报文首部
事实上,网络防火墙的主要功能是根据报文首部实现的。
(1)ip报文首部:
0:版本号(4),IP首部大小[结果*4](4),服务类型(8),总长度=IP首部+数据[tcp首部](16)
4:段标识[用于分段标识](16),R(1),DF:不允许分片(1),MF:更多分片(1),段偏移量:分片拼接(13)
8:TTL:每经过一个路由-1,为0还没有到达目的地就抛弃(8),协议:TCP,UDP,TCMP等(8),首部校验码(16)
12:源IP
16:目的IP
20:options,可变长度的可选数据
24:数据
ICMP:互联网控制消息协议
是三层半协议,根据IP报文实现数据报文的发送,但不是能实现报文控制的协议
是传输网路控制的协议。
IP报文实现了将一个数据报文发往目标主机,但是真正通信的是两个主机上的进程是哪两个进程呢?
对于TCP,UDP协议可以根据端口号标记
端口号:[0-65535],一般在linux主机上0-1023管理员使用
在BSD上>5000的端口才允许用户使用
对linux来说一切皆文件,每打开一个端口就称打开一个套接字文件
所以众多的应用协议都是基于TCP,UDP协议,来完成再次封装,以标记两个进程的
(2)TCP报文首部:
0:源端口(16),目标端口(16)
4:序列号[sequence Number](32)
TCP是有状态的协议,需要三次握手,四次断开,每一次报文的传输都需要对方确认
发送方告诉接收方所发送陪的编号,第一次的随机的,以后每一次都加1。
8:确认号[Acknowledgement Number](32)
把对方的序列号加1,并回送给对方。
一次传一批,依次确认,一次发多少个呢?
滑动窗口的窗口大小是双方用来协商发送缓冲和接收缓冲的大小的。
12:首部长度(4),保留:现在有两个已经使用(6),下面6个:是否有效[1为有效]:
URG紧急指针(1),ACK确认号(1),PSH推送[立即送给内核](1),RST重置(1),SYN同步请求(1),FIN断开链接(1)
窗口大小(16)
16:TCP校检和(16),紧急指针(16)
20:options,可变长度的可选数据
24:数据
例如一个http报文:
要发送一个http报文,有很多的开销:帧首部,IP首部,TCP首部,http首部,数据
这些数据都要转换为能够通过网络发送的数据格式:文本,二进制,最后都是转换成0和1
TCP:有限状态机
(3)TCP的三次连接:
A(client)----> B(server) 发出请求:
初始状态 1次 2次 3次
A(client):closed 主动打开 SYN_SEND ESTABLISHED
B(sever) :closed 被动打开(Listen) SYN_RCVD ESTABLISHED
(4)TCP四次断开
初始状态
A(主动关闭):ESTABLISHED FIN_TIME1 FIN_TIME2 TIME_WAIT(等待MSL*2) COLSED
B(被动关闭):ESTABLISHED CLOSE_WAIT LAST_ACK CLOSED
MSL:报文段的最大生存时间,一般120秒
2、iptables基础原理
(1)网络防火墙(主机防火墙):
工作在主机or网络边缘,对于数据报文进行检查,监控,并根据事先规定的规则进行处理。
是一个组件,可能是硬件,也可以是软件。
规则:真正实现防火功能的是规则,由匹配标准和处理办法组成
默认规则:一般采用关闭(通),另一种为开放(堵)。
简单说,防火墙就是数据报文过滤。
Linux内核实现了网络功能,但是防火墙规则应该写到内核,但又不能直接和内核打交道,那该怎么办呢?
于是,就有人在TCP/IP协议栈上(就是实现TCP/IP模块上) ,选择几个开放的位置,只开放给用户空间的一个命令
实现了,用户空间的命令操作内核(特殊的系统调用)。
早期linux上没有防火墙的,是参考OpenBSD移植过来的。
Linux2.0:ipfw/firewall
Linux2.2:ipchain/firewall
Linux2.4:iptables/netfilter
(2)5个钩子函数,四个表,五个链
数据报文到达网卡时将其拆分,根据ip判断是发往自己的还是发往其他主机的。
如果发往自己就发到自己的用户空间所谓某个进程
如果是发往其他主机的,查看/proc/sys/net/ipv4/ip_forward是否为1,为1是可以转发。
那是谁来判断决策数据报文的流向呢?
根据分析目标IP和路由表来完成路由决策
路由决策发生在,一个数据报文被网卡接收以后,送到TCP/IP协议栈上的那一刻。
数据报文有三种流向:
1.从外面进来的:流向主机内部 #input函数 ,图中1号
2.从里面出去的:从主机内部流出 #output函数, 图中2号
3.转发的:A-->B经过,B-->A经过 #forward函数,图中3号
这3个位置:是netfilter的设计者补充在TCP/IP协议栈上的3个钩子函数(hook function)
任何一个报文经过的时候把报文勾起来进程查看收否符合规则。
还有2个位置:两个特殊的钩子函数
做地址转换(NAT):私有的IP不可以上网,公网IP才可以上网
公网地址有限,可以申请一个公网地址供多个私有IP主机上网
把私有IP主机的网关指向这个公网地址,然后通过转换地址就可以上网
做nat的主机有一个nat会话表,记录转化过程
有两种转换类型:
目标地址转换:PREROUTING函数, 图中4号
源地址转换: POSTROUTING函数, 图中5号
**********************************************************
5个钩子函数:prerouting,input,output,foreard,postrouting
5个规则链:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING
4个表:
filter[过滤]:INPUT,OUTPUT,FORWARD
NAT[地址转换]:PREROUTING,POSTROUTING,OUTPUT
mangle[拆开,修改,封装]:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING
raw[不改变原状]:PREROUNTING,OUTPUT
优先级:
PREROUTING:raw,mangle,nat
IUPUT:mangle,filter
OUTPUT:raw,mangle,nat,filter
FORWARD:mangle,filter
POSTROUTING:mangle,nat
**********************************************************
能否使用自定义链?
可以使用自定义链,但只在被调用时才能发挥作用,
且如果没有定义链中的任何规则匹配,还应该有返回机制。
用户可以删除自定义的空链
默认链无法删除
3.规则:匹配标准 + 处理办法
(1)原则:
从上到下匹配,匹配到就停止。
规则越少越好,效率高。
当规则有联系的时候,小范围的在上面
当规则没有联系的时候,大范围的在上面
同一链,不同功能不可以交叉存放规则,必须按类存放
(2) 计数器:每个规则都有两个内置的计数器:
1.被匹配的报文个数
2.被匹配的报文大小之和
(3)匹配标准:
IP:SIP(源IP),DIP(目标IP)
TCP:SPORT(源端口),DPORT(目标端口),还可可以根据标志位匹配:
如:tcp第一次握手:SYN=1,FIN=0,RST=0,ACK=0
tcp第二次握手:SYN=1,FIN=0,RST=0,ACK=1
tcp第三次握手:SYN=0,FIN=0,RST=0,ACK=1(ESTABLISHED)
UCP:SPORT(源端口),DPORT(目标端口)
ICMP:icmp-type(ICMP报文类型)
使用报文来标记,有多种控制消息报文,每种报文的格式不一样
如:ping的时候,网关不可达,请求超时,主机不在线,主机名称不可解析等,报文类型的区别
匹配标准分类:
通用匹配:自身能完成的匹配
扩展匹配:需要依赖模块完成的匹配
隐式扩展:不用特别指明由哪个模块进行的扩展,此时使用-p{tcp|udp|icmp}
显示扩展:必须指明由哪个模块进行的扩展,在iptables中使用-n选项可完成此功能
(4)处理办法
ACCEPT:放行
DROP: 丢弃
REJECT:拒绝
DNAT: 目标地址转换
SNAT: 源地址转换
REDIRECT:
MASQUERADE:
MASK: 打标记