转载自: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. 服务器使用VMware系软件管理主机集群

    在服务器安装ESXI 6.0系统,此系统300多M,用于管理服务器上的主机. 其他主机安装个vsphere client连接后可ESXI系统可进行简单管理 如果要更强大的功能,需要安装vcenter ...

  2. vue 使用a+ router.push的形式跳转时,地址栏不显示参数

    解决办法: a链接不要写href 属性

  3. HDU 4940 Destroy Transportation system(无源汇上下界网络流)

    Problem Description Tom is a commander, his task is destroying his enemy’s transportation system. Le ...

  4. Day 04 列表,元祖,range

    列表: why: 1.字符串取值费劲 2.对字符串做任何操作,取出来的都是字符串 3.字符串有长度限制 基于以上原因,python提供了另一个数据类型,list 容器类数据类型. 列表页脚数组,可以存 ...

  5. Shell脚本break和continue命令

    在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用 break 和 continue 来跳出循环. break命令 允许跳出所有循环(终止执行后面的所有循环). continu ...

  6. 获取URL某个参数

    /* 获取URL某个参数(可以是中文) * 返回:字符串 */ function getUrlParam(key) { // 获取参数 var url = window.location.search ...

  7. springboot 项目添加jaeger调用链监控

    1.添加maven依赖<dependency> <groupId>io.opentracing.contrib</groupId> <artifactId&g ...

  8. Liunx Mkdir

    linux mkdir命令: 创建目录 介绍:该命令创建指定的目录名,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录1语法: mkdir [-m] [-p] 目录 ...

  9. 2D情况下,复数的意义代表旋转

    4 x i x i = - 4 就是"4"在数轴上旋转了180度. 那么4 x i = 4i 就旋转了90度. 复数的意义就表示旋转 乘以-1,表示x正半轴的数,围绕原点,逆时针偏 ...

  10. (转)ScriptManager.RegisterStartupScript方法和Page.ClientScript.RegisterStartupScript() 方法

    ScriptManager.RegisterStartupScript方法 如果页面中不用Ajax,cs中运行某段js代码方式可以是: Page.ClientScript.RegisterStartu ...