機能

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のスクリプトがあります。
サイトの「ハンドラー」タブ:Node.jsのバージョン、起動スクリプト、環境変数、制限

証明書と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サーバー内で実行されます。アドレスが禁止されるのは明らかな攻撃の場合だけです。

地域ルール:国グループ、例外、最終的な国の一覧
Bot Fightの設定:ボットのカテゴリ、IPで検証されたクローラー、公開IPフィード、探索リクエスト・攻撃ペイロード・スキャンの検出
レート制限と禁止
各アドレスは既定で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付きで返します。
グローバルブロックリスト
全サイトでブロックするアドレスとネットワーク。ディスクに保存され、再起動後も保持されます。保護を無効にしているサイトにも適用されます。

トラフィック制御

各サイトに誰が到達できるか、ルールをどの順序で適用するか、ブロックされた訪問者に何を見せるかを決められます。

すべてのリクエストに対するチェックの順序

  1. Cloudflare:実際の訪問者IP、Cloudflare経由のみ
  2. グローバルブロックリスト、次にサイトの許可リスト
  3. レート制限と有効な禁止
  4. Bot Fight:ユーザーエージェント、検証済みクローラー、IPフィード、探索リクエスト、攻撃ペイロード、スキャン、ハニーポット
  5. 地域:国とグループ、ホスティングネットワーク、AS番号、ブラウザの言語
  6. デバイス
  7. セキュリティヘッダーとホットリンク対策
  8. リンク限定
  9. パスワード
  10. .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許可リストがリセットされ、サインインのブロックも解除されます。
「セキュリティ」セクション:グローバルブロックリスト、更新日付きのクローラーIPリスト、IP検索

今後の予定

以下の機能は2.0より後のリリースで予定しているもので、2.0には含まれていません。

ロードマップ全体を見る
  1. 2.1データベースとサイト設定ファイルMySQLとMariaDB:データベース、ユーザー、権限 · nginx風の構文によるサイトごとの設定ファイル、フォームと同期 · gzipとbrotli、ローテーション付きのアクセスログ、locationブロック
  2. 2.2ユーザーOSのパスワードでのサインイン · 自分のサイトだけが見えるユーザー · rootが設定する権限、サポートのためにユーザーとしてサインイン
  3. 2.3初心者向け初回サインイン時のセットアップウィザード · シンプルモードとエキスパートモード · ワンクリックの保護プリセット · 修正ボタン付きのヘルスチェックと、より充実したダッシュボード
  4. 2.4証明書とDNSSSL証明書のセクション · 自前のDNSサーバーとネームサーバー · CloudflareとのDNS同期 · Cloudflareでのサインイン
  5. 2.5メールメールドメイン、メールボックス、エイリアス · Postfix、Dovecot、Rspamd、DKIM · Roundcubeウェブメール

予備のサーバーで試してみてください

クリーンなUbuntu 24.04なら、インストールは数分で終わります。