Linux中的iptables防火墙

 更新时间:2024年09月13日 16:27:47   作者:活老鬼  
iptables防火墙由netfilter和iptables组成,其中netfilter是内核态的数据包过滤系统,iptables是用户态的防火墙管理程序,iptables包含raw、mangle、nat和filter四个规则表,以及INPUT、OUTPUT、FORWARD、PREROUTING和POSTROUTING五个规则链

一、iptables概述

iptables防火墙是Linux系统防火墙的一种,实际上由两个组件netfilter和iptables组成。

netfilters与iptables的关系:

  • netfilter:属于“内核态”的防火墙功能体系。是内核的一部分,由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集。
  • iptables:属于“用户态”的防火墙管理体系。是一种用来管理Linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常位于/sbin/iptables文件下。

netfilter/iptables后期简称为iptables。iptables是基于内核的防护墙,其中内置了raw、mangle、nat、filter四个规则表。表中所有规则配置后,立即生效,不需要重启服务。

二、规则表与规则链结构(四表五链)

1.简述

  • 规则表(四表)的作用:容纳各种规则链。
  • 规则链(五链)的作用:容纳各种防火墙规则。

总结:表中有链,链中有规则。

2.四表(规则表)

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

数据包到达防火墙时,数据表之间的优先顺序:

raw -> mangle -> nat -> filter

3.五链(规则链)

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

三、数据链过滤的匹配流程

  • 入站数据:PREROUTING -> INPUT -> 本机的应用程序
  • 出站数据:本机的应用程序 -> OUTPUT -> POSTROUTING
  • 转发数据:PREROUTING -> FORWARD -> POSTROUTING

四、iptables命令行配置方法

1.命令格式

iptables -t "表名" "管理选项" "链名" "匹配条件" -j "控制类型"

  • 不指定表名时,默认指filter表
  • 不指定链名时,默认值表内所有链
常用管理选项
常用选项解释
-A--apend 在指定表的末尾追加新规则
-I--insert 在指定链的开头插入一条新规则,不指定序号时默认在开头插入新规则
-R--replace 修改、替换指定链中某一条的规则,可指定序号或具体内容
-P--policy 设置指定链的默认策略
-D--delete 删除指定链中的某一条规则
-F--flush 清空指定链中的所有规则,若为指定链名,则清空表中所有链
-L--list 列出指定链中的所有规则,若为指定链名,则列出表中所有链
-n--numeric 使用数字形式输出结果,如显示IP地址而不是主机名
-v显示详细信息,包括每条规则的匹配包数量和匹配字节数
--line-numbers查看规则时,显示序号
常用的控制类型
常用控制类型解释
ACCEPT允许数据包通过
DROP直接丢弃数据包,不给出任何回应信息
REJECT拒绝数据包通过,会给数据发送端一个响应信息
SNAT修改数据包的源地址
DNAT修改数据包的目的地址
REDIRECT重定向改变目的端口,将接受的包转发至本机的不同端口
MASQUERADE伪装成一个非固定公网IP地址
LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

2.基本匹配条件

基本匹配条件解释
-p指定协议
-s指定源地址
-d指定目的地址
-i指定入站网卡
-o指定出站网卡

3.隐含匹配

需以特定的协议匹配作为前提。

3.1.端口匹配

匹配条件解释
--sport源端口
--dport目的端口

例:

iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT

ps:--sport 和 --dport 必须配合-p "协议类型"使用

3.2 TCP标志位匹配

标志位解释
SYN同步位
ACK确认位
FIN结束位
RST重置位
URG紧急位
PSH推送位

例:

iptables -I INPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT

拒绝来自22端口的SYN之外的tcp包(只接收SYN包)

3.2 ICMP类型匹配

类型代码解释
Echo-Reques8请求
Echo-Reply0回显
Destination-Unreachable3目标不可达

例:

iptables -A INPUT -p icmp --icmp-type 8 -j -DROP
#禁止其他主机ping本机

3.3 显示匹配

要求以“-m 扩展模块”的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件。

3.3.1 多端口匹配:

-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表

例:

iptables -A INPUT -p tcp -m multiport --dport 80,22,21 -j ACCEPT

3.3.2 IP范围匹配:

-m iprange --src-range 源ip范围
-m iprange --dst-range 目的ip范围

例:

iptables -A FORWARD -p udp -m iprange --src-range 192.168.80.100-19.2169.80.200

3.3.3 mac地址匹配

-m mace --mace-source "mac地址"

3.3.4 状态匹配

-m state --state "连接状态"
常见的状态连接解释
NEW与任何连接无关的,还没开始连接
ESTABLISHED响应请求或者已建立连接的,连接态
RELATED与已有连接有相关性的,衍生态,一般与ESTABLISHED 配合使用
INVALID无效的封包,例如数据破损的封包状态

例:

iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

五、SNAT与DNAT

均需网关开启IP路由转发:

临时打开 echo 1 > /proc/sys/net/ipv4/ip_forward 或 sysctl -w net.ipv4.ip_forward=1

永久打开:

vim /etc/sysctl.conf

....
net.ipv4.ip_forward=1    #将此行写入配置文件


sysctl -p    #载入配置

1.SNAT

SNAT用于在网络中修改数据包的源地址。

SNAT转换前提条件:

  • 局域网各主机已正确设置IP地址、子网掩码、默认网关地址
  • Linux网关开启IP路由转发
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens36 -j SNAT --to-source 12.0.0.1-12.0.0.10

2.DNAT

DNAT用于在网络中修改数据包的目的地址,通常是为了保护内网服务器的安全。

DNAT转换前提条件:

  • 局域网的服务器能够访问Internet
  • 网关的外网地址有正确的DNS解析记录
  • Linux网关开启IP路由转发
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.80.11

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 系统讲解Apache Kafka消息管理与异常处理的最佳实践

    系统讲解Apache Kafka消息管理与异常处理的最佳实践

    Apache Kafka 作为分布式流处理平台的核心组件,广泛应用于实时数据管道、日志聚合和事件驱动架构,下面我们就来系统讲解 Kafka 消息管理与异常处理的最佳实践吧
    2025-04-04
  • Linux服务器系统通过命令查看端口是否被占用的方法

    Linux服务器系统通过命令查看端口是否被占用的方法

    在 Linux 服务器系统中,端口是网络通信的关键资源,每个服务通常监听一个或多个端口,用于处理外部请求或内部通信,本文将详细介绍几种常用的 Linux 命令,帮助管理员高效检测和诊断端口占用情况,需要的朋友可以参考下
    2026-02-02
  • 查看Linux内存条数与清理内存的命令方法

    查看Linux内存条数与清理内存的命令方法

    下面小编就为大家带来一篇查看Linux内存条数与清理内存的命令方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Apache 二级域名实现方法介绍

    Apache 二级域名实现方法介绍

    首先,你的拥有一个有泛域名解析的顶级域名,例如:domain.com
    2009-05-05
  • Ubuntu 18.04 安装MySQL时未提示输入密码的问题及解决方法

    Ubuntu 18.04 安装MySQL时未提示输入密码的问题及解决方法

    这篇文章主要介绍了Ubuntu 18.04 安装MySQL时未提示输入密码的问题及解决方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • Linux下gdb调试之打断点的实现方法

    Linux下gdb调试之打断点的实现方法

    这篇文章主要介绍了Linux下gdb调试之打断点的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Linux添加新硬盘并加入原有分区的实现

    Linux添加新硬盘并加入原有分区的实现

    文章介绍了如何在Linux系统中使用LVM(逻辑卷管理)来扩展分区空间,包括添加新硬盘、创建LVM分区、建立物理卷、将PV加入VG(卷组)以及调整LV(逻辑卷)大小,特别提到在调整根目录大小时遇到的问题,通过检查文件系统类型并使用相应工具(如xfs_growfs)解决了问题
    2026-03-03
  • 在Linux中打开、提取和创建rar文件的操作方法

    在Linux中打开、提取和创建rar文件的操作方法

    RAR 是一种流行的文件压缩格式,以其高效的压缩算法和将大文件压缩为较小档案的能力而闻名,虽然 Linux 本身支持 ZIP 和 TAR 等常见档案格式,但处理 RAR 文件需要额外的工具,在这篇博文中,我们将探讨如何在 Linux 中打开、提取和创建 RAR 文件,需要的朋友可以参考下
    2024-04-04
  • ubuntu20.04虚拟机无法上网的问题及解决

    ubuntu20.04虚拟机无法上网的问题及解决

    这篇文章主要介绍了ubuntu20.04虚拟机无法上网的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Linux创建Shell脚本.sh文件的三种方法

    Linux创建Shell脚本.sh文件的三种方法

    本文详细介绍了在Linux系统中创建Shell脚本文件的几种方法,包括使用vim、nano编辑器和快速创建空文件,同时,强调了赋予脚本执行权限和建议将脚本放在/usr/local/bin/目录下的重要性,需要的朋友可以参考下
    2026-02-02

最新评论