2026年1月25日日曜日

raspiでcloudflareのリバースプロキシを使うためにufwいれてみた

raspiの外部公開もそろそろセキュリティが気になってきたのでOS更新にあわせて、cloudflareを使ってみることした。そのためにufwを設定する必要があった。

sudo ufw allow sshをまず最初に入れるのが鉄則
curl https://ifconfig.meで、グローバルIp確認、それを次にいれる
sudo ufw allow from <自分のIP> to any port 443 proto tcp
sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcpで、LAN限定にしたいなら
sudo ufw delete allow sshで、最初の設定削除
cloudflareのリバースプロキシを使うのが目的なので、そちらにのみ許可する設定です
# IPv4
curl https://www.cloudflare.com/ips-v4
# IPv6
curl https://www.cloudflare.com/ips-v6 でIp確認
これをみて
sudo ufw allow from 173.245.48.0/20 to any port 443 proto tcpを続ける
sudo ufw allow from 2400:cb00::/32 to any port 443 proto tcpも同様
ここまでの確認は sudo ufw status numbered この時表示なる番号をもとに、削除もできる
例。sudo ufw delete 2 # ルール番号指定で削除

sudo ufw allow from 192.168.1.0/24 to any port 80 proto tcp
sudo ufw allow from 192.168.1.0/24 to any port 443 proto tcp
sudo ufw allow from 192.168.1.0/24 to any port 8080 proto tcp(bottle確認用)
でLAN内からのWEBアクセスは可能にしておく

注意:Cloudflare IPは変わることがある→ cron スクリプトで自動更新

そこで、このあとは、次のようなスクリプトを用意
#!/bin/bash
# ファイル名: update-cloudflare-ufw-home.sh
# LAN内 + Cloudflare + WAN自動IP用 ufw 443自動更新
# cronやsudoでも安全に動作
# --- 設定 ---
LAN_CIDR="192.168.1.0/24"   # LAN内ネットワーク
UFW_PORT=443
TMP_DIR="$HOME/tmp"
# --- 0. 一時ディレクトリ作成 ---
mkdir -p $TMP_DIR
# --- 1. Cloudflare IP取得 ---
curl -s https://www.cloudflare.com/ips-v4 > $TMP_DIR/cf-ips-v4.txt
curl -s https://www.cloudflare.com/ips-v6 > $TMP_DIR/cf-ips-v6.txt
# --- 2. 既存Cloudflare 443ルール削除(LANルールは残す) ---
# IPv4
if [ -f "$TMP_DIR/cf-ips-v4.txt" ]; then
  for ip in $(cat $TMP_DIR/cf-ips-v4.txt); do
      sudo ufw delete allow from $ip to any port $UFW_PORT proto tcp 2>/dev/null || true
  done
fi
# IPv6
if [ -f "$TMP_DIR/cf-ips-v6.txt" ]; then
  for ip in $(cat $TMP_DIR/cf-ips-v6.txt); do
      sudo ufw delete allow from $ip to any port $UFW_PORT proto tcp 2>/dev/null || true
  done
fi
# --- 3. LAN内ルール再登録(もしまだない場合) ---
sudo ufw allow from $LAN_CIDR to any port $UFW_PORT proto tcp
# --- 4. Cloudflareルール追加 ---
if [ -f "$TMP_DIR/cf-ips-v4.txt" ]; then
  for ip in $(cat $TMP_DIR/cf-ips-v4.txt); do
      sudo ufw allow from $ip to any port $UFW_PORT proto tcp
  done
fi
if [ -f "$TMP_DIR/cf-ips-v6.txt" ]; then
  for ip in $(cat $TMP_DIR/cf-ips-v6.txt); do
      sudo ufw allow from $ip to any port $UFW_PORT proto tcp
  done
fi
# --- 5. WAN自分IP取得・追加 ---
MYIP=$(curl -s https://ipinfo.io/ip)
if [ -n "$MYIP" ]; then
    sudo ufw allow from $MYIP to any port $UFW_PORT proto tcp
fi
# --- 6. 状態確認 ---
sudo ufw status verbose
以上のスクリプトをcronに追加
crontab -e
0 6 * * * /home/pi/update-cloudflare-ufw-home.sh

※対策はあくまでインバウンドのみです。インバウンドのみcloudflareのセキュリティ対策を経たトンネルを使います。アウトバウンドは通常の経路です。ルータは443のみオープンにして、80は閉じても大丈夫です。SSL更新もcloudflareにまかせるか、こちらでやる(DNS-01というらしい。数日前設定したばかりだが。)か、選べる。

※cloudflareにまかせるには AやCNAMEをproxiedにして
sudo systemctl status certbot.timerでこちら管理しているようならとめて、起動しないように
sudo systemctl stop certbot.timer
sudo systemctl disable certbot.timer
確認はsudo systemctl status certbot.timer
sudo systemctl is-enabled certbot.timerでinactive ,disabledならok

cloudflare側は 「SSL/TLS」メニュー> Origin Certificate を入れている場合 → Full (strict) 
・「Edge Certificates」タブ>Always Use HTTPS:オンにすると自動で HTTPS にリダイレクト
・ Cloudflare → SSL/TLS → Origin Server>「Create Certificate」で Origin Certificate を作成>サーバに設置、この証明書があれば Let’s Encrypt は不要になる

sudo a2enmod ssl
sudo a2ensite default-ssl
sudo systemctl reload apache2
sudo mkdir -p /etc/ssl/cloudflare
sudo chmod 700 /etc/ssl/cloudflare

origin_cert.pemとorigin_key.pemとして保存
sudo chmod 600 /etc/ssl/cloudflare/*

sudo nano /etc/apache2/sites-available/default-ssl.conf
SSLEngine on
SSLCertificateFile /etc/ssl/cloudflare/origin_cert.pem
SSLCertificateKeyFile /etc/ssl/cloudflare/origin_key.pem
# 推奨の TLS 設定
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:!aNULL:!MD5
このあと、以下のコマンドで完了
sudo a2enmod ssl
sudo a2ensite default-ssl
sudo systemctl reload apache2

※最後に、lan内でrapsiのhttpsにアクセスするとその都度警告がでますが、requestlyという拡張機能をchromeに入れると文字置換https://ホスト名>http://192.168~のような感じにできて解決できるようです。

0 件のコメント:

コメントを投稿