はじめに
IBMからAIエージェント駆動の次世代エンタープライズ向け開発支援パートナーBobが3月末に登場しました。
仕事でもトライアルをしていたのですが、久しぶりに個人のアカウントでも利用可能なIBM製品なので、自分のPCでも30日フリートライアルを試してみました。IBMの個人向け製品というと20年位前のホームページビルダーを思い出しますね。
この記事はIBM関連の製品はプロモーションではなく、個人的な検証になります。
今回のミッション
IBM BobやVSCodeベースのIDEにはリモートエクスプローラーという機能があり、SSHでサーバーに接続しその環境を操作したり環境上で開発することが可能です。
この機能を使って、今回は個人開発だけではなくサーバー構築にもBobを利用できないかと考えて検証を行いました。
↓このアイコンです。

BobにはIDEとは別にBob-Shellというシェル統合型のツールもあります、こちらのツールでもCLI上で対話しながら作業が可能ですが、こちらの場合は、チャット内ですべての操作ができるようアカウントの権限調整するか、複数のターミナルを起動して操作を行う必要があります。
https://bob.ibm.com/docs/shell
プロローグ: サーバー情報の可視化(2時間)
最初の課題
SMTP設定を始める前に、まず、このサーバの構成を可視化する必要がありました。
このサーバは個人的な検証として構築したものでメモレベルでしか構築情報は残っていませんでした。
構築時メモを元に、パッケージやコンテナ環境内で動いているサービスを可視化するためのスクリプトをまずはBobに作成させました。
system_scanner.pyの誕生
Bobが作成したのは、Linuxサーバーの情報を包括的に収集するPythonスクリプトでした。
このスクリプトはこのVPSの環境以外にも汎用的に使いたいとリクエストをしています。
収集する情報:
- 基本情報(ホスト名、IP、アップタイム)
- OS情報(ディストリビューション、カーネル、WSL検出)
- ハードウェア(CPU、メモリ、ディスク)
- ネットワーク(インターフェース、ファイアウォール、リッスンポート)
- ミドルウェア(Nginx、Apache、MySQL、PostgreSQL、Postfix、OpenDKIM)
- プログラミング言語(Python、Node.js、PHP、Ruby、Go、Java)
- コンテナ環境(Docker、Podman)
- systemdサービス
特徴:
- root権限で実行(詳細情報取得のため)
- WSL環境も自動検出
- Docker/Podman混在環境に対応
- JSON形式で出力
実行例
$ sudo python3 system_scanner.py
システムスキャンを開始します...
============================================================
[INFO] 基本情報をスキャン中...
[INFO] OS情報をスキャン中...
[INFO] ハードウェア情報をスキャン中...
[INFO] ネットワーク情報をスキャン中...
[INFO] ミドルウェアをスキャン中...
[INFO] コンテナ環境をスキャン中...
============================================================
スキャン完了!
結果を保存しました: system_scan_result.json
Markdown変換ツール
JSON出力だけでは読みにくいので、Markdownに変換するツールも作成しました。
$ python3 scan_to_markdown.py
JSONファイルを読み込み中: system_scan_result.json
Markdownを生成中...
✓ 完了: system_scan_result.md を生成しました
発見した環境
スキャン結果から現在のサーバは下記のような構成になっていました。
- Postfixは既にインストール済み(停止状態)
- Podman 4.9.3で動作
- WordPress + MariaDB がPod内で動作
- Nginx がコンテナ外でリバースプロキシとして動作
- Let's Encrypt証明書設定済み
- OpenDKIMは未インストール
フェーズ1: SMTP環境構築の設計(30分)
本題の依頼
サーバー情報が整理できたところで、本題のSMTP設定を開始しました。
「このサーバでSMTPを利用したい。Podman上で動くWordPressからコメントなどの通知を送れるようにしたい。DNSはConohaのDNSを利用している。こちらに必要な設定なども合わせて教えてほしい。」
Bobの初期アクション
-
既存環境の再確認
- 先ほど作成したserver_parameters.mdを読み込み
- Podman構成、ネットワーク設定、DNS情報を把握
-
TODOリストの作成
- Postfixのインストールと基本設定 - SPF、DKIM、DMARCのDNS設定準備 - Postfixの詳細設定(SASL認証、TLS設定) - OpenDKIMのインストールと設定 - ファイアウォール設定 - WordPressコンテナからのSMTP接続設定 - DNS設定手順のドキュメント作成 - メール送信テスト -
包括的なセットアップスクリプトの作成
-
setup_all.sh: 総合セットアップスクリプト -
postfix_smtp_setup.sh: Postfix設定 -
opendkim_setup.sh: OpenDKIM設定 -
test_mail.sh: メール送信テスト
-
ポイント: Bobは単にSMTPを動かすだけでなく、本格的なメール配信環境の構築を提案してきました。
フェーズ2: DNS設定ガイドの作成(30分)
Bobの提案
「DNS設定が重要です。SPF、DKIM、DMARCレコードを設定しましょう。」
作成されたドキュメント
- DNS_SETUP_GUIDE.md: 詳細な設定手順(223行)
- DNS_QUICK_REFERENCE.md: コピペ用リファレンス(189行)
- WORDPRESS_SMTP_SETUP.md: WordPress側の設定(267行)
私が行ったDNS設定
ConoHa DNSコントロールパネルで以下を設定:
SPFレコード:
v=spf1 ip4:000.000.000.000 a:vm-XXXXXX.example.com ~all
DKIMレコード (OpenDKIM設定後に取得):
v=DKIM1; h=sha256; k=rsa; p=XXXXXXX...
DMARCレコード:
v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com
MXレコード:
10 vm-XXXXXXXX-8e.example.com.
逆引きDNS (VPSコントロールパネルから):
vm-XXXXXXXX-8e.example.com
重要な質問
「SPF,DKIM,DMARCの記号(バッククォート`)は必要?」
Bobの回答:
「❌ バッククォート(`)は不要です。❌ ダブルクォート(")も不要です。値をそのままコピー&ペーストしてください。」
この質問により、DNS_SETUP_GUIDE.mdとDNS_QUICK_REFERENCE.mdが更新され、より明確になりました。
学び: 些細な疑問でも質問することで、ドキュメントの品質が向上することが分かりました。
フェーズ3: 最初の壁 - 接続エラー(1時間)
問題発生
WordPressのWP Mail SMTPプラグインを設定し、テストメール送信。
Connection: opening to 10.88.0.1:25, timeout=30
Connection failed. Error #2: stream_socket_client():
Unable to connect to 10.88.0.1:25 (Connection timed out)
Bobのデバッグアプローチ
-
診断スクリプトの作成
diagnose_connection.sh- Postfixの状態確認
- ポート25のリッスン状態
- inet_interfaces設定
- mynetworks設定
- UFWファイアウォール設定
- Podmanネットワーク情報
- WordPressコンテナからの接続テスト
-
問題の特定
- Postfixの
inet_interfacesが$myhostname, localhost - Podmanネットワーク(10.88.0.0/16)からの接続を受け付けていない
- Postfixの
-
修正スクリプトの提供
fix_postfix_network.sh-
inet_interfaces = allに変更 -
mynetworksにPodmanネットワークを追加
-
私の対応
実際には、自分で試行錯誤していました:
-
mynetworksに10.0.2.0/24を追加 - UFWで該当アドレス帯を解放
- WordPress側でSMTPアドレスを
000.000.000.000(外部IP)に変更
結果: 接続は成功したが、新たな問題が...
フェーズ4: 第二の壁 - Relay Access Denied(2時間)
新たな問題
2026-04-17 13:44:00 SERVER -> CLIENT: 250 2.1.0 Ok
2026-04-17 13:44:00 CLIENT -> SERVER: RCPT TO:<USERNAME@example.com>
2026-04-17 13:44:00 SERVER -> CLIENT: 454 4.7.1 <USERNAME@example.com>: Relay access denied
接続はできるが、メール送信が拒否される。
Bobの分析
-
ログ分析
- WordPress → 000.000.000.000:25 に接続
- Postfixは「この接続元IPはmynetworksに含まれていない」と判断
-
根本原因の特定
- WordPressが外部IP(000.000.000.000)に接続
- Postfixは外部IPからの接続を信頼していない
-
mynetworksに10.0.2.0/24は追加済みだが、実際の接続は外部IPから
-
2つの解決策を提示
-
方法1: 外部IPを
mynetworksに追加(即座に解決) - 方法2: WordPress設定を内部IP(10.0.2.1)に変更(より安全)
-
方法1: 外部IPを
私の選択
方法1を採用。fix_external_ip_relay.shを実行。
mynetworks = 127.0.0.0/8, 10.0.2.0/24, 10.88.0.0/16, 172.17.0.0/16, 000.000.000.000/32
結果: メール送信成功!🎉
2026-04-17 13:49:59 SERVER -> CLIENT: 250 2.1.0 Ok
2026-04-17 13:49:59 CLIENT -> SERVER: RCPT TO:<USERNAME@example.com>
2026-04-17 13:49:59 SERVER -> CLIENT: 250 2.1.5 Ok
内部IPへの挑戦
方法2も試したが、10.0.2.1への接続は失敗。
Connection: opening to 10.0.2.1:25, timeout=30
Connection failed. Error #2: stream_socket_client():
Unable to connect to 10.0.2.1:25 (No route to host)
Bobの説明:
「WordPressコンテナはPod内で動作しており、Podのネットワーク構成により10.0.2.1へのルートが存在しません。外部IP(000.000.000.000)を使用する現在の設定で問題ありません。」
学び: Podmanのネットワーク構成を理解することの重要性。理想的な解決策が常に実現可能とは限らない事が分かりました。
フェーズ5: メールスコアの改善(3時間)
衝撃の低スコア
Gmailへの送信は成功。しかし、mail-tester.comでテスト → スコア: -3.7点
SpamAssassin thinks you can improve
Score: -3.7
A score below -5 is considered spam.
-3.243 HELO_DYNAMIC_IPADDR
-0.363 RDNS_DYNAMIC
-0.001 SPF_HELO_NONE
-0.001 SPF_NONE
さらに詳細を見ると:
You're not fully authenticated
- [SPF] vm-XXXXXXXX-8e does not allow your server 000.000.000.000
- Your message is not signed with DKIM
- You do not have a DMARC record
- We didn't find a mail server (MX Record) behind your domain name
Bobの診断
check_mail_score_issues.shを実行して問題を特定:
- SPFレコードが設定されていない → 実は設定済みだった(DNS伝播待ち)
- DKIMが設定されていない → OpenDKIMが動作していない
- DMARCレコードが設定されていない → 実は設定済みだった(DNS伝播待ち)
- MXレコードが設定されていない → 実は設定済みだった(DNS伝播待ち)
-
送信元が
USERNAME@vm-XXXXXXXX-8e→noreply@example.comであるべき -
逆引きDNSが
blog.example.com→vm-XXXXXXXX-8e.example.comであるべき
修正作業
ステップ1: OpenDKIMとPostfix設定の修正
fix_mail_score.sh
このスクリプトが実行した内容:
- OpenDKIMを起動・有効化
- Postfix設定を確認・修正
- 送信元アドレス書き換えを再設定(
/etc/postfix/generic) - DKIM milter設定を追加
milter_default_action = accept milter_protocol = 6 smtpd_milters = inet:localhost:8891 non_smtpd_milters = inet:localhost:8891
ステップ2: 逆引きDNSの修正
ConoHa VPSコントロールパネルで:
-
blog.example.com→vm-XXXXXXXX-8e.example.com
重要: これはDNSコントロールパネルではなく、VPSコントロールパネルから設定。
ステップ3: HELO問題の修正
最大の減点要因「HELO_DYNAMIC_IPADDR (-3.243点)」を修正。
fix_helo_hostname.sh
PostfixがHELOコマンドでIPアドレスを送信していた問題を解決:
smtp_helo_name = vm-XXXXXXXX-8e.example.com
myhostname = vm-XXXXXXXX-8e.example.com
smtpd_banner = $myhostname ESMTP
結果
修正前: 1/10点
主に
The famous spam filter SpamAssassin. Score: -3.6.
A score below -5 is considered spam.
You're not fully authenticated Check DMARC policy state? -5
We check if the server you are sending from is authenticated -1
修正後: 5.3/10点
✓ HELO_DYNAMIC_IPADDR 解消
✓ SPF_PASS 通過
✓ DKIM署名 追加済み
✓ DMARC 通過
⏳ RDNS_DYNAMIC 伝播待ち
Bob IDEでのサーバー構築作業スタイルの特徴
1. 事前準備の重視
ユーザーリクエストですが、SMTP設定の前に、サーバー情報収集ツールを作成:
-
system_scanner.py: 自動情報収集 -
scan_to_markdown.py: Markdown変換 - 現状把握を最優先
2. 段階的なアプローチ
問題を小さく分割し、一つずつ解決:
- サーバー情報収集 → DNS設定 → 接続問題 → リレー問題 → スコア問題
3. 診断スクリプトの活用
問題が発生するたびに診断スクリプトを作成:
-
diagnose_connection.sh: 接続診断 -
debug_relay_issue.sh: リレー問題デバッグ -
check_mail_score_issues.sh: スコア問題診断
情報収集もさっとツールを作り、特権操作が必要な場合はユーザー実行させます。
このような方法であれば、事前に処理内容を管理者が見ることができるので、より安全にサーバー操作が出来ます。
4. 修正スクリプトの提供
診断後、即座に修正スクリプトを提供しました:
-
fix_postfix_network.sh: ネットワーク設定 -
fix_external_ip_relay.sh: 外部IPリレー許可 -
fix_relay_access.sh: リレーアクセス修正 -
fix_mail_score.sh: メールスコア改善 -
fix_helo_hostname.sh: HELO修正
これは、権限が制限されている環境下でもユーザーが情報を与えることにより、特権で動作することを想定したスクリプトが作成され、ユーザーは処理内容を確認した後、修正を試すことができます。
5. 包括的なドキュメント作成
技術レベルに応じた複数のドキュメントを作成しました:
-
README.md: 総合ガイド(298行) -
QUICKSTART.md: 5ステップで完了(203行) -
DNS_SETUP_GUIDE.md: 詳細な手順(223行) -
DNS_QUICK_REFERENCE.md: コピペ用(189行) -
WORDPRESS_SMTP_SETUP.md: WordPress設定(267行) -
FINAL_CHECK.md: 最終確認手順(213行)
6. ユーザーへの質問
ユーザーが必要な情報を的確に質問することでドキュメントが改善されました:
- 「セットアップスクリプトはroot(sudo)で実行すべきか?」
- 「SPF,DKIM,DMARCの記号は必要?」
これらの質問により、ドキュメントがより明確になりました。
まとめ
IBM Bobを一般ユーザー環境下でサーバー構築に利用してみましたが、スクリプト開発以外にも強いパートナーになることが分かりました。
また、IDEのチャットを利用することで作成されたスクリプトの確認やターミナルウインドウでのコマンド実行も迅速にでき、スムーズな構築やトラブルシュートができました。
ちなみに、スキャンツールとこのメールサーバー設定で約20ボブコインの消費でした。今回はフリートライアルですが、Proプラン換算で大体10ドルくらいです。
https://bob.ibm.com/pricing
今後は今回作ったスクリプトを再利用してセキュリティスキャンなどができるツールも作りたいなと考えています。