网络安全
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)构建的。它将用户配置的高级策略翻译成具体的
iptables
或nftables
规则。优点
更加灵活、易于维护。
支持运行时配置更改而无需重启整个防火墙。
==为什么有firewalld还要学习iptables?==
firewalld 并不是“替代”iptables,而是“基于”iptables/nftables
firewalld
是一个更高层次的防火墙管理服务。它通过 D-Bus 接口动态管理规则,并将这些规则最终转换为
iptables
或nftables
的实际命令。所以说,无论用的是
firewalld
、ufw
还是其他图形化界面工具,它们的背后依然是iptables
或nftables
。类比理解:
可以把
firewalld
想象成是一个“遥控器”,而iptables
是电视本身。虽然遥控器方便了操作,但如果不懂电视的原理,就很难进行高级调试或修复问题。
netfilter 过滤流程
在 Linux 内核中,所有进出或转发的数据包都会经过 netfilter 框架 提供的多个“检查点”或称为“钩子(hook points)”。
这些钩子是我们在使用 iptables
或 nftables
编写规则时所针对的位置。
钩子名称 | 描述 |
---|---|
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服务器防火墙配置
操作步骤
准备一个干净的CentOS,如果没有自行安装
安装Apache HTTP服务器
安装mysql服务器
使用nmap查看没有启用防火墙的系统情况
配置防火墙
使用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无法确认端口的状态。
防御性措施:过滤端口通常是为了增加安全性,通过限制对外部世界的暴露来减少潜在攻击的机会。
也可以在远程连接工具这里使用端口扫描仪