转载自: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. c#: 以模态窗口显示于其它进程窗体之前

    产品之工具箱,需要工具以模态窗体,显示于主界面之上.记下代码点,以做备忘. 1.IWin32Window internal class Win32Window : IWin32Window { pub ...

  2. iOS工程中创建pch文件

    1.新建pch类文件 2.在工程配置中,Build Setting 下搜索"pre"寻找Apple LLVM6.1 - Language下的 Preflx Header 3.点开P ...

  3. JS编程题练习

    JS编程题练习 1. 两个数组合并成一个数组排序返回 先依次比较两个数组,按照小的就传入新的数组.当这次比较完之后可能有一个数组的长度很长,留下一些数组,然后在新数组的末尾插入即可. function ...

  4. SI和DI

    si和di是8086CPU中和bx功能相近的寄存器,si和di不能够分成两个8位寄存器来使用. 用si和di实现将字符串"welcome to masm!"复制到它后面的数据区中. ...

  5. Activity横竖屏切换时 一些数据的保存

    private VideoView videoView; 02.private static final String VIDEO_PATH = Environment 03. .getExterna ...

  6. :before与::before的区别

    相同点 都可以用来表示伪类对象,用来设置对象前的内容 :befor和::before写法是等效的  不同点 :befor是Css2的写法,::before是Css3的写法 :before的兼容性要比: ...

  7. idea中lombok安装

    项目中经常使用bean,entity等类,绝大部分数据类类中都需要get.set.toString.equals和hashCode方法,虽然eclipse和idea开发环境下都有自动生成的快捷方式,但 ...

  8. What's the #pragma pack

    What's the #pragma pack 这是一个预编译宏, 目前我对于它的认识是: 告诉编译器对于某些结构进行字节对齐使用的. 目前阶段,几乎不使用, 只是见到了, 有疑问, 先简单学习记录一 ...

  9. linux小笔记

    1. 安装go并设置环境变量 Add /usr/local/go/bin to the PATH environment variable. You can do this by adding thi ...

  10. 转easyui datagrid 前台分页的实现

    easyui datagrid 前台分页的实现java采用的版本 来源:本站原创 js知识 超过5,090人围观 暂无评论 使用easyui分页,有后台服务器端实现和前台浏览器端实现.服务器端实现按规 ...