導入
こんにちは。Cloudflareでウェブサイトを保護する方法に関するこのチュートリアルへようこそ。サーバー上でウェブサイトをホストする方法、Cloudflareの優れた無料L7保護でセキュリティを維持しながらウェブサイトを保護する方法、そして攻撃者がCloudflareをバイパスしてサーバーに直接攻撃できないようにサーバーポートをロックダウンする方法を説明します。.
Cloudflareについて
始める前に、Cloudflare とその機能について少し説明します。
- Cloudflareは世界最大級のネットワークの一つです。今日、企業、非営利団体、ブロガーなど、インターネット上で活動するあらゆる人々が、より高速で安全なウェブサイトやアプリを誇りにしています。DDoS攻撃から保護され、バックエンドサーバーも攻撃者から保護されています。Cloudflareは、SQLインジェクション、XSS、DDoS攻撃などの攻撃からウェブサイトを保護するセキュリティサービススイートも提供しています。.
- Cloudflare は数百万の Web サイトのインターネット リクエストを処理し、1 秒あたり平均 5,500 万件の HTTP リクエストを処理します。.
- Cloudflareは、インターネットのセキュリティとパフォーマンスにおいて多くの改善を行ってきました。ウェブサイト所有者にとって、ウェブサイトを攻撃から保護し、パフォーマンスを向上させるための優れたツールです。そして何より、無料で利用できるのが最大の利点です。.
- トラフィックが増加したら、いつでも有料プランにアップグレードして、より多くの機能とより優れたパフォーマンスを享受できます。.
前提条件
- ドメイン名
- ドメインが追加されたCloudflareアカウント
- Debian 12を実行するサーバー
- 保護のためのウェブサイト
ステップ1 – サーバーを更新してNGINXをインストールする
まず、サーバーを更新し、次に NGINX リポジトリを追加して NGINX をインストールする必要があります。.
apt update && apt upgrade -y
apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring -y
# Add the signing key for the nginx packages
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg > /dev/null
# Add the NGINX repository
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian `lsb_release -cs` nginx" | tee /etc/apt/sources.list.d/nginx.list
# Pin down the NGINX repository to avoid conflicts with the default Debian repository
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | tee /etc/apt/preferences.d/99nginx
apt update
# Install NGINX
apt install nginx -yステップ2 – ウェブサイトのセットアップと構成
NGINX を Web サイトを提供するために構成することは、このチュートリアルの範囲外ですが、このチュートリアルではデフォルト設定を使用し、Cloudflare を使用してサーバーを保護します。.
原産地証明書が必要です クラウドフレア 作成してリストする /etc/nginx/sslつまり cf.crt そして cf.キー 置いてください。.
Cloudflare ダッシュボードでドメインを選択し、「SSL/TLS」>「オリジンサーバー」>「証明書の作成」に移動すると、オリジン証明書を作成できます。.
以下の設定 (例: /etc/nginx/sites-available/default) を Web サイトのニーズに合わせて調整できます。.
server {
listen 443 ssl;
server_name <example.com>;
access_log /var/log/nginx/host.access.log main;
ssl_certificate /etc/nginx/ssl/cf.crt;
ssl_certificate_key /etc/nginx/ssl/cf.key;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}ステップ2.1 – NGINXをリロードする
この時点で、NGINX をリロードして変更を適用し、ドメインをサーバーにポイントします。.
systemctl reload nginx
NGINXがリロードされたら、CloudflareダッシュボードでAレコードを追加することで、ドメインをサーバーに向けることができます。CloudflareのL7保護を有効にするには、プロキシステータスが「プロキシ済み」になっていることを確認してください。そうしないと、サーバーがインターネットに公開されてしまいます。.
ステップ3 – 60%の道のり
目標の60%を達成しました。ウェブサイトはCloudflareのL7保護によって保護されていますが、サーバーは依然としてインターネットに公開されており、攻撃者はCloudflareを迂回してサーバーに直接攻撃することができます。.
次の手順では、サーバー ポートをロックダウンし、Cloudflare IP 範囲のみがサーバーにアクセスできるようにします。.
これを実現するには iptables を使用できますが、さらに一歩進んで、Hetzner Cloud Firewall を使用してサーバー ポートをロックダウンします。.
ステップ4 – Hetznerクラウドファイアウォールの設定
このステップでは、Hetzner Cloud Firewall を設定してサーバー ポートをロックダウンし、Cloudflare IP 範囲のみがサーバーにアクセスできるようにします。.
これは、Hetzner Cloud Consoleでプロジェクトを選択し、「ファイアウォール」タブをクリックすることで実行できます。ただし、CloudflareのIPアドレス範囲は動的であり、時間の経過とともに変更される可能性があります。そのため、Hetzner Cloud APIを使用してこのプロセスを自動化します。.
まず、Hetzner クラウド コンソールでいくつかの操作を行う必要があります。
- 「セキュリティ」«「APIトークン」に移動し、「APIトークンを生成」をクリックしてAPIトークンを生成します。読み取りと書き込みの権限を付与してください。.
- ファイアウォールIDをメモしておいてください。ファイアウォールページにアクセスした際にURLで確認できます。
- サーバーにファイアウォールが適用されていることを確認してください。そうでないと役に立ちません。.
サーバーに戻り、以下のスクリプトをファイル(例:firewall.py)に保存します。このスクリプトは、Hetzner Cloud Firewall で Cloudflare の IP アドレス範囲をホワイトリストに登録します。.
注:以下のスクリプトは、既存のファイアウォールルールを上書きします。ファイアウォールに他の重要なルールが含まれていないことを確認してください。含まれている場合は、SSHポートを開くなどのルールをスクリプトに追加してください。.
import requests
import json
HETZNER_API_TOKEN = "YOUR_HETZNER_API_TOKEN"
HETZNER_FIREWALL_ID = "YOUR_HETZNER_FIREWALL_ID"
def get_cloudflare_ips():
response = requests.get('https://www.cloudflare.com/ips-v4')
if response.status_code == 200:
return response.text.strip().split('\n')
else:
print("Failed to retrieve Cloudflare IP ranges")
return []
def whitelist_ips_in_hetzner(ip_ranges):
headers = {
'Authorization': f'Bearer {HETZNER_API_TOKEN}',
'Content-Type': 'application/json',
}
payload = {
"rules": [
{
"direction": "in",
"source_ips": ip_ranges,
"port": "443",
"protocol": "tcp",
"description": "Accept port 443"
},
#{
# "direction": "in",
# "source_ips": ["0.0.0.0/0","::/0"],
# "port": "22",
# "protocol": "tcp",
# "description": "Accept SSH connections"
#}
]
}
response = requests.post(f'https://api.hetzner.cloud/v1/firewalls/{HETZNER_FIREWALL_ID}/actions/set_rules', headers=headers, data=json.dumps(payload))
if 200 <= response.status_code < 203:
print("IPs whitelisted successfully in Hetzner Firewall")
else:
print("Failed to whitelist IPs in Hetzner Firewall", response.json())
if __name__ == "__main__":
cloudflare_ips = get_cloudflare_ips()
whitelist_ips_in_hetzner(cloudflare_ips)ステップ5 – スクリプトを実行して自動化する
- Pythonをインストールする
スクリプトを実行するには、サーバーにPythonをインストールする必要があります。まだPythonがインストールされていない場合は、次のコマンドを実行してインストールできます。
apt install python3 -y
- スクリプトを実行します。
Python をインストールしたら、次のコマンドでスクリプトを実行できます。
python3 firewall.py
「IPがHetznerファイアウォールで正常にホワイトリストに登録されました」のような出力が表示されるまでお待ちください。表示されない場合は、エラーメッセージを確認してトラブルシューティングを行ってください。.
- 自動化
スクリプトが正常に実行されたら、cron ジョブに追加して自動化し、スクリプトが 24 時間ごとに実行され、Hetzner Cloud Firewall が Cloudflare IP 範囲で更新されるようにすることができます。.
crontab -e を実行し、ファイルに次の行を追加することで、cron ジョブを追加できます。.
* 0 * * * /usr/bin/python3 /path/to/firewall.py
ステップ6 – Cloudflare側の保護を強化する
Cloudflare ダッシュボードにログインします。.
- 「SSL/TLS」タブに移動します
ウェブサイトが常に HTTPS 経由で提供され、Cloudflare とサーバー間の通信が暗号化され安全であることを保証するには、次の手順を実行します。
- 「常に HTTPS を使用する」を有効にする – 「HTTPS 自動書き換え」を有効にする – SSL/TLS 暗号化モードを「完全 (強力)」に設定する。.
「セキュリティ」タブに移動します
ウェブサイトがボット、ホットリンク、その他の攻撃から保護されていることを確認するには:
- 「ブラウザ整合性チェック」を有効にする – 「ホットリンク保護」を有効にする – 「ボットファイトモード」を有効にする“
これは万能のソリューションではないため、常に Cloudflare ダッシュボードを監視し、Web サイトのニーズに応じて設定を変更する必要があることに注意してください。.
- また、「レート制限」を有効にして、Web サイトを攻撃からさらに保護することもできます。幸いなことに、Cloudflare はこの機能の無料レベルを提供しています (1 つのルールを含む)。.
- Cloudflare のキャッシュ機能を使用して、静的な Web サイトのコンテンツをキャッシュし、サーバーの負荷を軽減することもできます。.
もう一度、トラフィックを監視し、Web サイトのニーズに応じて設定を変更する必要があります。.
このスクリプトもあります: https://github.com/guided-hacking/cfautouam
このスクリプトを使用すると、サーバーのCPUまたはRAM使用量が過剰になった場合に、Cloudflareを自動的に「攻撃モード」に切り替えることができます。これはサーバーを攻撃から保護するのに役立ちますが、このチュートリアルではその範囲外です。.
結果
このチュートリアルでは、CloudflareのL7保護を使用してウェブサイトを保護する方法を学びました。これにより、ポートをインターネットに公開することなく、サーバーとウェブサイトを攻撃から保護することができます。また、HetznerのクラウドファイアウォールをCloudflareのIPアドレス範囲で更新するプロセスを自動化し、Cloudflare側の保護を強化しました。.










