Cloudflare یکی از محبوبترین سرویسهای امنیت و تحویل محتوا (CDN) در دنیاست که بین کاربران و سرور اصلی وبسایت قرار میگیرد و بهعنوان یک Reverse Proxy عمل میکند. استفاده از Cloudflare علاوه بر افزایش سرعت بارگذاری صفحات، قابلیتهایی مانند محافظت در برابر حملات DDoS، مدیریت DNS و بهبود امنیت ارتباطات را نیز در اختیار شما قرار میدهد.
از طرف دیگر، Nginx یکی از سریعترین و پرکاربردترین وبسرورهای دنیا است که میلیونها وبسایت پرترافیک از آن استفاده میکنند. ترکیب Nginx با Cloudflare، علاوه بر افزایش سرعت دسترسی کاربران، باعث میشود درخواستهای مخرب قبل از رسیدن به سرور اصلی شناسایی و مسدود شوند.
در این آموزش یاد میگیرید چگونه وبسایتی که توسط Nginx میزبانی میشود را با استفاده از Cloudflare Origin CA Certificate ایمن کنید و سپس قابلیت Authenticated Origin Pulls را فعال نمایید تا تنها سرورهای Cloudflare بتوانند به سرور اصلی شما متصل شوند. با این کار، حتی اگر شخصی IP واقعی سرور شما را پیدا کند، امکان ارسال مستقیم درخواست به Nginx را نخواهد داشت و تمام ترافیک باید از طریق Cloudflare عبور کند.
نکته: این مقاله بر اساس Ubuntu 24.04 LTS بهروزرسانی شده است و تمامی مراحل با نسخههای جدید سیستمعامل و Nginx سازگار هستند.
پیشنیازها
برای انجام مراحل این آموزش به موارد زیر نیاز دارید:
- یک سرور Ubuntu 24.04 LTS در پارمین کلود (Parmin Cloud) یا هر ارائهدهنده دیگری
- یک کاربر غیر Root با دسترسی
sudo - فعال بودن فایروال UFW
- نصب و پیکربندی Nginx روی سرور
- یک حساب کاربری Cloudflare
- یک دامنه که DNS آن به Cloudflare منتقل شده باشد و رکوردهای آن به IP سرور اشاره کنند.
- پیکربندی یک Server Block در Nginx برای دامنه موردنظر
اگر هنوز Nginx را نصب نکردهاید، پیشنهاد میشود ابتدا آن را روی Ubuntu 24.04 نصب و پیکربندی کنید و سپس ادامه این آموزش را دنبال کنید.
مرحله اول — ایجاد گواهی Origin CA در Cloudflare
Cloudflare قابلیتی به نام Origin CA ارائه میدهد که به شما اجازه میدهد یک گواهی TLS رایگان مخصوص سرور اصلی (Origin Server) ایجاد کنید.
برخلاف گواهیهای عمومی مانند Let’s Encrypt، این گواهی تنها توسط Cloudflare معتبر شناخته میشود و هدف آن رمزنگاری ارتباط بین Cloudflare و سرور شما است.
برای ایجاد این گواهی:
- وارد حساب Cloudflare شوید.
- دامنه موردنظر را انتخاب کنید.
- از منوی SSL/TLS وارد بخش Origin Server شوید.
- روی گزینه Create Certificate کلیک کنید.
در صفحه ایجاد گواهی، گزینه پیشفرض Let Cloudflare generate a private key and a CSR را بدون تغییر نگه دارید و روی Next کلیک کنید.
در مرحله بعد Cloudflare دو مقدار در اختیار شما قرار میدهد:
- Origin Certificate
- Private Key
مهم: کلید خصوصی (Private Key) فقط همین یک بار نمایش داده میشود. بنابراین قبل از بستن پنجره، آن را در محلی امن ذخیره کنید.
ذخیره گواهی روی سرور
فایلهای گواهی را داخل مسیر /etc/ssl ذخیره میکنیم.
ابتدا فایل مربوط به گواهی را ایجاد کنید:
sudo nano /etc/ssl/cert.pem
محتوای Origin Certificate را داخل فایل قرار داده و ذخیره کنید.
سپس فایل کلید خصوصی را ایجاد کنید:
sudo nano /etc/ssl/key.pem
مقدار Private Key را داخل آن قرار داده و فایل را ذخیره کنید.
نکته: هنگام کپی کردن Certificate و Private Key دقت کنید هیچ خط خالی اضافهای داخل فایلها ایجاد نشود؛ زیرا Nginx این فایلها را نامعتبر تشخیص خواهد داد.
هشدار
گواهی Cloudflare Origin CA فقط توسط سرورهای Cloudflare معتبر شناخته میشود. بنابراین اگر در آینده Cloudflare را غیرفعال کنید یا رکورد DNS را از حالت Proxy خارج نمایید، مرورگر کاربران خطای Certificate Not Trusted نمایش خواهد داد.
به همین دلیل این نوع گواهی فقط زمانی مناسب است که تمام ترافیک وبسایت از طریق Cloudflare عبور کند.
مرحله دوم — پیکربندی Nginx برای استفاده از گواهی Cloudflare Origin CA
اکنون که گواهی و کلید خصوصی را روی سرور ذخیره کردهاید، باید Nginx را طوری پیکربندی کنید که از این گواهی برای ارائه سرویس HTTPS استفاده کند.
اگر قبلاً برای دامنه خود یک Server Block ایجاد کردهاید، کافی است همان فایل را ویرایش کنید. در غیر این صورت، ابتدا یک Server Block جدید برای دامنه خود بسازید.
برای ویرایش فایل تنظیمات دامنه، دستور زیر را اجرا کنید (نام فایل را متناسب با دامنه خود تغییر دهید):
sudo nano /etc/nginx/sites-available/your_domain.conf
سپس تنظیمات مربوط به HTTPS را به شکل زیر در فایل قرار دهید:
server {
listen 80;
listen [::]:80;
server_name your_domain.com www.your_domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name your_domain.com www.your_domain.com;
ssl_certificate /etc/ssl/cert.pem;
ssl_certificate_key /etc/ssl/key.pem;
root /var/www/html;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
}
در این پیکربندی:
- سرور روی پورت 80 درخواستهای HTTP را دریافت کرده و آنها را به HTTPS هدایت میکند.
- سرور دوم روی پورت 443 با استفاده از گواهی Cloudflare Origin CA به درخواستهای HTTPS پاسخ میدهد.
- مسیر فایلهای
cert.pemوkey.pemهمان فایلهایی هستند که در مرحله قبل ایجاد کردید.
بررسی صحت تنظیمات
قبل از راهاندازی مجدد Nginx، بهتر است فایل پیکربندی را بررسی کنید تا از نبود خطا مطمئن شوید.
sudo nginx -t
اگر همه چیز درست باشد، خروجی مشابه زیر مشاهده خواهید کرد:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
در ادامه، سرویس Nginx را مجدداً بارگذاری کنید:
sudo systemctl reload nginx
یا در صورت نیاز:
sudo systemctl restart nginx
فعال کردن حالت Full (Strict) در Cloudflare
تا این مرحله، ارتباط رمزنگاریشده بین Cloudflare و سرور برقرار شده است؛ اما Cloudflare هنوز باید بداند که از این گواهی استفاده کند.
برای این کار:
- وارد داشبورد Cloudflare شوید.
- دامنه موردنظر را انتخاب کنید.
- از منوی SSL/TLS وارد بخش Overview شوید.
- حالت Full (Strict) را انتخاب کنید.
چرا Full (Strict)؟
در حالت Flexible ارتباط بین Cloudflare و سرور رمزنگاری نمیشود و امنیت کامل وجود ندارد.
حالت Full نیز گواهی را بررسی نمیکند.
اما Full (Strict) معتبرترین و امنترین گزینه است و Cloudflare فقط زمانی به سرور متصل میشود که گواهی نصبشده معتبر باشد.
بررسی اتصال HTTPS
اکنون مرورگر خود را باز کنید و آدرس زیر را وارد کنید:
https://your_domain.com
اگر همه مراحل را بهدرستی انجام داده باشید:
- ارتباط از طریق HTTPS برقرار میشود.
- مرورگر اتصال امن را نمایش میدهد.
- Cloudflare نیز ارتباط رمزنگاریشده با سرور شما برقرار خواهد کرد.
مرحله سوم — فعال کردن Authenticated Origin Pulls
تا اینجا ارتباط بین کاربران، Cloudflare و سرور شما بهصورت رمزنگاریشده برقرار شده است. اما هنوز یک مشکل امنیتی وجود دارد.
اگر شخصی IP واقعی سرور شما را پیدا کند، میتواند مستقیماً به Nginx متصل شود و درخواستهای خود را بدون عبور از Cloudflare ارسال کند. در این حالت، قابلیتهایی مانند WAF، قوانین امنیتی، محدودسازی نرخ درخواست (Rate Limiting) و محافظت در برابر حملات DDoS عملاً دور زده میشوند.
قابلیت Authenticated Origin Pulls این مشکل را برطرف میکند. با فعال شدن این ویژگی، Nginx تنها درخواستهایی را میپذیرد که توسط گواهی اختصاصی Cloudflare امضا شده باشند. بنابراین حتی اگر IP سرور شما افشا شود، کاربران عادی امکان اتصال مستقیم به آن را نخواهند داشت.
دانلود گواهی Cloudflare
ابتدا گواهی عمومی Cloudflare را روی سرور دانلود کنید:
sudo mkdir -p /etc/ssl/cloudflare
sudo curl https://developers.cloudflare.com/ssl/static/authenticated_origin_pull_ca.pem \
-o /etc/ssl/cloudflare/cloudflare.crt
نکته: این گواهی توسط Cloudflare منتشر شده و برای اعتبارسنجی درخواستهای ارسالی از سمت Cloudflare استفاده میشود.
پیکربندی Nginx
فایل Server Block دامنه را مجدداً باز کنید:
sudo nano /etc/nginx/sites-available/your_domain.conf
داخل بلاک HTTPS، دو دستور زیر را اضافه کنید:
ssl_client_certificate /etc/ssl/cloudflare/cloudflare.crt;
ssl_verify_client on;
در نهایت تنظیمات HTTPS شما مشابه نمونه زیر خواهد بود:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name your_domain.com www.your_domain.com;
ssl_certificate /etc/ssl/cert.pem;
ssl_certificate_key /etc/ssl/key.pem;
ssl_client_certificate /etc/ssl/cloudflare/cloudflare.crt;
ssl_verify_client on;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
در این تنظیمات:
ssl_client_certificateگواهی Cloudflare را معرفی میکند.ssl_verify_client onباعث میشود Nginx تنها درخواستهایی را بپذیرد که گواهی معتبر Cloudflare را ارائه دهند.
بررسی تنظیمات
قبل از اعمال تغییرات، فایل پیکربندی را بررسی کنید:
sudo nginx -t
در صورت نبود خطا، سرویس Nginx را مجدداً بارگذاری کنید:
sudo systemctl reload nginx
فعال کردن Authenticated Origin Pulls در Cloudflare
اکنون باید این قابلیت را از طریق پنل Cloudflare نیز فعال کنید.
مراحل زیر را انجام دهید:
- وارد داشبورد Cloudflare شوید.
- دامنه موردنظر را انتخاب کنید.
- از منوی SSL/TLS وارد بخش Origin Server شوید.
- گزینه Authenticated Origin Pulls را پیدا کنید.
- آن را روی Enabled قرار دهید.
پس از فعال شدن این گزینه، Cloudflare هنگام برقراری ارتباط با سرور، گواهی مخصوص خود را ارسال میکند و Nginx نیز آن را بررسی خواهد کرد.
تست عملکرد
برای اطمینان از صحت تنظیمات، ابتدا دامنه خود را از طریق مرورگر باز کنید:
https://your_domain.com
اگر همه چیز بهدرستی پیکربندی شده باشد، وبسایت بدون مشکل بارگذاری خواهد شد.
سپس IP مستقیم سرور را در مرورگر وارد کنید:
https://SERVER_IP
یا با استفاده از curl اتصال مستقیم را بررسی کنید:
curl -k https://SERVER_IP
در این حالت، اتصال باید با خطای SSL یا عدم دسترسی مواجه شود، زیرا درخواست مستقیماً از Cloudflare ارسال نشده و Nginx آن را رد میکند.
نتیجه: از این پس تنها سرورهای Cloudflare قادر به برقراری ارتباط با وبسرور شما خواهند بود و تمامی کاربران باید از مسیر Cloudflare به وبسایت دسترسی پیدا کنند؛ موضوعی که امنیت زیرساخت شما را بهطور قابلتوجهی افزایش میدهد.
مرحله چهارم — افزایش امنیت و بررسی عملکرد
در این مرحله، چند تنظیم امنیتی مهم را اعمال میکنیم تا علاوه بر استفاده از Cloudflare، امنیت وبسرور Nginx نیز افزایش پیدا کند.
مخفی کردن نسخه Nginx
بهصورت پیشفرض، Nginx نسخه خود را در هدر پاسخ HTTP نمایش میدهد. این موضوع میتواند اطلاعات مفیدی در اختیار مهاجمان قرار دهد.
برای غیرفعال کردن نمایش نسخه، فایل تنظیمات اصلی Nginx را باز کنید:
sudo nano /etc/nginx/nginx.conf
در بخش http مقدار زیر را اضافه کنید:
server_tokens off;
پس از ذخیره فایل، تنظیمات را بررسی و سرویس را مجدداً بارگذاری کنید:
sudo nginx -t
sudo systemctl reload nginx
فعال کردن HSTS
قابلیت HTTP Strict Transport Security (HSTS) به مرورگر اعلام میکند که همیشه از HTTPS برای برقراری ارتباط با وبسایت استفاده کند و هرگز از HTTP استفاده نکند.
داخل Server Block مربوط به HTTPS، هدر زیر را اضافه کنید:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
توجه: قبل از فعال کردن HSTS مطمئن شوید که وبسایت شما بهطور کامل روی HTTPS کار میکند. در غیر این صورت ممکن است کاربران تا مدت زیادی نتوانند از طریق HTTP به سایت دسترسی پیدا کنند.
افزودن هدرهای امنیتی
همچنین میتوانید هدرهای امنیتی زیر را به تنظیمات Nginx اضافه کنید:
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header X-XSS-Protection "1; mode=block" always;
این هدرها به ترتیب:
- از حملات Clickjacking جلوگیری میکنند.
- مانع تشخیص اشتباه نوع فایل توسط مرورگر میشوند.
- اطلاعات Referrer را کنترل میکنند.
- تا حدی از برخی حملات XSS در مرورگرهای قدیمی جلوگیری میکنند.
بررسی وضعیت SSL
بعد از اعمال تنظیمات، دوباره وبسایت را باز کنید:
https://your_domain.com
سپس در داشبورد Cloudflare مطمئن شوید که حالت SSL روی Full (Strict) قرار دارد.
همچنین میتوانید با استفاده از curl هدرهای پاسخ را بررسی کنید:
curl -I https://your_domain.com
نمونهای از خروجی:
HTTP/2 200
server: cloudflare
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
اطمینان از عبور ترافیک از Cloudflare
برای اینکه مطمئن شوید تمام درخواستها از طریق Cloudflare عبور میکنند، به هدرهای پاسخ دقت کنید.
وجود هدرهایی مانند موارد زیر نشان میدهد که درخواست توسط Cloudflare پردازش شده است:
CF-Cache-Status
CF-Ray
Server: cloudflare
در صورتی که این هدرها وجود نداشته باشند، احتمال دارد:
- رکورد DNS در حالت DNS Only (ابر خاکستری) باشد.
- یا درخواست مستقیماً به سرور ارسال شده باشد.
در این صورت وارد بخش DNS در Cloudflare شوید و مطمئن شوید که رکورد دامنه در حالت Proxied (ابر نارنجی) قرار دارد.
جمعبندی
در این آموزش یاد گرفتید چگونه یک وبسایت مبتنی بر Nginx را پشت Cloudflare قرار دهید و ارتباط بین کاربران، Cloudflare و سرور را بهصورت کاملاً امن برقرار کنید.
در پایان این مراحل:
- ارتباط کاربران با وبسایت از طریق HTTPS برقرار میشود.
- ارتباط بین Cloudflare و سرور نیز با استفاده از Origin CA Certificate رمزنگاری شده است.
- تنها سرورهای Cloudflare اجازه برقراری ارتباط با Nginx را دارند.
- با فعال کردن Authenticated Origin Pulls، دسترسی مستقیم به سرور اصلی مسدود میشود.
- با اعمال هدرهای امنیتی و فعال کردن HSTS، امنیت وبسرور نیز افزایش پیدا میکند.
این معماری علاوه بر افزایش امنیت، باعث بهرهمندی از امکانات Cloudflare مانند CDN، کش، محافظت در برابر حملات DDoS، قوانین WAF و بهینهسازی عملکرد وبسایت میشود و گزینهای مناسب برای استقرار سرویسهای Production در پارمین کلود یا سایر زیرساختهای ابری است.
از همراهی شما با پارمین کلود سپاسگزاریم.
نظرات کاربران