netfilter框架和iptables
转载自: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的更多相关文章
- IPTables 和 Netfilter 框架
前言 防火墙是保护服务器的重要工具. Linux中最常用的基本防火墙软件是iptables.iptables通过与Linux内核网络堆栈(networking stack)中的包过滤钩子(packet ...
- Linux Netfilter框架分析
目录 Netfilter框架 Netfilter的5个hook点 netfilter协议栈数据流分析 连接跟踪conntrack conntrack连接跟踪表条目 连接跟踪表大小 管理连接跟踪表 ip ...
- ifconfig 命令,改变主机名,改DNS hosts、关闭selinux firewalld netfilter 、防火墙iptables规则
ifconfig 命令用于查看网络相关的命令: 安装:yum install net-tools -y ifdown eth_name 关闭网卡 ifup eth_name 开启网卡 配 ...
- Linux中级之netfilter防火墙(iptables)
一.什么是防火墙? 防火墙其实就是一个隔离工具:工作于主机或者网络的边缘 对于进出本主机或者网络的报文根据事先定义好的网络规则做匹配检测 对于能够被规则所匹配的报文做出相应处理的组件(这个组件可以是硬 ...
- netfilter框架之hook点
1. Netfilter中hook的所在位置 当网络上有数据包到来时,由驱动程序将数据包从网卡内存区通过DMA转移到设备主存区(内存区), 之后触发中断通知CPU进行异步响应,之后ip_rcv函数会被 ...
- netfilter/iptables 简介
netfilter 是 Linux 内置的一种防火墙机制,我们一般也称之为数据包过滤机制.iptables 则是一个命令行工具,用来配置 netfilter 防火墙.下图展示了一个带有防火墙的简单网络 ...
- iptables简单命令
IPTables是基于Netfilter基本架构实现的一个可扩展的数据报高级管理系统或核外配置工具,利用table.chain.rule三级来存储数据报的各种规则.Netfilter-iptables ...
- iptables基础原理和使用简介
概念简介 名称 Netfilter/iptables模块有两部分组成: Netfilter框架以及iptables,iptables又分为iptables(内核空间)和iptables命令行工具(用户 ...
- 使用arm开发板搭建无线mesh网络(二)
上篇博文介绍了无线mesh网络和adhoc网络的区别,这篇文章将介绍无线mesh网络的骨干网节点的组建过程.首先需要介绍下骨干网节点的设计方案:每个骨干网节点都是由一块友善之臂的tiny6410 ar ...
随机推荐
- AngularJS——第4章 数据绑定
第4章 数据绑定 AngularJS是以数据做为驱动的MVC框架,所有模型(Model)里的数据经由控制器(Controller)展示到视图(View)中. 所谓数据绑定指的就是将模型(Model)中 ...
- golang基础学习
一.输出hello,world程序 package main; import "fmt"; func main() { fmt.Printf("hello,world&q ...
- MVc Identity登陆锁定
2016-08-03 [ASP.NET Identity] OAuth Server 鎖定(Lockout)登入失敗次數太多的帳號 743 6 ASP.NET Identity 檢舉文章 2016-0 ...
- 在threejs中添加两个场景和相机是需要注意render的参数设置
问题:我刚开始设置了两个场景和相机 但是第二个一直将第一个场景给覆盖了一直找不到原因 解决: 问题出在 renderer.autoClear = false;上 设置render的参数如下: rend ...
- IDEA使用过程中常见小问题
在磁盘随便一个位置,创建一个文件夹,可以通过IDEA open 打开它 然后在将一些代码模块,放入这个文件夹,IDEA刷新,能够自动显示出来 然后执行下面的文档操作 1.IDEA通过一个项目文件导 ...
- Android.Study.Question
1. NullPointerException 1.1 发生该异常的原因. 1.2 解决方法有哪几种? try-catch 2. Eclipse 中 debug/run 两个模式,run 是relea ...
- mac/linux 修改vim显示信息
转自:http://www.cnblogs.com/yjmyzz/p/4019783.html 步骤1: cp /usr/share/vim/vimrc ~/.vimrc 先复制一份vim配置模板到个 ...
- 多维数组sorted函数的用法
对某一个位置排列 l=[[1,5,7,9],[5,10,6,11],[4,2,1,4]] newlist=sorted(l,key=lambda iterm : iterm[0],reverse=Tr ...
- generic_netlink 用法
参考资料: https://wiki.linuxfoundation.org/networking/generic_netlink_howto generic_netlink 框架 +-------- ...
- Spring MVC(一)Servlet 2.x 规范在 Spring MVC 中的应用
Spring MVC(一)Servlet 2.x 规范在 Spring MVC 中的应用 Spring 系列目录(https://www.cnblogs.com/binarylei/p/1019869 ...