百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

iptables与Netfilter的关系

liebian365 2025-02-09 13:08 8 浏览 0 评论

iptables很多人都熟知,相比于iptables,Netfilter知道的人就会少很多。

有些人可能也没有明白两者的区别

我们可以先看如下这样的幅图

我们可以看得到的是。iptables是位于用户空间,而Netfilter却是位于内核空间

两者的区别可以归纳于下

Netfilter是官方内核中提供对报文数据包过滤和修改的一个功能,它位于内核中的tcp/ip协议栈的报文处理框架,它可以用于在不同阶段将某些钩子函数(hook)作用域网络协议栈。Netfilter 本身并不对数据包进行过滤,它只是允许可以过滤数据包或修改数据包的函数挂接到内核网络协议栈中的适当位置。这些函数是可以自定义的。

iptables是用户层的工具,它提供命令行接口,能够向 Netfilter 中添加规则策略,从而实现报文过滤,修改等功能。在linux中的这样的工具有很多,在centos6上面是iptables,在centos7上面则是firewalld,不过在7上面的时候,依习惯依然会称为iptables。

可以简单的这样理解,我们驱车旅游,Netfilter是车,而iptables是坐在车里面的人,车并没有对路线选择的能力,但是有车能提供行驶及改变路线的能力,决定是否行驶以及行驶到哪里去,这则是由坐在车里面的人来决定的。

Netfilte为什么能拦截数据

在回答这个问题之前,我们可以看一下通信过程的原理图

数据从发送方送至接收方,是通过光纤这样的基础设备完成,光纤属于物理层,在数据从用户的应用发出之后,通过应用层向下传递,一层一层的进行封装,然后到达物理层之后,通过物理层进行传输,到达接收方物理层之后,再向应用一层一层的解包。

因为这样的封装和解包,所以每段数据上面都会有相应的tag,当数据进行路由之后,会依据对应的tag来决定此数据的动向,是转发出去,还是流入接收。

其整个流程如下:

我们可以看出,Netfilter一共有五个协议栈点,分别是prerouting,input,forward,output,postrouting。

通过这五个栈点,对数据的流向进行管理。

每个链中有都对应的函数,称之为hook函数,这函数可以自定义。当hook函数遇到匹配自身设定规则的数据之后,它会跳出来进行处理,形如hook(钩子)把数据钩一下。如果没有匹配自身规则设定,则不处理。

某个数据在送达至路由前,存在一个prerouting链,如果规则设定中对该类型的数据拒收,而该数据不会流入后面的其它栈点。

表和链的区别

iptables中经常听到的概念就是四表五链,但是这些又都是什么

,我们可以很容易联想到钩子,就是上图中的那五个协议栈中出现的概念。

五链:

PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING

,表就是链的集合,多条链的组成,就形成了一张表,也因为不同链之间的组合,所以不同的表对数据有着不同的处理功能。

每个表中均会内置一组链。

常见的表中链的组合如下:

raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,OUTPUT,POSTROUTING,INPUT(centos 7新增INPUT)
filter:INPUT,FORWARD,OUTPUT

其中nat表中的INPUT是在centos7中新增的

四表的基础功能:

raw:关闭nat表上启用的连接追踪机制
mangle:拆解报文,做出修改,并重新封装起来
nat:network address translation,用于修改报文源地址或目标地址,甚至端口
filter:过滤,防火墙

其实相比于四表,还有一个基础表security,可以通过iptables -t security -vnL查看其中的对应链,不过用的很少。

平时我们所常用的是filter表

其中的链我们可以使用iptables -vnL查看

[root@iZ25la2y7noZ ~]# iptables -vnL
Chain INPUT (policy ACCEPT 21M packets, 1877M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 21M packets, 31G bytes)
 pkts bytes target     prot opt in     out     source               destination 

可以看到其中有三条链

而查看nat表时,可以看到其中有四条链

[root@iZ25la2y7noZ ~]# iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 11 packets, 792 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 11 packets, 792 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 8 packets, 3800 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 8 packets, 3800 bytes)
 pkts bytes target     prot opt in     out     source               destination   

表的执行优先级

raw-->mangle-->net-->filter

iptables的简单使用

规则编写格式:

iptables [-t table] COMMAND chain [-m matchname [per-match-options]] [-j targetname [per-target-options]]

表类型:- t table

filter:默认类别
net
mangle
raw

管理类命令:

管理链:

	-P:policy,定义默认策略
	-N:new,新建一条自定义规则链
	-F:flush,清空指定的链
	-E:rename chain,重命名自定义的引用计数为零的链
	-X:drop,删除自定义的引用计数为零的链

管理规则:

	-A:append,在指定链的尾部追加一条规则
	-I:insert,在指定位置插入一条规则,默认表示在链首
	-D:delete,删除指定的规则
	-R:replace,替换指定的规则

管理查看:

	-L:list,列出表中链的规则
	-n:numeric,以数值格式显示,不反解
	-v:verbose,显示详细信息
	-x:exactly,显示计数器的精确结果,不进行换算
	--line-number:显示链中的规则编号

管理重置规则计数器:

	-Z:zero,置零

处理动作: -j targetname [per-target-options]

	DROP:丢弃
	ACCEPT:接收
	REJECT:拒绝
	REDIRET:端口转换
		--to-ports port[-port] 指定映射的端口
	SNAT:源地址转换
		--to-source [ipaddr[-ipaddr]][:port[-port]] 指定修改的源地址和端口
	DNAT:目标地址转换
		--to-destination [ipaddr[-ipaddr]][:port[-port]] 指定修改的目标地址和端口
	MASQUERADE:地址伪装
		--to-ports port[-port] 指定伪装的端口
	LOG:日志记录
		--log-prefix 日志前缀样式

匹配条件:

每条规则都包含一组匹配与一个处理动作,只有数据包匹配到规则后,iptables才会依据指定的动作来处理数据

基本匹配:

	[!] -s:soure address,匹配报文的ip源地址
	[!] -d:destination address,匹配报文的ip目标地址
	[!] -i:in interface name,匹配数据报文的流入接口(如eno16777736)
	[!] -o:out interface name,匹配数据报文的流出接口
	[!] -p:protocol,匹配协议类型{tcp|udp.icmp}

扩展匹配:

隐式扩展:

不需要使用-m选项指出match name

		-p tcp:隐含了-m tcp
			[!] --sport port[:port] 匹配报文中tcp的源端口
			[!] --dport port[:port] 匹配报文中tcp的目标端口
			[!] --tcp-flags mask comp
				检查tcp标志位,各标志以逗号分隔,comp中指定的标记必须为1,comp中没出现,而mask中出现的必须为0。
				标志有以下几种: SYN ACK FIN RST URG PSH ALL NONE
			[!] --syn 相当于tcp第一次握手,等价于--tcp-flags  SYN,RST,ACK,FIN  SYN
					相当于SYN=1,RST=0,ACK=0,FIN=0
		-p udp
			[!] --sport port[:port] 匹配报文中的udp源端口
			[!] --dport port[:port] 匹配报文中的udp目标端口
		-p icmp
			[!] --icmp-type {type[/code]|typename} 匹配icmp中的类型
				8:echo-request
				0:echo-reply

显示扩展:

必须使用-m选项指出match name

		-m multiport:多端口匹配
			[!] --sports port[,port|,port:port]...] 匹配多个源端口
			[!] --dports port[,port|,port:port]...] 匹配多个目标端口
			[!]--ports port[,port|,port:port]...] 匹配指定多个端口,
		-m iprange:ip地址范围匹配
			[!] --src-range IPADDR-IPADDR 源地址范围
			[!] --dst-range IPADDR-IPADDR 目标地址范围
		-m string:对应用层数据作字符串匹配
			--algo {bm|kmp} 选择匹配策略,可选择bm或kmp
			[!] --string "STRING" 匹配指定的字符串
			[!] --hex-string "STRING" 十六进制的字符串
		-m time:时间匹配
			--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 起始时间
			--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 结束时间
			--timestart hh:mm[:ss]
			--timestop hh:mm[:ss]
			[!] --monthdays day[,day...]
			[!] --weekdays day[,day...]
		-m connlimit:依客户端ip并发连接数作匹配
			--connlimit-upto n 连接数小于n时允许
			--connlimit-above n 连接数大于n时拒绝
		-m limit:基于接收报文速率作匹配
			--limit rate[/second|/minute|/hour|/day] 平均速率
			--limit-burst number N 峰值连接数
		-m state:状态匹配
			--state STATE
			 	有以下五种STATE:
				INVALID:无法识别的状态
				ESTABLISHED:已建立的连接
				NEW:新连接
				RELATED:相关联的连接
				UNTRACKED:未追踪的连接

conntrack机制:

状态检测基于追踪机制(conntrack),负责该功能模块为nf_conntrack
启用nf_conntrack模块
	modprobe nf_conntrack
nf_conntrack模块被nf_nat模块所关联,所以查看nat表即会自动开启nf_conntrack模块
查看是否启用nf_conntrack模块
	lsmod | grep conntrack
查看追踪的连接
	cat /proc/net/nf_conntrack
定义最大追踪数量
	定义在/proc/sys/net/nf_conntrack_max中
定义连接追踪时长
	定义在/proc/sys/net/netfilter/目录中

conntrack机制的实际举例

在iptables中放行ftp服务的访问
	因为ftp服务有两种模式,一种是主动模式,其访问端口为20+1,而被动模式使用随机端口进行访问,故在iptables中直接无法通过设置指定端口来放行ftp服务的访问。在此通过nf_conntrack机制就很容易解决
        iptables -A INPUT -d 172.16.45.21 -p tcp -m state --state ESTABLISHED -j ACCEPT
        iptables -A INPUT -d 172.16.45.21 -p tcp --dprot 21 -m state --state NEW -j ACCEPT
        iptables -A OUTPUT -s 172.16.45.21 -p tcp -m state --state RELATED -j ACCEPT

iptables规则的保存与重载

iptables-save > /PATH/TO/SOME_RULE_FILE
iptables-restore < /PATH/TO/SOME_RULE_FILE

iptables的修改正确步骤

1.在修改iptables规则之前,先备份原有规则
    iptables-save > /etc/sysconfit/iptables.bak
2.将要修改的规则写入脚本
    vim iptables.sh
3.添加计划任务,防止iptables的错误规则导致服务器无法访问
        at now +2 miniute
        at > /sbin/iptables-restore < /etc/sysconfig/iptables.bak
        at > 
4.运行修改规则脚本
    sh ./iptables.sh
5.如果新的规则无问题,则取消计划任务
    atrm N(N表示at队列号)

相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: