☰
用m0n0wall搭建双防火墙隔离环境,复现内网渗透测试全流程
2026/10/17 9:17:01 网站建设 项目流程

很多搞安全的朋友都有过这个阶段:看过大量渗透测试的文档,命令行、漏洞原理都能背下来,但真要上手,总感觉缺一套不受干扰、可以随便折腾的实验环境。直接拿公司内网练手肯定不行,租一台云服务器又只能测Web,没法模拟内网里的横向移动、多段特权提升这些更贴近实战的场景。我自己的选择是,在虚拟机里用老牌防火墙系统m0n0wall,自己搭一套双防火墙隔离的三层网络结构:外网段、DMZ段、内网段,然后在这个环境里做授权范围内的渗透测试演练。这篇文章就完整记录这套环境的搭建思路、配置过程和踩坑经验。

这套方案的适用人群很明确:正在准备安全方向面试的开发者、想复现攻击链路的红队新人、搞防御建设但不放心直接拿现网做验证的运维工程师。你不需要买任何硬件,一台普通笔记本电脑跑虚拟机就够了,m0n0wall对配置的要求低到令人发指,跑在VirtualBox或者VMware里毫无压力。下面我会从拓扑规划开始,一步步把两台防火墙的安装、规则配置、跨网段访问验证全部讲清楚,最后再分享几个我踩过的最典型的坑。

1. 为什么非要搭双防火墙,单防火墙行不行

1.1 单防火墙和双防火墙的隔离差异

先回答一个我之前也很纠结的问题:到底是先搭一台防火墙做个标准的DMZ,还是直接上两台防火墙做纵深隔离?我的结论是,如果你想认真练内网渗透测试,双防火墙几乎是必然选项。

单防火墙的典型结构是这样的:防火墙把网络切成两个区域,一侧是外网,一侧是内网,DMZ区域挂在防火墙的第三个网卡上。这种架构能解决“对外发布服务”的需求,但从攻击者的视角看,一旦突破了DMZ里的某一台Web服务器,它到达内网核心的路径通常只有一跳——如果管理员在防火墙上写了一条比较宽泛的规则,比如允许DMZ访问内网的全部端口,那么内网的核心资产基本就裸奔了。

双防火墙把这个风险拆成了两层。第一台防火墙负责把外网和DMZ隔开,第二台防火墙负责把DMZ和内网再隔开。攻击者即使拿下了DMZ里的主机,还需要面对第二个独立的过滤节点。现实中的大型企业内网,核心数据中心和办公网之间往往就是这种多层异构防护思路,不是为了堆设备,而是为了把“单点沦陷”的影响范围限制住。渗透测试的价值恰恰也在这里:只有让环境足够接近真实网络,你在里面练的攻击手法、走的流程才有参考意义。

1.2 为什么选m0n0wall而不是pfSense或OPNsense

你可能想问,m0n0wall都停止开发多少年了,为什么还要用它。这个问题问得好,但答案也简单:因为我是来学防火墙和渗透测试的,不是来学管理系统的。

m0n0wall是一个基于FreeBSD的轻量级防火墙发行版,最后的稳定版本停留在1.8.1。它体积小,功能聚焦,Web管理界面只有一个,所有配置基本一两步就能完成。对比pfSense和OPNsense,它们功能强大得多,有插件系统、有包管理、有各种流量分析工具,但代价是配置界面复杂,新手经常迷失在菜单层级里。m0n0wall那种“一条规则就干一件事”的简洁逻辑,特别适合用来理解防火墙本身的工作原理。

还有一点很关键:m0n0wall对虚拟机的要求极低,128MB内存、几百兆硬盘就能跑起来,我这套环境里同时开两台m0n0wall加上攻击机和两台靶机,物理机的内存占用也才4GB左右。换成pfSense,光是两个实例的内存开销就会明显高出一截。m0n0wall的规则引擎是典型的状态化防火墙逻辑,你写一条“允许某网段访问某端口”,它就能自动处理回程流量,这种特性恰好也是理解商业防火墙的基础。

2. 网络拓扑设计和地址规划

2.1 三段式隔离架构的整体思路

这套环境的拓扑可以看作一条单向的信任链:

外部网络——第一台m0n0wall——DMZ区域——第二台m0n0wall——内部网络

外部网络模拟的是你从互联网发起攻击时的视角,里面放一台攻击机。第一台防火墙的外网网卡接在这个区域,内网网卡接DMZ。DMZ区域放一台模拟业务的主机,比如一个开了Web服务的Linux服务器。第二台防火墙的外网网卡接在DMZ网段里,内网网卡接内部网络。内部网络放两台靶机,模拟核心内网里的服务器和普通办公终端。

这里有个容易混淆的设计点:第二台m0n0wall的“外网”接口,在物理上其实就处在DMZ网段里,它在逻辑上把DMZ当成不被信任的区域来对待。只有穿过它,才能进入更内层的内部网络。攻击者从外网进来,走到DMZ已经算突破了第一道防御,但对内部网络来说,它仍然只是一个“外部访客”。

2.2 IP地址规划与虚拟机网卡分配

我自己在VirtualBox里的地址规划如下,你可以直接抄:

角色虚拟机名称第一块网卡第二块网卡第三块网卡管理地址
外部网络虚拟机(攻击机)Kali-AttackerNAT(上网下载工具)vboxnet0无192.168.56.10/24
第一台防火墙m0n0wall-FW1vboxnet0vboxnet1无WAN: 192.168.56.1/24,LAN: 10.10.10.1/24
DMZ服务器DMZ-Webvboxnet1无无10.10.10.10/24
第二台防火墙m0n0wall-FW2vboxnet1vboxnet2无WAN: 10.10.10.2/24,LAN: 172.16.10.1/24
内网靶机AInternal-Servervboxnet2无无172.16.10.20/24
内网靶机BInternal-PCvboxnet2无无172.16.10.30/24

在VirtualBox里,vboxnet0、vboxnet1、vboxnet2都是通过全局工具创建的Host-Only网络。这里有个细节:Host-Only网络默认自带一个DHCP服务,如果你开着它,它会主动给网段里的机器分配地址,这会干扰防火墙的静态地址配置。我的习惯是把每一个Host-Only网络的DHCP服务器都关掉,全部手工配静态地址,这样能减少很多“怎么IP不对”的困惑。

第一台m0n0wall在启动时,安装程序会让你选WAN口和LAN口对应哪个网卡,这个步骤很多人容易搞反,后面我会专门讲怎么避免。

3. 双防火墙的完整搭建流程

3.1 第一台防火墙的基础安装

先下载m0n0wall 1.8.1的ISO镜像,这个版本是最后一代,网上很容易找到。在VirtualBox里新建一个虚拟机,类型选FreeBSD,内存给128MB就够,硬盘给512MB,网卡按上面表格接好。

用ISO引导之后,m0n0wall会进入LiveCD模式,直接出现一个字符界面的菜单。第一件事是选择接口映射,它会列出当前识别到的网卡,比如em0、em1。这一步一定要跟VirtualBox里的网卡顺序对应起来。有个稳的办法:在VirtualBox里先把第二块网卡禁用,只留第一块,这时进m0n0wall,看菜单里哪个接口能检测到link,它就是WAN口;然后再把第一块禁用、第二块启用,重新看一次,剩下的那个就是LAN口。别嫌麻烦,接口接反了后面全部白搭。

接口选完之后,进入菜单的“Assign IP Address”选项。给WAN口配192.168.56.1/24,给LAN口配10.10.10.1/24。配完之后,用浏览器访问http://10.10.10.1,默认用户名admin,密码mono,就能看到m0n0wall的Web管理界面。

这时候Web界面第一屏会显示一些系统信息,硬盘状态那一栏通常显示的是“LiveCD”或者“Writeable”。要让配置在重启后还能保留,需要进入“System”菜单,找到“Save Configuration to Hard Drive”这个选项,执行一次保存。很多人搭完环境一重启,所有配置全没了,就是漏了这一步。

3.2 第一台防火墙的规则和NAT设置

m0n0wall默认的防火墙策略是“全部拒绝”,所以装了之后TELNET、PING全都不通,这是正常的,不是你配置错了。我们需要通过Web管理界面去放行需要的流量。

先设置出站NAT。进入“Firewall”菜单下的“NAT”,选择“Outbound”,这里我直接选“Manual Outbound NAT”,然后添加一条规格:接口选WAN,协议选Any,源地址填10.10.10.0/24,目标地址填Any,转换地址用接口地址。这样DMZ区里的主机访问外部网络时,源IP会被替换成防火墙WAN口的地址。

然后设置防火墙过滤规则。进入“Firewall”菜单下的“Rules”,在WAN标签页里添加规则:动作选Pass,协议选TCP,源地址填192.168.56.0/24,目标地址填DMZ-Web的IP 10.10.10.10,目标端口填80。这条规则的意思很清楚:只允许外部网络的攻击机访问DMZ Web服务器的80端口。为了测试方便,我还会再加一条源地址192.168.56.0/24、目标地址10.10.10.10、协议ICMP的规则,放行ping,这样排查连通性的时候会舒服很多。

LAN口的规则不用动,m0n0wall默认会隐式允许回程流量,也就是你放行了出站连接,相关的应答包能自动通过。

这里要特别强调一个操作顺序:改规则之前,先把默认规则改成Log,或者保持默认拒绝也行,但一定要在Web管理界面里保存重启。m0n0wall的规则是即时生效的,如果你鼠标点快了,很可能把自己也锁在外面。我的做法是先把管理界面访问的规则写在最前面,然后每加一条规则就顺手在浏览器里刷新一下,确认页面还能打开,再继续往下配。

提示:m0n0wall的规则列表按从上到下的顺序匹配,匹配到第一条就停止。所以“放通某些IP的80端口”和“拒绝其余所有流量”这两条,顺序千万不能写反。

3.3 第二台防火墙和内部网络的联动配置

第二台防火墙的安装流程跟第一台一模一样,区别就在接口分配和IP地址。

它的WAN口要接在DMZ网段,也就是vboxnet1,地址配10.10.10.2/24。它的LAN口接内部网络,vboxnet2,地址配172.16.10.1/24。在m0n0wall里,WAN口和LAN口是可以任意指定物理网卡的,这里不需要额外设置。

第二台防火墙配完之后,第一件事不是加过滤规则,而是加上台默认路由。进入“System”菜单的“Routing”,把默认网关设为10.10.10.1,也就是第一台防火墙的LAN口地址。这一步决定了内部网络的机器能不能把流量发到外部网络。

然后设置NAT和规则。跟第一台类似,在第二台防火墙的WAN口做源NAT,把172.16.10.0/24的流量转换成10.10.10.2。规则我建议这样设计:只在WAN口放行DMZ区域的流量访问内部网络,而且目标端口只开放特定的业务端口,比如22和3306。内部网络访问外部的请求由第二台防火墙来做NAT和放行,LAN口规则保持默认。

这还没完,跨防火墙还有一个关键配置:第一台防火墙需要知道“内部网络”这个网段应该往哪里走。回到第一台防火墙的“System”菜单,在“Static Routes”里添加一条静态路由:目标网络172.16.10.0/24,网关填10.10.10.2。没有这条路由,第一台防火墙会把发往172.16.10.0/24的包当成外部流量转发到互联网,那内部网络的回包就永远到不了攻击机。

两层防火墙加静态路由配齐之后,整个链路就变成了:攻击机192.168.56.10 -> FW1的WAN口 -> FW1的LAN口 -> DMZ服务器 -> FW2的WAN口 -> FW2的LAN口 -> 内部靶机。每一跳都有独立的过滤逻辑,这才是双防火墙环境真正的价值。

4. 在环境里跑渗透测试场景的正确姿势

4.1 靶机和攻击机的准备细节

攻击机我用的是常见的Kali Linux虚拟机,具体什么发行版不重要,重要的是它必须待在外部网络段,也就是192.168.56.0/24。装完系统之后,先把网络适配器改成静态IP,网关闭掉Host-Only的DHCP,避免IP漂移给后面的实验带来干扰。

DMZ服务器可以选一个轻量级的Linux,然后装上Nginx或者Apache,再故意开一个存在已知漏洞的Web应用。你不需要真的去找那种很老的CMS,自己写一个只包含SQL注入逻辑的PHP页面就完全够用。这样做的意义在于,你能精确控制漏洞的形态,复现的时候不会被各种环境依赖搞得怀疑人生。

内部网络里的两台靶机,建议一台模拟数据库服务器,装一个MySQL或者Redis;另一台模拟办公主机,装一些常规的开发工具即可。你可以提前在内部主机上布置一些模拟的敏感数据,比如一个文本文件里面写几行“模拟数据库密码”,这样后面练横向移动和权限提升的时候才有明确的目标。

4.2 从外网到内网的分阶段渗透验证

环境搭好之后,不建议一上来就直接打内网。我习惯分成三个阶段来验证,每一个阶段都跟防火墙的规则直接相关,一旦出问题,也好定位到底断在哪一层。

第一阶段,验证外网到DMZ的访问。攻击机先ping一下DMZ服务器的10.10.10.10,通了就说明第一层防火墙的ICMP规则生效了。然后用浏览器或者curl访问http://10.10.10.10,能拿到Web页面,说明80端口的放行规则OK。

第二阶段,验证从DMZ到内网的访问。让被拿下的DMZ主机做跳板,尝试访问内部网络里的数据库服务器172.16.10.20。这时候你大概率会失望——连接超时。不要慌,这是第二台防火墙的规则在起作用,因为我们在FW2上只放行了特定端口的访问,如果你测试的是数据库端口3306,那还得在FW2的WAN口添加一条目标端口3306的Pass规则。这就是渗透测试里常常提到的“东西向流量控制”的模拟场景。

第三阶段,验证内网主机主动向外访问。从靶机A curl一下攻击机的IP,如果第二台防火墙的NAT和规则配得正确,请求能通,但攻击机能看到的源IP是172.16.10.20,说明请求已经穿过两层防火墙了,而内网主机的真实IP对DMZ以外的设备是隐藏的。

这三个阶段走下来,你不仅验证了防火墙规则,还顺便摸清了流量转发路径。后续再跑什么漏洞利用、密码爆破、横向移动,都有个清晰的地理位置概念:我现在踩在哪一层,过了哪台防火墙。

注意:所有渗透测试动作都只能针对自己搭建的这些靶机进行。虚拟化环境再接近真实,也只是授权范围内的演练场,这个边界必须牢牢守住。

5. 常见问题与排查技巧实录

5.1 浏览器打不开m0n0wall管理界面

这个是最常见的坑。装了m0n0wall之后,浏览器输入http://10.10.10.1没反应,很多人第一反应是防火墙挂了,其实八成是接口分配反了。

排查方式很简单:在m0n0wall字符界面菜单里看接口列表,如果LAN口显示的是你在VirtualBox里认定的第二块网卡,但Web管理界面始终不通,就先确认自己的访问机在不在同一个网段。比如你的管理机是Windows,Host-Only网卡如果被设成了另一个网段,那永远也访问不了。

还有一个容易被忽略的问题:m0n0wall的Web管理界面默认只监听LAN口,不会在WAN口上开管理端口。如果你访问的是WAN口的IP,那是怎么都进不去的。这是安全设计,不是故障。

5.2 外部机器能ping通DMZ,但访问Web超时

这个现象通常指向规则顺序错误。比如你在FW1的WAN规则里写了“允许所有ICMP”,后面又写了一条“拒绝所有TCP”,那Web肯定不通,因为第一条规则已经匹配放行了ICMP,TCP流量会被第二条拒绝掉。

正确的顺序应该是:先精确放行80端口和少量测试端口,最后再写一条默认拒绝。你可以在规则列表里把默认规则拖动到最下面,m0n0wall的拖拽功能虽然不太顺手,但胜在规则少,多试几次总能排对。

5.3 内网主机能出外网,但外部访问不进来

这个问题十有八九出在NAT配置上。m0n0wall默认的“Manual Outbound NAT”只转换你指定的源网段,如果内网主机出外网用的是172.16.10.0/24,但你只在FW2上写了源地址10.10.10.0/24的NAT规则,那流量转发到内部网络后,源地址没有被正确转换,内网主机收到包却发现源地址不可达,直接丢弃回包。攻击机看到的表象就是“TCP握手发出去就没回应了”。

排查方式是抓包。在攻击机上用tcpdump抓取流向10.10.10.2的包,同时在FW2的LAN口抓一遍,对比源IP地址的变化,一眼就能看出NAT规则写没写对。

5.4 防火墙规则保存后天不见失效

m0n0wall的pfsense系防火墙规则存储方式比较特殊,某些参数修改之后需要点页面底部的“Apply changes”按钮才能真正生效,只点“Save”按钮很多时候只是把配置写到缓存里。这个按钮藏得不算深,但确实有人会遗漏。每次改完规则,记得看一眼页面底部有没有红色的“Apply changes”提示,有就点,点完再测试。

5.5 双防火墙环境下,内网机器互相访问也超时

如果在内部网络的两台靶机之间做东西向流量测试,发现居然不通,那要检查第二台防火墙的LAN规则。m0n0wall对LAN口同样默认拒绝跨接口转发,如果你没在LAN规则里放行172.16.10.0/24访问172.16.10.0/24的流量,那内部两台机器之间是互相隔离的状态。这个现象在真实网络中不太常见,因为大部分办公网内部默认是互通的,但在这里它确实是一个独立到可以踩的坑。

我当年第一次搭这套环境的时候,在这里卡了整整一晚上。后来悟出一个道理:在双防火墙环境里,任何一次通信失败,都不要急着怀疑漏洞利用姿势不对,先确认流量死在防火墙的哪条规则上,再往下查。

6. 使用体会和我想多说的一句

来来回回在m0n0wall上搭过好几次环境,我最大的感受是:这套东西虽然老,但它把网络隔离的核心逻辑暴露得很干净。你不需要处理那些花里胡哨的功能模块,只需要关心接口、路由、NAT、规则这四件事。这四件事恰恰是绝大多数商业防火墙产品背后真正在做的事情。

现在很多搞安全的朋友习惯用Docker Compose一键起测试环境,方便是方便,但那种环境里网络是全通的,几乎没有隔离可言。而你用双防火墙手动搭一遍环境之后,对“为什么企业里数据库永远不应该放在Web服务器同一网段”这句话会有完全不同的理解。你会亲眼看到,即使DMZ的Web服务器被人拿下了,它想摸到内网数据库,还得跟第二台防火墙的规则做一番搏斗。

最后分享一个小技巧:m0n0wall的配置其实是一个XML文件,放在系统菜单的“Backup/Restore”里。你可以在搭好一套环境之后,把每台防火墙的配置分别导出备份。后面想快速重建实验室、或者把环境复制到另一台电脑上,直接导入配置文件,五分钟就能恢复原状。这比每次都从零开始配置要高效得多。

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

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

立即咨询