网络安全必备!Linux iptables防火墙原理+实战案例
nanshan 2025-07-24 20:24 4 浏览 0 评论
6.1 了解iptables基本概念与原理
6.1.1 Netfilter与iptables概述
Netfilter 是 Linux 内核中的一个框架,允许在内核空间对网络数据包进行过滤、修改和重定向。它是 Linux 防火墙的基础,提供了以下功能:
o 数据包过滤:根据规则允许或阻止数据包通过。
o 网络地址转换(NAT):修改数据包的源或目标地址,常用于路由器和防火墙。
o 数据包修改:如修改数据包的 TTL(Time to Live,生存时间)或 TOS(Type of Service,服务类型)。
o 连接跟踪:跟踪网络连接状态,用于状态防火墙。 Netfilter 通过钩子(hooks)在内核的网络协议栈中插入处理函数,这些钩子位于数据包处理的各个阶段,如接收、转发、发送等。
iptables 是用户空间的工具,用于配置和管理 Netfilter 的规则。它通过命令行接口让用户定义数据包的处理规则,并将这些规则传递给内核中的 Netfilter。 iptables有多个表,每个表包含一系列规则链(Chains),用于处理不同类型的任务。主要功能包括:
o 定义规则:允许或阻止特定类型的数据包。
o 管理链(Chains):规则被组织成链,常见的链有 INPUT、OUTPUT 和 FORWARD。
o 执行动作:如 ACCEPT、DROP、REJECT 等。
Linux防火墙能力构建在内核态Netfilter子系统之上,该框架通过在内核网络协议栈的关键位置设置钩子点(Hook Points)实现流量控制,iptables作为用户空间配置工具,本质是通过/proc/net/ip_tables接口向Netfilter注入控制规则。这种分层设计使运维人员无需修改内核即可实现灵活的策略管控,但同时也带来规则匹配的性能损耗(单核处理器处理小包能力约1Gbps)。
6.1.2 iptables体系结构:表、链与规则
(1)规则表(Tables):功能分层
filter 表:
核心功能:数据包过滤(过滤规则),是默认加载的表。
应用场景:控制哪些流量可以进入(INPUT)、流出(OUTPUT)或经过本机转发(FORWARD)。
典型规则:拒绝恶意 IP 访问 SSH 端口,允许特定网段访问 Web 服务。
nat 表:
核心功能:网络地址转换(NAT),包括源地址转换(SNAT)和目标地址转换(DNAT)。
应用场景:
DNAT(目标转换):实现端口转发(如将公网 8080 端口映射到内网服务器 80 端口)。
SNAT(源转换):为内网设备分配统一公网 IP 访问互联网(共享上网)。
mangle 表:
核心功能:修改数据包元数据(如 TOS 字段、MARK 标记),用于流量分类或 QoS(服务质量)控制。
典型场景:标记视频流为高优先级,确保带宽分配。
raw 表:
核心功能:关闭连接追踪(Connection Tracking),用于特殊场景(如 DNS 缓存)。
(2)规则链(Chains):流量处理路径
每个表包含若干链,链定义了数据包在特定阶段的处理顺序。
filter 表默认链:
INPUT 链:处理进入本机的数据包(目标地址为本机 IP)。
OUTPUT 链:处理本机主动发出的数据包(源地址为本机 IP)。
FORWARD 链:处理需经本机转发的数据包(源和目标均非本机 IP,需开启 IP 转发)。
nat 表默认链:
PREROUTING 链:在数据包进入路由决策前处理(常用于 DNAT,如公网端口映射)。
POSTROUTING 链:在数据包完成路由决策后处理(常用于 SNAT,如内网共享上网)。
OUTPUT 链:处理本机生成的需进行 NAT 的数据包(如本机访问内网服务时的地址转换)。
(3)规则(Rules):流量匹配与动作
基本条件:源 / 目标 IP 地址、协议(TCP/UDP/ICMP)、端口号。
状态匹配:--state(如 ESTABLISHED 已建立连接的数据包,NEW 新建连接)。
接口匹配:-i(入站接口,如 eth0)、-o(出站接口,如 wlan0)。
ICMP 类型:--icmp-type(如允许 ping 请求 echo-request)。
执行动作(Target):
ACCEPT:允许数据包通过。
DROP:静默丢弃数据包(无响应)。
REJECT:拒绝数据包并返回错误信息(如 TCP 的 RST 包、ICMP 的不可达消息)。
LOG:记录数据包信息到系统日志(配合其他动作使用,如 ACCEPT 前先记录)。
SNAT/DNAT:执行源 / 目标地址转换。
6.1.3 iptables规则处理逻辑
优先级顺序:
表的优先级:raw 表 > mangle 表 > nat 表 > filter 表(由内核模块加载顺序决定)。
链的处理顺序:
入站流量:PREROUTING 链(nat) → INPUT 链(filter)。
出站流量:OUTPUT 链(filter) → POSTROUTING 链(nat)。
转发流量:PREROUTING 链(nat) → FORWARD 链(filter) → POSTROUTING 链(nat)。
规则匹配逻辑:
数据包按顺序匹配链中的规则,一旦命中某条规则即执行对应动作,不再继续匹配后续规则。
若未匹配任何规则,则执行链的 默认策略(-P 参数设置,默认通常为 ACCEPT,但生产环境建议设为 DROP)。
6.1.4 iptables与firewalld对比
iptables 是底层核心工具,适合需要高度定制化策略的场景;firewalld 是上层管理工具,适合标准化服务配置。两者可共存,firewalld 本质上通过 iptables 实现规则。
6.2 iptables语法与规则
6.2.1 iptables命令与选项
通过命令iptables --help查看帮助,下面是iptables命令的详细解释。
#命令: --append -A 链名 #向链中追加规则 --check -C 链名 #检查规则是否存在 --delete -D 链名 #从链中删除匹配的规则 --delete -D 链名 规则编号 #删除链中规则编号(1 为第一个)的规则 --insert -I 链名 [规则编号] #在链中插入规则,作为规则编号(默认为 1,即第一个) --replace -R 链名 规则编号 #替换链中规则编号(1 为第一个)的规则 --list -L [链名 [规则编号]] #列出链中的规则或所有链的规则 --list-rules -S [链名 [规则编号]] #打印链中的规则或所有链的规则 --flush -F [链名] #删除链中所有规则或所有链中的规则 --zero -Z [链名 [规则编号]] #清空链或所有链中的计数器 --new -N 链名 #创建新的用户自定义链 --delete-chain -X [链名] #删除用户自定义链 --policy -P 链名 目标 #更改链的策略为目标 --rename-chain -E 旧链名 新链名 #更改链名,(移动任何引用) |
选项的详细解释
#选项: --ipv4 -4 #无(该行将被 ip6tables-restore 忽略) --ipv6 -6 #错误(该行将被 iptables-restore 忽略) [!] --protocol -p proto #协议:通过编号或名称指定,例如 'tcp' [!] --source -s address[/mask][...] #指定源地址 [!] --destination -d address[/mask][...] #指定目的地 [!] --in-interface -i input name[+] #网络接口名称([+] 表示通配符) --jump -j target #规则的目标(可加载目标扩展) --goto -g chain #跳转到链且不返回 --match -m match #扩展匹配(可加载扩展) --numeric -n #地址和端口的数字输出 [!] --out-interface -o output name[+] #网络接口名称([+] 表示通配符) --table -t table #要操作的表(默认值:'filter') --verbose -v #详细模式 --wait -w [seconds] #获取 xtables 锁的最大等待时间,超时则放弃 --line-numbers #列表时打印行号 --exact -x #展开数字(显示确切值) [!] --fragment -f #仅匹配第二个或后续的分片 --modprobe=<command> #使用此命令尝试插入模块 --set-counters -c PKTS BYTES #在插入/追加时设置计数器 [!] --version -V #显示软件包版本。 |
IPTABLES 完整语法:
iptables [ACD] 链名 规则条件 [选项] iptables -I 链名 [规则编号] 规则条件 [选项] iptables -R 链名 规则编号 规则条件 [选项] iptables -D 链名 规则编号 [选项] iptables -[LS] [链名 [规则编号]] [选项] iptables -[FZ] [链名] [选项] iptables -[NX] 链名 iptables -E 旧链名 新链名 iptables -P 链名 目标 [选项] iptables -h (打印此帮助信息) |
6.2.2 基本基本语法
iptables [-t table] command [chain] [rule-specification] [-j target] |
命令解释:
table:指定操作的表,例如: filter(默认)、 nat、mangle、raw 。 command: 操作类型,例如: o -A (append)、 -I (insert)、 -D (delete)、 -R (replace)、 -L (list) 。 o -F (flush)、 -P (policy)、 -E (rename)、 -X (delete chain)、 -Z (zero counters) 。 chain:指定操作的链。 INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING 。 rule-specification:匹配条件,用于指定要处理的数据包特征,例如: 源 IP 地址、目标端口等。 target:控制类型,指定匹配数据包后的动作,例如: ACCEPT、DROP、REJECT、 LOG、DNAT、SNAT、MASQUERADE、 REDIRECT 。 |
匹配条件(rule-specification):
o -p <protocol>: 指定协议 (tcp, udp, icmp 等)。 o -s <source>: 指定源 IP 地址或网络。 o -d <destination>: 指定目标 IP 地址或网络。 o --sport <port>: 指定源端口。 o --dport <port>: 指定目标端口,匹配条件的扩展用法:规则条件扩展语法。 |
控制类型(target):
o ACCEPT: 允许数据包通过 。 o DROP: 丢弃数据包,不发送任何回应。 o REJECT: 拒绝数据包,并发送 ICMP 错误消息。 o LOG: 记录数据包的日志信息,通常和 -j NFLOG 或 -j ULOG 一起使用,用于将日志发送到特定的设施。 o SNAT、DNAT:用于源地址(source NAT)转换和目标地址(destination NAT)转换,主要用于nat表。 o MASQUERADE: 一种特殊的 SNAT,用于动态获取公网 IP 地址。 o REDIRECT: 将数据包重定向到本机的另一个端口。 |
6.2.3 IPtables常用操作
(1)关闭并禁用firewall,两者都是防火墙管理工具,同一个系统中只能使用其中一种,若先择使用iptables,需要关闭firewall。
(2)安装iptables工具yum -y install iptables。
(3)启动并设置开机自启动systemctl start iptables && systemctl enable iptables。
(4)查看规则并显示规则行号iptables -nL --line-number
(5)列出指定链中的规则iptables -L INPUT
(6)添加规则
-P(policy)设置指定链的 默认策略。例如: #将 INPUT链的默认策略设置为 DROP,即如果没有匹配的规则,所有进入的数据包都将被丢弃。 iptables -P INPUT DROP -p(protocol)指定数据包的协议类型。常见的协议有 tcp、udp、icmp 等。例如: -j(jump)指定当数据包匹配规则时要执行的动作。常见的动作有:ACCEPT:允许, DROP:丢弃等。 |
丢弃所有进入的 ICMP 数据包,通常用于禁止所有 ping操作。
在INPUT链的末尾添加一条规则,允许(ACCEPT)目标端口为21(ftp服务端口)的TCP数据包通过。
-A(append) 用于在指定链的末尾添加一条规则。 --dport(destination port)指定目标端口号。 |
在INPUT链的第一个位置插入一条规则,允许目标端口为80(HTTP服务端口)的TCP数据包通过,-I(insert)用于在指定链的 指定位置 插入 一条规则。(如果没有指定位置,默认插入到链的开头)。
允许源端口为 80 的 TCP 数据包通过,--sport(source port)指定源端口号。
允许来自IP地址为192.168.1.100的数据包通过,-s(source)指定数据包的源地址。可以是IP地址、IP地址范围或主机名等。
允许来自IP地址为192.168.1.100/24网段且目的端口是22的数据包通过。
允许目标地址为192.168.1.100的数据包通过,-d(destination)指定数据包的目的地址。
当从ens33出去的,访问目的地址是 192.168.23.253 ,且目的端口是80的route,允许通过。
-i(in-interface)指定输入接口
当从ens33进来的,原地址是 192.168.23.253 ,且目的端口是80的route,允许通过。
(7)删除规则
-D(delete)用于 删除 指定链中的一条规则。可以通过指定规则编号或直接指定规则内容来删除。 |
删除INPUT链的第一条规则并查看结果。
删除INPUT链中匹配这条规则(允许目标端口为80的TCP数据包通过)的规则并查看结果。
清空 FORWARD链中的所有规则。如果不指定链,默认清空所有链中的规则(iptables -F)。
(8)保存规则,iptables防火墙工具保存规则有三种方式,具体命令如下:
1 service iptables save 2 iptables-save > /etc/iptables/rules.v4 3 iptables-restore < /etc/iptables/rules.v4 |
6.3 iptables实战案例
6.3.1 基本防火墙规则设置
(1)iptables -F清空所有规则,剩下的是系统默认的规则。
(2)设置默认策略 ,将INPUT 和FORWARD 链的默认策略设置为DROP,这样没有匹配规则的数据包都会被丢弃,增强了系统的安全性。
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT |
(3)允许本地回环接口iptables -A INPUT -i lo -j ACCEPT。
(4)允许已建立的连接iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
(5)禁止外部 ICMP (ping) 本机。
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP #这条规则丢弃所有进入的ICMP回显请求数据包,从而禁止外部主机ping本机。 # --icmp-type 指定 ICMP数据包的类型,不指定则操作所有类型,包括: ## echo-request(ping 请求) ## echo-reply(ping 回复) ## destination-unreachable(目标不可达)等 |
(6)允许外部SSH连接本机iptables -A INPUT -p tcp --dport 22 -j ACCEPT
(7)允许外部访问本机的HTTP服务,在任务五的iptables实验中,我们将http服务的端口改成了12090,因此这里我们要放行12090端口,iptables -I INPUT -p tcp --dport 12090 -j ACCEPT,这条规要使用-I选项,将这条规则置于其他规则上面,否则会被下面的规则覆盖。
(8)在宿主机上的浏览器访问虚拟机的http服务。
6.3.2 NAT相关规则
假设本机有一个公网IP地址为 192.0.2.1,内部有一台主机IP地址为 192.168.232.10,运行着一个HTTP服务(监听端口8080)
(1)端口转发(REDIRECT)通常用于将外部访问的 HTTP 流量(端口 80)重定向到本机的另一个端口(例如 8080)。
#将外部对本机某端口的访问(旧目标端口),转发到内部主机的端口(新目标端口) iptables -t nat -A PREROUTING -p tcp --dport <旧目标端口> -j REDIRECT --to-port <新目标端口> |
将端口 80 转发至 8080并查看结果
(2)多端口转发:将端口 1000-2000 转发至 3000-400并查看结果。
6.3.3 目标网络地址转换(DNAT)
DNAT(Destination NAT):修改数据包的目的地址,通常用于将外部网络的公共 IP 地址映射到内部网络的私有 IP 地址。
可以用于将外部网络的请求,转发到内部网络的特定主机和服务,将流量转发到另一个服务器(例如内网中的另一台机器)。
在路由前,将外部对 旧目标地址 的请求,转发到 新目标地址 的服务。 iptables -t nat -A PREROUTING -d <旧目标IP> -p tcp --dport <旧目标PORT> -j DNAT --to-destination <新目标IP>:<新目标PORT> |
假设本机有一个公网IP地址为 192.0.2.1,内部有一台主机IP地址为 192.168.1.100,运行着一个HTTP服务(监听端口8080)
(1)当用户访问公网IP:端口时,将流量转发到内网主机IP:端口上,具体实现如下。
#当外部用户访问 “192.0.2.1:80” (旧目标地址)时,DNAT规则会将其修改为 192.168.1.100:8080 (新目标地址)。 #外部用户通过公网IP地址 192.0.2.1 访问本机的HTTP服务(端口80)。 #本机需要将请求转发到内部主机 192.168.1.100 的HTTP服务(端口8080) |
(2)在nat表的PREROUTING链中,将目标端口为 80 的数据包的目标地址,修改为 192.168.1.100,目标端口修改为8080。
6.3.4 源网络地址转换(SNAT)
SNAT(Source NAT):修改数据包的源地址,通常用于将内部网络的私有 IP 地址转换为外部网络的公共 IP 地址。
MASQUERADE 会自动将数据包的源 IP 地址替换为网关的出接口 IP 地址(通常是公网 IP 地址),并且在数据包返回时,再将目标 IP 地址转换回原始的私有 IP 地址。
#在路由后,将内部源地主,转化成外部源地址
iptables -t nat -A POSTROUTING -s <内部源地址> -j SNAT --to-source <外部源地址
假设内部主机 192.168.1.100 需要访问外部网络,本机需要将内部主机的源地址 192.168.1.100 修改为公网IP地址 192.0.2.1。
(1)设置当内部主机192.168.1.100 发送数据包到外部网络时,SNAT规则将源地址 192.168.1.100 修改为192.0.2.1。
- 当 FORWARD出来后,访问的目的地址是 192.168.23.223端口是80的,进行DNAT地址转换,把源地址改为192.168.23.252。
相关推荐
- 使用nginx配置域名及禁止直接通过IP访问网站
-
前段时间刚搭建好这个网站,一直没有关注一个问题,那就是IP地址也可以访问我的网站,今天就专门研究了一下nginx配置问题,争取把这个问题研究透彻。1.nginx配置域名及禁止直接通过IP访问先来看n...
- 如何在 Linux 中使用 PID 号查找进程名称?
-
在Linux的复杂世界中,进程是系统运行的核心,每个进程都由一个唯一的「进程ID」(PID)标识。无论是系统管理员在排查失控进程,还是开发者在调试应用程序,知道如何将PID映射到对应的进程名称都是一项...
- Linux服务器硬件信息查询与日常运维命令总结
-
1.服务器硬件信息查询1.1CPU信息查询命令功能描述示例lscpu显示CPU架构、核心数、线程数等lscpucat/proc/cpuinfo详细CPU信息(型号、缓存、频率)cat/proc/c...
- Ubuntu 操作系统常用命令详解(ubuntu常用的50个命令)
-
UbuntuLinux是一款流行的开源操作系统,广泛应用于服务器、开发、学习等场景。命令行是Ubuntu的灵魂,也是高效、稳定管理系统的利器。本文按照各大常用领域,详细总结Ubuntu必学...
- 从 0 到 1:打造基于 Linux 的私有 API 网关平台
-
在当今微服务架构盛行的时代,API网关作为服务入口和安全屏障,其重要性日益凸显。你是否想过,不依赖商业方案,完全基于开源组件,在Linux上构建一个属于自己的私有API网关平台?今天就带你...
- Nginx搭建简单直播服务器(nginx 直播服务器搭建)
-
前言使用Nginx+Nginx-rtmp-module在Ubuntu中搭建简单的rtmp推流直播服务器。服务器环境Ubuntu16.04相关概念RTMP:RTMP协议是RealTi...
- Linux连不上网?远程卡?这篇网络管理指南你不能错过!
-
大家好!今天咱们聊个所有Linux用户都躲不开的“老大难”——网络管理。我猜你肯定遇到过这些崩溃时刻:新装的Linux系统连不上Wi-Fi,急得直拍桌子;远程服务器SSH连不上,提示“Connecti...
- 7天从0到上线!手把手教你用Python Flask打造爆款Web服务
-
一、为什么全网开发者都在疯学Flask?在当今Web开发的战场,Flask就像一把“瑞士军刀”——轻量级架构让新手3天速成,灵活扩展能力又能支撑百万级用户项目!对比Django的“重型装甲”,Flas...
- nginx配置文件详解(nginx反向代理配置详解)
-
Nginx是一个强大的免费开源的HTTP服务器和反向代理服务器。在Web开发项目中,nginx常用作为静态文件服务器处理静态文件,并负责将动态请求转发至应用服务器(如Django,Flask,et...
- 30 分钟搞定 Docker 安装与 Nginx 部署,轻松搭建高效 Web 服务
-
在云计算时代,利用容器技术快速部署应用已成为开发者必备技能。本文将手把手教你在阿里云轻量应用服务器上,通过Docker高效部署Nginx并发布静态网站,全程可视化操作,新手也能轻松上手!一、准...
- Nginx 配置实战:从摸鱼到部署,手把手教你搞定生产级配置
-
各位摸鱼搭子们!今天咱不聊代码里的NullPointerException,改聊点「摸鱼必备生存技能」——Nginx配置!先灵魂拷问一下:写了一堆接口却不会部署?服务器被恶意请求打崩过?静态资源加载...
- 如何使用 Daphne + Nginx + supervisor部署 Django
-
前言:从Django3.0开始支持ASGI应用程序运行,使Django完全具有异步功能。Django目前已经更新到5.0,对异步支持也越来越好。但是,异步功能将仅对在ASGI下运行的应用程序可用...
- Docker命令最全详解(39个最常用命令)
-
Docker是云原生的核心,也是大厂的必备技能,下面我就全面来详解Docker核心命令@mikechen本文作者:陈睿|mikechen文章来源:mikechen.cc一、Docker基本命令doc...
- ubuntu中如何查看是否已经安装了nginx
-
在Ubuntu系统中,可以通过以下几种方法检查是否已安装Nginx:方法1:使用dpkg命令(适用于Debian/Ubuntu)bashdpkg-l|grepnginx输出...
- OVN 概念与实践(德育概念的泛化在理论和实践中有什么弊端?)
-
今天我们来讲解OVN的概念和基础实践,要理解本篇博客的内容,需要前置学习:Linux网络设备-Bridge&VethPairLinux网络设备-Bridge详解OVS+Fa...
你 发表评论:
欢迎- 一周热门
-
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
手机如何设置与显示准确时间的详细指南
-
NAS:DS video/DS file/DS photo等群晖移动端APP远程访问的教程
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
如何修复用户配置文件服务在 WINDOWS 上登录失败的问题
-
一加手机与电脑互传文件的便捷方法FileDash
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
- 最近发表
-
- 使用nginx配置域名及禁止直接通过IP访问网站
- 如何在 Linux 中使用 PID 号查找进程名称?
- Linux服务器硬件信息查询与日常运维命令总结
- Ubuntu 操作系统常用命令详解(ubuntu常用的50个命令)
- 从 0 到 1:打造基于 Linux 的私有 API 网关平台
- Nginx搭建简单直播服务器(nginx 直播服务器搭建)
- Linux连不上网?远程卡?这篇网络管理指南你不能错过!
- 7天从0到上线!手把手教你用Python Flask打造爆款Web服务
- nginx配置文件详解(nginx反向代理配置详解)
- 30 分钟搞定 Docker 安装与 Nginx 部署,轻松搭建高效 Web 服务
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)