本記事では、firewalldでIP制限を行っている環境でも
Let’s Encrypt(Certbot)の証明書更新を正常に行う方法を解説します。
■ よくある問題
firewalldでアクセス制限(例:日本IPのみ許可)をしていると、
Let’s Encryptの証明書更新が失敗します。
■ 原因
Let’s Encrypt の HTTP-01 認証は、
👉 世界中のサーバーから80番ポートにアクセスされます。
外部(海外IP)
↓
80/tcpアクセス
↓
認証
👉 しかしIP制限していると
海外IP → ブロック → 認証失敗
■ 解決方法
👉 証明書更新のタイミングだけ
👉 80/tcpを一時的に開放
■ なぜ firewalld を停止しないのか
sudo systemctl stop firewalld
👉 これは非推奨です
■ 理由
・全ポートが無防備になる
・SSH / メール / VPN も影響
・セキュリティリスクが高い
👉 必要なのは 80/tcpだけ
■ スクリプト作成
sudo vi /usr/local/bin/certbot-renew-firewalld.sh
■ 内容(そのままコピペ)
#!/bin/bash
set -eu
LOGFILE="/var/log/certbot-renew-firewalld.log"
log() {
echo "[$(date '+%F %T')] $*" >> "$LOGFILE"
}
log "=== start certbot renew ==="
# HTTPを一時開放
firewall-cmd --add-service=http
log "http opened"
# 証明書更新
certbot renew --quiet
RC=$?
# HTTPを閉じる
firewall-cmd --remove-service=http
log "http closed"
if [ $RC -eq 0 ]; then
log "renew success"
else
log "renew failed"
fi
exit $RC
■ 実行権限
sudo chmod +x /usr/local/bin/certbot-renew-firewalld.sh
■ 手動テスト
sudo /usr/local/bin/certbot-renew-firewalld.sh
■ dry-runテスト(重要)
sudo firewall-cmd --add-service=http
sudo certbot renew --dry-run
sudo firewall-cmd --remove-service=http
👉 成功すればOK
■ cron登録
sudo crontab -e
■ 毎日4時
0 4 * * * /usr/local/bin/certbot-renew-firewalld.sh
👉 完全自動化
■ 動作確認
sudo tail -n 50 /var/log/certbot-renew-firewalld.log
👉 ログで確認
■ よくあるトラブル
● 更新に失敗する
・80が開いていない
・DNSが間違っている
● Apacheと競合
👉 standalone使わない
👉 webroot推奨
■ セキュリティ構成
通常 → 日本IP制限
更新時 → 一時開放
👉 バランス良い構成
■ この方法が向いている人
・firewalldでIP制限している
・WordPress運用
・セキュリティ重視
■ 関連記事
👉 WordPressを日本IPのみ公開する方法
👉 ipset自動更新
👉 firewall設定

コメント