firewalldでLet’s Encrypt更新を通す方法|80/tcpだけ一時開放する運用

水冷パソコンの水温 Security

本記事では、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設定

コメント

タイトルとURLをコピーしました