linux 网络防火墙
netfilter :是内核的一个frame :框架
iptables :数据报文过滤:nat mangle等规则生成工具
网络知识: IP报文首部 tcp报文首部
hdr len 报头首部长度 给出的字节需要乘以横向 32/8 = 4字节
Type of Service(服务类型) 服务类型
Total Length(总长度) 报文总长度 包括表头与内容 (Data) 部分。最大可达 65535 bytes。 注: 报文总长度 - 报文首部长度 就是data长度 里面还有 tcp 报文或者 udp报文长度 如果是应用层 还有http
Identification 段标识符 :一个ip报文 在网络, 两个物理设备支持的大小字节不一样的话, A 主机发送 1500字节,到A路由,但是路由支持500字节,所以将会将报文 分片,到B路由的话又支持1500字节,根据的就是段身份标识,如果身份id一样,就是同一个报文。
MF : more identification 更多的身份段 即更多的分包
DF : dont fragment 不允许分片,如果你的大小不跟我的一样,我还不允许分片,所以就告诉此路不通。
fragment offset 片偏移量 比如 第一个 分片是1-100 第二个101开始了
Time To Live(TTL, 存活时间) 报文不能无限在互联网上游荡,必须有限制 表示这个 IP 封包的存活时间,范围为 0-255。当这个 IP 封包通过一个路由器时, TTL 就会减一,当 TTL 为 0 时,这个封包将会被直接丢弃。说实在的,要让 IP 封包通过 255 个路由器,还挺难的再
Protocol Number(协定代码)
里面 可能有tcp首部,也可能是udp首部,二者只能选其一, 还有icmp互联网控制消息协议,不是四层 也不是三层, 是三层半, ip报文能识别其data装在的协议类型, 该段就是这个重要
来自传输层与网络层本身的其他数据都是放置在 IP 封包当中的,我们可以在 IP 表头记载这个 IP 封包内的资料是啥, 在这个字段就是记载每种数据封包的内容啦!在这个字段记载的代码与相关的封包协议名称如下所示:
IP 内的号码 |
封包协议名称(全名) |
1 |
ICMP (Internet Control Message Protocol) |
2 |
IGMP (Internet Group Management Protocol) |
3 |
GGP (Gateway-to-Gateway Protocol) |
4 |
IP (IP in IP encapsulation) |
6 |
TCP (Transmission Control Protocol) |
8 |
EGP (Exterior Gateway Protocol) |
17 |
UDP (User Datagram Protocol) |
首部校验核 存放首部校验码
?Source Address
?还用讲吗?当然是来源的 IP 地址,从这里我们也知道 IP 是 32 位喔!
?Destination Address
?有来源还需要有目标才能传送,这里就是目标的 IP 地址。
?Options (其他参数)
?这个是额外的功能,提供包括安全处理机制、路由纪录、时间戳、严格与宽松之来源路由等。
?Padding(补齐项目)
?由于 Options 的内容不一定有多大,但是我们知道 IP 每个数据都必须要是 32 bits,所以,若 Options 的数据不足 32 bits 时,则由 padding 主动补齐。
你只要知道 IP 表头里面含有: TTL, Protocol, 来源地址与目标地址也就够了!而这个 IP 表头的来源与目标 IP ,以及那个判断通过多少路由器的 TTL ,就能了解到这个 IP 将被如何传送到目的端吶。后续各小节我们将介绍 IP 的组成与范围,还有 IP 封包如何传送的机制 (路由) 等等。
要想承载应用协议,众多的上层应用协议是通过tcp报文再次封装以标识。
实际通信的是两个进程在通信,怎么评判主机间的通信呢, 靠ip看不出,对tcp 要看端口号,udp也是要看端口,所以要涉及到端口号了,端口号表示范围是0-65535。 接下去就是tcp报文的介绍。
一般linux 主机 0-1024 端口只能管理员才能使用的,其他用户都没有权限。 在bsd主机上是5000以上的的端口作为客户端去链接服务器的时候。
linux一切皆文件,所以每打开一个端口,就称为打开了一个套接字文件。
tcp====报文
?Source Port & Destination Port (来源埠口 & 目标端口)
?什么是埠口(port)?我们知道 IP 封包的传送主要是藉由 IP 地址连接两端, 但是到底这个联机的通道是连接到哪里去呢?没错!就是连接到 port 上头啦! 这个目标与来源 port 的纪录,可以说是 TCP 封包上最重要的参数了!
?Sequence Number (封包序号)
Acknowledge Number (回应序号)
tcp报文是传输控制协议,是一种可靠的协议,要三次握手,三次握手之后,每次报文传输都需要确认,一方告诉另外一方, 既发送方随机发送的号给接收方,每次 序列号在第一次的基础上加一,而确认号是接收方在序列号加一后给,发送方。
但是不能一次发一个,很慢,比如传电影,一个报文一个的发很慢, 所以就得 发一批,接收方逐个确认,那发送多少呢?这就出现滑动窗口的概念, 窗口大小 :双方用来协商 发送大小,接收大小的大小的。 如果发多了,就会导致报文被丢弃。丢弃了怎么办?我们知道 tcp 是一种可靠的协议,一旦丢弃,收不到发送发的报文,就不会有该发送方的序列号,没有序列号 接收方就不会给发送方回复确认方,所以,发送方就会重传,那重传时间是多少呢? 是有个计时器的, 发送方重传时间有个标准
由于 TCP 封包必须要带入 IP 封包当中,所以如果 TCP 数据太大时(大于 IP 封包的容许程度), 就得要进行分段。这个 Sequence Number 就是记录每个封包的序号,可以让收受端重新将 TCP 的数据组合起来。
为了确认主机端确实有收到我们 client 端所送出的封包数据,我们 client 端当然希望能够收到主机方面的响应,那就是这个 Acknowledge Number 的用途了。 当 client 端收到这个确认码时,就能够确定之前传递的封包已经被正确的收下了。
Headerlength 首部长度
reserved 保留位
八个 目前还有6个 tcp的标志位
URG 紧急指针 0 无效 1 有效
ACK 用于说明确认号是否有效
PSH 推送, 一旦 用于推送是绝对不能在缓冲中停留的,必须要立刻送到内核,需要内核优先处理的报文
RST 重置 reset 链接发生抖动时候 不多解释 对我们意义不大。如果 RST 为 1 的时候,表示联机会被马上结束,而无需等待终止确认手续。这也就是说, 这是个强制结束的联机,且发送端已断线。
SYN 发生同步请求的 建立联系的第一个请求是发送的
FIN 断开链接的发送的第一个
windows size 滑动窗口大小 上面 序列号已经介绍
?Checksum(确认检查码)
urgent pointer
option
data
对于tcp的data 有可能还有应用层的报文。
一个真正的报文 可能真正的数据量很小,
对于一个数据 前面比如是应用层的http协议,对于tcp来说 前面的都是数据,来进行封装,对于 ip报文封装时候,前面就都是数据了。 对于以太网来说,前面的就都是数据了,帧首部
这些数据如何偶要将其转换为能够通过网络发送的数据格式
有文件格式
有 二进制格式
tcp 的三次握手 四次端口 不同状态
三次握手
A 主机跟B主机
默认大家都是CLOSED状态, tcp 状态
A主机发送到 b主机请求的第一次报文就是从closed 主动打开了。 b主机接收到A 第一次的syn的请求报文就从closed 到lisetened 状态是 被动打开,
a主机第一次给b主机发送请求报文 syn=1 ack=0
b主机第一次回复给a主机的报文 由于是第一次 syn一定是1 ack加一 syn =1 ack=1
b主机发送给a主机状态就从listen变成 syn_recd
a主机接收到b主机的第一次回复的 就从主动打开状态 变成 syn_send 状态
b再次接收到a回复的即变成 established
有限状态机: 所有的tcp状态
四次断开
客户端发送报文包含 FIN断开标志
发送关闭请求的叫主动关闭方,主动关闭方 发送 fin,主动方变成 timewait1
被动关闭方从established 方 回应ack 。被动方开始进入closed wait
被动关闭方再次发送fin 给 这之间都是closedwait
主动方接受到被动方的fin之间都是timewait2 ,接受到了就回复ack 但是其不能立刻关闭, 需要等待 2倍的msl时间才能closed
被动关闭方接受到ack就变成了closed 这之间过程状态是last_ack
这些个状态叫tcp的状态转移
而这些个的状态的转移机制叫tcp的有限状态机
通过我们知道tcp的
防火墙
什么是防火墙:
规则:匹配标准
工作在主机或者网络的边缘,对进出的数据报文,按照 事先定义 好的规则中的标准进行检查,一旦触发符合定义的规则,就按照规则定义的动作进行的一系列组件。
防火墙:硬件 软件:规则(匹配标准 处理办法)
能防火是规则
防火墙是一个framwork,框架。 可以是纯粹的硬件 可以使纯粹的软件
默认规则:
全开发 :堵 古代抓人拿画像
或者全关闭:通 有令牌可以通过
规则 : 匹配标准
IP : SIP DIP
TCP: SPORT DPORT 还可以用标志位标记根据标志位匹配 比如第一次 SYN=1 ACK=0 RST=0 FIN=0 第二次握手 SYN=1 ACK=1 FIN=0 RST=0 第三次握手也就是established ACK=1 SYN=0 RST=0 FIN=0
UDP :SPORT DPORT
ICMP: icmp_type 使用报文标记, 比如 ping 网关不可达 主机不在线 请求超时 主机无法解析
根据匹配标准 对来往的报文就行过滤就是防火墙
数据报文过滤
linux 内核中实现了网络功能, 规则不能放在用户空间,所以是在内核上的,但是用户不能跟内核打交道,于是就有人选择了这样一套机制, 在tcp/ip实施的位置上,这几个位置是开放的,开放给用户空间的一个命令,这个命令缩写的规则会立即送到内核的tcp/ip
协议栈的那几个位置。
用户设计的命令 跟内核的某个位置, 这两个 叫内核的工作框架,命令叫用户管理工具,
在内核中设置了一个机制, 这个机制产生几个系统调用 这几个系统掉有某个特定的应用程序,来完成系统调用。当然不是说所有的应用程序都不能跟内核打交道。通过某些机制可以达成,比如mkdir 可以和 硬盘中内核打交道
机制
linux 2.0
参考openBSD 移植
命令 ipfw/机制firewall
linux2.2
命令 ipchain/firewall
linux 2.4
iptables/netfilter
对于2.4 而言 netfilter就是工做在内核可以方规则的位置 而iptables就是可以产生系统调用,在内核中放置规则的命令应用程序
iptales是由四个表5个链组成
所以我们过滤必须放置报文要经过的地方
首先 ip报文经过了以太网卡,解开帧,交给 tcp协议栈处理,先去看ip首部,源ip 目的ip ,是本机就送到本机,不是本机的就需要转发了, 比如我们打开本机转发功能 /proc/sys/net/ipv/ip_forward 经过本机转发的报文是不会让tcp ip协议栈转发到本机的yoghurt空间跟应用程序打交道的。
有几种流向? 3 种 流向数据包
1 从外部到达本机内部,
2 从本机内部 出去的请求
3 从外部进入进行转发 到外面
在这三个位置上 报文必须要经过某个位置
tcp/ip 协议栈有路由表,用于路由决策 只要进入到本机网卡的报文,首先都要路由决策再决定是进入到内部还是转发。
这些个位置是几个钩子函数
hocks:function 钩子函数
任何经过这些个位置的报文都要经过钩子的吊起来抽打一遍,一旦满足就执行动作。
其实还有两个位置 钩子函数 是经过入口网卡后为经过路由表决策前的更改
出口网卡出去前,在路由决策做出之后,在发送出去之前进行的更改。
路由转换时本机内部有一个net回话表
路由转换 是报文刚刚进入本机的一刹那就要改的,否则如果不改路由决策已决定,根本不用等出 取的时候来的及改的、
hock function :钩子 函数
prerouting
input
output
forward
postrouting
在每个钩子位置函数都可以放置规则,规则多了就像链一样 所以就有五个规则链
规则链 :
PREROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
filter(过滤功能): 表 这个功能的这三个链 相当于行列 就相当于表 所以命令叫iptables
INPUT
OUTPUT
FORWARD
nat (地址转换):
PREROUTING
OUTPUT 链也可以实现
POSTROUTING
其实还有两个表
mangle (把报文拆开 ,修改之后再缝上): 主要修改报文的其他首部 比如ttl值 可以在五个链上进行
PREROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
row(不做任何修改,还原成原来的):表 既不到内部 也不转发,什么也不做 只能放在两个链上
PREROUTING
OUTPUT
总结: iptales是由四个表5个链组成
如上 同一个链 可以防止不同的表,那可以,交叉使用吗?不可以,这些表的功能不一样,是不可以放的
虽然不能交叉存放,但是可以按类分别存放的。
优先次序是啥?
PREROUTING: 1 raw 2 mangle 3 nat
INPUT: 1 mangle 2 filter
OUTPUT: 1 raw 2 mangle 3 nat 4filter
FORWARD: 1 mangle 2 filter
POSTROUTING: 1 mangle 2 nat
比如500条规则
我们是否 可以给规则归类,使用自定义链 ?比如web 的类和 mysql的 类 或者ssh类
可以自定义,但是必须是默认链被调用后,自定义发送作用
比如500条太多,抽出200 比如200-400,当前面200处理完 201 条时候,跳转动作,到抽出的,如果没匹配到,就又跳回去,继续往下 走
什么样的需要精简呢?
比如只有那些访问的是web服务的独立出来,
使用自定义链也是提高效率的 只有那些同类的才可以
所以可以使用自定义链,但只能被调用时候才能发挥作用,而且如果没有自定义连的人设规则匹配,还会有返回机制。
用户可以删除自定义的空恋
默认链无法删除
每一条规则都有两个内置的计数器
一个记录 被匹配到的报文的个数
一个记录被匹配的报文大小体积之和
规则:匹配标准,处理动作
未完待续。。。。