Iptables快速上手

2024-08-29 03:44
文章标签 快速 iptables

本文主要是介绍Iptables快速上手,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Iptables

  • firewall 防火墙
  • Iptables简述
  • 一、Iptables的四表五链
    • 1.filter表
    • 2.nat表
    • 3.raw表
    • 4. mangle表
    • 5.数据包的流通过程
  • 二、快速上手
    • 1. 查看规则
    • 2. 规则详细
    • 3. 添加规则
    • 4. 自定义链
  • 三、关于iptables和docker
    • 1. 背景
    • 2. 解决方案
    • 3. Demo

firewall 防火墙

  • 从逻辑上讲,可以分为服务器防火墙和主机防火墙。网络防火墙和主机防火墙不存在冲突。
    • 网络防火墙位于网络边界,如路由器或专用硬件设备。用于监控和控制进出网络的数据包,主要职责是在网络层过滤数据包,以保护网络免受攻击。(公司的防火墙就是一种网络防火墙)
    • 主机防火墙安装在单个主机上,如常见的iptables和firewalld。用于保护该主机免受未经授权的网络访问,监控并控制进出主机的数据包,以防止未经授权的访问。
  • 从物理上讲,防火墙可以分为硬件防火墙和软件防火墙。
    • 硬件防火墙:在硬件级别实现部分防火墙功能,一部分功能仍需基于软件实现,性能高,成本高。
    • 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。

Linux防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于包过滤防火墙,并且基于内核编码的实现具有非常稳定的性能和高效率。

Iptables简述

iptables 是 Linux 系统中用于设置、维护和检查网络层数据包过滤规则表的工具。这些规则表定义了哪些数据包应该被允许通过,哪些应该被拒绝或丢弃。

  • 封端口、IP
  • 实现NAT功能
    • 共享网络
    • 端口映射(转发),IP映射

Iptables已被写入到Linux内核中,并且在Dcoker中提供了相当重要的服务。

Iptables相关概念:

  • 表(table):存放链的容器,防火墙最大的概念。
  • 链(chain):存放规则的容器
  • 规则(policy):准许或拒绝规则,定义的是防火墙的通行规则
    在这里插入图片描述
    工作流详解:
  • 防火墙是层层过滤的,实际执行的规则顺序是从上到下,即Rule1到默认规则,不过这条规则是拒绝服务还是允许,都完成一次规则匹配。
  • 规则匹配成功,即明确标识是DROP还是ACCEPT,数据包就不再向下匹配新的规则。
  • 如果规则没有明确表示是阻止还是通过,也就是没有匹配该条规则,则继续向下匹配,直到匹配默认规则得到明确的DROP或ACCEPT。
  • 防火墙默认规则是所有规则都匹配完成才会匹配的。

考虑到匹配规则是从上往下的,因此在设计防火墙规则的适合顺序十分重要。

在只允许一些特定的ip通过防火墙时,把filter-允许某些IP通过的规则放前边,Drop-禁止所有IP的规则放后边。

一、Iptables的四表五链

  • 四表: filter、nat、raw、mangle
  • 五链:
    • INPUT:处理入站数据包
    • OUTPUT:处理出站数据包
    • FORWARD:处理转发数据包
    • POSTROUTING链:在进行路由选择后处理数据包(对数据链进行源地址修改转换)
    • PREROUTING链:在进行路由选择前处理数据包(做目标地址转换)

Tip:此处只介绍最常用的filter和Nat表!

1.filter表

实现防火墙功能,屏蔽或是准许IP端口。

  • iptalbes默认操作表,不指定表制定规则时,操作的是filter表
  • 真正负责主机防火墙功能的表(过滤流入流出主机的数据包)
链名功能
INPUT负责过滤所有目标地址是本机的数据包(是否准许外部数据包进入服务器)
FORWARD负责转发流经主机的数据包,转发作用
OUTPUT负责处理所有源地址是本地的数据包(处理从本机发出的数据包)

2.nat表

实现nat功能,共享网络(内外网服务器上网),端口映射和IP映射。

  • 负责网络地址转换,即来源与目的IP地址的port的转换。
  • 一般用于局域网共享上网或者特殊的端口转换服务相关。

1.用于企业路由(zebra)或网关(iptables),共享上网(POSTROUTING)
2.做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务(PREROUTING)
3.WEB,单个端口的映射,直接映射80端口,这个表定义了3个链,nat功能相当于网络的acl控制。和网络交换机acl类似。

链名功能
OUTPUT负责过滤所有目标地址是本机的数据包(是否准许外部数据包进入服务器)
PREROUTING负责转发流经主机的数据包,转发作用
POSTROUTING负责处理所有源地址是本地的数据包(处理从本机发出的数据包)

3.raw表

raw 表用于处理连接跟踪(connection tracking)的例外情况,即那些不应该被连接跟踪机制处理的流量。raw 表通常用于配置不需要进行连接跟踪的流量,比如某些类型的初始数据包或特定类型的流量,以避免不必要的资源消耗,例如 ICMP 请求,可以将其标记为 raw 类型,以提高处理效率。

链名功能
OUTPUT用于处理从本地系统发出的流量。
PREROUTING用于处理到达接口之前的流量。

4. mangle表

mangle 表用于修改数据包的内容或其元数据,而不直接决定数据包的命运(如接受或丢弃)。mangle 表主要用于数据包的标记、修改 TTL(生存时间)值、修改标志位等操作。它可以用来做一些高级的网络功能,比如负载均衡、QoS(Quality of Service)配置、路由选择等。

链名功能
PREROUTING用于处理到达接口之前的流量。
INPUT用于处理到达本地系统接口的流量。
FORWARD用于处理转发的流量。
OUTPUT用于处理从本地系统发出的流量。
POSTROUTING用于处理离开接口之后的流量。

5.数据包的流通过程

在这里插入图片描述

  • 请求到达服务器前先经过PREROUTING链,进行规则匹配,决定是否访问本机。
  • 如果数据包目标地址不是本机,需要经过FORWARD链进行转发,最后经过POSTROUTING链离开。
  • 如果数据包的目标地址是本机,需要经过INPUT链上制定的规则,符合的才能进入服务系统,不符合的则经过OUTPUT链离开。

二、快速上手

iptables 命令的基本语法如下:

iptables [-t 表名] 命令 [选项] [链名] [条件] [-j 目标]
  • -t 表名:指定要操作的表,默认为 filter 表。iptables 有几个内置表,如 filter、nat、mangle、raw、security 等。
  • 命令:指定要执行的操作,如 -A(追加)、-D(删除)、-L(列出规则)等。
  • 选项:一些命令可能需要额外的选项来指定操作的具体细节。
  • 链名:指定规则所在的链,如 INPUT、OUTPUT、FORWARD 等,或是自定义的链。
  • 条件:用于匹配数据包的条件,如源地址、目的地址、端口号等。
  • -j 目标:指定匹配到的数据包的处理方式,如 ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝)等。

具体命令详细可以使用iptalbes --help查看,此处只列举常用命令。

1. 查看规则

查看所有 iptables 规则:

							iptables -nL
解析: -n 选项告诉iptables不要对地址进行 DNS 解析,而 -L 选项则是列出所有链中的规则。

在这里插入图片描述


查看指定表的规则:

							iptables -t 表名 -nL

在这里插入图片描述

2. 规则详细

根据配置好的指定规则匹配每个流经此处的数据包。如果匹配成功,则由规则后面指定的处理动作进行处理,如果该条规则匹配失败,则数据包流入下一规则进行匹配,直至所有规则匹配失败,最后按照该链的默认规则处理。

  • target : 处理动作,该条规则匹配成功后按照指定动作进行处理。
    • ACCEPT:允许数据包通过
    • DROP:丢弃数据包,不给任何回应信息,客户端会收到Connect time out,连接超时。
    • REJECT:拒绝数据包,给请求端一个响应的信息,客户端会收到unreachable,请求不可达。
    • SNAT:源地址转换,根据指定的条件,将数据包源IP进行更改转发,可以解决内网用户用同一个公网地址上网的问题。
    • MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip。
    • DNAT:目标地址转换,将数据包的目标地址变更,如访问Docker服务时,目标地址会由主机变更到Docker容器。
    • REDIRECT:在本机做端口映射
    • LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配
  • prot: 通信协议,例如TCP、UDP、ICMP。
  • opt: 选项,通常在建立规则的时候可以指定。
  • source: 源地址,指的是数据包的来源IP。
  • destination: 目标地址,指的是数据包想要发送的目的地。

3. 添加规则

Tip: 规则的匹配是从上到下的,哪个先匹配就执行哪个,后面就算有一模一样的也不会执行,因此在设计规则的时候顺序是十分重要的!!!

添加规则:

					iptables -t 表名 -A 链名 匹配条件 -j 处理动作
例如:
允许源地址192.168.10.152的数据包通过:iptables -t filter -I INPUT -s 192.168.10.152 -j ACCEPT
禁止所有的数据包,不接收任何网络访问:iptables -t filter -I INPUT -j ACCEPT
设置指定链的默认策略:iptables -t nat -P FORWARD ACCEPT 
根据索引删除指定链的规则:iptables -t nat -D FORWARD 1

iptables命令使用iptables开头,以下是一些常用参数:

参数作用
-t [表名]指定要操作的表,默认是filter表
-A [链名]指定要操作的链,append,在该链的末尾添加规则
-I [链名]指定要操作的链,Insert,在该链的首部添加规则
-D [链名]指定要操作的链,delete,根据索引删除规则
-s [源地址]source,设置数据包的源地址要求
-d [目标地址]destination,设置数据包的目标地址要求
-p [通信协议]prot,设置数据包的通信协议要求
- -dport [目标地址端口]destination port,设置目标地址的端口要求
-j [处理动作]jump,设置数据包匹配要求时的处理动作

其他参数可以通过iptables --help 查看哈,太多了就不列举了。

关于设置防火墙策略:

白名单:把指定链的默认策略设置为DROP,只设置允许数据包通过的规则,实现只有匹配规则的数据包才能进行通信,其余通信将被拒绝或是屏蔽。

黑名单:把链的默认策略设置为ACCEPT,只设置禁止数据包通过的规则,实现只有匹配规则的数据包不能够进行通信,其余通信将会允许通过。

Tip:iptables重启的时候默认会清空规则,可以要做好相应的重启策略,对应白名单,通常不建议更改链的默认策略为DROP,一旦规则清空,所有的数据包都不能够通过,包括自己,如果是服务器,那么将会无法进行ssh远程连接。因此可以利用从上到下的匹配规则,白名单可以在最后一条规则设置为拒绝所有数据包。

关于设置一连串的ip地址:

  • –src-range: 取代-s参数,可以设置一串连续的ip,例如 --src-range 192.168.1.127-192.168.1.146
  • –dst-range: 取代-d参数,可以设置一串连续的ip,例如 --dst-range 192.168.1.127-192.168.1.146

4. 自定义链

除了iptables提供的链,我们可以通过自定义链管理更多的规则,值得一提的是自定义链并不能直接使用和删除。需要被默认的链引用才能使用,只有当链中没有规则并且没有被引用时才能进行删除

创建自定义链:						iptables -t filter -N NEW_CHAIN
在默认链中引用自定义链:				iptables -t filter -I INPUT -j NEW_CHAIN
重命名自定义链:						iptables -E NEW_CHAIN RENAME_CHIAN
删除一个符合规则的自定义链:			iptables -X RENAME_CHAIN

三、关于iptables和docker

1. 背景

在实际开发过程中,Docker服务默认使用iptables作为端口、地址转发和映射,并且Docker桥接模式使用的Docker0网卡在iptables中不受常用的filter表下的INPUT链控制,因此做好Docker服务的安全策略十分必要。
在这里插入图片描述

  • 外部网络在访问Docker容器服务时,先通过iptables中的NAT表的PREROUTING链,Docker会在iptables中添加转发规则。因此目标地址为宿主机,端口为映射端口的数据包,会被FORWARD进行转发。
  • 经过NAT的DNAT(目标地址转换)操作后,目标地址以及端口可能发生改变,因此不再经过FILTER表的INPUT链(通常在此处设置规则拦截数据包),而是由FILTER表的FORWARD链处理。
  • 最后会在FILTER表中还会经过Docker创建的自定义链处理,最后发送到对应的容器当中。

2. 解决方案

根据上述的描述,iptables设置在FILTER表的INPUT链中的规则不在能够限制Docker服务的访问,除了对上述背景中提到的相关链进行修改,Docker提供了一条DOCKER-USER的链供用户进行规则设置,因此需要在Filter表中的DOCKER-USER链进行规则设定。

Docker服务在启动的时候会自动在iptables中创建相应的链,并设立规则。

			iptables -I DOCKER-USER -p tcp --dport 80 -j DROPiptables -I DOCKER-USER -s 10.10.181.201 -p tcp --dport 80 -j ACCEPT

上述规则只允许源地址为 10.10.181.201 ,目标端口为80的数据包访问Docker服务,其余目标端口为80,协议类型为TCP的数据包将会被屏蔽。

在实际开发过程中,情况可能更复杂,可以根据iptables中链的转发跳转情况进行设定,可能会存在数据包经过NAT表的转发后目标地址和端口发生改变的情况,因此DOCKER-USER表规则的设置应该视情况而定!!!

3. Demo

生产场景下希望Docker容器服务只能由指定的服务器访问,因此需要在iptables中添加一些规则。

小技巧:
iptables -t 表名 -I 链名 -j LOG --log-prefix=“logNamePrefix”
添加一条日志规则,当数据包通过这条规则的时候会记录到日志中,并以logNamePrefix为前缀。
日志默认存放路径:/var/log/messages

上文提到已经提及数据包流转顺序,不再强调哈。

下边介绍外部是如何访问Docker服务的。


NAT表的PREROUTING链:
在这里插入图片描述

  • 数据包经过LOG规则会被记录,其余的自定义链只需关注DOCKER这条即可(其余两条规则为empty)。
  • DOCKER这条自定义链作为规则被引用,ADDRTYPE match dst-type LOCAL表示只有目标地址为本机相关的才符合规则进入自定义链中。

NAT表的DOCKER链:
在这里插入图片描述

  • 该链为Docker服务创建的自定义链,会根据容器启动/创建时的指定参数进行配置。
  • 只有目标地址为本机相关,才能进入这条链中进行匹配。

例如: 第二条规则的匹配含义。
将通信协议为tcp且目标端口为8443的的数据包进行DNAT(目标地址转换),目标地址变换为172.17.0.2,目标端口变换为443


FILTER表的FORWARD链:
在这里插入图片描述
LOG规则顺序插入错误了,应该在第一条哈。 and 只关注第一条DOCKER-USER的自定义链就好

  • DOCKER-USER链为docker预留给用户进行修改编辑的链,用户自定义网络配置可以在这里实现。

FILTER表的DOCKER-USER链:
在这里插入图片描述

  • 此处设置相应的规则,因为生产环境地址保密哈.
  • 172.17.0.x通常为桥接模式下Docker容器的内部地址,不只要允许外部访问,还要允许内部相应。

/var/log/messages文件相关内容,有兴趣的可以研究一下数据包流动情况。
在这里插入图片描述

具体问题具体分析,配置不一样的可能需要做相应更改,以上仅作参照。

这篇关于Iptables快速上手的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116751

相关文章

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简

CentOs7上Mysql快速迁移脚本

因公司业务需要,对原来在/usr/local/mysql/data目录下的数据迁移到/data/local/mysql/mysqlData。 原因是系统盘太小,只有20G,几下就快满了。 参考过几篇文章,基于大神们的思路,我封装成了.sh脚本。 步骤如下: 1) 先修改好/etc/my.cnf,        ##[mysqld]       ##datadir=/data/loc

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室

UE5 半透明阴影 快速解决方案

Step 1: 打开该选项 Step 2: 将半透明材质给到模型后,设置光照的Shadow Resolution Scale,越大,阴影的效果越好

快速排序(java代码实现)

简介: 1.采用“分治”的思想,对于一组数据,选择一个基准元素,这里选择中间元素mid 2.通过第一轮扫描,比mid小的元素都在mid左边,比mid大的元素都在mid右边 3.然后使用递归排序这两部分,直到序列中所有数据均有序为止。 public class csdnTest {public static void main(String[] args){int[] arr = {3,

快速幂(基础算法)

文章目录 目的基本例子暴力代码思路讲解优化(即快速幂)位运算写法(终极优化) 目的 减小时间复杂度 基本例子 a的b次方,最后取模 暴力代码 long long ans=1;long long a,b;for(long long i=1;i<=b;i++){ans*=a;}ans%=c; 当数据大的时候就不行了 思路讲解 3¹⁰=(3²)⁵= 9⁵ =

Kafka (快速)安装部署

文章目录 1、软件下载&配置环境1_JDK安装2_Zookeeper安装3_Kafka安装 2、单机安装1_配置主机名和IP映射2_单机Kafka配置 3、集群安装1_配置主机名和IP的映射关系2_时钟同步3_Zookeeper配置信息4_集群Kafka配置 4、kafka的其他脚本命令 1、软件下载&配置环境 下面的操作无论是单机部署还是分布式集群环境下都是通用的。 准