Linux:iptables(老版本,考试最爱考)、firewalld(centos7+)
Windows:netsh advfirewall(高级防火墙,cmd),还有 powershell 的 Set-NetFirewallRule
1. 黑名单(拒绝列表,deny 模式)
规则逻辑:默认所有流量都允许通过,只把坏人写进名单,拒绝名单里的
流程:
防火墙先放行所有访问
匹配黑名单:如果源 IP / 目的端口在黑名单里 → 拦住丢弃
不在黑名单 → 直接允许通行
优点:配置简单,不用大量添加允许规则
缺点:不安全!新的攻击者不在黑名单里,就能直接进来
例子:我只拉黑 192.168.1.100,别的任何人都可以访问
简答背诵:黑名单策略默认允许所有流量,仅禁止列表中指定对象访问。
2. 白名单(允许列表,allow 模式)
规则逻辑:默认全部流量都拒绝,只有写在名单里的才允许放行
流程:
防火墙默认全部拦住
匹配白名单:IP / 端口在白名单 → 放行
不在白名单 → 丢弃
优点:安全性高,未知来源一律进不来(政府、等保核心推荐)
- 缺点:维护麻烦,新增合法业务,就要手动加到白名单
例子:只允许 192.168.11.2 访问网站服务器,其他 IP 全部拒绝
简答背诵:白名单策略默认拒绝所有流量,仅允许列表中指定对象访问。
Linux iptables 防火墙
Netfilter 是 Linux 内核里的数据包处理框架(内核态),是 Linux 防火墙、NAT 的底层核心,从 Linux 2.4 内核开始正式集成netfilter/...。 简单一句话区分:Netfilter 是内核底层机制;iptables /nftables 是用户态工具,用来给 Netfilter 下发规则。
Netfilter = Linux 内核里面,安在网络通道上的 5 个检查站电脑收包、发包、转发包的时候,数据包一定会路过这几个检查站,检查站可以决定:放行、扔掉、改 IP。
iptables 四表五链,考试只考 filter 表(默认,包过滤),INPUT 链(访问本机)
数据包经过一个检查站(钩子)的时候,如果这个钩子上有多个表的链,固定顺序:mangle 先跑 → nat 再跑 → filter 最后跑
mangle(修改包头、打标记)优先级最高,最先处理
nat(改 IP、端口)中间
filter(放行 / 丢弃,防火墙过滤)最后
核心原理:5 个钩子(Hook)
它在 Linux 网络栈数据包流转的关键位置预埋了 5 个挂载点(Hook),内核模块可以在这些点注册回调函数;数据包经过钩子时,就会执行注册的处理逻辑(放行、丢弃、修改地址等):
PREROUTING:数据包刚进入网卡、路由决策之前(常用于 DNAT,修改目标 IP)
INPUT:路由判断包发给本机,送到本机应用前(入站防火墙过滤)
FORWARD:路由判断需要转发到别的机器(转发包过滤)
OUTPUT:本机程序向外发出的包、路由决策前(出站过滤)
POSTROUTING:包即将离开网卡、路由之后(常用于 SNAT / 地址伪装)
PREROUTING:快递刚送到中转站大门,还没决定送给谁✅ 在这里可以改快递收件地址(DNAT、端口映射)
INPUT:查完,发现这个快递是给中转站自己的,送到这里检查 ✅ 防火墙拦外面连本机的请求,比如别人连你 ssh
FORWARD:快递不是给本机的,要中转,继续送到别的地方✅ 路由器、虚拟机、Docker 转发流量就在这过滤
OUTPUT:中转站自己往外发快递,出发前检查 ✅ 控制本机程序往外联网,比如不让某个软件访问外网
POSTROUTING:快递马上要送出大门了,最后一关 ✅ 改寄件人地址(SNAT,家用电脑共享上网靠这个)
数据包流向简图:
支持的动作(Verdict),钩子回调处理完包之后返回判决:
NF_ACCEPT✅ 放行 这个快递没问题,继续往下一个检查站走,网络流程正常继续。 比如:PREROUTING 放行 → 继续去做路由判断;INPUT 放行 → 交给本机程序。
NF_DROP🗑️ 丢弃 直接扔进垃圾桶,到此结束,流程终止。 不会给对方回任何消息(不像 REJECT 会发拒绝包),对方只会一直等、最后超时。
NF_QUEUE📤 交给用户态程序 内核先把这个包 “暂停、打包放到队列里”,不自己决定放行还是丢弃, 扔到用户空间(我们写的 C 程序、一些入侵检测软件),由外面的程序判断怎么处理。
例子:Snort、一些流量审计、自定义风控程序就是用 NF_QUEUE 拿包
NF_STOLEN✋ 内核模块扣下包 这个包归当前这个内核模块接管了,原来的网络栈直接不管这个包了。 和 DROP 不一样:不是丢掉,是模块自己拿去用(比如自己构造回复包),主线流程不再走。
通俗说:包被 “抢走”,网络栈后续所有步骤全部跳过。
NF_REPEAT🔁 再来一遍在当前这个检查站,再重新跑一次这个钩子的处理函数很少用。相当于:刚检查完一遍,现在回头再重新执行一遍当前这个检查逻辑。 ⚠️ 用不好直接死循环,一般开发内核模块才会碰到,日常写 iptables 基本见不到。
一条链里面,可以写很多条规则,规则是从上到下按顺序比对举个例子:filter 表的 INPUT 链,里面写了 3 条规则
规则1:源IP 192.168.1.10 放行 规则2:tcp 22端口 记录日志(LOG) 规则3:tcp 22端口 丢弃(DROP) 默认策略:全部放行(ACCEPT)匹配流程(重点区分【终结动作】和【非终结动作】)
数据包进来,先拿包对比规则 1
匹配上,且动作是 ACCEPT:停止!这条链不再往下看别的规则,包直接放行
匹配上,动作是 LOG:LOG 只是打日志,不是结束!做完日志,继续往下匹配规则 2、3
和规则 1 不匹配 → 去对比规则 2
和规则 2 不匹配 → 对比规则 3
如果全部规则都不匹配→ 执行这条链的【默认策略 POLICY】
✅ 终结动作(匹配到就停止本链后续规则): ACCEPT、DROP、REJECT ✅ 非终结动作(做完继续往下匹配): LOG、MARK、TOS(mangle 里常用)
最容易踩坑一句话:LOG 只是打印日志,不会拦包,不会停止匹配!
第四层:iptables 完整语法拆解
iptables [-t 表名] 命令 [链名] [匹配条件] -j 动作逐个拆开:
[-t 表名]:可选,不写默认-t filter可选:filter /nat/mangle【命令】告诉 iptables 你要干什么(增删改查
【链名】INPUT / OUTPUT / FORWARD / PREROUTING / POSTROUTING
【匹配条件】用来描述 “是什么样的包”
-p tcp/udp/icmp协议--dport 22目标端口--sport源端口-s 源IP源地址-d 目的IP目标地址-j 动作jump,匹配成功之后执行什么(就是前面说的终结 / 非终结动作)
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT翻译: 在 filter 表,INPUT 链,追加一条规则:匹配 tcp 协议、目标端口 22 的包,匹配成功就放行。
iptables 参数大全
语法总框架:
iptables [-t 表名] 命令参数 链名 [匹配条件] -j 动作默认不写
-t就是 filter 表(过滤表,考试最多) 底层是 netfilter,iptables 只是配置工具!
一、表参数-t(必考!4 张表)
参数 | 表名 | 作用 | 考试重点 |
|---|---|---|---|
| filter 过滤表 | 包放行 / 丢弃 | 默认表,INPUT/OUTPUT/FORWARD 链,包过滤防火墙 |
| nat 地址转换表 | 改 IP:SNAT/DNAT | PREROUTING、POSTROUTING、OUTPUT;端口映射、上网共享 |
| mangle 修改表 | 修改报文头部 TTL、标记 | 修改数据包,软考偶尔选择题 |
| raw 表 | 关闭连接跟踪 | 优先级最高,考的最少 |
二、【命令参数:对链 / 规则做增删改查】(高频考点)
参数 | 全称 | 含义 | 例子 + 考点坑 |
|---|---|---|---|
| Append | 追加规则,放到这条链最后面 |
|
| Insert | 插入规则,默认插到第 1 位(最前面),可指定序号 |
|
| Delete | 删除规则,两种写法:匹配内容 / 行号 |
|
| Replace | 替换指定序号的规则 | 考得少 |
| List | 列出链里所有规则 | 常搭配 |
| Flush | 清空链所有规则 |
|
| Policy | 设置链默认策略(没有任何规则命中时执行) |
|
| New-chain | 新建自定义链 | 了解即可 |
| Delete-chain | 删除空的自定义链 | 不能删内置 5 条链 |
| Zero | 清零数据包、字节计数器 |
查看配套参数(和 - L 一起用)
-n:numeric,数字显示 IP、端口,不反向解析域名(考试写配置必带)-v:verbose,详细,显示包数量、字节--line-numbers:显示规则行号(删规则要用行号)
标准查看命令:
iptables -L -n -v --line-numbers
三、【匹配条件参数:用来匹配数据包】(最重要,下午案例必考)
参数 | 全称 | 含义 | 示例 |
|---|---|---|---|
| --source | 源 IP / 源网段 |
|
| --destination | 目的 IP / 目的网段 |
|
| --in-interface | 入网卡(数据包从哪个网卡进来) |
|
| --out-interface | 出网卡(数据包从哪个网卡出去) |
|
| --protocol | 协议 |
|
👉 TCP/UDP 专属扩展匹配(必须 -p tcp 之后才能写!)
参数 | 含义 |
|---|---|
| source-port 源端口 |
| destination-port目的端口(最常考) |
| 只匹配 TCP SYN 握手包(新建连接) |
例子:
-p tcp --dport 22匹配目标 22 端口 ssh
👉 扩展模块-m(match,加载匹配模块)
模块 | 参数 | 作用 |
|---|---|---|
|
| 多端口匹配,逗号分隔 |
|
| 连接状态匹配!软考超级高频 |
状态解释: NEW:新连接;ESTABLISHED:已经建立好的连接;RELATED:关联连接;INVALID:无效包
四、-jjump 动作目标(匹配之后干什么,必考)
-j就是 jump,命中规则跳转执行这个动作
动作 | 含义 | 考试说明 |
|---|---|---|
| 放行、允许通过 | 允许包继续走 |
| 直接丢弃,不回任何响应 | 无声丢掉,对方超时 |
| 拒绝,返回拒绝报文(比如 ICMP 不可达) | 告诉对方被拒绝,和 DROP 区分选择题 |
| 记录日志,不拦包,打完日志继续匹配下一条 | 只是写日志 |
| 跳出当前自定义链,回到上一级链继续匹配 | |
SNAT / DNAT | nat 表动作,改源 / 目的 IP | 只有 nat 表能用 |
✅ 选择题坑:DROP 和 REJECT 的区别! DROP:悄悄丢包,对方一直等超时;REJECT:明确回复拒绝
拿这条举例:
iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT-A INPUT-A = Append 追加规则;INPUT:这条规则给 INPUT 链(管进本机的包) 👉 意思:把这条规则加到【入站检查清单】末尾-i eth0-i = input interface 入网卡 👉 包是从 eth0 这块网卡进来的-p tcp-p = protocol 协议 👉 这个数据包是 TCP 协议(SSH、网页都是 tcp)-s 192.168.1.0/24-s = source 源 IP 👉 发这个包的机器,IP 属于 192.168.1.0 这个网段--dport 22--dport = destination port 目标端口 👉 这个包想要访问本机的22 端口(ssh 服务)-j ACCEPT-j = jump,匹配上就跳转到这个动作 👉 满足上面所有条件:放行
✅ 整句人话:凡是从 eth0 网卡进来、tcp、来自 192.168.1.0/24 网段、想要访问本机 22 端口的包,直接放行。
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -j ACCEPT-A OUTPUT加到 OUTPUT 链,OUTPUT 管本机往外发出去的包-o eth0-o = output interface 出网卡 👉 包要从 eth0 网卡发出去-p tcptcp 协议--sport 22--sport = source port 源端口 👉这个包是本机的 22 端口发出去的(ssh 服务给对方回消息)-j ACCEPT放行
✅ 整句人话:本机从 22 端口发出、走 eth0 网卡出去的 tcp 包,放行。
最容易混淆一对:--dport 和 --sport(重点!)
客户端(192.168.1.10)连服务器 ssh:
客户端发请求:客户端随便开一个端口 →去找服务器的 22 端口这个包:
--dport 22(目标是 22),走 INPUT服务器回复:服务器从自己的 22 端口往外回信 → 发给客户端随机端口 这个回复包:
--sport 22(来源是 22),走 OUTPUT
画图简化: 客户端 →【dport 22】→ Linux 主机(INPUT) 客户端 ←【sport 22】← Linux 主机(OUTPUT)
Windows 防火墙命令
前置要求:所有命令必须【管理员】CMD / PowerShell运行,否则权限不足报错。 两套体系:
netsh advfirewall:CMD 传统命令,运维、批处理脚本最常用(重点)PowerShell
*-NetFirewallRule:面向对象,适合高级脚本、筛选查询 三个配置配置文件(profile)
domain 域:公司加了域的电脑,家用基本不用管
private 专用:连家里 wifi、内网(信任的网络)
public 公网:外面咖啡馆、公共 wifi(危险网络,默认最严格)
netsh advfirewall 整体结构
netsh advfirewall ├─ firewall # ✅ 最常用:出入站端口、程序放行/阻断规则(我们90%操作在这里) ├─ consec # 连接安全规则(IPsec 加密、认证) ├─ mainmode # IKE 主模式协商(IPsec底层) ├─ monitor # 监控:当前连接、安全关联SA ├─ set / show # 全局开关、默认策略、查看状态 ├─ export / import # 备份、恢复防火墙策略 ├─ reset # 重置防火墙到出厂默认 └─ dump # 导出全部配置脚本1. 全局开关 & 基础状态(set /show)
查看当前状态
:: 查看当前激活的配置文件 netsh advfirewall show currentprofile :: 查看所有3套配置文件防火墙状态、默认策略 netsh advfirewall show allprofiles :: 查看全局设置 netsh advfirewall show global开启 / 关闭防火墙(按配置文件)
⚠️不推荐直接关公网防火墙,安全风险极高
:: 开启所有配置文件防火墙 netsh advfirewall set allprofiles state on :: 关闭全部(慎用!) netsh advfirewall set allprofiles state off :: 单独关闭公网,内网域、专用保持开启 netsh advfirewall set publicprofile state off重置防火墙(出问题乱了,一键恢复出厂)
netsh advfirewall reset👉 意思:删掉你自己加的所有放行 / 拉黑规则,变回刚装系统的样子
设置默认策略(非常重要)
action=allow|block:没有匹配任何规则时,默认怎么处理流量
:: 推荐安全基线:入站默认拒绝,出站默认允许(Windows默认) netsh advfirewall set allprofiles firewallpolicy blockinbound,allowoutbound :: 宽松模式:入站出站全部默认放行(服务器测试临时用,不建议长期) netsh advfirewall set allprofiles firewallpolicy allowinbound,allowoutbound备份 & 恢复 & 重置
:: 导出全部防火墙策略 netsh advfirewall export "D:\fw.wfw" :: 导入恢复 netsh advfirewall import "D:\fw.wfw" :: 一键重置防火墙(删除所有自定义规则,恢复系统默认,无确认) netsh advfirewall reset二、核心:netsh advfirewall firewall 规则【增删改查】
通用语法:
netsh advfirewall firewall add rule [参数] netsh advfirewall firewall set rule [参数] netsh advfirewall firewall delete rule [参数] netsh advfirewall firewall show rule [参数]🔑 核心参数表(必须记熟)
表格
参数 | 可选值 | 说明 |
|---|---|---|
| 字符串,带空格要引号 | 规则唯一名称,删改查全靠这个,建议英文不要中文空格乱码 |
|
| in = 入站(别人连本机);out = 出站(本机往外连) |
|
| allow 放行;block 阻断;bypass 绕过(IPsec 认证专用) |
|
| 协议号,255=any 全部 |
| 单个端口、范围、逗号分隔 |
|
| 远程端口 | 出站规则才常用 |
| IP / 网段 | 本机绑定 IP,默认 any |
| IP、网段、 | 允许 / 拒绝哪些远端 IP; |
| 程序完整路径 | 按程序放行,不是端口 |
|
| 是否启用这条规则 |
|
| 在哪套网络配置生效,默认 any 全部 |
| 备注 | 注释 |
✅ 常用 add rule 示例(高频)
放行入站 TCP 80 端口(web 服务)
netsh advfirewall firewall add rulename="开放80端口" dir=in action=allow protocol=TCP localport=80
只允许内网 192.168.1.0/24 访问 3389 远程桌面,公网拒绝
netsh advfirewall firewall add rule
name="内网才能连3389"
dir=in
action=allow
protocol=TCP
localport=3389
remoteip=192.168.1.0/24
阻断本机向外访问某个 IP(出站拉黑)
netsh advfirewall firewall add rule
name="拉黑这个地址"
dir=out
action=block
remote ip=203.0.113.10
放行某个 exe 程序(不限制端口)
netsh advfirewall firewall add rule name="放行服务端程序" dir=in action=allow program="D:\test\server.exe"
放行 ICMP(ping,别人能 ping 通本机)
netsh advfirewall firewall add rule name="允许ping" dir=in action=allow protocol=icmpv4
✅ 查询 show rule
:: 列出所有规则(简略)
netsh advfirewall firewall show rule name=all
:: 查看指定规则详情
netsh advfirewall firewall show rule name="Allow_TCP80" verbose
:: 只看启用的规则
netsh advfirewall firewall show rule name=all enabled=yes
✅ 修改 set rule
不能改 name,只能改其他属性;name 用来定位旧规则
:: 把上面RDP规则,改成只允许192.168.1.5访问 netsh advfirewall firewall set rule name="RDP_Only_LAN" new remoteip=192.168.1.5 :: 临时禁用一条规则,不删除 netsh advfirewall firewall set rule name="Allow_TCP80" new enable=no✅ 删除 delete rule
:: 按名字删单条 netsh advfirewall firewall delete rule name="Allow_TCP80" :: 删除所有名字带RDP的(慎用) netsh advfirewall firewall delete rule name=all | findstr RDP三、monitor 监控(排查排错)
:: 查看当前活跃的防火墙连接、安全关联 netsh advfirewall monitor show all netsh advfirewall monitor show mmsa netsh advfirewall monitor show qmsa四、PowerShell 防火墙命令(现代方案,适合自动化)
New-NetFirewallRule新建Get-NetFirewallRule查询Set-NetFirewallRule修改Remove-NetFirewallRule删除Get-NetFirewallPortFilter / Get-NetFirewallApplicationFilter过滤端口、程序
# 放行TCP 80入站 New-NetFirewallRule -DisplayName "Allow_TCP80_PS" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow # 查询所有入站允许规则 Get-NetFirewallRule -Direction Inbound -Action Allow # 禁用规则 Set-NetFirewallRule -DisplayName "Allow_TCP80_PS" -Enabled False # 删除 Remove-NetFirewallRule -DisplayName "Allow_TCP80_PS"PowerShell 优势:可以管道筛选,比如批量找出所有开放 3389 的规则:
Get-NetFirewallPortFilter | Where-Object {$_.LocalPort -eq 3389} | Get-NetFirewallRule五、consec 连接安全规则(IPsec,网络安全工程师考点)
consec= connection security,做流量加密、身份认证(不是放行端口),配合防火墙规则使用;mainmode 是 IKE 第一阶段协商参数。
:: 新建IPsec规则:两端必须认证 netsh advfirewall consec add rule name="IPsec_Auth" endpoint1=any endpoint2=any action=requireinrequestout六、重要避坑 & 原理(考试 / 实操必看)
规则匹配顺序:从上往下匹配,匹配到就停止;block 规则要写在 allow 前面,否则会被放行规则优先命中
规则名字区分大小写吗?netsh 不区分,但尽量统一命名,中文名字容易乱码,不推荐
remoteip写法:192.168.1.0/24、localsubnet(本网段)、dns、dhcp、wins关闭防火墙≠关闭规则;关闭防火墙是整个引擎不工作,所有流量直接放行
端口放行只是允许流量进入,程序本身必须监听该端口,否则依然连不上
域环境:可以把规则存储在 GPO:
netsh advfirewall set store gpo="域名\GPO名",域下发策略
七、速查口诀(备考软考信息安全工程师)
advfirewall 三配置文件:域、专用、公网 firewall 管端口程序,consec 管 IPsec 加密 add 增 set 改 show 查 delete 删 dir in 入 out 出,allow 放行 block 拦 默认策略:入拒出放是基线 export 备份 reset 重置,管理员权限是前提