اوبنتودواپسلینوکس

میزبانی امن وب‌سایت با Cloudflare و Nginx در Ubuntu 24.04 LTS

مقدمه

اگر قصد دارید وب‌سایت خود را با Nginx میزبانی کنید، استفاده از Cloudflare یکی از بهترین روش‌ها برای افزایش امنیت، سرعت و پایداری سرویس است.

Cloudflare به‌عنوان یک Reverse Proxy بین کاربران و سرور شما قرار می‌گیرد و علاوه بر ارائه CDN، امکانات متعددی مانند محافظت در برابر حملات DDoS، فایروال تحت وب (WAF)، مدیریت DNS و بهینه‌سازی کش را نیز فراهم می‌کند.

در این آموزش یاد می‌گیرید چگونه یک وب‌سایت که روی Ubuntu 24.04 LTS و Nginx اجرا شده است را به Cloudflare متصل کنید و ارتباط بین Cloudflare و سرور را با استفاده از Origin CA Certificate ایمن نمایید. همچنین در ادامه قابلیت Authenticated Origin Pulls را فعال می‌کنیم تا تنها سرورهای Cloudflare بتوانند به وب‌سرور شما متصل شوند و تمامی درخواست‌های مستقیم به سرور مسدود شوند.

در پایان این آموزش، تمام درخواست‌های کاربران ابتدا از Cloudflare عبور کرده و سپس به سرور شما خواهند رسید؛ موضوعی که امنیت وب‌سایت را به شکل قابل توجهی افزایش می‌دهد.


پیش‌نیازها

قبل از شروع این آموزش، موارد زیر باید آماده باشند:

  • یک سرور Ubuntu 24.04 LTS
  • یک کاربر دارای دسترسی sudo
  • نصب و پیکربندی Nginx
  • یک دامنه فعال
  • یک حساب کاربری در Cloudflare
  • اضافه کردن دامنه به Cloudflare و تنظیم DNS آن روی سرور
  • ایجاد یک Server Block در Nginx برای دامنه موردنظر

در این آموزش فرض می‌کنیم دامنه شما قبلاً به Cloudflare منتقل شده و وب‌سایت از طریق HTTP در دسترس است.


معماری این راه‌اندازی

در حالت عادی ارتباط کاربران به این شکل است:

Visitor
     │
     ▼
 Nginx Server

اما پس از پایان این آموزش ساختار به شکل زیر خواهد بود:

Visitor
     │
     ▼
Cloudflare
     │
SSL/TLS
     │
     ▼
Nginx Server

و پس از فعال‌سازی Authenticated Origin Pulls:

Visitor
     │
     ▼
Cloudflare
     │
(Authenticated TLS)
     │
     ▼
Nginx

در این حالت هیچ کاربری قادر نخواهد بود مستقیماً به IP سرور متصل شود.


مرحله اول — ساخت Origin Certificate در Cloudflare

Cloudflare قابلیتی به نام Origin CA ارائه می‌کند که یک گواهی SSL مخصوص ارتباط بین Cloudflare و سرور شما ایجاد می‌کند.

این گواهی فقط توسط Cloudflare معتبر شناخته می‌شود و برای استفاده مستقیم کاربران مناسب نیست.

وارد داشبورد Cloudflare شوید.

سپس دامنه موردنظر را انتخاب کنید.

از منوی سمت چپ وارد بخش زیر شوید:

SSL/TLS

سپس وارد تب:

Origin Server

روی گزینه:

Create Certificate

کلیک کنید.


تنظیمات ساخت گواهی

تنظیمات پیش‌فرض را تغییر ندهید.

گزینه زیر را انتخاب کنید:

Generate private key and CSR with Cloudflare

سپس روی:

Next

کلیک کنید.

Cloudflare دو مقدار در اختیار شما قرار می‌دهد:

  • Origin Certificate
  • Private Key

هردوی این موارد را ذخیره کنید زیرا Private Key فقط یک بار نمایش داده می‌شود.


ذخیره Certificate روی سرور

ابتدا فایل گواهی را ایجاد کنید.

sudo nano /etc/ssl/cert.pem

کل متن Origin Certificate را داخل فایل قرار دهید.

سپس فایل را ذخیره کنید.


اکنون فایل کلید خصوصی را ایجاد کنید.

sudo nano /etc/ssl/key.pem

محتویات Private Key را داخل آن قرار دهید.

سپس فایل را ذخیره کنید.


نکته مهم

هنگام Paste کردن Certificate یا Private Key دقت کنید هیچ خط خالی اضافی داخل فایل وجود نداشته باشد.

وجود خط خالی باعث می‌شود Nginx گواهی را نامعتبر تشخیص دهد.


هشدار امنیتی

گواهی‌های Origin CA فقط برای ارتباط بین Cloudflare و سرور طراحی شده‌اند.

اگر Cloudflare را غیرفعال کنید یا رکورد DNS را از حالت Proxy خارج نمایید، مرورگر کاربران این گواهی را معتبر نخواهد دانست و خطای SSL نمایش داده می‌شود.

به همین دلیل Origin Certificate نباید جایگزین گواهی عمومی مانند Let’s Encrypt شود.


مرحله دوم — پیکربندی Nginx برای استفاده از Origin Certificate

اکنون که گواهی SSL و کلید خصوصی را روی سرور ذخیره کرده‌اید، باید Nginx را طوری پیکربندی کنید که از آن‌ها برای برقراری ارتباط امن با Cloudflare استفاده کند.


فعال کردن HTTPS در فایروال

اگر از UFW استفاده می‌کنید، ابتدا اجازه دسترسی به HTTP و HTTPS را صادر کنید.

sudo ufw allow 'Nginx Full'

سپس تنظیمات فایروال را بارگذاری مجدد کنید.

sudo ufw reload

برای اطمینان از اعمال شدن قوانین، وضعیت UFW را بررسی کنید.

sudo ufw status

خروجی باید مشابه زیر باشد:

Status: active

To                         Action
-----------------------------------------
OpenSSH                    ALLOW
Nginx Full                 ALLOW

حذف Server Block پیش‌فرض

اگر هنوز فایل پیش‌فرض Nginx فعال است، آن را حذف کنید.

sudo rm -f /etc/nginx/sites-enabled/default

ویرایش تنظیمات سایت

فایل تنظیمات دامنه را باز کنید.

sudo nano /etc/nginx/sites-available/your_domain

اگر قبلاً Server Block ساخته باشید، احتمالاً چیزی مشابه زیر مشاهده خواهید کرد.

server {

    listen 80;
    listen [::]:80;

    server_name your_domain www.your_domain;

    root /var/www/your_domain/html;

    index index.html index.htm index.nginx-debian.html;

    location / {
        try_files $uri $uri/ =404;
    }

}

ریدایرکت تمام درخواست‌های HTTP به HTTPS

بهتر است کاربران همیشه از نسخه امن سایت استفاده کنند.

بنابراین بلاک اول را به شکل زیر تغییر دهید.

server {

    listen 80;
    listen [::]:80;

    server_name your_domain www.your_domain;

    return 301 https://$host$request_uri;

}

استفاده از 301 Redirect باعث می‌شود موتورهای جستجو نیز نسخه HTTPS سایت را به‌عنوان آدرس اصلی در نظر بگیرند.


ایجاد Server Block برای HTTPS

در ادامه فایل، بلاک زیر را اضافه کنید.

server {

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name your_domain www.your_domain;

    root /var/www/your_domain/html;

    index index.html index.htm index.nginx-debian.html;

    ssl_certificate     /etc/ssl/cert.pem;
    ssl_certificate_key /etc/ssl/key.pem;

    location / {

        try_files $uri $uri/ =404;

    }

}

در این بخش:

  • listen 443 ssl فعال‌سازی HTTPS را انجام می‌دهد.
  • http2 باعث افزایش سرعت بارگذاری صفحات می‌شود.
  • ssl_certificate مسیر فایل گواهی Cloudflare Origin CA را مشخص می‌کند.
  • ssl_certificate_key نیز کلید خصوصی مربوط به آن گواهی است.

بررسی صحت تنظیمات Nginx

قبل از راه‌اندازی مجدد سرویس، فایل‌های تنظیمات را بررسی کنید.

sudo nginx -t

اگر همه چیز صحیح باشد، خروجی مشابه زیر خواهد بود.

nginx: configuration file /etc/nginx/nginx.conf test is successful

راه‌اندازی مجدد Nginx

اکنون سرویس را ریستارت کنید.

sudo systemctl restart nginx

برای اطمینان از اجرا شدن سرویس نیز می‌توانید دستور زیر را اجرا کنید.

sudo systemctl status nginx

تنظیم حالت SSL در Cloudflare

اکنون وارد داشبورد Cloudflare شوید.

مسیر زیر را باز کنید.

SSL/TLS → Overview

حالت SSL را روی گزینه زیر قرار دهید.

Full (Strict)

چرا Full (Strict)؟

Cloudflare چهار حالت مختلف برای SSL ارائه می‌دهد:

حالت توضیح
Off بدون SSL
Flexible فقط ارتباط کاربر با Cloudflare رمزنگاری می‌شود.
Full ارتباط Cloudflare تا سرور رمزنگاری می‌شود اما اعتبار گواهی بررسی نمی‌شود.
Full (Strict) ارتباط رمزنگاری شده است و اعتبار گواهی نیز بررسی می‌شود. پیشنهاد شده

از آنجایی که از Origin Certificate استفاده می‌کنیم، بهترین گزینه Full (Strict) است.


تست اتصال

اکنون مرورگر را باز کنید و آدرس سایت را وارد کنید.

https://your_domain

اگر همه مراحل را به‌درستی انجام داده باشید:

  • سایت بدون خطا باز می‌شود.
  • مرورگر اتصال HTTPS را تأیید می‌کند.
  • ارتباط بین Cloudflare و سرور نیز کاملاً رمزنگاری شده خواهد بود.

مرحله سوم — فعال‌سازی Authenticated Origin Pulls

تا این مرحله ارتباط بین Cloudflare و سرور شما رمزنگاری شده است، اما هنوز یک مشکل امنیتی وجود دارد.

اگر مهاجم IP واقعی سرور را پیدا کند، می‌تواند مستقیماً به Nginx متصل شود و Cloudflare را دور بزند. در این حالت حملات دیگر از فیلترها، WAF و سیستم‌های امنیتی Cloudflare عبور نخواهند کرد.

قابلیت Authenticated Origin Pulls این مشکل را برطرف می‌کند.

در این روش، Nginx فقط درخواست‌هایی را قبول می‌کند که دارای گواهی معتبر Cloudflare باشند و تمام ارتباط‌های مستقیم با IP سرور رد خواهند شد.


نحوه عملکرد Authenticated Origin Pulls

در این حالت فرآیند ارتباط به شکل زیر خواهد بود:

Visitor
     │
     ▼
Cloudflare
     │
Client Certificate
     │
     ▼
Nginx

اگر درخواست مستقیماً به IP سرور ارسال شود:

Visitor
    │
    ▼
Nginx
    ✖ Connection Rejected

بنابراین حتی اگر IP سرور لو برود، کسی قادر به دسترسی مستقیم نخواهد بود.


دریافت گواهی Cloudflare

Cloudflare برای احراز هویت درخواست‌های خود از یک گواهی عمومی استفاده می‌کند.

به جای کپی کردن دستی گواهی (که ممکن است در آینده تغییر کند)، بهتر است آخرین نسخه را مستقیماً از مخزن رسمی Cloudflare دریافت کنید.

sudo curl -L \
https://developers.cloudflare.com/ssl/static/authenticated_origin_pull_ca.pem \
-o /etc/ssl/cloudflare.crt

اکنون فایل زیر روی سرور ایجاد شده است:

/etc/ssl/cloudflare.crt

ویرایش تنظیمات Nginx

فایل تنظیمات دامنه را باز کنید.

sudo nano /etc/nginx/sites-available/your_domain

داخل بلاک HTTPS، دو خط زیر را اضافه کنید.

ssl_client_certificate /etc/ssl/cloudflare.crt;
ssl_verify_client on;

در نهایت بخش SSL باید چیزی مشابه زیر باشد.

server {

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name your_domain www.your_domain;

    ssl_certificate     /etc/ssl/cert.pem;
    ssl_certificate_key /etc/ssl/key.pem;

    ssl_client_certificate /etc/ssl/cloudflare.crt;
    ssl_verify_client on;

    root /var/www/your_domain/html;

    location / {
        try_files $uri $uri/ =404;
    }

}

معنی این تنظیمات

ssl_client_certificate

این فایل شامل Certificate Authority مربوط به Cloudflare است.

Nginx از این فایل برای بررسی اعتبار درخواست‌های ورودی استفاده می‌کند.


ssl_verify_client on

با فعال شدن این گزینه، هر کلاینت باید هنگام برقراری ارتباط یک Client Certificate معتبر ارائه دهد.

از آنجایی که فقط Cloudflare این گواهی را دارد، تمام درخواست‌های دیگر رد خواهند شد.


بررسی تنظیمات

تنظیمات Nginx را بررسی کنید.

sudo nginx -t

اگر خروجی مشابه زیر بود، همه چیز صحیح است.

nginx: configuration file /etc/nginx/nginx.conf test is successful

راه‌اندازی مجدد Nginx

sudo systemctl restart nginx

فعال کردن Authenticated Origin Pulls در Cloudflare

اکنون وارد داشبورد Cloudflare شوید.

از مسیر زیر وارد تنظیمات شوید.

SSL/TLS

سپس وارد تب:

Origin Server

در پایین صفحه گزینه زیر را پیدا کنید.

Authenticated Origin Pulls

آن را روی Enabled قرار دهید.


تست عملکرد

اکنون دوباره سایت را باز کنید.

https://your_domain

اگر همه چیز به درستی انجام شده باشد، سایت بدون هیچ مشکلی بارگذاری خواهد شد.


بررسی امنیت

برای اطمینان از عملکرد صحیح این قابلیت، می‌توانید به‌صورت موقت گزینه Authenticated Origin Pulls را در داشبورد Cloudflare غیرفعال کنید.

پس از غیرفعال کردن، مرورگر را رفرش کنید.

اکنون Nginx درخواست Cloudflare را معتبر تشخیص نمی‌دهد و معمولاً یکی از خطاهای زیر نمایش داده می‌شود:

  • 403 Forbidden
  • 400 Bad Request
  • یا خطای 525 / 526 از سمت Cloudflare (بسته به تنظیمات SSL)

این رفتار نشان می‌دهد که Nginx فقط درخواست‌هایی را می‌پذیرد که دارای گواهی معتبر Cloudflare باشند.

پس از اطمینان از عملکرد صحیح، دوباره گزینه Authenticated Origin Pulls را فعال کنید.


جمع‌بندی

در این آموزش نحوه راه‌اندازی یک وب‌سایت مبتنی بر Nginx در کنار Cloudflare را بررسی کردیم. همچنین با استفاده از Origin CA Certificate و قابلیت Authenticated Origin Pulls ارتباط بین Cloudflare و سرور را ایمن کردیم تا تنها درخواست‌هایی که از شبکه Cloudflare عبور کرده‌اند به سرور اصلی برسند.

در طول این راهنما با موارد زیر آشنا شدید:

  • نصب و پیکربندی Nginx روی Ubuntu
  • ایجاد گواهی Origin CA از طریق Cloudflare
  • نصب گواهی SSL روی Nginx
  • فعال‌سازی حالت Full (Strict) در Cloudflare
  • راه‌اندازی Authenticated Origin Pulls
  • جلوگیری از دسترسی مستقیم به IP سرور
  • افزایش امنیت ارتباط بین Cloudflare و سرور اصلی

با این ساختار، علاوه بر بهره‌مندی از قابلیت‌های امنیتی Cloudflare مانند CDN، WAF، DDoS Protection و DNS پرسرعت، اطمینان خواهید داشت که هیچ کاربری نمی‌تواند Cloudflare را دور زده و مستقیماً به سرور شما متصل شود.


پیشنهادهای امنیتی

اگر این سرور در محیط Production استفاده می‌شود، پیشنهاد می‌شود اقدامات زیر را نیز انجام دهید:

  • فعال کردن HTTP/3 (QUIC) در Cloudflare
  • فعال کردن HSTS از بخش SSL/TLS داشبورد Cloudflare
  • استفاده از Brotli Compression
  • فعال کردن Always Use HTTPS
  • فعال کردن Automatic HTTPS Rewrites
  • محدود کردن دسترسی به پورت 443 فقط از IPهای Cloudflare (در صورت امکان)
  • استفاده از Fail2Ban برای جلوگیری از حملات Brute Force
  • فعال کردن OCSP Stapling در Nginx
  • استفاده از جدیدترین نسخه پایدار Nginx و OpenSSL

نتیجه

ترکیب Nginx و Cloudflare یکی از بهترین گزینه‌ها برای میزبانی وب‌سایت‌های مدرن محسوب می‌شود. با استفاده از Origin CA ارتباط بین سرور و Cloudflare رمزنگاری می‌شود و با فعال‌سازی Authenticated Origin Pulls، تنها سرورهای Cloudflare اجازه ارسال درخواست به Nginx را خواهند داشت. این معماری امنیت، عملکرد و پایداری وب‌سایت را به شکل قابل توجهی افزایش می‌دهد و از بسیاری از حملات مستقیم علیه سرور جلوگیری می‌کند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا