转载自:http://blog.chinaunix.net/uid-23069658-id-3160506.html

http://blog.chinaunix.net/uid-23069658-id-3243434.html

https://blog.csdn.net/jasonchen_gbd/article/details/44873089

https://blog.csdn.net/fangxin205/article/details/54972153

1.网络通信的基本模型

  数据在协议栈的发送过程中,发送方从上至下依次是“加头”的过程,每到达一层数据就被会加上该层的头部;与此同时,接受方就是个“剥头”的过程,从网卡收上包来之后,在往协议栈的上层传递过程中依次剥去每层的头部,最终到达用户那儿的就是裸数据了

2.Netfilter概念

1)Netfilter 是Linux内核中在网络层进行控制和修改网络数据包的实现框架,常用来数据包过滤、地址转换(NAT)、连接跟踪等

2)Netfilter 定义了一系列hook点,每个hook点上可以挂载多个hook函数,hook函数中可以实现对数据包内容修改、过滤数据包等功能

3)所有的hook点都放在一个全局的二维数组,第一维为协议族编号,第二维为该协议族下的hook点个数

  如IPv4协议(编号为2)下的5个hook点

PRE_ROUTING:     nf_hooks[2][0]

LOCAL_IN:           nf_hooks[2][1]

FORWARD:            nf_hooks[2][2]

LOCAL_OUT:         nf_hooks[2][3]

POST_ROUTING:  nf_hooks[2][4]

4)每个hook点上的hook函数会按照优先级顺序注册到一个链表中,注册的接口为nf_register_hook()

5)hook函数返回值的说明:

NF_ACCEPT: 接受分组,使之穿过网络实现中剩余的协议层(或该hook点上后续的hook函数)。
NF_STOLEN:挂钩函数窃取了一个分组,并处理了该分组,此时,该分组已与内核无关,不必再调用其他挂钩,还必须取消其他协议层的处理。
NF_DROP::丢弃分组,其中的数据可以释放了。
NF_QUEUE:将分组置于一个等待队列上,以便其数据可以由用户空间代码处理。不会执行其他hook函数
NF_REPEAT:再次调用该hook函数。

6)一个数据包按顺序经过hook点,到达一个hook点后,会检查该hook点是否注册了用于处理数据包的hook函数,如果有,则挨个去调用链表上的hook函数,根据返回到Netfilter框架中的值来进一步决定该如何处理该数据包

3.Netfilter在内核中的位置

4.IPv4下的五个hook点

  数据报从进入系统,进行IP校验以后,首先经过第一个HOOK点NF_IP_PRE_ROUTING进行处理;然后就进入路由代码,其决定该数据报是需要转发还是发给本机的;若该数据报是发被本机的,则该数据经过HOOK点NF_IP_LOCAL_IN处理以后然后传递给上层协议;若该数据报应该被转发则它被NF_IP_FORWARD处理;经过转发的数据报经过最后一个HOOK函数NF_IP_POST_ROUTING处理以后,再传输到网络上。本地产生的数据包经过HOOK点NF_IP_LOCAL_OUT 处理后,进行路由选择处理,然后经过NF_IP_POST_ROUTING处理后发送出去。

简单的说:

1)对于发往本地的数据包,会依次经过NF_INET_PRE_ROUTING和NF_INET_LOCAL_IN两个hook点的处理

2)对于本地向外发出去的数据包,会依次经过NF_INET_LOCAL_OUT和NF_INET_POST_ROUTING两个hook点的处理

3)对于通过本机转发的数据包,会依次经过F_INET_PRE_ROUTING、NF_INET_FORWARD和NF_INET_POST_ROUTING三个hook点的处理

5.iptables命令

1)iptables的主要功能是实现系统对网络数据包的进出和转发

2)iptables用5张不同的表来存放iptables规则:

  filter表:对数据包进行过滤

  nat表:对数据包进行地址转换

  mangle表:主要用来修改数据包

  raw表:高级功能,如:设置raw时一般是为了不再让iptables做数据包的跟踪连接处理,提高性能https://blog.csdn.net/qk1992919/article/details/51149043

  security表:centos系统中有,用于实现强制访问控制安全模型

4个表的优先级由高到低的顺序:raw-->mangle-->nat-->filter

3)iptables有5条规则链(5个hook点):

  INPUT链:处理输入数据包

  OUTPUT链:处理输出数据包

  FORWARD链:处理转发数据包

  PREROUTING链:用于目的地址转换(DNAT)

  POSTOUTING链:用于源地址转换(SNAT)

PREROUTING链上即有mangle表,也有nat表,那么先由mangle处理,然后由nat表处理,其余链也是如此

4)iptables规则的动作包括:

  ACCEPT:接收数据包

  DROP:丢弃数据包

  SNAT:源地址转换

  DNAT:目的地址转换

  MASQUERADE:ip地址伪装,算是SNAT中的一种特例,有着和SNAT相近的效果,可以实现自动化的SNAT

  REDIRECT:重定向、映射、透明代理

  LOG:日志记录

5)下图是IPv4协议中iptables在每个hook点上默认注册好注册的hook函数,这些hook函数会去遍历这些表中的iptables规则,并根据这些规则去处理数据包:

6)下图这些默认注册好的hook函数对应的iptables表:

7)iptables指令参数:

. --proto -p proto protocol: by number or name, eg. `tcp'
. --source -s address[/mask][...]. Source specification
. --destination -d address[/mask][...]. Destination specification
. --in-interface -i input name[+]. Network interface name ([+] for wildcard)
. --jump -j target. Target for rule (may load target extension)
. --goto -g chain. Jump to chain with no return
. --match -m match extended match (may load extension)
. --numeric -n numeric output of addresses and ports
. --out-interface -o output name[+]network interface name ([+] for wildcard)
. --table -t table table to manipulate (default: `filter')
. --verbose -v verbose mode
. --line-numbers print line numbers when listing
. --exact -x expand numbers (display exact values)
. --fragment -f match second or further fragments only
. --modprobe= try to insert modules using this command
. --set-counters PKTS BYTES set the counter during insert/append
. --version -V print package version.

8)指令举例:

//在filter表的INPUT链上添加一条规则:将源地址为192.168.100.122的icmp请求包丢弃(禁止别人ping我)
iptables -t filter -A INPUT -p icmp --icmp-type echo-request -s 192.168.100.122 -j DROP
//在filter表的INPUT链上删除这条规则
iptables -t filter -D INPUT -p icmp --icmp-type echo-request -s 192.168.100.122 -j DROP
//在filter表的OUTPUT链上添加一条规则:将目的地址为114.114.114.114的icmp请求包丢弃(禁止我ping别人)
iptables -t filter -A OUTPUT -p icmp --icmp-type echo-request -d 114.114.114.114 -j DROP
//在filter表的INPUT链上删除这条规则
iptables -t filter -D OUTPUT -p icmp --icmp-type echo-request -d 114.114.114.114 -j DROP
//在filter表的FORWARD链上添加一条规则:将源地址为192.168.100.100的数据包丢弃不转发
iptables -t filter -A FORWARD -s 192.168.100.100 -j DROP

6.iptables命令中的SNAT、DNAT和MASQUERADE

6.1SNAT

1)SNAT(source network address translation),即源地址转换。举例来说,多个用户连接路由器上网,每个用户都配置了内网IP,用户访问外网时,用户将数据包发给路由器,路由器将数据包的报头中的源地址(用户的内网ip)替换成路由器的ip,再将数据包转发给下一跳;下一跳收到数据包时,查看数据包的源地址将是路由器的ip地址,而不是用户的ip地址

2)指令举例:

//把所有10.8.0.0网段的数据包的源地址改成192.168.5.3,再由eth0口发出
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3
////把所有10.8.0.0网段的数据包的源地址改成192.168.5.3或192.168.5.4或192.168.5.5,再由eth0口发出
iptables -t nat -A POSTROUTING -s -192.168.5.5

6.2DNAT

1)DNAT(destination network address translation),即目的地址转换。举例来说,有个web服务器放在内网配置内网ip,前端有个防火墙配置公网ip,用户使用公网ip来访问这个网站,当访问的时候,用户发出一个数据包,这个数据包的目的地址是公网ip,所以这个数据包会发送到防火墙,防火墙收到数据包会把数据包的报头里的目的地址改成web服务器的内网ip,然后再把这个数据包发送到内网的web服务器上

2)指令举例:

//更改所有从eth0口进来的源地址为192.168.1.0/24的数据包的目的地址为1.2.3.4
iptables -t nat -A PREROUTING -s  -i eth0 -j DNAT --to 1.2.3.4

6.3MASQUERADE

1)MASQUERADE,ip地址伪装,算是SNAT中的一种特例,有着和SNAT相近的效果,可以实现自动化的SNAT

2)使用SNAT的时候,出口的ip地址可以是一个,也可以是一个范围,但是不管是几个,都必须明确的写出出口的ip;当系统采用动态拨号方式上网时,出口的ip时常发生变化,这个时候就使用MASQUERADE,自动地获取当前出口的ip来做nat

3)指令举例:

//把所有10.8.0.0网段的数据包的源地址动态地改成出口的ip
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE

netfilter框架和iptables的更多相关文章

  1. IPTables 和 Netfilter 框架

    前言 防火墙是保护服务器的重要工具. Linux中最常用的基本防火墙软件是iptables.iptables通过与Linux内核网络堆栈(networking stack)中的包过滤钩子(packet ...

  2. Linux Netfilter框架分析

    目录 Netfilter框架 Netfilter的5个hook点 netfilter协议栈数据流分析 连接跟踪conntrack conntrack连接跟踪表条目 连接跟踪表大小 管理连接跟踪表 ip ...

  3. ifconfig 命令,改变主机名,改DNS hosts、关闭selinux firewalld netfilter 、防火墙iptables规则

    ifconfig 命令用于查看网络相关的命令: 安装:yum install net-tools -y  ifdown  eth_name  关闭网卡  ifup  eth_name   开启网卡 配 ...

  4. Linux中级之netfilter防火墙(iptables)

    一.什么是防火墙? 防火墙其实就是一个隔离工具:工作于主机或者网络的边缘 对于进出本主机或者网络的报文根据事先定义好的网络规则做匹配检测 对于能够被规则所匹配的报文做出相应处理的组件(这个组件可以是硬 ...

  5. netfilter框架之hook点

    1. Netfilter中hook的所在位置 当网络上有数据包到来时,由驱动程序将数据包从网卡内存区通过DMA转移到设备主存区(内存区), 之后触发中断通知CPU进行异步响应,之后ip_rcv函数会被 ...

  6. netfilter/iptables 简介

    netfilter 是 Linux 内置的一种防火墙机制,我们一般也称之为数据包过滤机制.iptables 则是一个命令行工具,用来配置 netfilter 防火墙.下图展示了一个带有防火墙的简单网络 ...

  7. iptables简单命令

    IPTables是基于Netfilter基本架构实现的一个可扩展的数据报高级管理系统或核外配置工具,利用table.chain.rule三级来存储数据报的各种规则.Netfilter-iptables ...

  8. iptables基础原理和使用简介

    概念简介 名称 Netfilter/iptables模块有两部分组成: Netfilter框架以及iptables,iptables又分为iptables(内核空间)和iptables命令行工具(用户 ...

  9. 使用arm开发板搭建无线mesh网络(二)

    上篇博文介绍了无线mesh网络和adhoc网络的区别,这篇文章将介绍无线mesh网络的骨干网节点的组建过程.首先需要介绍下骨干网节点的设计方案:每个骨干网节点都是由一块友善之臂的tiny6410 ar ...

随机推荐

  1. 专项测试——移动app安装包检测

    一.背景和现状 安装包的重要性无需多提,针对安装包质量控制越来越严格和规范,包括证书.文件大小.安装成功率等,APP的证书及混淆是影响APP的安装成功率及代码安全性的很大因素,随着功能迭代,安装包也会 ...

  2. swift 快速创建一些基本控件

    1.tableview private lazy var cellId = "cellId" fileprivate lazy var tv : UITableView = { l ...

  3. POST请求测试地址

    http://service.xunjimap.com/xunjiservice/common1_0_4/index?53D2CFEB65F6BBEEEB42836FE18E7E0D params.a ...

  4. B+树与B-树

    前面已经介绍过B-树,接下来,我们主要介绍一下B+树. 1.B+树的概念 B+树是应文件系统所需而生的一种B-树和变形树.一棵m阶B+树和m阶的B-树的差异在于: (1)有n棵子树的结点中含有n个关键 ...

  5. js 逻辑运算符

    两个逻辑运算符的操作顺序在自己的脑海里一直理不清,用js做了个实验 <script type="text/javascript">    if(false && ...

  6. SqlServer添加触发器不让删除数据

    触发器是:instead of delete 类型,注意了:instead类型的触发器相当于: DELETE命令过来后,直接走触发器中的代码,再往下,没有了…… 就是说,这个触发器会屏蔽掉你所有的DE ...

  7. C++中强制类型转换

    C++强制类型转换 C++中的强制类型转换虽然兼容C语言中的强制类型转换.但是并不建议在C++中使用C语言风格的强制类型转换.C++中的强制类型转换共有4个关键字分别是:static_cast,con ...

  8. (O)阻止默认事件和阻止冒泡的应用场景

    场景1:阻止默认事件   比如这样的一个需求 点击取消a标签按钮的时候会触发一些js动作,但是不能让这个a标签产生跳转行为, 所以需要在点击取消的时候 阻止冒泡,防止其跳转. <a id='ca ...

  9. 从1~N中任选出三个数,最小公倍数最大

    已知一个正整数N,问从1~N中任选出三个数,它们的最小公倍数最大可以为多少. 当n为奇数:n.n-1.n-2这是三个最大数,并且它们两两互质.因为连续的奇.偶.奇,互质.连续的两个数互质是因为它们的公 ...

  10. NC 日志文件注册

    在实际开发中,例如接口向外系统发送数据,这些数据前台看不到,一般都是记录日志,然后在后台日志文件中查看.但是,用系统原本日志文件来看,有时会记录一些别的模块日志信息.所以,我们可以注册个自己的模块日志 ...