搞网络的人多少都遇到过这种场面:一台跑得好好的Fortigate防火墙,某天突然反复重启、升级中途断电、或者开机直接卡在引导界面,配置还没来得及备份。这时候最要紧的事情,就是从设备里把配置和关键日志捞出来——也就是做一次文件系统提取。我把这几年在Fortigate上做文件系统提取的几种路径、具体操作和踩坑记录整理成文,给有同样需求的运维朋友做个参考。
先说清楚适用范围:下文提到的所有操作,都只针对你拥有合法管理权限的设备和固件,用于故障恢复、数据备份和学习研究。无论哪种提取方式,只要方向明确、步骤耐心,Fortigate里面那些配置、日志、证书文件大部分都能救回来。
1. 先搞清楚Fortigate文件系统到底长什么样
1.1 从分区结构理解"提取"的本质
Fortigate防火墙运行的是FortiOS,这个系统虽然看起来像封闭的嵌入式系统,但底层其实是一套Linux内核加定制用户态。不同硬件型号的存储介质不一样,有的是板载SSD,有的是CF卡,虚拟化版本则是虚拟磁盘,但它们的逻辑分区结构大体上是一致的:
- Bootloader区域:负责引导,一般很少动它。
- 内核与内核模块:启动时加载,固件升级会整体替换。
- rootfs(根文件系统):以只读方式挂载,通常是squashfs这类压缩只读文件系统,里面是系统程序和库文件。
- data区(配置与日志存储区):可写分区,设备的配置文件、证书、日志、会话状态都在这里,通常是ext4格式。
搞清楚分区结构之后,"提取文件系统"就有了明确目标:大部分故障恢复场景要的是data区里的配置文件,固件解包分析场景要的是rootfs里的系统程序,日志取证场景则要把data区里的日志文件完整导出来。不同目标对应不同的操作路径,这就引出了下面按设备状态的提取方法分类。
1.2 为什么说提取文件系统是故障恢复的"救命稻草"
我自己遇到的最典型情况,是某台分支机构的FortiGate 60F在升级FortiOS 7.2到7.4的过程中断电,重启后网络接口全部失踪、Web管理界面直接进不去,SSH也连不上。当时唯一的希望就是通过console口进维护模式,把data区里最新的配置文件抓出来,然后在新设备上恢复。
另一个常见场景是设备硬件损坏但磁盘没坏:把存储介质拆下来做镜像,再从镜像里提取配置和日志,这种离线的做法在设备已经无法开机时尤其管用。此外,安全研究或固件分析也需要从官方固件包里提取rootfs做版本比对、漏洞分析,这属于另一种"提取",用的是完全不同的工具链。
2. 设备还能开机时的在线提取操作
2.1 最稳妥的官方备份路径
如果设备虽然异常,但还能进入CLI或者Web管理界面,优先走官方备份,这属于最不容易出错的做法。
在CLI下执行:
execute backup config tftp <文件名> <服务器IP>这条命令会把当前运行配置以文本形式备份到TFTP服务器。如果要连证书一起备份,用:
execute backup full-config tftp <文件名> <服务器IP>Web界面则在"System > Advanced > Backup"里下载配置文件。这类备份虽然拿到的不是整个文件系统,但对绝大多数恢复场景已经足够。我建议所有能在CLI登录的设备先做这一步,哪怕你马上准备进维护模式做更底层的提取,也要先有一个保底配置在手。
2.2 用系统自带的诊断命令直接读文件
一些较新版本的FortiOS提供了直接查看底层文件的命令,不用特意进维护模式。假设我想确认data分区的位置和挂载情况,可以执行:
diagnose hardware sysinfo memory diagnose sys coredump list查看临时文件或者系统文件列表,可以用:
fnsysctl ls /data fnsysctl cat /data/etc/fortidebug.conffnsysctl在较老的FortiOS版本里是访问底层文件系统的主要入口。在7.x版本中,部分命令被收紧,但diagnose目录下仍然有很多有用的子命令。
这里要提醒一下:能在线操作时,别急着拆机或者反复重启设备。在线状态下导出的文件最完整,而且你可以随时用execute backup和fnsysctl两种方式交叉验证,确保拿到的配置是完整可用的。
2.3 在线提取时的网络与传输协议选择
在线提取时,传文件通常有三种方式可选:TFTP、FTP、SCP。我实际用下来的感受是:
- TFTP最轻量,局域网里非常快,但服务器端需要提前搭好,且没有加密和校验,所以只建议在隔离的维护网络里用。
- FTP支持列出目录、上传下载都方便,但明文传输同样只适合临时环境。
- SCP走SSH通道,如果有管理SSH权限,是安全性最高的选择,传输失败率也最低。
如果你手边的设备还能使用SSH管理,我更推荐用SCP方式直接把备份文件拉回来,避免TFTP服务器UDP丢包导致文件不完整。具体操作是在CLI里开启SCP服务端:
config system global set admin-scp enable end然后在电脑上用scp admin@<防火墙IP>:sys_config <本地路径>拉取配置文件。这个方式比TFTP稳很多,尤其在文件较大、链路有丢包的环境中。
3. 设备无法正常启动时的维护模式提取
3.1 进入维护模式的时机与按键技巧
FortiGate在引导过程中预留了一个维护模式入口,官方的叫法是"Maintenance Mode"或"Emergency Recovery Mode"。不同型号进入方式稍有差别,但绝大多数设备都是开机后密切关注console输出,在出现倒计时提示时按Ctrl+C中断引导,然后选择进入维护模式。
以FortiGate 100F为例,接好console线后,给设备加电,终端窗口会快速滚动日志,看到类似Press Ctrl+C to stop auto-boot...的提示时,立刻按Ctrl+C。如果没截住,可以重启再来一次,多试几次就能摸到时机。
进入维护模式后的命令行提示符通常是M开头,比如M[100F]:。在这个模式里,系统会挂载一个最小化的文件系统供操作,它能识别设备内置的存储介质,并提供ls、cd、tftp、fdisk等基础命令。但要注意,维护模式不是完整系统,很多上层命令不可用,所以操作逻辑以"挂载分区、定位文件、导出文件"为主。
3.2 在维护模式下定位配置分区
设备进入维护模式后,默认不会自动挂载data区。首先要确认存储设备名称。在大多数基于SATA/SAS磁盘的设备上,它会是/dev/sda之类;在基于CF卡的设备上,可能是/dev/mmcblk0或/dev/hda。
我通常在提示符下执行:
fdisk -l查看整个磁盘的分区布局。一个典型的FortiGate磁盘输出会包含多个分区,其中要重点找的是ext4格式的那个分区,它就是配置文件所在的数据分区。确认分区号后,建立一个临时目录并挂载:
mkdir -p /tmp/mnt mount /dev/sda3 /tmp/mnt分区号不要照抄,不同型号、不同FortiOS版本的分区编号会有差异,一定要先看fdisk -l的输出再决定。
挂载完成后,配置文件一般在/tmp/mnt/etc目录下,核心文件是forticonf.conf或system.conf(不同版本文件名有差异),日志在/tmp/mnt/log目录。用ls -la仔细看一下文件大小,确认文件不是0字节再动手导出。
3.3 通过TFTP把文件救出来
文件找到之后,就需要传输到外部主机。在维护模式下,最通用的传输方式就是TFTP。先给防火墙管理接口配置一个和TFTP服务器同网段的IP:
ifconfig eth0 192.168.1.2 netmask 255.255.255.0然后执行导出:
tftp -p -r system.conf -l /tmp/mnt/etc/system.conf 192.168.1.100其中-p表示put(上传),-r是远程文件名,-l是本地文件路径,最后的IP是TFTP服务器地址。如果文件比较多,比如要把整个/tmp/mnt/etc目录打包导出,维护模式下没有tar是常见问题,这种情况可以用dd配合管道来传,不过前提是文件是连续的块设备。更务实的做法是逐个导出关键文件,别贪多。
3.4 维护模式导出的实战顺序建议
按我自己在故障现场的操作习惯,进维护模式后按这个顺序行事:
- 先执行
fdisk -l,完整记录分区表,防止后续操作出错时不知道原始状态。 - 挂载data分区后,先用
ls -la记录文件列表和大小,至少确认system.conf存在且非空。 - 导出配置文件、证书目录、日志目录三块,缺一不可。证书在
/tmp/mnt/etc/cert或类似路径下,少了它就算拿到配置也没法用于新设备。 - 每次TFTP传输成功后,回到电脑上对比文件大小,确保和源文件一致再动下一步。
4. 设备彻底开不了机时的离线固件提取
4.1 从官方固件包中解出rootfs
在线和维护模式都走不通,或者目标仅仅是分析固件内部结构时,可以从FortiOS固件镜像入手。官方固件通常是一个带自定义文件头的压缩包,用常规解压工具打不开,需要先识别文件头。
用binwalk先扫描一把:
binwalk fortios.img输出里会明确标出rootfs压缩文件所在偏移量,最常见的格式是squashfs。拿到偏移量后,可以用dd把rootfs部分截取出来:
dd if=fortios.img of=rootfs.squashfs bs=1 skip=<偏移量>然后用unsquashfs解包:
unsquashfs rootfs.squashfs解开后就是一个完整可浏览的根文件系统,系统程序、库文件、启动脚本都在里面。对于想验证版本差异、研究启动流程的人来说,这一步等于打开了黑盒。
4.2 不同固件版本对提取工具的影响
FortiOS 6.x的固件头部结构相对简单,binwalk识别率高。到了7.0之后,Fortinet在固件封包上做了一些调整,部分版本直接binwalk会识别不出squashfs,这时候可以先跑binwalk -A或者用foremost按文件特征去扫描。
另一个常见问题是新旧固件的压缩算法差异:旧版多采用gzip压缩的squashfs,新版可能使用xz或zstd。unsquashfs的版本如果太老,会报"Filesystem uses unsupported compression"的错误。解决办法是升级squashfs-tools到最新版,而不是绕过报错。
4.3 有磁盘镜像时的离线提取路径
如果手里有从故障设备拆下来的整盘镜像(比如用dd或者ddrescue做的镜像文件),不需要直接操作物理设备,可以把镜像文件挂载起来提取:
fdisk -l fortigate_disk.img losetup /dev/loop0 fortigate_disk.img -P mount /dev/loop0p3 /mnt/forti关键点是losetup -P参数,它让内核把镜像里的分区表也解析出来,这样每个分区就能以loop0p1、loop0p2这样的设备节点访问。如果不用-P,内核往往只暴露整个镜像为一个块设备,分区挂载会很麻烦。
磁盘镜像提取的好处是保留了原始的分区结构、文件权限、删除文件的残留数据,对日志取证和故障根因分析价值最高。缺点是需要额外的存储空间和分析时间,一块4GB的磁盘镜像做全盘字符串扫描也不算轻松。
5. 提取过程中的常见问题与排查思路
5.1 问题速查表
结合实际操作经验,我把最常遇到的问题整理成一个速查表,方便在现场对照处理:
| 现象 | 可能原因 | 排查与解决 |
|---|---|---|
| TFTP传输一直超时 | 防火墙接口IP未配置;电脑防火墙拦截UDP 69端口;TFTP服务器目录无写权限 | 确认两端IP同网段;临时关闭电脑防火墙或放行TFTP端口;检查服务器目录权限 |
维护模式下ls无输出 | data分区未挂载;分区编号选错 | 先fdisk -l看分区表;检查dmesg有无挂载错误;确认文件系统是否损坏 |
| 导出的配置文件是0字节 | 挂载只读失败;文件路径不对;读取时分区已经异常 | 重新挂载并检查mount输出;在/tmp/mnt下逐层ls确认路径 |
unsquashfs报压缩算法不支持 | squashfs-tools版本过旧;固件用了新压缩算法 | 升级到最新squashfs-tools;尝试加-no-xattrs参数绕过属性解析问题 |
binwalk识别不出rootfs | 固件文件头被加密或压缩;文件不是完整固件 | 用binwalk -A做深度扫描;检查文件大小是否为完整固件包;考虑对固件头做偏移分析 |
| 恢复配置后部分接口状态不对 | 配置文件与硬件型号不匹配;接口索引发生变化 | 用config system interface手工核对;在新设备上微调接口映射关系 |
5.2 分区挂载失败的处理经验
维护模式下挂载data分区,偶尔会看到mount: mounting /dev/sdaX on /tmp/mnt failed: Invalid argument之类的报错。这通常不是磁盘彻底坏了,而是文件系统有轻微异常。先试试只读挂载并跳过日志回放:
mount -r -t ext4 /dev/sda3 /tmp/mnt-r只读挂载能避开日志回放失败带来的干扰,对读取配置来说足够了。如果还不行,再用e2fsck -n /dev/sda3以只读方式检查文件系统,注意一定带-n,避免修复操作对原始数据造成二次改动。
5.3 版本差异导致的路径变化
FortiOS从6.0到7.4的演进过程中,配置文件路径和文件名有过调整。我的习惯是挂载好分区后,不急着找特定文件名,先列目录:
ls -la /tmp/mnt/ ls -la /tmp/mnt/etc/把整个目录树看一遍,确认实际文件名和位置,比靠记忆去套路径可靠得多。毕竟故障现场时间宝贵,多试两次错误路径会浪费大量时间。
6. 提取完成后的数据利用与现场心得
6.1 配置文件恢复的正确姿势
拿到配置文件后,如果目标是在另一台FortiGate上恢复,路径有两种:一是通过Web界面"Restore"上传备份文件;二是在CLI下执行:
execute restore config tftp <文件名> <服务器IP>恢复完务必留意版本匹配问题:配置文件的版本不能高于目标设备固件版本,否则可能出现语法解析错误。跨大版本恢复时,建议先在新设备上升级固件到与旧设备相同或相近的版本,再恢复配置,不要先把配置灌进去再升级,那样更容易出问题。
6.2 日志文件和证书的后续处理
日志文件提取出来后,如果是明文日志,直接用文本工具分析就行;如果是二进制格式,可以先在本地用FortiGate配套的工具或第三方日志分析平台做解析。证书文件导出后,建议立即用OpenSSL检查有效期和私钥是否匹配:
openssl x509 -in cert.pem -text -noout openssl rsa -in private.key -check如果证书已经过期,白忙一场。所以不要在提取完配置后就松懈,证书验证是容易被忽略但极其重要的一步。
6.3 一些花钱买不来的实操体会
我在实际处理这类问题时,最大的体会就是"备份永远是第一位的"。定期做配置备份、把备份文件存储在设备之外,才是解决问题的根本手段,文件系统提取只是事后补救。另一个体会是保存好原始固件镜像和磁盘镜像,即使当前用不到,在后续做故障复盘、安全分析时这些原始数据都是最有价值的证据。
提取工作完成后,不要急着把设备返修或者重新刷机,先在电脑上保留一份完整的镜像文件和关键文件清单。如果你和我一样管理着一批FortiGate设备,建议为每个型号建立一份文件系统关键路径速查表,设备尺寸不同、版本不同,路径差异记在文档里比记在脑子里可靠得多。