top of page

機種もバージョンも違う FortiGate の設定移行を AI に任せてみた(50E → 50G)

エンジニアK
6 日前
読了時間: 9分

FortiGate-50E から FortiGate-50G へのリプレースで、コンフィグの移行作業を AI に依頼しました。

使ったのは、Claude Code(モデルは Claude Opus 5.5)と OpenAI の Codex です。


結果として、50G にリストアするためのコンフィグ、CLI スクリプト、移行手順書まで一式を作ってくれました。 この記事では、AI が何をどう進めたのかを紹介します。


作成したフルコンフィグは、50G の実機に GUI からリストアし、コンフィグが通ることまで確認しました。 一方、通信や VPN の動作試験はこれからです。 この記事は「AI が移行用のコンフィグと手順書を作り、実機にリストアするまで」の記録です。


コスト

Claude Code(Opus 5.5)の利用料は、

約 2.86 ドルでした。

これとは別に Codex も使っているため、合計はもう少し高くなります。

コストは以下の記事で可視化したMod機能でわかりました。



今回の移行が面倒な理由


FortiGate の設定移行は、同じ機種・同じバージョン同士なら、バックアップとリストアで進めるのが基本です。 今回はその前提が成り立ちませんでした。

  • 機種が違う: 50E のバックアップは 50G にそのままリストアできません。コンフィグの先頭に機種情報が入っているうえ、ポート構成や使えるコマンドも機種ごとに異なるためです。

  • バージョン差が大きい: FortiOS 6.2.16 から 7.4.11 への移行です。設定項目の追加・廃止や既定値の変更があります。

  • ポート名が違う: 50E の wan1 は、50G では wan という名前になります。

  • 使っていないポートがある: 50E の一部のポートは使っておらず、移行の必要がありません。

人手でやると、数千行あるコンフィグを読み比べて必要な設定を拾い、新機種向けに書き直す作業になります。 地味ですが、ミスが通信断に直結する作業です。


AI への依頼内容

依頼は、次のようなテキストファイル 1 つだけです(ファイル名などは一般化しています)。

master.txtの内容↓

FG50EからFG50Gへコンフィグを移行してほしいです。

- FG50Eのコンフィグは「(50E のバックアップファイル)」
- FG50Gのコンフィグは「(50G のバックアップファイル)」
- 結果は「output」に出力してください
- wan2およびlan4およびlan5は利用していません
- wan1はwanに移行となります
- 判断に迷ったときは人間に意見を求めてください
- FG50Gのコンフィグは上書きしてOKです。lanとか。

50G 側のコンフィグは、初期設定に近い状態のものを渡しています。 これをベースに、50E の設定を移し替えてもらう形です。


人間が入力したプロンプト


会話で入力したのは、次のプロンプトだけです(フォルダ名は一般化しています)。

  1. (作業フォルダ)に移動してください

  2. master.txtの内容を読めますか?

  3. 作業をお願いします

ほかには、作業中に AI から来た 4 つの質問に、選択肢から答えただけです(後述)。

移行作業そのものについての細かい指示は出していません。


作業の終盤には、手順書への追記を 2 回依頼しました。

  • READMEに人間が入力したプロンプトと質問に答えたプロンプトも記載してください

  • 流れをREADMEに追記できますか?

その結果、手順書の末尾には「依頼内容」「入力したプロンプト」「質問と回答」「作業の流れと役割分担」が作業記録として残っています。

後から第三者が見ても、どこまでを人間が判断し、どこからを AI が進めたのかを追えるようになりました。


AI が進めた作業

1. 2 つのコンフィグの差分分析


最初に、2 つのコンフィグを config セクション単位に分解して比較しました。

50E は約 6,000 行・226 セクション、50G は約 10,600 行・248 セクションです。


単純に比べると、ほぼすべてのセクションに差分が出ます。

多くは機器ごとに異なる UUID や、バージョンによる既定値の違いでした。


そこで AI は、まず UUID の行を無視して比べ直し、比較のノイズを減らしました。

そのうえで、移行元にしかない設定や、ポリシーから参照されている設定を個別に確認し、移行対象を選んでいます。


その結果、移行が必要なものは次のように整理されました。

  • インターフェース(PPPoE の WAN、LAN、Wi-Fi 用 VLAN、IPsec VPN)

  • アドレス・サービスなどのオブジェクト

  • ファイアウォールポリシー 21 件と local-in-policy 2 件

  • DHCP、DNS、スタティックルート、管理者の信頼ホスト、ログ設定


「移行しない」と判断した設定にも理由が付いていました。 たとえば UTM プロファイル(アンチウイルスや Web フィルタ)は、ポリシーから参照されておらず既定値のままです。 そのため、移行先の既定値を使えばよいと判断しています。


2. 迷った点は人間に質問

依頼文の「判断に迷ったときは人間に意見を求めてください」に従い、AI は作業前に 4 つの質問をしてきました。

質問

背景

人間の回答

パスワード・事前共有鍵の扱い

6.2 の暗号化値が 7.4 で復号できる保証がない

暗号化値をそのまま転記

出力形式

フルコンフィグか、差分の CLI スクリプトか

両方を出力

50G 初期設定の LAN 向け DHCP サーバー

50E では LAN の DHCP を使っていない

削除する

DNS の設定

50G の既定は DNS over TLS、50E は ISP の DNS

50E と同じ ISP の DNS

どれも、移行後の動作に影響する判断です。

選択肢ごとに推奨案と理由が示されていたので、こちらは選ぶだけで済みました。

結果的に、4 問とも AI の推奨案をそのまま選んでいます。


3. 移行設定の作成と「落とし穴」の回避


AI は、移行する設定を CLI 形式のテンプレートとして書き起こしました。

wan1 から wan への置き換えも、ポリシー・ルート・VPN・アドレスのすべてで行っています。


途中で、人間でも見落としそうな点に気づいていました。

  • ポリシーの評価順が崩れる問題: 50G の初期設定には「ID 1 = LAN から WAN へ全許可」のポリシーがあります。一方、50E の ID 1 は「全拒否」で、LAN から WAN への許可ポリシー群の後ろに置かれています。50G の ID 1 をそのまま上書きすると、位置が変わらないため全拒否が先頭に来てしまいます。AI は、いったん削除してから 50E と同じ順序で作り直す方法を取りました。

  • DHCP サーバーの競合: 50G の初期設定にある LAN 向け DHCP を残すと、既存の DHCP サーバーと競合する可能性があります。

  • DNS の方式: 50G 既定の DNS over TLS のままだと、50E と動作が変わります。


4. 変換プログラムは Codex が実装


テンプレートを 50G のコンフィグに反映し、リストアできるフルコンフィグを作る処理は、プログラムで行いました。 このプログラムの実装は、Claude Code が仕様書を書いて Codex に依頼しています。


仕様書には、次のような点が具体的に書かれていました。

  • FortiOS コンフィグの構造(config / edit / set のネスト、複数行にわたる証明書の値)

  • CLI で投入したときと同じ結果になる反映ルール

  • 変更していない部分は元のファイルと 1 文字も変えないこと

  • パスワードなどの秘密値は、画面にもログにも出さないこと

Codex は、変換プログラムとテスト 28 件を作成しました。


5. コードレビュー・実行・検証


Claude Code は、Codex が作ったコードをレビューしてから実データで実行しました。

最初の実行はエラーで止まりました。

原因は、Claude Code 自身の仕様の誤りです。 FortiOS のバックアップに普通に含まれる unset 行を、エラーとして扱う仕様にしていました。

Claude Code はこれを自分の誤りと認めて 1 行修正し、再実行しています。


生成後は、次の検証も行いました。

  • ポリシーやグループが参照するオブジェクトが、すべて存在するか

  • 旧ポート名(wan1 など)への参照が残っていないか

  • ポリシーの並び順が 50E と同じか


6. 手順書の作成と独立レビュー


最後に Claude Code が移行手順書(README)を作り、Codex がそれを独立した立場でレビューしました。 Codex からは 6 件の指摘がありました。


  • 新旧の機器が同じ LAN の IP を使うため、切り替え時の配線手順が必要

  • リストア後に設定の読み込みエラーを確認するコマンドを入れるべき

  • 拒否されるべき通信の確認項目も必要

Claude Code はすべての指摘を採用して手順書を修正しました。

指摘を受けて、拒否ポリシーには 「set action deny」 を明示する変更もコンフィグに加えています。 再レビューの結果は「重大な指摘なし」でした。


Claude Code と Codex の役割分担


今回は、2 つの AI に役割を分けて作業させました。

担当

作業

Claude Code

差分分析、質問、移行設定の作成、仕様書の作成、コードレビュー、実行・検証、手順書の作成

Codex

変換プログラムとテストの実装、手順書の独立レビュー

移行設定の中身を考えたのは Claude Code です。

Codex のプログラムは、それを 50G のコンフィグへ機械的に反映する役割です。

作った人とは別の AI がレビューする体制にしたことで、作成者が見落としていた運用面の抜けを拾えました。


できあがったもの

成果物

内容

フルコンフィグ

50G へのリストア用コンフィグ(実機で GUI からリストアし、読み込みエラー 0 件を確認済み)

CLI スクリプト

移行分だけを投入する CLI(代替手段)

移行手順書

移行内容、移行しなかった設定と理由、切り替え・切り戻し手順、投入後の確認項目

依頼してから成果物ができるまで、質問への回答を含めて 30 分ほどでした。


使ってみて感じたこと


良かった点

  • 止まるべきところで止まる: 動作に影響する判断は勝手に決めず、推奨案付きで質問してくれました。

  • 既定値の違いまで見ている: 初期設定のポリシーや DHCP、DNS の方式など、バージョン差・機種差による落とし穴を拾っていました。

  • 秘密情報の扱いが慎重: パスワードや事前共有鍵は、テンプレートではプレースホルダーにし、作業中の画面表示も伏字にしていました。暗号化値は、変換プログラムが成果物へ直接転記しています。

  • 「移行しない理由」まで残る: 手順書に判断の理由が残るので、後から人間が検証しやすくなっています。



注意点

  • 動作試験は必須: 実機へのリストアは通りましたが、通信・VPN・拒否動作などの試験はまだです。リストアが通ることと、移行元と同じ動作をすることは別物です。

  • 暗号化値の互換性は未確認: 6.2 の暗号化値をそのまま転記しているため、7.4 で接続できなければ再入力が必要です。

  • AI の出力はレビュー前提: 今回も、AI 自身の仕様の誤りが 1 件ありました。テストと独立レビューで見つけられる体制が大事です。

  • 顧客情報の扱い: コンフィグには IP アドレスや認証情報が含まれます。AI に渡す前に、利用する環境や社内ルールを確認してください。


コメント


bottom of page