大破ログ

日々大破、それと側転少々。PC関連その他、気になったことなどをつらつらと。

Fortinet FortiGate 50E

FortiGate 50E内部

ヤフオクにて漁っていた際にネットワークアダプタの情報がMarvellのものであることに気付いて衝動的に確保し、多少苦しみながらも解決して投げ込み、マージされました。

まとめていきます。

仕様

大半の機種でFortiSOCまたはIntel CPUを搭載するFortiGateとしてはかなり珍しく、Marvellの汎用SoCである88F6820を搭載しています。
そしてRAMが大きい上、個人的に初となる128MiBのSPI-NOR Flashを搭載。(これまで見たことのあるSPI-NORは64MiBが最大)
さらにはイーサネットポートを合計7ポートも搭載。

  • SoC: Marvell Armada 385 88F6820
  • RAM: DDR3 2048MiB (MT41K512M8DA-107 x4)
  • Flash: SPI-NOR 128MiB (MX66L1G45GMI-10G)
  • WAN/LAN: 1000Mbps x2/1000Mbps x5
  • USB: USB 3.0 Type-A x1
  • UART: "CONSOLE", 所謂Ciscoケーブル互換

その他詳細については、雑記を参照。

OpenWrt化

ブートローダが主に復旧用としてファームウェア投入機能を持つ為、それを利用してinitramfsイメージを踏み台とする
なお、 "FG-50E" と称する

FG-50Eのブートメニューを表示させる
電源を接続してブートする途中、 Please wait for OS to boot, or press any key to display configuration menu と表示されたタイミングで適当なキーを押下し、ブートメニューに入る
TFTPサーバを用意
ブートメニュー上で [R]: Review TFTP parameters. を選択してTFTP関連の情報を表示し、それに従ってTFTPサーバを用意する
なお、PCはTFTP関連情報内に示されるポートに接続する
また、OpenWrtのinitramfsイメージは "image.out" にリネームの上TFTPフォルダに配置する
TFTPでinitramfsイメージをダウンロード
ブートメニュー上で [T]: Initiate TFTP firmware transfer. を選択してTFTPを実行し、initramfsイメージをサーバからダウンロードする
initramfsイメージを実行
TFTPサーバからのダウンロードが完了後 Save as Default firmware/Backup firmware/Run image without saving:[D/B/R]? と表示されたら R キーを押下し、Flashには書き込まず実行する
メーカーファームウェアをバックアップ
もし将来的にメーカーファームウェアに書き戻す可能性がある場合など、必要であればメーカーファームウェアをバックアップする
dd を用い、/proc/mtd を確認の上 "firmware-info", "kernel", "rootfs" を最低限取り出し、scp等でPCに転送し保管する
例)
root@OpenWrt:/# mkdir /tmp/mtd
root@OpenWrt:/# cd /tmp/mtd
root@OpenWrt:/tmp/mtd# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 001c0000 00010000 "u-boot"
mtd1: 00010000 00010000 "firmware-info"
mtd2: 00010000 00010000 "dtb"
mtd3: 00010000 00010000 "u-boot-env"
mtd4: 00010000 00010000 "board-info"
mtd5: 00600000 00010000 "kernel"
mtd6: 01800000 00010000 "rootfs"
mtd7: 00600000 00010000 "kn2"
mtd8: 01800000 00010000 "rfs2"
mtd9: 01200000 00010000 "part1"
mtd10: 01200000 00010000 "part2"
mtd11: 01e00000 00010000 "config"
root@OpenWrt:/tmp/mtd# dd if=/dev/mtdblock1 of=mtd1_firmware-info.bin
128+0 records in
128+0 records out
root@OpenWrt:/tmp/mtd# dd if=/dev/mtdblock5 of=mtd5_kernel.bin
12288+0 records in
12288+0 records out
root@OpenWrt:/tmp/mtd# dd if=/dev/mtdblock6 of=mtd6_rootfs.bin
49152+0 records in
49152+0 records out
バックアップをデバイスに書き戻す際は、mtd コマンドを用いて書き込む
mtd write <backup image> <target partition>
例)
mtd write mtd1_firmware-info.bin firmware-info
mtd verify mtd1_firmware-info.bin firmware-info    # 書き込まれたデータが元データと一致するか検証
OpenWrt上でsysupgradeを実行
scpなどを用いてsysupgradeイメージをデバイス上にアップロード(またはダウンロード)し、sysupgradeを実行する
完了
Flashへの書き込みが完了後再起動され、OpenWrtで起動する
この時メーカーファームウェアで起動してしまう場合は、ブートメニューに入ったうえで [B]: Boot with backup firmware and set as default. を選択し、デフォルトのOSイメージをOpenWrtを書き込んだ1番目の方に切り替える

備考

  • フロントのWAN1/2の "SPEED" LED(緑)とLAN1~5の "SPEED" LED(緑/橙)はOpenWrtにおいては100/1000Mそれぞれのリンク速度による取り扱いを行うことができない為、代わりに速度問わずリンクが確立された場合点灯するように構成した。
    Linux Kernel及びOpenWrtにおいて、ネットワークデバイスのリンク速度に従ってLEDを制御するトリガが存在しないことが理由。
    2023/07/29追記: 後日薄っすらと気になる記憶があり確認したところ、Ethernet PHYのリンク状態でLEDを制御するトリガがLinux Kernelに存在していることに気付き、それを使用してメーカー公式ファームウェアと同じ挙動をさせる変更を投げ、マージされた。

  • WAN1, WAN2ポートはデフォルトでブリッジを構成している為、上流が1系統である場合はどちらに接続しても問題無い。
    ただし、それぞれで別系統のWANを利用する場合、ブリッジを解除しそれぞれにOpenWrtの仮想インターフェースを割り当て直す。

  • OpenWrtのサポートにおいては、Flash内に2組存在するOSイメージ領域のうち1つ目の最小限を利用するよう構成しており、もう片方のメーカーファームウェアに対しての影響は恐らく無いと思われる。
    この為、ブートメニューにおいて [B]: Boot with backup firmware ~ を選択することで、必要に応じてOpenWrtとメーカーファームウェアを切り替えてブートできる。

  • 中古などで入手する場合、本機種のDCジャックは特殊であり通常の丸形プラグを持つACアダプタを使用できない為、基本的にはACアダプタが付属するものの選択を推奨。
    なお、嵌合するプラグはMolex 5557-02Rであり、自作することは可能()。

作業時の色々

  • 現状FortinetからGPLソースコードは提供されておらず、基本的にはメーカーファームウェアのDeviceTreeのほか、実機上で試行錯誤を重ねてサポートを詰めていった。

  • ブートローダ自体はU-Bootであるものの、それ自体では中断プロンプトが出ず連続して実行されるFortiGate用プログラムないしはU-Boot内の改変部において中断プロンプトが表示される。それによって現れるブートメニューで受け付けるイメージ形式はU-BootのものではNGで、その形式の特定に少々時間を要した。
    最終的に、本来ヘッダ内にはkernelやrootfs, DTB, その他データ等のoffset/lengthに加え様々な情報が付加されるようであるものの、そのうちkernelとrootfsのoffset/lengthのみでチェックを通せることが判明し、その形式をOpenWrtでのビルド時に生成するようにした。

  • 上記のTFTPで渡すイメージ形式に加えて、Flash内からブートする際に必要となるファームウェア情報が格納される場所の特定にも少々時間を要した。
    TFTPで渡すイメージにはヘッダが必要であるものの、実際にFlash内のファームウェア領域に書き込まれるファームウェアではヘッダが削除されており、単体のzImageとなっている。しかし一方で、ブートローダによってFlash内からブートされる際、明らかにどこかに格納されたサイズ値を用いてkernelを読み込んでいるログが出ており、FlashからOpenWrtをブートするにはそれがどこに存在しているかを探し当てる必要に迫られた。
    Flash内でファームウェア情報らしきものが存在する領域は早々に特定していたものの、ではその内のどれがKernelのサイズ値であるかということを特定するのに手間取った。結局のところ、あちこちの値に何とはなしにビットシフトを掛けていた時に偶然ブートローダが読み出すサイズの16進数値に見えるものが出現し、確認した結果 0x200 (512 bytes) をブロックサイズとしたブロック数が格納されていることを特定した。なお、kernelだけではなくrootfsのブロック数も格納されていた。

  • SoCのCPUが2C2Tであること、1GHzを超えるクロックであることなどからパワーがあり、サポート作業中の計測では LAN→WANの単純NATにおいて900Mbps超を記録し、負荷時のCPU使用率は 50%前後であった。

色々

日本国内でのOpenWrt目的としては貴重な有線機であること、上記の通り厄介な点はいくつかあったものの技術的興味は大きかったことなどから、ヤフオクで落札し届いた翌日からひたすら弄り回してサポート作業を進め、作業開始から4日ほどで大まかにOpenWrtで動作するところまでこぎつけることができた。
上述の通りSoCにパワーがあり、RAMが多く、イーサネットポート数が多く、USB 3.0ポートを搭載する上に中古ではライセンス切れの個体などが安価に数が出ている為、選択肢として良いように思える。個人的にはコンソールポートを搭載しているのもGood。