这次终于不再为 iptables 犯迷糊了
qiyuwang 2024-11-23 21:40 9 浏览 0 评论
基础概念
linux 的包过滤功能,即 linux 防火墙,它由 netfilter 和 iptables 两个组件组成。netfilter 位于内核空间,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。iptables 是一个命令行工具,位于用户空间,它使得插入、修改和删除信息包过滤表中的规则变得容易。
我们知道 iptables 是按照规则来办事的,规则其实就是网络管理员预定义的条件,规则一般的定义为"如果数据包头符合这样的条件,就这样处理这个数据包"。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables 就根据规则所定义的方法来处理这些数据包,如放行(ACCEPT)、拒绝(REJECT)和丢弃(DROP)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
当客户端访问服务器的服务时,客户端发送报文到服务器的网卡,而 TCP/IP 协议栈是属于内核的一部分,所以客户端的信息会通过内核的 TCP 协议传输到用户空间中的服务中,而此时客户端报文的目标终点(destination)为服务所监听的套接字(IP:PORT),当服务需要响应客户端请求时,服务发出的响应报文的目标终点则为客户端,这个时候服务所监听的IP与端口反而变成了原点(source)。netfilter才是真正的防火墙,它是内核的一部分,如果我们想要防火墙能够达到"防火"的目的,则需要在内核中设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止,于是就出现了 INPUT 关卡和 OUTPUT 关卡。然而这些关卡在 iptables 中并不被称为"关卡",而是被称为"链"。
其实我们上面描述的场景并不完善,因为客户端发来的报文访问的目标地址可能并不是本机,而是其他服务器,当本机的内核支持 IP_FORWARD 时,我们可以将报文转发给其他服务器。这个时候,我们就会提到 iptables 中的其他"关卡",也就是其他"链",它们就是 PREROUTING(“路由前”)、FORWARD(“转发”)、POSTROUTING(“路由后”)。
也就是说,当我们启用了防火墙功能时,报文需要经过如下关卡,也就是说,根据实际情况的不同,报文经过"链"可能不同。如果报文需要转发,那么报文则不会经过 INPUT 链发往用户空间,而是直接在内核空间中经过 FORWARD 链和 POSTROUTING 链转发出去的。
iptables的结构
iptables 由表(table)、链(chain)和规则(rule)组成,其中表包含链,链包含规则。
我们把具有相同功能的规则集合叫做“表”,对于不同功能的规则,我们可以放置在不同的表中进行管理。iptables 中具有 filter、nat、mangle、raw等几种内建表:
对于各个具体的链而言:
- INPUT 链:处理来自外部的数据。
- OUTPUT 链:处理向外发送的数据。
- FORWARD 链:数据转发。通过路由表后发现目的地址非本机,则匹配该链中的规则。
- PREROUTING 链:处理刚到达本机并在路由转发前的数据包。
- POSTROUTING 链:处理即将离开本机的数据包。
数据包的流转流程可以参考下图:
iptables 命令格式
iptables 命令格式为:
iptables [ -t 表名] 命令选项 [链名] [条件匹配] [-j 处理动作或跳转]
如果没有显式设置表名,那么默认为 filter表,即默认 -t filter。
命令选项
- -L 列出一个或所有链的规则
- -v 显示详细信息,包括每条规则的匹配句数量和匹配字节数
- -x 在v的基础上,禁止自动换算单位(K,M)
- -n 只显示ip地址和端口号,不显示域名和服务名称
- -I 插入到防火墙第一条生效
- -A 添加链是添加到最后一条
- -D 删除指定链中的某一条规则,按规则序号或内容确定要删除的规则
- -F 清空指定链中的所有规则,默认清空表中所有链的内容
- -X 删除指定表中用户自定义的规则链
匹配条件
- -i 入站请求interface(网卡)
- -o 出站请求interface(网卡)
- -s 入站源地址
- -d 目标地址
- -p 指定规则协议,如tcp, udp,icmp等,可以使用 all 来指定所有协议
- --dport 目的端口,数据包的目的(dport)地址是80,就是要访问我本地的80端口
- --sport 来源端口 数据包的来源端口是(sport)80,就是对方的数据包是80端口发送过来的。
动作
- ACCEPT:允许数据包通过。
- DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
- REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。(一般不使用REJECT(拒绝)行为,REJECT会带来安全隐患。)
- SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
- MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
- DNAT:目标地址转换。
- REDIRECT:在本机做端口映射。
- LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
规则
在上述描述中我们一直在提规则,可是没有细说。那么规则具体指什么呢?
规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理。
规则大致又两个逻辑单元组成:匹配条件和动作。最常用的匹配条件是“源地址”、“目标地址”、“源端口”、“目标端口”;最常用的动作有 ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝)。
在实际操作iptables 的过程中,是以“表”作为操作入口的,如果你经常操作关系型的数据库,那么当你听到“表”这个词的时候,你可能会联想到另一个词——“增删改查”,当我们定义 iptables 规则时,所做的操作其实类似于“增删改查”。我们不妨从最简单的“查”操作入手。
filter 表是我们最常用到的表,我们这里以 filter表为例来说明具体的操作。下面的命令展示如何查看 filter 表中的规则:
iptables -t filter -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
上面我们使用-t选项指定要操作的表,使用-L选项查看-t选项对应表的规则。-L 对应 List,意为列出规则。上面命令的含义为列出filter表的所有规则。
我们可以查看指定表中指定链的规则。比如,我们只查看 filter 表中 INPUT 链的规则:
iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
上面只显示了 filter 表中 INPUT 链的规则(省略 -t 选项默认为 filter 表),当然,你也可以指定只查看其它链。我们还可以使用-v选项查看出更多、更详细的信息,示例如下:
iptables -vL INPUT
Chain INPUT (policy ACCEPT 1509K packets, 851M bytes)
pkts bytes target prot opt in out source destination
这里我们看到多了一些字段,这些字段就是规则对应的属性,具体的含义归纳如下:
- pkts: 匹配到的报文的个数
- bytes: 匹配到的报文包的大小总和
- target: 表示规则对应的“动作”,即规则匹配成功后需要采取的措施
- prot: 对应的协议,是否只针对某些协议应用此规则
- opt: 表示规则对应的选项
- in: 表示数据包由哪个interface(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则
- out:表示数据包由哪个interface(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则
- source: 表示规则对应的源头地址,可以是一个 IP,也可以是一个网段
- destination: 表示规则对应的目标地址
上面链(Chain INPUT)的背后还有一个括号,括号里包含了policy ACCEPT、1509K packets、851M bytes三部分。
- policy: 表示当前链的默认策略,policy ACCEPT 表示上面 INPUT 链中的默认动作为 ACCEPT, 换句话说就是,默认接受通过INPUT的所有请求。
- packets: 表示当前链的默认策略匹配到的包的数量。
- bytes:表示当前链的默认策略匹配到的所有包的大小总和。
如果需要,我们可以使用iptables -F INPUT 命令来清空 filter 表 INPUT 链中的规则。
假设我们有2台测试机,IP地址分别为 host1 和 host2, 我们可以在 host1 上使用 ping 命令来查看一下网络连通情况:
ping host2
64 bytes from host2: icmp_seq=512 ttl=49 time=213 ms
64 bytes from host2: icmp_seq=513 ttl=49 time=213 ms
64 bytes from host2: icmp_seq=514 ttl=49 time=213 ms
然后我们在 host1 上配置一条规则,拒绝 host2 上的所有报文访问 host1。对应的命令如下:
iptables -t filter -I INPUT -s host2 -j DROP
使用-I选项,指明将“规则”插入哪个链中,I 表示 Insert,即插入的意思,这里表示添加规则之意。使用-s选项,指明匹配条件中的“源地址”,即如果报文的源地址属于 -s 对应的地址,那么报文则满足匹配条件。s 表示 source,即源地址。使用-j选项,指明当匹配条件满足时,所对应的动作,上面指定了动作为 DROP,当报文的源地址为 host2 时,报文则被 DROP。
再来查看一下 filter 表中的 INPUT 链:
iptables -nvL INPUT
Chain INPUT (policy ACCEPT 1421 packets, 344K bytes)
pkts bytes target prot opt in out source destination
114 7992 DROP all -- * * host2 0.0.0.0/0
可以看到相应的规则已经添加了,在 iptables 中,动作被称之为 “target”, 所以上面的 target 字段对应的动作为 DROP。
现在 INPUT 链中已经存在了一条规则,它拒绝了所有来自 host2 的报文,如果此时我们在这条规则之后再配置一条规则—— 接受所有来自 host2 的报文,那么此时 iptables 的表现如何呢?
使用如下命令在 filter 表中追加一条规则:
iptables -nvL INPUT
Chain INPUT (policy ACCEPT 355 packets, 133K bytes)
pkts bytes target prot opt in out source destination
3960 274K DROP all -- * * host2 0.0.0.0/0
0 0 ACCEPT all -- * * host2 0.0.0.0/0
上面并没有继续使用-I选项,而是使用了-A选项,A代表 Append,也是表示在 INPUT 链中追加规则。-I与-A之间的区别在于:-I表示在链的首部插入规则,而-A表示在链的头部插入规则。
上面的信息中也显示了新添加的 ACCEPT 规则在原先的 DROP 之后。
此时再在 host1 上尝试去 ping 通 host2 时会发现还是 ping 不通。看来新添加的规则没有生效。我们这里再次添加一条相同的规则,不过此时使用-I选项来添加。
iptables -I INPUT -s host2 -j ACCEPT
iptables -nvL INPUT
Chain INPUT (policy ACCEPT 57 packets, 6438 bytes)
pkts bytes target prot opt in out source destination
16 2274 ACCEPT all -- * * host2 0.0.0.0/0
7319 507K DROP all -- * * host2 0.0.0.0/0
0 0 ACCEPT all -- * * host2 0.0.0.0/0
如果我们此时再尝试 ping 通 host2 时,发现已经可以正常ping 通了。如果观察仔细,我们可以发现,刚刚添加的 ACCEPT 规则在 DROP 规则之前了。可见,规则的顺序很重要。
如果报文已经被前面的规则匹配到,iptables 则会对报文执行对应的动作,即使后面的规则也能匹配到当前报文,很有可能也没有机会再对报文执行相应的动作了。就以上面的例子来说,报文先被第一条规则匹配到了,于是当前报文被“放行”了。也正因为报文已经被放行了,后面的第二条规则及时能够匹配到放行的报文,也没有机会在对刚才的报文进行丢弃操作了。这就是 iptables 的工作机制。
使用 iptables 是可以通过 --line-number 选项来列出规则的序号,如下所示:
iptables --line-number -nvL INPUT
Chain INPUT (policy ACCEPT 13186 packets, 6606K bytes)
num pkts bytes target prot opt in out source destination
1 1568 278K ACCEPT all -- * * host2 0.0.0.0/0
2 7319 507K DROP all -- * * host2 0.0.0.0/0
3 0 0 ACCEPT all -- * * host2 0.0.0.0/0
我们在添加规则的时候,还可以指定新增规则的编号,这样我们就能在任意位置插入规则了,我们只要把刚才的命令稍作修改即可,如下:
iptables t fileter -I INPUT 2 -s host2 -j DROP
这里仍旧使用-I选项进行插入规则的操作,-I INPUT 2表示在 INPUT 链中新增规则,新增规则的编号为2。
在删除规则时,我们可以使用规则的编号去删除,也可以使用具体的匹配条件和动作去删除。
举例,我们删除第三条规则:
iptables -t filter -D INPUT 3
iptables --line-number -nvL INPUT
Chain INPUT (policy ACCEPT 87 packets, 9870 bytes)
num pkts bytes target prot opt in out source destination
1 5115 594K ACCEPT all -- * * host2 0.0.0.0/0
2 7319 507K DROP all -- * * host2 0.0.0.0/0
我们再删除第一条规则:
iptables -D INPUT -s host2 -j ACCEPT
iptables --line-number -nvL INPUT
Chain INPUT (policy ACCEPT 228 packets, 26328 bytes)
num pkts bytes target prot opt in out source destination
1 7325 507K DROP all -- * * host2 0.0.0.0/0
如果要一下子全部清空怎么操作?这个在前面已经提及过了,使用iptables -t 表名 -F 链名。-F选项为 flush 之意,即冲刷指定的链,即删除指定链中的所有规则。此操作相当于删除操作,在没有保存 iptables 规则的情况下慎用。如果不指定链名,那么会删除表中的所有规则,即iptables -t 表名 -F。
此处省略修改规则、保存规则的具体操作。
相关推荐
- 第二十六章 Bat文件(bat文件百科)
-
第二十六章Bat文件bat文件是dos下的批处理文件。批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为.bat或.cmd。在命令提示下输入批处理文件的名称,或者双击该批处理...
- 自媒体良器:音频文件批处理,FFmpeg一行搞定!果断收藏
-
引言FFMpeg是众多多媒体应用程序的核心,但该程序本身不具备一次转换多个文件的能力。但也拦不住,FFMpeg本身是命令行程序,可编写脚本,借助Bash轻松快速地构建自动化程序。...
- 批处理:创建和删除文件夹命令(批处理命令 删除文件夹)
-
上一期,我们学习了文件夹的查看命令:tree和dir,以及文件夹切换命令:cd,今天,我继续给大家讲解下批处理的目录(文件夹)操作命令:创建和删除。一.md:创建目录(文件夹)可以在当前文件夹下创建...
- 利用VBA创建新的工作簿(vba 创建工作簿)
-
【分享成果,随喜正能量】我告诫自己:你的话说得太多,你听别人倾诉得太多,你咖啡喝得太多,你在陌生的房间里坐的时间太长,你的睡眠质量太差,你醒着的时间太长,你平庸的事想得太多,你希望过多,你安慰自己太频...
- 实用小工具,注册表文件快速转换.bat文件
-
关于注册表注册表是Windows操作系统中的一个核心数据库,它用于存储系统和应用程序的设置信息。这个数据库文件控制着Windows操作系统的外观和如何响应外来事件的工作方式。注册表包含了各种参数,直接...
- 如何给自己的电脑做一个截图工具?现场教会你具体流程和步骤
-
做自媒体,经常要用到一些图片,有时候图片上有水印去不掉,这时候要是有一个能随意截图的工具该有多少呀!今天教授让大家自己设计一个截图工具。下面就是流程和步骤:1、在电脑页面的任意位置,点击鼠标右键,新建...
- Windows使用批处理文件更改目录下的文件名(含序号)
-
从网上下载的图片,默认的名字是由许多字母和数字组成的比较长的一个字符串,不便于人记忆,使用起来比较麻烦。如下图所示:本文的目的是写一个批处理文件,将该目录中的所有扩展名为jpeg的文件改名为日期加序号...
- 学习VB编程第35天,如何调用bat批处理
-
今天学习了刘金玉老师零基础VB教程的第43期,学习的主要内容是如何调用bat批处理登录。一、什么是批处理1.什么是命令提示符(cmd)?在Windows开始菜单运行(windows+r键也可调出)中输...
- 利用bat让文件在指定时间自动进行备份
-
在很多时候,我们需要备份电脑中的一些文件,特别是企业服务器的备份,可能是有一些文件每天都会有更新,或者定期更新,而文件又是相对比较重要的,需要我们定时去备份。可有时候文件比较大,备份时间比较长,或者在...
- BAT 批处理脚本教程(批处理脚本编写教程)
-
BAT批处理脚本教程第一章批处理基础第一节常用批处理内部命令简介批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD。这些命令统称批处...
- Windows系统bat批处理常用命令(一)
-
一、批处理中常用的命令:@命令:加在每个命令行的最前面,表示运行时不显示这一行的命令行。eg:@echooff//不显示后续命令行及当前命令行...
- 编写bat文件在windows上自动执行cmd命令
-
windows电脑上直接新建txt记事本文件,编写好要执行的命令后,将后缀修改成.bat,然后直接点击文件就可以执行里面的命令了#打开命令窗口startcmd#/k执行完命令不关...
- 不会C语言写bat脚本代码批量修改文件名,DeepSeek帮你解决!
-
哈喽大家好,我是小飞。今天给大家讲一下DeepSeek做了一个批量修改文件夹的bat脚本。·首先先让它这样修改一下,因为之前已经做过一个,然后它没有改,现在让它修改一下,把它修改一个很智能的BAT脚本...
- BAT批处理命令之ren/rename(与Excel合作批量修改文件名)
-
写在前面一鸽就是半年...
- 使用批处理文件——autoexec.bat(批处理more)
-
1、dblspace.sys磁盘压缩。 drvspace.sys、dblspace和drvspace是Microsoft公司推出的磁盘压缩工具,可以将磁盘的空间增加许多,但由于它依靠对文件进行压...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- navicat无法连接mysql服务器 (65)
- 下横线怎么打 (71)
- flash插件怎么安装 (60)
- lol体验服怎么进 (66)
- ae插件怎么安装 (62)
- yum卸载 (75)
- .key文件 (63)
- cad一打开就致命错误是怎么回事 (61)
- rpm文件怎么安装 (66)
- linux取消挂载 (81)
- ie代理配置错误 (61)
- ajax error (67)
- centos7 重启网络 (67)
- centos6下载 (58)
- mysql 外网访问权限 (69)
- centos查看内核版本 (61)
- ps错误16 (66)
- nodejs读取json文件 (64)
- centos7 1810 (59)
- 加载com加载项时运行错误 (67)
- php打乱数组顺序 (68)
- cad安装失败怎么解决 (58)
- 因文件头错误而不能打开怎么解决 (68)
- js判断字符串为空 (62)
- centos查看端口 (64)