本文共 5454 字,大约阅读时间需要 18 分钟。
iptables系列之基础原理
linux:网络防火墙 netfilter:frame 框架 网络过滤器 iptables:数据报文过滤,NAT,mangle等规则生成的工具。网络知识: IP报文首部 tcp报文首部 ip:tcp:httpIP报文首部: 版本号4 头部长度4 服务类型8 总长度16 段标识符16 R1 DF1 MF1 片偏移13 TTL8 协议8 首部校验和 源ip32 目的ip32 可选 数据分段和重组DF:don't fragment MF:more fragment片偏移:8的整数倍协议:封装的报文的协议icmp:3层协议直接使用IP udp 17 tcp 69 端口号:0--65535 0---1023 系统 >=5000用户 tcp:有状态的协议,三次握手TCP首部 源端口16 目的端口16 序列号32 确认号32头部长度4 R6 URG1 ACK1 PSH1 RST1 SYN1 FIN1 窗口大小16 校验和16 紧急指针 选项 数据 注意:数据的流向序列号:发送方告诉接受方发送的数据的编号确认号:接受方期望接受下一个序列的第一个序号。流控:滑动窗口。重传;计时器URG:紧急指针是否有效ACK:说明确认号是否有效PSH:推送,要优先处理的数据RST:重置 SYN:同步请求,建立连接 FIN:断开连接转换为能够通过网络发送的数据格式 文本 二进制 TCP的三次握手 TCP的四次断开被动打开:closed---->listen 主动打开:closed---->syn_sent listen--->SYN_RCVD---->established closed---->syn_sent---->established
TCP的状态转移:主动关闭方:established--->fin-wait-1----->fin-wait-2---->time-wait---->closed 被动关闭方:established---->closed-wait---->last-ack------>closed 2MSL:最长报文段寿命 fin-wait-1---->closing--->time-wait--->closed
工作在主机或网络的边缘,对进出主机或网络的数据报进行检查与监控,并且根据事先定义的规则,匹配其规则,采取定义的处理的动作进行操作的组件。
防火墙:硬件,软件,规则(匹配标准,处理办法)framework:框架 (不防家贼)默认规则: 开放:堵 关闭:通 服务器:默认允许已知,拒绝未知 规则:匹配标准 IP:源ip,目标ip TCP/UDP:sport,DPORT,URS,ACK,PSH,RST,SYN,FIN ICMP:icmp-type 控制消息报文协议 报文类型 数据报文过滤: 网络功能:是内核空间实现的
内核中为用户空间中命令预留一些空间
在内核中TCP/IP的模块上开放一些位置,只是开放给用户空间可以编写防火墙规则的命令。可以实现用户中的命令可以直接操控内核空间的。 内核中的工作框架,用户空间中的管理工具。 syscall:可以和内核直接打交道。linux2.0 ipfw/firewall linux2.2 ipchain/netfilter,firewall linux2.4 iptables(用户空间中可以写规则的用户空间中的应用,规则生成器)/netfilter(内核中可以放置的空间)
内核中netfilter TCP/IP模块网卡(拆帧)--->IP---本机->进程---> |----->转发--->网卡IP---->网卡--->用户
1.从外面进入主机内部到达进程
2.本机内部出去的报文 3.通过主机进行转发的路由决策发生在数据包文件被网卡接受后进入主机后,进入TCP/IP协议栈模块时进行路由决策。
上述的三个位置是内核空间让iptables在内核空间中放置规则的地方。
进,出,转发
/proc/sys/net/ipv4/ip_forward -s 0.0.0.0 -d 172.16.100.7 reject
hook function:钩子函数
netfilter设计者放在TCP/IP上的钩子函数。自上而下,挨个检查,匹配前一个了,就不检查下面的了。
若两条规则不相关,就将范围大的规则放在上面,匹配的可能性大。(http访问频繁的放在上面。) 若两条规则相关,则将范围小的规则放在上面,防止规则覆盖与疏漏。
hook function:5个
路由之前的位置 报文在即将转发之前的位置 做地址转换的通俗的说,netfilter的架构就是在整个网络流程的若干位置放置了一些检测点(HOOK),而在每个检测点上登记了一些处理函数进行处理(如包过滤,NAT等,甚至可以是 用户自定义的功能)。
[1]:NF_IP_PRE_ROUTING:刚刚进入网络层的数据包通过此点(刚刚进行完版本号,校验和等检测), 目的地址转换在此点进行;[2]:NF_IP_LOCAL_IN:经路由查找后,送往本机的通过此检查点,INPUT包过滤在此点进行;[3]:NF_IP_FORWARD:要转发的包通过此检测点,FORWARD包过滤在此点进行;[4]:NF_IP_POST_ROUTING:所有马上便要通过网络设备出去的包通过此检测点,内置的源地址转换功能(包括地址伪装)在此点进行;[5]:NF_IP_LOCAL_OUT:本机进程发出的包通过此检测点,OUTPUT包过滤在此点进行。
netfilter
是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。
框架
netfilter提供了一个抽象、通用化的框架[1],作为中间件,为每种网络协议(IPv4、IPv6等)定义一套钩子函数。Ipv4定义了5个钩子函数,这些钩子函数在数据报流过协议栈的5个关键点被调用,也就是说,IPv4协议栈上定义了5个“允许垂钓点”。在每一个“垂钓点”,都可以让netfilter放置一个“鱼钩”,把经过的网络包(Packet)钓上来,与相应的规则链进行比较,并根据审查的结果,决定包的下一步命运,即是被原封不动地放回IPv4协议栈,继续向上层递交;还是经过一些修改,再放回网络;或者干脆丢弃掉。
NAT
:network address transfer
sip:172.16.100.6 dip:100.2.2.1------>sip:12.1.1.6 dip:100.2.2.1 数据报文出去修改地址 源地址转换 返回的响应的报文: sip:100.2.2.1 dip:12.1.1.6 ----->sip:100.2.2.1 dip:172.16.100.6 目标地址转换注意:主机内部维护着一张地址映射表。源地址转换是在报文即将离开网卡的时候修改源地址。目标地址转换是在报文刚刚进入网卡的时候修改目标地址。SNAT:DNAT:NAT静态转换动态转换 端口多路复用(PAT)ALG(Application Level Gateway),即应用程序级网关技术
prerouting input output forward postrouting
PREROUTING INPUT OUTPUT FORWARD POSTROUTING
INPUT OUTPUT FORWARD
PREROUTING OUTPUT POSTROUTING
PREROUTING INPUT OUTPUT FORWARD POSTROUTING raw(): PREROUTING OUTPUT 注意:不同功能的不能放在一起。 iptables:
raw:PREROUTING mangle:PREROTINGnat:PREROUTING -------| \|/ |-------- 路由选择--------------| \|/ \|/ magle:INPUT mangle:FORWARDfilter:INPUT filter:FORWARD \|/ | 路由选择 | \|/ |raw: OUTPUT | mangle:OUTPUT |nat:OUTPUT | filter:OUTPUT | | | | | |-------> mangle:POSTROUTING <---| nat: POSTROUTING
四个表五个链 表:raw,mangle,nat,filter 链:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING itables: 可以使用自定义链: 一个钩子函数hook function就是一个链。自定义链只有被默认链调用才可以使用。
自定义链是为了精简链,调高链的效率。可以使用自定义链,但是在被调用是才能发挥作用,而且如果没有自定义链中任何规则匹配,还应该有返回机制: 用户可以删除自定义空链 不可以删除默认链 每条规则都有两个内置计算器 被匹配到的报文个数。 被匹配的报文大小之和。
iptables [-t table] subcommand CHAIN [num] 匹配标准 -j 处理办法匹配标准: 通用匹配 扩展匹配(使用扩展模块,依赖于模块进行匹配) 隐含扩展:不用特别指明由哪个模块进行的扩展,因为此时使用-p {tcp|udp|icmp} 显示扩展:必须指明由哪个模块进行的扩展,在iptables中使用-m选项可完成此功能。 匹配标准: 通用匹配: -s,--src :指定源地址 -d,--dst :指定目标地址 -p {tcp|udp|icmp}:指定协议 -i interface:指定数据报文流入的接口 可用于定义标准的链:PREROUTING,INPUT,FORWARD -o interface:指定数据报文流出的接口 可用于定义标准的链:OUTPUT,POSTROUTING,FORWARD -j 处理办法 -j 跳转 -j TARGET ACCEPT :接受 DROP :默默丢弃 REJECT :拒绝并通知 iptables -t filter -A INPUT -s 172.160.0.0/16 -d 172.16.100.7 -j DROP
转载地址:http://mzbcl.baihongyu.com/