Linux内核project导论——网络:Netfilter概览
简单介绍
最早的内核包过滤机制是ipfwadm。后来是ipchains。再后来就是iptables/netfilter了。
再往后,也就是如今是nftables。
只是nftables与iptables还处于争雄阶段,谁能胜出眼下还没有定论。可是他们都属于netfilter项目的子成员。
钩子
netfilter基于钩子,在内核网络协议栈的几个固定的位置由netfilter的钩子。
我们知道数据包有两种流向,一种是给本机的:驱动接收——》路由表——》本机协议栈——》驱动发送。一种是要转发给别人的:驱动接收——》路由表——》转发——》驱动发送。
针对这几个关键位置,netfilter定义了几个钩子:NF_IP_PRE_ROUTING是在查路由表之前,NF_IP_LOCAL_IN实在查完路由表决定发送本机之后,NF_IP_FORWARD实在查完路由表决定转发的时候。NF_IP_POST_ROUTING是要交给驱动发送之前。NF_IP_LOCAL_OUT是本机产生的数据交给驱动发送之前。通过在这几个钩子位置注冊函数。截断数据包的流动。能够完毕数据包的过滤和转换功能。要知道的是,转发功能一般仅仅在路由器上打开。一般的PC假设发现不是自己的数据包就会直接选择丢弃。所以。普通PC能够使用的钩子有NF_IP_PRE_ROUTING、NF_IP_LOCAL_IN、NF_IP_LOCAL_OUT、NF_IP_POST_ROUTING四个。
能够看到都是在IP层的钩子,然而,这些钩子可不仅仅仅能够处理IP层的数据,由于在IP层能够拿到完整的数据包,所以你想处理哪一层都是能够的。
iptables不是注冊在钩子函数上,可是位置是一致的。是netfilter框架下的一个附属的功能。由table、chain、rule组成。
netfilter提供了几个重要的功能,方便不管是iptables还是nftables使用。caching功能能够有一个缓存,通过查询数据包的某个位置能够决定该数据包根本不会经过后面的过滤规则。
用户空间使用iptables
table、chain和rule
chain和rule是iptables自创的概念,我们知道在钩子函数的地方能够运行指定的函数调用。
iptables系统就默认实现了几个调用,而且用统一的数据结构来组织这个调用的形式。这个组织结构就是table、chain和rule。
在不论什么一个hook点,都能够定义多个table,一个table有多个chain。每一个chain中能够定义多个rule。要记住的是table和chain仅仅是容器,里面的rule才是真正发挥作用的规则。
理论上我们能够在不论什么一个hook点做过滤、nat、改动数据包等全部操作。可是iptables为了统一架构起见。在各个hook点定义了顺序的几个table,每一个table用来完毕一类的工作。
提前定义的table包含:filter、nat和mangle。这每一个table表示的是功能,并非表示位置,一个table内部有多个chain。当中每一个chain位于特定的位置。
下图是一个内部已经定义的table、chain关系图表:
https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg
FILTER: PREROUTING, FORWARD, POSTROUTING
NAT: PREROUTING, INPUT, OUTPUT, POSTROUTING
MANGLE: PREROUTING, INPUT, FORWARD, OUTPUT,POSTROUTING
能够看到,提前定义的3个表表示3种不同的功能。每一个表都在一些hook点定义了一组chain。如此,当一个用户想要在某一个hook点做某一件事情。就能够定位到table(功能)——》chain(位置)——rule(行为)来完毕数据包操作。
每一条rule的格式都是同样的,包含源IP地址、目的IP地址、上层协议、接口、操作(target)。可是并非每一个域对于每一个chain都是可用的。比如在INPUT的地方匹配输出接口就是永远匹配不到的。所以有效的rule在不同的chain上是不同的。
iptables是个可扩展的软件,其对TCP、UDP等经常使用协议的支持都是通过扩展,iptables本体仅仅支持到ip层,你仅仅要使用相应的选项就会自己主动的使用扩展。另一些不是协议的扩展,这些扩展一般通过iptables –m 调用,比如iptables –m mac能够用来匹配mac地址。-m limit能够用来限制每秒钟匹配的数目,超过的就放行。这些扩展包含:
l xt_mac.ko:匹配mac地址
l xt_limit.ko:限制每秒钟匹配的数目,超过的就放行
l xt_owner.ko:用来匹配某个某个进程或用户创建的数据包
l xt_state.ko:用来匹配处于某个连接状态的数据包(比如NEW、ESTABLLISHED、RELATED)
l xt_pkttype.ko:用来依据多播、广播还是单播来匹配包
l xt_quota.ko:能够为一个rule设置quota。当quota达到后。改rule失效
l xt_recent.ko:同意你设置一个IP列表。兴许的IP列表的用户都不生效
l xt_string.ko:同意你匹配数据包中的一个字符串
l xt_time.ko:同意你依据数据包的到达和离去时间进行匹配
l xt_u32.ko:通过匹配检查数据包的某4位是否与要求的一致来进行操作
还有非常多target的扩展和conntrack的扩展、ipv6的扩展。能够依据应用的类型进行匹配,能够改动ttl、TOS等数据位。基本能用得上的功能都有相应的扩展。
操作(target)也是能够扩展的。常见的默认的操作有ACCEPT和DROP。扩展的还有LOG、REJECT等。用户还能够自己实现。还有两种默认是QUEUE和RETURN,RETURN实现了各个规则之间的函数式调用。QUEUE则实现了数据包的排队。这些操作也都相应着详细的模块:nft_queue.ko、nft_reject.ko、xt_LOG.ko、nft_log.ko等。
bpf
用户空间不止能够加入规则,还能够加入代码。
这是通过xt_bpf模块实现的。iptables –m bpf –bytecode 后面跟详细的code就好了,从汇编编译成code的程序再linux内核的tool/net下有。
内核模块使用netfilter
不可是用户空间能够给iptables加入规则,内核模块加入规则的能力更强大。由于其具备编码能力,所以不仅仅是能够丢弃一个数据包,还能够返回NF_STOLEN,这样这个数据包对于协议栈来说将会停止向上发送。而这个模块将会处理这个数据包的兴许流程。
应该注意的是。netfilter这个名字指的是内核过滤数据包这个架构,而iptables则是table、chain、rule这套设计。内核里面一般直接使用netfilter的钩子。而不使用iptables的规则。
Linux内核project导论——网络:Netfilter概览的更多相关文章
- Linux内核project导论——网络:Filter(LSF、BPF、eBPF)
概览 LSF(Linux socket filter)起源于BPF(Berkeley Packet Filter).基础从架构一致.但使用更简单.LSF内部的BPF最早是cBPF(classic).后 ...
- Linux内核project导论——网络:路由:路由原理
总览 路由表 IP层通过路由将数据包送达该送达的目的地址,这就要求在整个网络中建立正确的路由表.路由表的内容是记录要到达哪里下一跳须要发到哪里(能够是port能够是ip),如此整个网络在单个节点仅仅知 ...
- 使用socket BPF/Linux内核工程导论——网络:Filter(LSF、BPF、eBPF)
使用socket BPF linux 下的 包过滤器 BPF Linux内核工程导论——网络:Filter(LSF.BPF.eBPF) 注意(文中描述的内容): 此外,这段BPF代码还存在的一个问题是 ...
- Linux内核project导论——linux学习和职业曲线(刚開始学习的人,中级,高级都可參考)
Linux世界介绍 给自己定级 门外汉: 不会安装操作系统 不会用虚拟机(安装和使用) 入门级: 熟悉常见的发行版,甚至装过而且能用一些特殊发行版(比如kali)做过一些简单的图形界面的使用. 会一些 ...
- Linux内核project导论——前言
想要研究linux内核.使用linux内核,首先要知道linux内核能做到什么,提供了什么.我看过非常多刚開始学习的人一进入公司就開始使用linux内核开发内核模块.使用的不管是通信方式.内存接口还是 ...
- route-显示并设置Linux内核中的网络路由表
route命令 网络配置 route命令用来显示并设置Linux内核中的网络路由表,route命令设置的路由主要是静态路由.要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两 ...
- route---设置Linux内核中的网络路由表
route命令用来显示并设置Linux内核中的网络路由表,route命令设置的路由主要是静态路由.要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现. 在L ...
- ubuntu最近升级到最新的linux内核后,网络无法使用怎么办?
答:进入旧的内核中编译需要的网卡模块 1. 启动旧的内核进入系统 2. 安装新内核源码 3. 找出当前的网卡型号 4. 尝试卸载某个与网卡相关的内核模块,观察是否影响当前网卡的使用,如果有影响,那么便 ...
- Linux内核的整体架构
Linux内核的整体架构 作者:蜗蜗 发布于:2014-2-21 13:23 分类:Linux内核分析 原文:http://www.wowotech.net/linux_kenrel/11.html ...
随机推荐
- Android之UtilsRequesServicetHelp工具类
package com.example.getnetutil; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; ...
- vim分屏功能
转载,来自http://coolshell.cn/articles/1679.html 本篇文章主要教你如何使用 Vim 分屏功能. 分屏启动Vim 使用大写的O参数来垂直分屏. vim -On fi ...
- python spark 求解最大 最小 平均 中位数
rating_data_raw = sc.textFile("%s/ml-100k/u.data" % PATH) print rating_data_raw.first() nu ...
- CodeForces 651C
Description Watchmen are in a danger and Doctor Manhattan together with his friend Daniel Dreiberg s ...
- 饭卡(hdoj--2546--背包)
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- Node.js:Buffer
ylbtech-Node.js:Buffer 1.返回顶部 1. Node.js Buffer(缓冲区) JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文 ...
- 转载【梦想天空(山边小溪)】Web 开发人员和设计师必读文章推荐【系列二十九】
博客地址:http://www.cnblogs.com/lhb25/p/must-read-links-for-web-designers-and-developers-volume-29.html
- 在YII2中使用redis
一.安装YII2的redis扩展 composer require --prefer-dist yiisoft/yii2-redis 二. 配置basic/config/web.php 在compon ...
- ACM_____不再爱你……
不再爱你…… 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在有一个圆柱形水杯,里面装满了水,在它的底部有一个小洞,通过一些简单的物理知识我们可以知道: 1.由于重力 ...
- caffe学习笔记--跑个SampleCode
Caffe默认情况会安装在CAFFERROOT,就是解压到那个目录,例如: home/username/caffe-master, 所以下面的工作,默认已经切换到了该工作目录.下面的工作主要是,用于测 ...