运维安全04 - iptable的介绍以及使用

网络安全

iptables

iptables 理解为命令空间的命令行工具

iptables理解为命令空间的命令行工具

netfilter为内核空间的防火墙核心服务,真正的防火墙

左上角iptables服务为CenstOS6及早期版本的iptables守护进程,右上角firewalld是CentOS7及更高版本的itables守护进程,但两者都需要itables命令与netfilter进行通讯

netfilter:内核空间的防火墙核心服务

  • 位置:运行在 Linux 内核空间(Kernel Space)。

  • 作用:是 Linux 系统真正的防火墙功能实现者,负责数据包过滤、NAT(网络地址转换)、连接跟踪等。

  • 特点

    • 提供了多个"钩子"(hook points),允许在数据包经过网络协议栈的不同阶段进行拦截和处理。

    • 支持多种功能模块,如 filter(过滤)、nat(地址转换)、mangle(修改报文)、raw(原始处理)等。

  • 不可直接操作:用户不能直接与 netfilter 交互,必须通过用户空间的工具来配置规则。

iptables:用户空间的命令行工具

  • 位置:运行在用户空间(User Space)。

  • 作用:是一个用于配置 Linux 防火墙规则的命令行工具。

  • 与 netfilter 的关系

    • iptables 是对 netfilter 功能的封装,它将用户定义的规则转换为内核能识别的数据结构,并通过系统调用(如 setsockopt)传递给 netfilter。

    • 实际上,iptables 命令最终是通过调用 netfilter 提供的接口来生效的。

CentOS 6 及更早版本:使用 iptables 服务

  • 服务名称:iptables

  • 功能

    • 启动时加载预定义的规则文件(通常位于 /etc/sysconfig/iptables)。

    • 提供服务脚本(如 /etc/init.d/iptables)用于启动、停止、保存规则。

  • 规则持久化

    • 使用 service iptables save 命令将当前运行的规则保存到配置文件中。
  • 本质:该服务只是封装了 iptables 命令,定时或开机时自动应用规则。

CentOS 7 及更高版本:使用 firewalld 服务

  • 服务名称:firewalld

  • 功能

    • 提供了一个动态管理防火墙的守护进程。

    • 支持区域(zone)的概念,便于按网络环境分类管理策略。

    • 支持 D-Bus 接口,允许图形界面或其他程序动态调整规则。

  • 底层机制

    • firewalld 实际上也是基于 iptables(或 nftables)构建的。

    • 它将用户配置的高级策略翻译成具体的 iptablesnftables 规则。

  • 优点

    • 更加灵活、易于维护。

    • 支持运行时配置更改而无需重启整个防火墙。

==为什么有firewalld还要学习iptables?==

firewalld 并不是"替代"iptables,而是"基于"iptables/nftables

  • firewalld 是一个更高层次的防火墙管理服务。

  • 它通过 D-Bus 接口动态管理规则,并将这些规则最终转换为 iptablesnftables 的实际命令。

  • 所以说,无论用的是 firewalldufw 还是其他图形化界面工具,它们的背后依然是 iptablesnftables

类比理解:

可以把 firewalld 想象成是一个"遥控器",而 iptables 是电视本身。虽然遥控器方便了操作,但如果不懂电视的原理,就很难进行高级调试或修复问题。

netfilter 过滤流程

在 Linux 内核中,所有进出或转发的数据包都会经过 netfilter 框架 提供的多个"检查点"或称为"钩子(hook points)"。

这些钩子是我们在使用 iptablesnftables 编写规则时所针对的位置。

钩子名称 描述
PREROUTING 数据包进入路由决策前(即系统还没决定这个包是发给本机还是转发出去)
INPUT 数据包被路由到本机(即目标地址是本机)
FORWARD 数据包需要被转发(即目标地址不是本机)
OUTPUT 由本机本地进程发出的数据包
POSTROUTING 数据包即将离开本机之前(路由之后)

netfilter 包过滤流程示意图:

每个钩子可以包含多个链(chain),而每条链中又可以添加多条规则(rule)。

数据包会按顺序依次通过这些规则,直到匹配某一条规则并执行相应的动作(如 ACCEPT、DROP、MASQUERADE 等)。

远程访问本地服务

入口 --> prerouting --> 路由判断 --> input --> 本地服务

本地客户机访问远程资源

本地服务 --> output --> 路由 --> postrouting --> 出站

转发

入站 --> preouting -- 路由 --> forward --> 路由 --> postrouting --> 出站

prerouting , input , output ,postrouting 每一个都是一个检查站,每个检查站又会有多个规则。

iptables 表

iptables 中,"表"(Table)是用来 分类管理规则的逻辑结构。

每个"表"负责处理特定类型的功能,并且每个表只能在特定的 hook 点(如 PREROUTING、INPUT、OUTPUT 等) 上生效。

从上图可以看出 Linux 防火墙分有 prerouting , input , output ,postrouting 等检查站,每个检查站有 多个规则,为了便于管理 iptables 将规则进行归类,这个归类在 iptables 中叫做表。

可以把"表"理解为不同的"功能模块",它们各自专注于解决防火墙中的一类问题。

iptables 中的表有如下几种:

表名 功能说明 主要用途 常见 hook 点
filter 默认表,用于过滤数据包 控制哪些包可以被允许或拒绝 INPUT, FORWARD, OUTPUT
nat 网络地址转换(Network Address Translation) 修改源/目的地址,实现 SNAT/DNAT/MASQUERADE PREROUTING, OUTPUT, POSTROUTING
mangle 修改数据包头部信息 设置 TTL、TOS、MARK 等字段,常用于 QoS 或高级路由 PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw 控制是否对数据包进行连接状态跟踪 提高性能,避免某些包进入连接追踪系统 PREROUTING, OUTPUT
security 强制访问控制策略(SELinux 相关) 实现基于安全上下文的网络访问控制 INPUT, OUTPUT, FORWARD

filter 表:默认表,用于数据包过滤

  • 作用:这是最常用的表,用于定义"允许"或"拒绝"流量的规则。

  • 典型用途

    • 允许 SSH 访问

    • 拒绝某个 IP 地址访问 Web 服务

    • 限制本地程序对外访问

  • 主要链

    • INPUT(入站)

    • FORWARD(转发)

    • OUTPUT(出站)

nat 表:网络地址转换

  • 作用:修改数据包的源地址或目标地址,常用于 NAT(网络地址转换)场景。

  • 典型用途

    • DNAT(端口映射)

    • SNAT(源地址转换)

    • MASQUERADE(动态 SNAT,适合拨号上网)

  • 主要链

    • PREROUTING(DNAT)

    • POSTROUTING(SNAT / MASQUERADE)

    • OUTPUT(本地生成的数据包做 DNAT)

mangle 表:修改数据包头信息

  • 作用:用于修改数据包的一些头部字段,如 TTL、TOS、MARK 等,通常用于 QoS(服务质量)或高级路由策略。

  • 典型用途

    • 修改 TTL(生存时间)

    • 标记数据包以便后续策略路由使用(MARK)

    • 调整 TOS 字段以影响优先级

  • 主要链

    • 所有五个 hook 点都支持 mangle 表

raw 表:决定是否启用连接状态跟踪

  • 作用:用于控制是否对数据包进行连接状态跟踪(connection tracking),从而提高性能。

  • 典型用途

    • 忽略某些不需要状态跟踪的流量(如多播、广播)

    • 加快数据包处理速度

  • 主要链

    • PREROUTING

    • OUTPUT

security 表:强制访问控制策略(SELinux)

  • 作用:配合 SELinux 使用,用于实施基于安全策略的网络访问控制。

  • 典型用途

    • 限制不同用户、角色之间的网络访问权限

    • 安全策略隔离

  • 主要链

    • INPUT, OUTPUT, FORWARD

注意:该表在大多数系统中使用较少,除非启用了 SELinux 并配置了相关策略。

下面的命令可以查看 iptable 启用的表模块

复制代码
[root@localhost ~]# lsmod | grep iptable

过滤链与表之间的关系:

各个表中的执行是有优先级的,优先级的顺序如上图所示。

iptables 中,不同 表(table) 在数据包经过 netfilter 的 hook 点时,其规则的 执行顺序是固定的、有优先级之分的。

Hook Point 执行顺序(从先到后)
PREROUTING raw → mangle → nat
INPUT raw → mangle → filter
FORWARD raw → mangle → filter
OUTPUT raw → mangle → nat → filter
POSTROUTING mangle → nat

iptables 的基本语法

iptables [-t 表] <选项> <链> <匹配条件> <目标>

iptables -t filter -A INPUT -s 192.168.1.100 -j DROP

这个命令表示:

使用 filter 表;

在 INPUT 链中追加(-A)一条规则;

匹配源地址为 192.168.1.100 的数据包;

对匹配的数据包执行 DROP 操作(丢弃)。

  • -t 参数后跟表明,表就是上面内容提到的表,如 filter ,nat 等等

  • 选项指的是针对规则的操作,例如 : -A 添加到规则尾部, -I 插入到规则中,可以指定索引号

  • 链,上面讲述的 INPUT ,FORWARD 等链

  • 匹配条件,就是条件判断,如同编程中的判断结构

  • 目标,指定和匹配条件匹配的包的处理,比如: ACCEPT 接受, DROP 丢弃

-t 用于指定要操作的是哪个"功能模块"的规则。

参数 表名 说明
-t filter 默认表,用于过滤流量(允许/拒绝)
nat 网络地址转换(SNAT/DNAT/MASQUERADE)
mangle 修改数据包头部字段(TTL、TOS、MARK)
raw 控制连接状态跟踪
security 强制访问控制(SELinux 相关)

注意:如果不加 -t,默认使用 filter 表。
<选项>:对规则的操作指令(Action)

这部分决定了是要添加、删除、插入、查看还是修改规则。

操作 含义
-A Append,在链的末尾添加一条规则
-I Insert,在链中插入一条规则(可指定位置索引)
-D Delete,删除链中的某条规则(按编号或完整规则)
-R Replace,替换链中的某条规则
-L List,列出链中的所有规则
-F Flush,清空链中的所有规则
-Z Zero counters,清空规则计数器(匹配次数、字节数等)
-N New chain,创建一个自定义链
-X eXtended chains,删除用户自定义链
复制代码
# 查看 filter 表 INPUT 链的所有规则
iptables -t filter -L INPUT -n
​
# 清空 filter 表的所有规则
iptables -F
​
# 删除 INPUT 链中第3条规则
iptables -D INPUT 3

<链>:指定规则所在的链(chain)

每个表都有对应的链,不同链对应不同的 hook 点。

常见链包括:

链名 所属钩子点 说明
INPUT INPUT 处理发往本机的数据包
OUTPUT OUTPUT 处理本地发出的数据包
FORWARD FORWARD 处理转发的数据包(网关/路由器)
PREROUTING PREROUTING 路由前处理,常用于 DNAT
POSTROUTING POSTROUTING 路由后处理,常用于 SNAT

注意:不是所有链都存在于所有表中。例如 nat 表没有 INPUT 链。
<匹配条件>:判断哪些数据包会触发这条规则

这是规则的核心逻辑,用于精确控制哪些数据包应该被匹配。

常见匹配条件:

条件 示例 含义
-s -s 192.168.1.100 源地址匹配
-d -d 8.8.8.8 目标地址匹配
-p -p tcp 协议匹配(tcp/udp/icmp/any)
--sport --sport 22 源端口匹配
--dport --dport 80 目标端口匹配
-i -i eth0 入站接口(仅限 INPUT/FORWARD/PREROUTING)
-o -o eth0 出站接口(仅限 OUTPUT/POSTROUTING/FORWARD)
-m -m state --state NEW 加载扩展模块,如 state、limit、mac 等
-j -j ACCEPT 动作(Jump)------决定如何处理匹配的数据包
复制代码
# 匹配来自 192.168.1.100 的 TCP 流量,目标端口为 22
-s 192.168.1.100 -p tcp --dport 22

<目标动作>:匹配成功后执行的动作(Target)

用于定义当数据包满足匹配条件时,应该如何处理。

动作 含义
ACCEPT 接受数据包,不再继续匹配其他规则
DROP 丢弃数据包,不返回任何响应
REJECT 拒绝数据包,并发送拒绝信息(如 ICMP)
SNAT 源地址转换(在 POSTROUTING 中使用)
DNAT 目的地址转换(在 PREROUTING 中使用)
MASQUERADE 自动 SNAT,适用于动态 IP 地址(如拨号上网)
REDIRECT 重定向到本机另一个端口(如透明代理)
LOG 记录日志,通常配合 --log-prefix 使用
RETURN 返回上一级链,继续匹配其他规则
自定义链 跳转到自己定义的链中做进一步处理
复制代码
# 允许 SSH 流量通过
-j ACCEPT
​
# 丢弃特定 IP 的访问
-j DROP
​
# 将 HTTP 请求转发到内部服务器
-j DNAT --to-destination 192.168.1.10:80

命令示例

允许 SSH 访问

复制代码
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

禁止某个 IP 访问

复制代码
iptables -A INPUT -s 192.168.1.100 -j DROP

设置 DNAT(端口映射)

复制代码
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:8080

查看当前规则(带编号)

复制代码
iptables -L -n --line-numbers

删除某条规则(比如第3条)

复制代码
iptables -D INPUT 3

在素材中有一个专门的思维导图,请自行整理一下

web服务器防火墙配置

操作步骤

  1. 准备一个干净的CentOS,如果没有自行安装

  2. 安装Apache HTTP服务器

  3. 安装mysql服务器

  4. 使用nmap查看没有启用防火墙的系统情况

  5. 配置防火墙

  6. 使用nmap查看启用防火墙后的情况

具体步骤

安装Apache HTTP

复制代码
systemctl stop firewalld

yum install -y httpd

systemctl status httpd

systemctl start httpd

systemctl status httpd

● httpd.service - The Apache HTTP Server
	Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
 	Active: active (running) since 二 2021-08-17 10:24:40 CST; 8s ago
 	
# 访问测试
# 出现'已连接'说明已经正常启动,403错误是因为没有部署index页面

安装mariaDB

复制代码
# 1.安装,一个客户端,一个服务器
[root@localhost etc]# yum install mariadb mariadb-server

 # 默认不会启动
[root@localhost etc]# systemctl status mariadb.service

 # 2.启动
[root@localhost etc]# systemctl start mariadb.service
[root@localhost etc]# systemctl status mariadb.service
 
# 3.创建目录,保存数据文件
[root@localhost /]# mkdir /var/mariadbdata
 # 4.初始化数据库
[root@localhost /]# mysql_install_db --user=mysql --datadir=/var/mariadbdata/data

# 查看数据文件是否正常创建
[root@localhost /]# ll /var/mariadbdata/data

 # 5.使用客户端连接数据库
[root@localhost /]# mysql

create database if not exists testdb default charset utf8;

show databases;

use testdb;

insert into users values('lisen', md5('123456'));

use mysql;

create user admin@localhost identified by '123456';

grant all on testdb.* to admin@localhost; 

exit;

去浏览器测试:输入当前主机ip

安装nmap,对Linux服务器进行端口扫描 https://nmap.org

Nmap(Network Mapper) 是一个开源的网络发现和安全审计工具,广泛用于扫描主机、端口、服务、操作系统类型等信息。它可以帮助系统管理员检测网络中的活动主机、开放的服务、潜在的安全漏洞,也可以被黑客用于侦察目标系统。

在linux环境可以使用yum下载,如下所示:(用于端口扫描)

复制代码
yum install -y nmap

windows环境的安装比较简单,从官方网站下载window版程序,直接安装即可。

在安装了Apache HTTP,mariadb的linux服务器中关闭防火墙进行端口扫描测试。

停用Linux防火墙:

复制代码
[root@localhost /]# systemctl stop firewalld

在windows宿主机中使用nmap进行端口扫描(命令行):

复制代码
nmap -sS -O 192.168.107.172

Not shown: 996 closed tcp ports (reset)

这一行表示在扫描的所有TCP端口中,有996个端口是关闭的(即没有服务在监听这些端口)。
Closed(关闭)

当一个端口标记为"closed",这意味着该端口对Nmap的探测做出了响应,但没有应用程序在监听这个端口。

换句话说,虽然端口是可以访问的,但是没有服务正在使用它。

从技术上讲,"closed"状态的端口不会直接构成安全威胁,因为没有运行中的服务可以被利用或攻击。然而,如果一个端口曾经开放过并提供服务,后来才关闭了,这可能意味着该服务已被移除或重新配置,这是网络环境变化的一个标志。

尽管关闭的端口本身不构成直接威胁,但它们可能会揭示有关网络架构或历史配置的信息,这些信息可能对攻击者有帮助。例如,了解哪些端口曾被使用可以帮助推测出网络内部的服务类型及其位置。

配置防火墙

复制代码
# 查看防火墙规则
[root@localhost /]# iptables -L -n
复制代码
#配置iptables
[root@localhost /]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@localhost /]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
[root@localhost /]# iptables -A INPUT -p tcp --dport 80 -j DROP
[root@localhost /]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

配置完成后再去浏览器测试:输入ip - 结果进不

复制代码
-- nmap代替了测试,不用出去测试
nmap -sS -O 192.168.107.172

Filtered(过滤)

如果一个端口被标记为"filtered",这意味着Nmap无法确定该端口是否打开,因为它接收到的响应表明数据包被防火墙、过滤器或其他网络安全设备阻止或丢弃了。

在这种情况下,Nmap无法确认端口的状态。

防御性措施:过滤端口通常是为了增加安全性,通过限制对外部世界的暴露来减少潜在攻击的机会。

也可以在远程连接工具这里使用端口扫描仪

相关推荐
行思理9 小时前
linux 安全与防护,全方向讲解
linux·安全·github
深盾安全10 小时前
Flutter框架编译Android程序全攻略:从入门到进阶
安全
房屋安全鉴定检测10 小时前
房屋安全鉴定报告有效期多久
安全·网络安全
心 一10 小时前
Web安全基石:深入理解与防御SQL注入漏洞
sql·安全·web安全
房屋安全鉴定检测11 小时前
房屋安全鉴定需要什么条件
安全·网络安全
wanhengidc12 小时前
什么是云手机?
运维·网络·安全·游戏·智能手机
FLS16813 小时前
Kali搭建sqli-labs靶场
linux·sql·安全·网络安全
KKKlucifer14 小时前
网络安全等级保护:等级保护工作、分级保护工作、密码管理工作三者之间的关系
网络·安全·web安全
leagsoft_100316 小时前
联软科技:以“韧性安全”守护数字世界,致敬抗战胜利80周年的坚韧精神
科技·安全