WardPane 2.0でできること
WardPane 2.0は静的サイト、PHPサイト、Node.jsサイトをホストし、証明書の自動発行とCloudflareに対応しています。保護とトラフィック制御はサイトごとにWebサーバーの内部で動作します。比較ページにある8つのパネルの多くでは、これらの機能はModSecurityか有料アドオンで提供されます。
初心者にも、経験豊富な管理者にも
初心者には、1つのコマンドでのインストール、自動で発行される証明書、サンドボックス化されたサイト、わかりやすい言葉で説明された設定。経験豊富な管理者には、すべてのオプション、ブラウザ内のターミナル、所有者ごとのPM2、.htaccess、決まった順序で実行されるサイトごとのルール、Cloudflare API、エクスポートとインポート、リリースのチェックサム、そしてソースコード。
ホスティング
サイトはISPmanager式のレイアウトで配置され、Linuxユーザーが所有し、WardPane自身がポート80と443で配信します。
- サイトとエイリアス
- サイトはドメインと最大99個のエイリアスで構成されます(Let's Encryptの証明書に含められる名前は最大100個です)。エイリアスはメインサイトを配信するか、独自のフォルダーがあればそのフォルダーを配信します。サイトには表示名を付けられます。
- 所有者ごとのレイアウト
- ファイルは/var/www/<owner>/data/www/<domain>に置かれ、ログと一時ファイルはその隣に置かれます。既定の所有者はwww-rootで、WardPaneが作成するLinuxユーザーです。1.xのサイトは以前のフォルダーのまま使えます。
- 3つのハンドラー
- ハンドラーなし(静的ホスティング)、PHP、Node.jsをサイトごとに選択でき、いつでも切り替えられます。他のハンドラーの設定は保持されるため、元に戻せば設定も復元されます。
- 静的ファイル
- SPAモード(未知のパスはindex.htmlへ)、独自の404.html、再開可能なダウンロードに対応した強いETag、HTTPからHTTPSへのリダイレクト、そしてサイトフォルダーの外には決して出られないシンボリックリンク。
- ランタイム
- パネルには、サーバーにインストールされているPHPのバージョンと、対応するNode.jsのメジャーバージョン(20、22、24、26)が表示されます。既定は24です(20は2026年4月にサポートが終了しました)。Node.jsのビルドはnodejs.orgから取得し、公開されているSHA256と照合します。
- 各サイトのメニュー
- サイト一覧表の各行には、そのサイトのすべての操作をまとめたメニューがあります。スイッチを使えば、何も削除せずにサイトを停止して再び有効にできます。
- ブラウザ内のシェル
- パネル内で直接使えるターミナル:rootセッションではrootのシェル、それ以外ではサイトフォルダー内のサイト所有者のシェルです。Node.jsサイトではpm2 listやpm2 restartも使えます。
- エクスポートとインポート
- 全サイトの全設定とグローバルブロックリストを1つのJSONファイルにまとめます。インポートは統合または置き換えを選べ、最初にファイル全体を検証し、/var/www内のファイルには一切触れません。
PHPとNode.js
動的サイトはそれぞれ専用のLinuxユーザーとしてsystemdのサンドボックス内で動作します。壊れたサイトや乗っ取られたサイトが、隣のサイトを読むことはできません。
- サイトごとのphp-fpmプール
- 共有プールも、共有のopcacheやセッションもありません。コードはPHPからは読み取り専用で、書き込めるのはtmp/、logs/、data/と指定したフォルダーだけです。そしてこれらのフォルダーからPHPが実行されることはありません。
- 厳格なPHPサンドボックス
- php-fpm自体を除き、ファイルシステム全体が読み取り専用かつnoexecです。open_basedirが設定され、exec、system、shell_exec、proc_open、popen、putenvは無効化され、システムコールはフィルタリングされます。
- Apacheなしで.htaccess
- 実際のサイトで使われているリライトルール、リダイレクト、アクセスルール、Basic auth、ヘッダー、キャッシュ設定がそのまま動作します。WordPress、Laravel、一般的なHTTPSやwwwへのリダイレクトにも対応します。適用できない行は推測せず、そのまま表示します。
- PM2によるNode.js
- Node.jsのメジャーバージョン、npmスクリプトまたはエントリーファイル、環境変数、制限を選択します。所有者ごとに1つのPM2デーモンがアプリを動かすため、所有者のシェルからpm2を使えます。
- アプリの前に置くプロキシ
- 必要ならpublic/内のファイルを直接配信し、それ以外はX-Forwarded-ForとX-Real-IPに実際の訪問者IPを付けてアプリに渡します。WebSocketも同じ保護チェックを通過した後に接続されます。
- 再起動、npm install、ログ
- 「ハンドラー」タブには、再起動とnpm install(lockfileがある場合はnpm ci)のボタン、出力・エラー・インストールのログ、選択できるpackage.jsonのスクリプトがあります。
証明書とCloudflare
証明書は手作業なしで発行・更新されます。Cloudflareの背後にあるサイトでも同様です。
- Let's Encryptを完全自動で
- サイトごとに、すべてのエイリアスを含む1つの証明書を発行し、有効期間が残り3分の1になると更新します。DNSがサーバーを指していない名前はスキップされ、指すようになった時点で追加されます。その理由はパネルに表示されます。
- IPv6も確認
- Let's EncryptはまずIPv6を試すため、すべてのAAAAレコードがサーバーを指している必要があります。WardPaneは証明書を申請する前にそれらを確認します。
- IPアドレス用の証明書
- サーバーのIPには短期間有効な証明書が発行され、数日ごとに更新されます。https://<ip>:1500のパネルは警告なしで開きます。
- Let's Encryptのレート制限
- パネルは重複した証明書を申請せず、1回の申請で失敗した名前をまとめて報告し、失敗するたびに待ち時間を延ばし、無効化されたACMEアカウントを置き換えます。
- ワンクリックでCloudflareトークン
- 「Cloudflareトークンを作成」ボタンを押すと、必要な権限が入力済みの状態でCloudflareが開きます。トークンを貼り付けて戻せば、パネルがサイトのゾーンを確認して修正できます。
保護
各サイトには専用のチェックがあり、PHPやNode.jsがリクエストを受け取る前にWebサーバー内で実行されます。アドレスが禁止されるのは明らかな攻撃の場合だけです。
- レート制限と禁止
- 各アドレスは既定で10秒間に150リクエストまで送信できます。上限を超えると404を返し、設定した分数だけ禁止します。IPv6の訪問者は/64単位で集計・禁止されるため、アドレスを変えても効果はありません。各サイトに許可リストがあります。
- Bot Fight
- AIクローラー、SEOクローラー、脆弱性スキャナー、スクリプトやヘッドレスブラウザ、空のユーザーエージェント、そして独自のリストをブロックします。検索エンジンとリンクプレビューは選択した場合のみブロックします。監視ツールとRSSリーダーには影響しません。
- 探索リクエストと攻撃ペイロード
- サイトに存在しない/.env、/.git、/wp-login.phpなどへのリクエストは、そのアドレスを禁止します。URL内の明白なSQLインジェクション、XSS、パストラバーサル、Log4Shellのペイロードは禁止の対象となり、判断が難しいものはそのリクエストだけを拒否します。
- スキャンの検出
- 連続した多数のミス(既定では60秒間に25回)はgobusterやffufによるものとみなし、アドレスを禁止します。画像の欠落はミス0.1回として数えるため、画像が壊れた古いページがスキャンと誤認されることはありません。
- 検証済みクローラー
- Google、Bing、DuckDuckGo、Apple、OpenAI、Anthropic、Perplexity、AhrefsはIP範囲を公開しています。WardPaneはそれらを毎日ダウンロードし、別のアドレスからこれらのクローラーを名乗る者を禁止します。ブラウザのユーザーエージェントを装っている場合でも、IPによってこれらのクローラーをブロックできます。
- 公開IPフィード
- Spamhaus DROP、FireHOL level 1、blocklist.deを毎日更新し、サイトごとにスイッチ1つで適用できます。
- グループ単位の地域ルール
- 国を1つずつ、またはグループ単位で許可・拒否できます:旧ソ連、CIS、EAEU、EU、EEA、シェンゲン圏、NATO、G7、G20、OECD、BRICS、SCO、ASEAN、アラブ連盟、メルコスール、大陸など。例外を追加し、最終的な国の一覧を確認できます。
- ホスティングネットワークとAS番号
- 自動化されたアクセスの大半の発信元であるAWS、Azure、Google Cloud、Hetzner、OVH、DigitalOcean、Vultrなどのクラウド、または指定した任意のAS番号からのリクエストをブロックします。
- 言語フィルター
- ブラウザの言語で許可・拒否します。言語をまったく送らないリクエスト用の別スイッチもあります。たとえばVPN経由のアクセスに対して、国の判定を補う有用な手がかりになります。
- デバイス
- 通常のブラウザ向けのフィルターとして、Windows、macOS、Linux、Android、iOS、その他のうち指定したものだけを通します。
- リンク限定
- 必須のURLパラメーター:たとえば広告からの?ref=metaadsのように、あなたのリンクから来た人にだけサイトが開きます。署名付きCookieと、オプションで訪問者のIPによってアクセスが維持されます。Webhookや決済コールバック用のパスは開いたままです。
- パスワード
- 下書きやサイトのテスト用コピーのためのHTTP Basicサインイン。パスワードはscryptハッシュとして保存され、他のすべてのフィルターの後に、メインスレッドとは別に検証されます。
- ホットリンク対策
- 他のサイトがあなたの画像やファイルを埋め込むことを防ぎます。拡張子、許可するサイト(ワイルドカード可)、Refererのないリクエストの扱いを選択できます。
- セキュリティヘッダー
- サイトごとのX-Frame-Options、Referrer-Policy、includeSubDomainsとpreload付きのHSTS、Content-Security-Policy、Permissions-Policy。
- ハニーポット
- robots.txtで禁止されたパスです。人間がこのパスを開くことはないため、リクエストした者は即座に禁止されます。
- 独自のブロックページ
- デバイス、ボット、地域、リンク限定によるブロック時に、独自のページとステータスコード(404、403、200)をno-store付きで返します。
- グローバルブロックリスト
- 全サイトでブロックするアドレスとネットワーク。ディスクに保存され、再起動後も保持されます。保護を無効にしているサイトにも適用されます。
トラフィック制御
各サイトに誰が到達できるか、ルールをどの順序で適用するか、ブロックされた訪問者に何を見せるかを決められます。
すべてのリクエストに対するチェックの順序
- Cloudflare:実際の訪問者IP、Cloudflare経由のみ
- グローバルブロックリスト、次にサイトの許可リスト
- レート制限と有効な禁止
- Bot Fight:ユーザーエージェント、検証済みクローラー、IPフィード、探索リクエスト、攻撃ペイロード、スキャン、ハニーポット
- 地域:国とグループ、ホスティングネットワーク、AS番号、ブラウザの言語
- デバイス
- セキュリティヘッダーとホットリンク対策
- リンク限定
- パスワード
- .htaccessのルール、次にハンドラー:ファイル、PHP、またはNode.js
- Cloudflareを考慮した実IP
- 訪問者のアドレスは、接続が本当にCloudflareから来ている場合にのみCF-Connecting-IPから取得します。ネットワークの一覧はcloudflare.comから毎日更新されます。
- Cloudflare経由のみ
- サーバーIPへの直接リクエストには404を返すため、誰もCDNとそのルールを迂回できません。
- スイッチがオフのとき
- Cloudflareの背後にあるのにそう設定されていないサイトでも、Cloudflareのアドレスを禁止することはなく、Cloudflareサーバーごとに10倍高い制限値が適用されます。修正方法はログで提案されます。
- Cloudflare Workers
- Workerからのリクエストはゾーン単位で集計され、通常の制限と禁止が適用されます。自分のゾーンのWorkerはCloudflareとして扱われます。
- ブロックページのコード
- 空のアドレスに見せるなら404、リクエストを拒否したと伝えるなら403、独自ページを表示するなら200を使います。レート制限や禁止の対象となったクライアントには、常にプレーンな404を返します。
- キャッシュに安全なレスポンス
- リンクによる通過に依存するレスポンスにはCache-Control: privateとVary: Cookieが付与されるため、CDNがリンクを持たない人にそれを渡すことはありません。
パネルのセキュリティ
パネルは特権のないユーザーwardpaneとして動作し、サインインページには専用のブルートフォース対策の制限があります。
- rootでのサインイン
- 任意で、サーバーのrootパスワードを使ってrootとしてサインインできます。パスワードは、パネルだけが開けるソケット上の小さなrootヘルパーを通じてunix_chkpwdで検証されます。初期状態では無効です。
- ブルートフォース対策
- 5回の失敗でそのアドレス(IPv6では/64)を15分間ブロックし、50回の失敗でその/48をブロックします。多数のアドレスから失敗が相次ぐと、未知のアドレスからのサインインを5分間停止します。過去30日以内にサインインしたアドレスは引き続き使えます。
- IP許可リスト
- PANEL_ALLOW_IPSを設定すると、パネルは他のアドレスに一切応答しません。現在使用中のアドレスを締め出すようなリストは受け付けません。
- rootヘルパーの分離
- パネルは目的の状態を書き込むだけです。systemdが起動するrootヘルパーが、ユーザー、フォルダー、ユニットを作成する前にすべての値を改めて検証します。
- サンドボックス化されたPHPとNode.js
- サイトごとのLinuxユーザー、読み取り専用のシステム、専用の/tmp、権限昇格の禁止、メモリとCPUの制限、そしてオプションで外部への接続の禁止。
- リリースのチェックサム
- すべてのアーカイブはSHA-256チェックサムとともに公開され、完全なソースコードを含みます。インストーラーはHTTPSでダウンロードし、何かを実行する前にSHA-256を確認します。
- 元に戻せるアップデート
- アップデートのたびに復元スクリプト付きのバックアップを作成し、新しいバージョンが起動するかを確認し、起動しなければ自動的にロールバックします。
- アクセスの復旧
- 自分を締め出してしまった場合は、サーバー上で1つのコマンドを実行すれば、パネルのサインインとIP許可リストがリセットされ、サインインのブロックも解除されます。
予備のサーバーで試してみてください
クリーンなUbuntu 24.04なら、インストールは数分で終わります。