1
2
3
4
Linux防火墙详解(一)
一、Linux防火墙简介
二、iptables的表和链
三、TCP/IP和iptables
一、Linux防火墙简介
1.iptables/netfilter:
防火墙:就是一个数据报文过滤工具
网络防火墙
主机防火墙
工作于网络或主机的比边缘(通信报文的进出口),对于进出本网络的报文根据事先定义的检查规则作匹配检测,对于匹配到规则的作出相应处理
防火墙:
硬件:需要软件的结合实现,NetScreen,CheckPoint//在硬件级别就能够实现对报文流量的分析,对常见的攻击进行处理
软件:
2.内核的基本功能:网络协议栈
1.从协议角度,看数据包流程:
2.从内核角度
进如该主机->流入,解封
从该主机出去->流出,封装各层
3.外部报文流向
1.请求进入本机://流入
进程间通信,需要向内核注册端口,内核通过查看端口映射查找该进程,然后拆掉首部信息,交给该进程处理
注册的目的:1.用于监听在某个端口
2.访问其他主机通信
2.经过我转发
目标地址不是我的,就不会到达我的用户空间
要么转发,要么丢弃
3.从本机出去的报文://流出
//流入和留出都有缓冲区,缓冲区:内存中的一段空间
//虽然网卡有全双工模式,但是流入和留出的传输速率很有可能不一致,内核有时候也很忙
//用户空间的访问控制,仅针对于特定应用有效,流入httpd的allow from和deny from
//内核可以针对用户空间的所有应用进行防护
防火墙:肯定会对系统性能有所影响
数据包流向:
报文流向:
1.流入本机:PREROUTING-->INPUT==>用户空间流程
2.留出本机:用户空间进程==>OUTPUT-->POSTROUTING
3.转发:PREROUTING-->FORWARD-->POSTROUTING
二、iptables的表和链
1.iptables/netfilter
netfilter:
hooks function :钩子函数,真正执行工作的
iptables:定义规则的,用户空间的命令行接口
钩子函数:内核的功能
netfilter:内核级别已经支持v6
iptables:主要用于v4
ip6tables //实现v6的支持
2.netfilter的五个钩子函数
PREROUTING //路由之前,进入本机前
INPUT
OUTPUT
FORWARD
POSTROUTING //路由之后,从本机出去之前
3.iptables的表和链
表:
filter:过滤,防火墙
mangle:拆解报文,按需修改,重新封装
nat:network address translation(IP层,传输层地址)
raw:关闭在nat表启用的连接追踪机制
表的优先级由高到低的顺序为:raw-->mangle-->nat-->filter
链:
iptables
内置链:
PREROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
自定义链
手动添加,需要和内置链关联,具有调用和返回机制
主链:上有调用机制
自定义链:上有返回主链的条目,假如都没有匹配的话,就返回主链
4.表和链的关系
filter:INPUT,FORWARD,OUTPUT
mangle:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING //随地都可以修改
nat:PREROUTING,OUTPUT,POSTROUTING//nat和ip相关
raw:PREROUTING,OUTPUT
RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。
一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.
RAW表可以应用在那些不需要做nat的情况下,以提高性能。
如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度。
同一链上的不同的表的规则的应用优先级(高-->低)
raw-->mangle-->nat-->filter
iptables是netfilter的实现
因为netfilter是内核的功能应该是不用启动的,默认就是随内核开启的
但是centos6:有iptables服务启用与关闭
5.规则:
组成部分:根据规则的匹配条件去匹配报文,对匹配成功的报文根据队则定义的处理动作做出处理
匹配条件:n个,与或非,默认是与
基本匹配:
扩展匹配:
处理动作:
基本处理动作:
扩展处理动作:
自定义处理动作:
匹配规则:
自上而下,逐条匹配,匹配到的话,就处理
都未能匹配,使用最后默认规则
添加规则的考量点:
1.要实现何种功能,判断添加规则至哪个表上
2.报文流经的位置;判断添加规则到哪条链上
三、TCP/IP和iptables
1.IP首部
s_ip,d_ip,version,Hdr Len[包头长度],
Identification:说明是哪一个报文的分片,有的报文太大的话,需要分片
Fragment offset:是哪个报文的第几个片段
DF:don't fragment
MF:报文不完整,需要等待其他分片合并以后才是完整的
TTL:生存周期,过一个路由-1,防止环路,一般是64,最大255=2^8
//路由器可以修改此值,防止被追踪到
Protocl:上层协议,tcp,udp,2^8
Header Checksum:首部校验和
报文:包头长度:小于64Bytes,
1480+20Bytes =1500
1460+20 = 1480 //
[20B:s_ip,D_ip,...][40B:Options][data]
IP包头
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
============================================
version(4)|包头长度(4) | TOS(8)| 总长度(16) //共32bit=4bytes || v4/v6
=============================================
标识(16) 标志(3) 片偏移(13)
=============================================
TTL(8) 协议(8) 首部校验和(16)
==============================================
Sip(32)
==============================================
DIP(32)
==============================================
选项(32) //可选
===============================================
数据
===============================================
包头长度:4(byte)*5=20bytes,带选项的4(byte)*6=24byte,不带数据
version:ipv4或者ipv6,包头长度:该部分占4个bit位,单位为32bit(4个字节)最大2^4*4(byte)=64byte,TOS:服务类型,总长度:2^16=65536bytes,,
//也即是说数据包的最大长度为65536bytes,常规的无选项的IP包头长度为20bytes,可以通过MTU计算出DATA数据字段的最大长度为1480bytes。
标识:16bit的标识字段唯一的标识主机发送的每一份数据报,由主机生成具有唯一性。通常每发送一份报文该值加1。该值在数据包分片时,会复制到每一个片中。所以在重组分片包的时候会观察该值,把该值相同的分片收集到一起重组,后面会继续讨论分片。
标志:该字段主要用来分片和重组
片偏移:
TTL:该IP数据包可以经过的路由器的最大数量 //最大2^8=256
协议:8bit的协议字段表示在IP上层承载的是什么协议。比如:0x01表示ICMP协议、0x06表示TCP协议、0x11表示UDP协议等。
首部校验和:一般不使用该字段,该字段的值以32bit为单位,不足时以0补充。
2.TCP首部:
s_port,d_port //各16bit
Sequence Number 32bits
Ack Number 32bits
端口是用来标记进程地址,ip用来标记主机地址
3.数据包流向解析
匹配PREROUTING:
raw.PREROUTING
mangle.PREROUTING
nat.PREROUTING
//逐个匹配,假如mangle的第2条匹配到了,需要打个标记,那就直接打个标记,然后接着由nat匹配,
假如有数据包从Network IN要通过iptables,数据包流向如下:
=============================================================================
1.Network IN数据包到达服务器的网络接口
2.进入raw表的 PREROUTING 链,这个链的作用是决定数据包是否被状态跟踪。
进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。
进入 nat 表的 PREROUTING 链,可以在此做DNAT(目标地址转换)
3.决定路由,查看目标地址是交给本地主机还是转发给其它主机。
4.到这里分两种情况,一种情况是数据包要转发给其它主机(一般情况下它是在担任网关服务器),数据包会依次经过:
路径一:
5.进入 mangle 表的 FORWARD 链,
进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。
6.进入 mangle 表的 POSTROUTING 链
进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT (源地址转换)
7.数据包流出网络接口,发往network out。
路径二:
8.另一种情况,数据包的目标地址就是发给本地主机的,它会依次穿过:
9.进入 mangle 表的 INPUT 链,
进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,数据包交给本地主机的应用程序进行处理。
10.应用程序处理完毕后发送的数据包进行路由发送决定。
11.进入 raw 表的 OUTPUT 链。
进入 mangle 表的 OUTPUT 链,
进入 nat 表的 OUTPUT 链,
进入 filter 表的 OUTPUT 链。
12.进入 mangle 表的 POSTROUTING 链,
进入 nat 表的 POSTROUTING 链。
13.进入出去的网络接口,发送往network out。
本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/2046884,如需转载请自行联系原作者