前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文了解iptables

一文了解iptables

作者头像
红客突击队
发布2022-09-30 14:21:21
5690
发布2022-09-30 14:21:21
举报
文章被收录于专栏:kaydenkayden

一文了解iptables

前言

netfilter/iptables(简称 iptables)组成 Linux 平台下的包过滤防火墙

iptables 组件是一种工具,也称为用户空间,它使插入、修改和除去信息包过滤表中的规则变得容易

netfilter 组件也称为内核空间,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集

安装 :yum -y install iptables iptables-services 重启:systemctl restart iptables 保存:service iptables save

一、原理

1、iptables基础

iptables 准确来讲并不是防火墙,真正的防火墙是运行于系统内核中的 netfilter,而 iptables 仅仅是 netfilter 的代言人,其所负责的主要功能便是与用户交互,获取到用户的要求,并转化成 netfilter 可以接受的信息。主要工作在网络层,针对IP数据包。体现在对包内的IP地址、端口等信息的处理上

  • netfilter netfilter属于“内核态”(Kernel Space,又称为内核空间)的防火墙功能体系。 是内核的一部分,由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集。
  • iptables iptables属于“用户态”(User Space,又称为用户空间)的防火墙管理体系。 是一种用来管理Linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常位于/sbin/iptables目录下。
  • netfilter/iptables netfilter/iptables后期简称为iptables。 iptables是基于内核的防火墙,其中内置了raw、mangle、nat和 filter 四个规则表。表中所有规则配置后,立即生效,不需要重启服务
防火墙的实现机制

防火墙的核心处理机制是过滤,而说到过滤,就必须具有“条件 & 动作”这两个关键要素,而在 iptables 中,这两种要素分别叫做“rule & target”,可以理解成符合 rule 的流量将会去往 target。

匹配规则的要素

防火墙的处理对象是网络流量,而对于网络流量来讲,标识流量的最重要的信息便是五元组,包括:S_IP, S_PORT, D_IP, DI_PORT, TCP/UDP,iptables 常用的也往往是根据五元组中的某个或某些要素进行过滤

举个栗子

防火墙的主要功能是过滤,那我们不妨把防火墙看成是个社区的废水处理厂,负责将社区的生活废水收集起来,经过多道工序的处理后,返还给社区。

  • 链:既然是要处理废水,那我们首先要在废水处理的个别关键环节上设置集中处理的“处理链”,在“处理链”中放置各种不同的过滤网、膜以及化学配方。
  • 表:即便是不同的处理链中,可能会用到一些相同的处理技术,比如粗滤膜、细滤膜,为了方便这些技术的复用,废水处理厂将功能类似的处理技术封装成集合,这样能够更加方便地使用

2、四表五链

(1)链

链就是从报文进入到报文离开这整个期间,计算机处理报文的关键环节 就好比污水处理厂,污水进入前得处理一下,进入后得沉淀一下,送回时又得进行一些处理,那么这3个节点就是关键环节

五链:

  • INPUT:处理入站数据包,匹配目标IP为本机的数据包。
  • OUTPUT:处理出站数据包,一般不在此链上做配置。
  • FORWARD:处理转发数据包,匹配流经本机的数据包。
  • PREROUTING链:在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网中的80端口映射到路由器外网端口上。
  • POSTROUTING链:在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网。

链的匹配顺序

  • 主机型防火墙
    • 入站数据(来自外界的数据包,且目标地址是防火墙本机) PREROUTING --> INPUT --> 本机的应用程序
    • 出站数据(从防火墙本机向外部地址发送的数据包) 本机的应用程序 --> OUTPUT --> POSTROUTING
  • 网络型防火墙
    • 转发数据(需要经过防火墙转发的数据包) PREROUTING --> FORWARD --> POSTROUTING
  • 规则链内的匹配顺序
    • 自上向下按顺序依次进行检查,找到相匹配的规则即停止(LOG策略例外,表示记录相关日志)
    • 若在该链内找不到相匹配的规则,则按该链的默认策略处理(未修改的状况下,默认策略为允许)
(2)表

在每个链上都有一堆规则,但是部分规则是相似的,那我们把一些实现相同功能的规则放在一起,就能轻松的完成复用了。 好比污水处理厂,粗滤、细滤基本上是好多关键环节都要用到的,那何不将粗滤网与细滤网直接封装到一根管子里,要用的时候,直接整根管子接上去就能一次实现两个功能,岂不方便?

四表:

  • raw表:确定是否对该数据包进行状态跟踪。包含两个规则链,OUTPUT、PREROUTING。
  • mangle表:修改数据包内容,用来做流量整形的,给数据包设置标记。包含五个规则链,INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。
  • nat表:负责网络地址转换,用来修改数据包中的源、目标IP地址或端口。包含三个规则链,OUTPUT、PREROUTING、POSTROUTING。
  • filter表:负责过滤数据包,确定是否放行该数据包(过滤)。包含三个规则链,INPUT、FORWARD、OUTPUT。
  • 在 iptables 的四个规则表中,mangle 表和 raw 表的应用相对减少。

匹配顺序

3、规则的概念

规则主要包含两部分,即“条件 & 动作”

(1)匹配条件

iptables 主要是通过网络流量的五元组(某个或某些)来进行匹配,包括:

  • S_IP:源 IP
  • S_PORT:源端口
  • D_IP:目的 IP
  • D_PORT:目的端口
  • TCP/UDP:四层协议
(2)处理动作

iptables 中称为 target

  • ACCEPT:允许数据包通过。
  • DROP:直接丢弃数据包。不回应任何信息,客户端只有当该链接超时后才会有反应。
  • REJECT:拒绝数据包。会给客户端发送一个响应的信息 。
  • SNAT:源 NAT,解决私网用户用同一个公网 IP 上网的问题。
  • MASQUERADE:是 SNAT 的一种特殊形式,适用于动态的、临时会变的 IP 上。
  • DNAT:目的 NAT,解决私网服务端,接收公网请求的问题。
  • REDIRECT:在本机做端口映射。
  • LOG:在 /etc/log/messages 中留下记录,但并不对数据包进行任何操作。

二、指令

1、常用参数

用法:iptables + -t 表名 + 规则/链管理参数 + 匹配参数 + 动作类型参数

代码语言:javascript
复制
代码语言:javascript
复制
#  选择表
-t  #  对指定表进行操作(必须是 raw、nat、filter、mangle 中的一个。如没有指定则默认为 filter表)

#  规则管理
-A  #  在指定规则链的末尾加入新规则
-I  #  在指定规则链的头部加入新规则(默认在第一行添加)
-D  #  删除指定链中的一条规则(可按规则序号和内容删除)
-R  #  修改、替换指定链中的某一条规则(可按照规则序号和内容替换)

#  链管理
-P  #  设置指定链默认策略 
-N  #  新建一条用户自己定义的规则链
-X  #  删除指定表中用户自定义的规则链
-E  #  重命名用户定义的链(不改变链本身)
-Z  #  将所有表的所有链的字节和数据包计数器清零

#  规则链
INPUT       #  处理入站的数据包
OUTPUT      #  处理出站的数据包
FORWARD     #  处理转发的数据包
PREROUTING  #  处理入站的路由规则
POSTROUTING #  处理出站的路由规则

#  匹配(加感叹号 “!“表示这个目标除外(加感叹号后需加空格后在加匹配项))
-s  #  匹配来源地址 IP/MASK
-d  #  匹配目标地址
-i  #  网卡名称(匹配从这块网卡流入的数据)
-o  #  网卡名称(匹配从这块网卡流出的数据)
-m  #  使用扩展模块
-p  #  匹配协议(如:tcp、udp、icmp)
    tcp     #  扩展选项:--source-port (扩展选项可用 iptables -p tcp -h 查看)
    udp     #  扩展选项:--source-port (扩展选项可用 iptables -p icmp -h 查看)
    icmp    #  可用扩展:  --icmp-type  (可用扩展可用 iptables -p icmp -h 查看)
    --dport 80  #  匹配目标端口 80
    --sport 81  #  匹配来源端口 81

#  指定动作类型
-j  #  指定动作类型
    动作类型:
    ACCEPT      #  允许数据包通过
    REJECT      #  拒绝数据包通过(必要时会发送响应信息)
    DROP        #  直接丢弃(不给出任何回应)
    QUEUE       #  中断过滤程序,将封包放入队列,交由其它程序处理
    RETURN      #  停止当前链中的后续规则,并返回到调用链(the calling chain)中
    REDIRECT    #  在本机上做端口映射
    DNAT        #  改变数据包的目的地址
    SNAT        #  改变数据包的源地址
    MASQUERADE  #  SNAT 的一种特殊形式,适用于动态、临时会变的 IP 上(只能用户 nat 表的 POSTROUTING 链)
    LOG         #  在 /var/log/messages 文件中记录日志信息,然后在将数据包传递给下一条规则

#  查看/清空 规则
-L  #  列出指定链中所有的规则
-n  #  IP地址和端口会一数字的形式打印
-v  #  详细输出
-F  #  清空规则链

2、扩展模块

使用方法:iptables + -m + 扩展模块名 可用扩展选项可用:iptables + -m + 扩展名 + -h 查看

limit(速率限制)
代码语言:javascript
复制
#  每分钟允许通过 5 个 icmp 包(默认为 3/小时,秒:/sec  分钟:/minute   小时:/hour  天:/day)
iptables -A INPUT -p icmp -m limit --limit 5/minute -j ACCEPT
#  每分钟允许通过 5 个 icmp 包,最多不超过 10 个
iptables -A INPUT -p icmp -m limit --limit 5/minute --limit-burst 10 -j ACCEPT

multiport( 多端口匹配)
代码语言:javascript
复制
#  匹配 22,端口(最多可指定15个端口)
iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT

iprange(匹配指定范围内的地址)#
#  匹配指定范围内的地址
iptables -A INPUT -p tcp -m iprange --src-range 192.168.1.0-192.168.1.111 --dport 22 -j ACCEPT
string(字符串匹配)
代码语言:javascript
复制
#  当服务端返回数据报文检查到有关键字 “test" 时,则丢弃该报文(能够检测到报文应用层中的字符串  注:该条规则需添加到 OUTPUT 链)
iptables -A OUTPUT -p tcp --dport 80 -m string --algo kmp --string "test" -j DROP
connlimit(连接数限制)
代码语言:javascript
复制
#  限制同一 IP 最多同时 10 个 http 连接
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT
#  限制每组 C 类 IP 最多同时 10 个 http 连接
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j DROP
#  限制指定网段的 IP 最多同时 10 个 http 连接
iptables -A INPUT -s 192.168.1.0/24 -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT
recent(时间限制)
代码语言:javascript
复制
--name      #  设置列表名称
--resource  #  源地址
--redest    #  目的地址
--seconds   #  指定时间内(单位:秒)
--hitcount  #  匹配次数
--set       #  将地址添加进列表,并更新信息(包含地址加入的时间戳)
--rcheck    #  匹配列表中的源地址(以第一个匹配计算时间)
--update    #  类似 rcheck(以最后一个匹配计算时间)
--remove    #  在列表里删除相应地址(后面接列表名称及地址)

#  将访问的主机记录到 test 列表,并放行
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name test --set -j ACCEPT
#  如访问的主机在 test 列表有记录则限制 80 端口 60 秒 内每个 IP 只能发起 20 个新的连接,超过则记录日志(日志前缀为 DDOS:)
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name test --rcheck --seconds 60 --hitcount 20 -j LOG --log-prefix 'DDOS:' --log-ip-options
#  如访问的主机在 test 列表有记录则限制 80 端口 60 秒 内每个 IP 只能发起 20 个新的连接,超过则丢包
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name test --rcheck --seconds 60 --hitcount 20 -j DROP
state(状态检查)
代码语言:javascript
复制
NEW:新建立一个会话
ESTABLISHED:已建立的连接
RELATED:有关联关系的连接
INVALID:无法识别的连接

#  放行 ssh 的首次连接状态
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
#  放行有关联的连接跟已建立的连接
iptables -A INPUT -m state --state  RELATED,ESTABLISHED -j ACCEPT

3、规则表和规则链

(1)规则表(tables)

规则表提供特定的功能(内置了4个表),类似用户组,每个组都有不同的功能,并且都有对应的用户(规则链)

代码语言:javascript
复制
filter  #  负责过滤功能(内核模块:iptables_filter)
nat     #  负责网络地址转换功能(内核模块:iptable_nat)
mangle  #  拆解、修改、封装报文(内核模块;iptable_mangle)
raw     #  决定数据包是否被状态跟踪机制处理内核(内核模块:iptable_raw)

规则表优先顺序(从左往右):raw <--- mangle <--- nat <--- filter

规则表对应的规则链:

代码语言:javascript
复制
raw 表:PREOUTING、OUTPUT
mangle 表:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat 表:PREROUTING、INPUT、OUTPUT、POSTROUTING
filter 表:INTPUT、FORWARD、OUTPUT

(2)规则链(chains)

规则链是规则的集合。对特定的数据包设置相应的规则(读取规则链时是按照从上往下的顺序)

代码语言:javascript
复制
INPUT       #  处理入站的数据包
OUTPUT      #  处理出站的数据包
FORWARD     #  处理转发的数据包
PREROUTING  #  数据包进入路由表前
POSTROUTING #  数据包进入路由表后

入站顺序(从左往右):PREROUTING <--- INPUT 出站顺序(从左往右):OUTPUT <--- POSTROUTING 转发顺序(从左往右):PREROUTING <--- FORWARD <--- POSTROUTING

4、实例

查看/删除 规则
代码语言:javascript
复制
iptables -L             #  列出所有规则
iptables -L -nv         #  查看详细信息(IP 跟 端口会以数字形式显示)
iptables -t nat -L      #  列出 nat 表中的所有规则
iptables -t nat -L -nv  #  查看详细信息(IP 跟 端口会以数字形式显示)
iptables -F             #  清除所有规则(如不指定表,则默认表为 filter)
iptables -t nat -D INPUT 1  #  删除 nat 表 INPUT 链下的第一条规则
在指定表中新建规则(如不指定,则默认为 filter 表)
代码语言:javascript
复制
#  在 nat 表中开放 80 端口
iptables -t nat -A INPUT -p tcp --dport 80 -j ACCEPT
设置白名单
代码语言:javascript
复制
#  允许 192.168.1.0/24 网段的主机访问
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT

#  允许 192.168.2.0/24 网段的主机访问本机的 80 端口
iptables -A INPUT -p all -s 192.168.2.0/24 --dport 80 -j ACCEPT
指定范围
代码语言:javascript
复制
#  指定 IP 范围
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
#  指定端口范围
iptables -t nat -A INPUT -p tcp --dport 90:100 -j ACCEPT

端口映射
代码语言:javascript
复制
#  当别的主机访问本地 80 端口时会被重定向到 8080 端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
禁止
代码语言:javascript
复制
#  禁 Ping
iptables -A INPUT -p icmp -j DROP
#  禁 Ping
iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP
#  禁止 MAC 地址为 00:11:22:33:44:55 的主机访问
iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55 -j DROP
#  禁止转发 MAC 地址为 00:11:22:33:44:55 的主机的数据
iptables -A FORWARD -m mac --mac-source 00:11:22:33:44:55 -j DROP

结语

简单了解iptables


红客突击队于2019年由队长k龙牵头,联合国内多位顶尖高校研究生成立。其团队从成立至今多次参加国际网络安全竞赛并取得良好成绩,积累了丰富的竞赛经验。团队现有三十多位正式成员及若干预备人员,下属联合分队数支。红客突击队始终秉承先做人后技术的宗旨,旨在打造国际顶尖网络安全团队。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 红客突击队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一文了解iptables
  • 前言
  • 一、原理
    • 1、iptables基础
      • 2、四表五链
        • 3、规则的概念
        • 二、指令
          • 1、常用参数
            • 2、扩展模块
              • 3、规则表和规则链
                • 4、实例
                • 结语
                相关产品与服务
                NAT 网关
                NAT 网关(NAT Gateway)提供 IP 地址转换服务,为腾讯云内资源提供高性能的 Internet 访问服务。通过 NAT 网关,在腾讯云上的资源可以更安全的访问 Internet,保护私有网络信息不直接暴露公网;您也可以通过 NAT 网关实现海量的公网访问,最大支持1000万以上的并发连接数;NAT 网关还支持 IP 级流量管控,可实时查看流量数据,帮助您快速定位异常流量,排查网络故障。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档