本記事では、WordPressサイトを日本国内からのアクセスのみに制限する方法を解説します。
■ 前提(重要)
本記事の設定は、firewalldを default deny(デフォルト拒否) にした上で行います。
■ なぜ default deny が必要か
firewalldの初期設定では、すべての通信が許可されている状態です。
この状態では ipset を設定しても意味がありません。
👉 理由:
全許可 → ipsetで制限しても他が通る
👉 正しい構成:
デフォルト拒否
↓
必要なIPだけ許可
👉 これにより
・日本IPのみ許可
・Googlebot許可
・その他はすべて拒否
という強力な制御が可能になります。
■ 設定イメージ
jp ipset → allow
googlebot → allow
その他 → drop
👉 これが本記事の前提です
■ 予想されるデメリット(重要)
この設定にはいくつか注意点があります。
● 海外からアクセスできない
日本IP以外はすべて遮断されます。
・海外出張
・海外VPN
→ 接続不可
● Let’s Encrypt の更新に影響
HTTP-01認証は海外サーバーからアクセスされるため、制限すると証明書更新に失敗します。
👉 対策:
・更新時のみポート80を開放
・またはDNS認証を使用
● 外部サービスに影響
以下が動かなくなる可能性があります:
・WordPressプラグイン更新
・外部API
・CDN連携
● Google以外のクローラーがブロックされる
Googlebotは許可していますが:
・Bing
・その他検索エンジン
👉 ブロックされます
● 設定ミスで自分もアクセス不能
ipsetに自分のIPが含まれていないと、サイトにアクセスできなくなります。
👉 必ず別セッションで確認しながら作業してください
■ この設定が向いているケース
・国内向けサイト
・セキュリティ重視
・攻撃対策を強化したい
👉 非常に強力な構成です
■ firewalldをdefault denyにする設定(重要)
firewalldでデフォルト拒否にするには、ゾーンのターゲットを変更します。
■ 現在のゾーン確認
sudo firewall-cmd --get-active-zones
👉 通常は public が使われています
■ default deny(DROP)に変更
sudo firewall-cmd --set-target=DROP --permanent
👉 これで「すべて拒否」がデフォルトになります
■ 設定反映
sudo firewall-cmd --reload
■ 確認
sudo firewall-cmd --list-all
👉 以下のように表示されればOK
target: DROP
■ 注意(最重要)
この設定を行うと、許可していない通信はすべて遮断されます。
👉 必ず先に以下を許可してください
# SSH
sudo firewall-cmd --permanent --add-port=22/tcp
# HTTP / HTTPS
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
👉 その後に reload
sudo firewall-cmd --reload
■ 安全な手順(推奨)
① SSH許可
② HTTP/HTTPS許可
③ target=DROP
④ reload
👉 この順番を守らないとログインできなくなります
さらに、検索エンジンに影響が出ないように
👉 Googlebotを別管理で許可する構成を採用します。
■ なぜ日本IP制限するのか
WordPressは世界中から攻撃されます:
・ログイン総当たり攻撃
・スキャン
・脆弱性攻撃
👉 日本IPのみに制限すると
攻撃の大半を遮断できます
■ 注意(最重要)
・SSHポートは必ず許可
・別セッションで確認しながら作業
・Googlebotを許可しないとSEOに影響
■ 全体構成
jp(日本IP) → 許可
googlebot → 許可
その他 → 拒否
■ ① ipset作成
sudo firewall-cmd --permanent --new-ipset=jp --type=hash:net
sudo firewall-cmd --permanent --new-ipset=googlebot --type=hash:net
■ ② Googlebot IP登録(重要)
sudo firewall-cmd --permanent --ipset=googlebot --add-entry=66.249.0.0/16
sudo firewall-cmd --permanent --ipset=googlebot --add-entry=64.233.160.0/19
sudo firewall-cmd --permanent --ipset=googlebot --add-entry=72.14.192.0/18
sudo firewall-cmd --permanent --ipset=googlebot --add-entry=74.125.0.0/16
👉 検索エンジンアクセスを維持
■ ③ 日本IP登録(初回)
curl -O https://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest
grep '|JP|' delegated-apnic-latest | grep ipv4 | \
awk -F '|' '{print $4"/"32-log($5)/log(2)}' > jp.txt
while read line; do
sudo firewall-cmd --permanent --ipset=jp --add-entry=$line
done < jp.txt
■ ④ 80 / 443 を制限
sudo firewall-cmd --permanent \
--add-rich-rule='rule family="ipv4" source ipset="jp" port port="80" protocol="tcp" accept'
sudo firewall-cmd --permanent \
--add-rich-rule='rule family="ipv4" source ipset="jp" port port="443" protocol="tcp" accept'
■ ⑤ Googlebot許可
sudo firewall-cmd --permanent \
--add-rich-rule='rule family="ipv4" source ipset="googlebot" port port="80" protocol="tcp" accept'
sudo firewall-cmd --permanent \
--add-rich-rule='rule family="ipv4" source ipset="googlebot" port port="443" protocol="tcp" accept'
■ ⑥ 設定反映
sudo firewall-cmd --reload
■ ⑦ 確認
sudo firewall-cmd --list-rich-rules
👉 jp と googlebot 両方が出ればOK
■ 動作確認(重要)
■ 国内回線
👉 表示される → OK
■ 海外(VPN)
👉 接続不可 → OK
■ Googlebot
👉 クロールされる → OK
■ よくあるトラブル
● サイトが見れない
→ 自分のIPがjpに含まれていない
● Googleにインデックスされない
→ googlebot未許可
● WordPress更新できない
→ 外部API制限
■ 運用ポイント(重要)
・日本IPは定期更新(cron)
・googlebotは別管理
・fail2banと併用
■ セキュリティ構成(完成形)
jp ipset → allow
googlebot → allow
blacklist → drop
fail2ban → 自動BAN
👉 ほぼ完全防御
■ Let’s Encrypt 更新について(重要)
本記事のように 80/443 を制限している場合、Let’s Encrypt の HTTP-01 認証に失敗することがあります。
そのため、証明書更新時だけ 80/tcp を一時開放する運用を推奨します。
→ firewalldでLet’s Encrypt更新を通す方法
■ 本環境
・Raspberry Pi
・Ubuntu Server
・Apache + WordPress
・firewalld + ipset + fail2ban
■ 次の記事
👉 ipset自動更新(cron)
👉 ipsetで特定の国だけ遮断する方法(firewalldはdefault allowのまま)

コメント