چرا ارتباط وب و دیتابیس نباید از اینترنت عمومی عبور کند؟
تصور کنید وبسرور شما روی یک IP عمومی و دیتابیس MySQL روی سروری دیگر با IP عمومی اجرا میشود. برای اتصال، اپلیکیشن به آدرسی مثل 203.0.113.25:3306 وصل میشود. این یعنی هر بستهای که بین این دو سرور رد و بدل میشود، از مسیر اینترنت عبور میکند و در معرض شنود، دستکاری یا حملات brute-force قرار دارد. حتی اگر رمز عبور قوی داشته باشید، پورت 3306 روی IP عمومی بهطور مداوم توسط اسکنرها مورد حمله قرار میگیرد.
راهحل استاندارد، استفاده از شبکه خصوصی است. در این معماری، هر سرور علاوه بر IP عمومی، یک IP خصوصی (مثل 10.10.0.5) دریافت میکند که فقط از داخل شبکه دیتاسنتر قابل دسترسی است. ترافیک بین این IPها هرگز به اینترنت عمومی نمیرود؛ در عوض از سوئیچها و روترهای داخلی دیتاسنتر عبور میکند. نتیجه: تأخیر کمتر (معمولاً زیر ۰.۵ میلیثانیه)، امنیت بالاتر و هزینه پهنای باند کمتر.
در این مقاله یاد میگیرید که چگونه یک شبکه خصوصی بین وبسرور و دیتابیس راهاندازی کنید، فایروال را بهدرستی تنظیم کنید و رایجترین اشتباهات را بشناسید. این راهنما برای هر دیتاسنتری که امکان تعریف VLAN یا VPC دارد (از جمله سرویسهای ابری ServerNet) کاربرد دارد.
مفاهیم پایه: IP خصوصی، VLAN و VPC
قبل از شروع، سه اصطلاح را روشن کنیم:
- IP خصوصی: آدرسی از رنجهای
10.0.0.0/8،172.16.0.0/12یا192.168.0.0/16که در اینترنت مسیریابی نمیشود. - VLAN: جداسازی منطقی شبکه در لایه ۲. دو سرور در یک VLAN میتوانند مستقیم با هم صحبت کنند؛ سرورهای VLAN دیگر نه.
- VPC (شبکه خصوصی مجازی): در محیطهای ابری، یک شبکه ایزوله که میتوانید زیرشبکهها، جدول مسیریابی و gateway آن را خودتان تعریف کنید.
در هر دو حالت، اصل یکسان است: سرورها یک رابط شبکه دوم (مثل eth1) دارند که فقط به شبکه داخلی متصل است. IP این رابط از دید بیرون نامرئی است.
آشنایی با توپولوژی هدف
معماری پیشنهادی ما به این شکل است:
وبسرور (Nginx + PHP-FPM)
eth0: 203.0.113.10 ← IP عمومی
eth1: 10.10.0.10 ← IP خصوصی
دیتابیسسرور (MySQL 8)
eth0: 203.0.113.20 ← IP عمومی
eth1: 10.10.0.20 ← IP خصوصی
اپلیکیشن روی وبسرور بهجای 203.0.113.20:3306 به 10.10.0.20:3306 وصل میشود. پورت 3306 روی IP عمومی دیتابیس بسته میماند.
گام ۱: فعالسازی شبکه خصوصی روی سرورها
در پنل مدیریت دیتاسنتر یا ابر، برای هر سرور یک رابط شبکه دوم اضافه کنید. در محیط ابری معمولاً این کار با «Attach secondary network» انجام میشود. در دیتاسنتر فیزیکی، باید از تیم شبکه بخواهید یک VLAN اختصاصی برای شما تعریف کند.
بعد از افزودن رابط، در لینوکس باید آن را پیکربندی کنید. در توزیعهای مبتنی بر Debian/Ubuntu، فایل /etc/netplan/01-netcfg.yaml را ویرایش کنید:
network:
version: 2
ethernets:
eth0:
dhcp4: true
eth1:
dhcp4: false
addresses:
- 10.10.0.10/24
routes:
- to: 10.10.0.0/24
via: 10.10.0.1
سپس تنظیمات را اعمال کنید:
sudo netplan apply
ip addr show eth1
خروجی باید شامل inet 10.10.0.10/24 باشد. همین کار را روی دیتابیسسرور با IP 10.10.0.20 تکرار کنید.
اشتباه رایج: فراموش کردن تعریف route برای زیرشبکه خصوصی. اگر route وجود نداشته باشد، پینگ به 10.10.0.20 با خطای «Network is unreachable» مواجه میشود. همیشه بعد از netplan apply، با ip route بررسی کنید که مسیر 10.10.0.0/24 وجود دارد.
گام ۲: تنظیم فایروال روی دیتابیسسرور
حالا باید اطمینان حاصل کنیم که MySQL فقط روی IP خصوصی گوش میدهد. دو لایه محافظت لازم است: تنظیم bind-address در MySQL و قوانین فایروال.
۲.۱ تنظیم bind-address در MySQL
فایل پیکربندی MySQL (/etc/mysql/mysql.conf.d/mysqld.cnf در Ubuntu) را ویرایش کنید:
[mysqld]
bind-address = 10.10.0.20
port = 3306
این تنظیم باعث میشود MySQL فقط روی IP خصوصی گوش دهد و درخواستهای ورودی به IP عمومی را نادیده بگیرد. سپس سرویس را ریاستارت کنید:
sudo systemctl restart mysql
ss -tlnp | grep 3306
خروجی باید فقط 10.10.0.20:3306 را نشان دهد، نه 0.0.0.0:3306.
۲.۲ قوانین UFW
اگر از UFW استفاده میکنید، ابتدا پورت SSH را باز نگه دارید تا از سرور قفل نشوید:
sudo ufw allow OpenSSH
sudo ufw allow from 10.10.0.0/24 to any port 3306
sudo ufw enable
دستور دوم فقط به سرورهای داخل شبکه خصوصی اجازه اتصال به MySQL میدهد. درخواست از هر جای دیگر (از جمله اینترنت) رد میشود.
اشتباه رایج: باز گذاشتن پورت 3306 روی IP عمومی در فایروال. حتی اگر bind-address را تنظیم کرده باشید، باز بودن پورت در فایروال یک لایه خطر اضافی است. همیشه قانون deny برای پورت 3306 روی اینترنت اضافه کنید:
sudo ufw deny 3306/tcp
گام ۳: اتصال اپلیکیشن به دیتابیس از طریق IP خصوصی
حالا باید اپلیکیشن را به آدرس جدید وصل کنید. برای مثال، در فایل .env لاراول:
DB_HOST=10.10.0.20
DB_PORT=3306
DB_DATABASE=app_db
DB_USERNAME=app_user
DB_PASSWORD=یک_رمز_قوی_طولانی
در وردپرس، فایل wp-config.php:
define('DB_HOST', '10.10.0.20:3306');
بعد از تغییر، کش اپلیکیشن را پاک کنید و اتصال را تست کنید:
mysql -h 10.10.0.20 -u app_user -p -e "SELECT 1;"
اگر خطای Connection refused گرفتید، به ترتیب این موارد را بررسی کنید:
- آیا
eth1روی هر دو سرور بالا است؟ (ip link show eth1) - آیا route به زیرشبکه خصوصی وجود دارد؟ (
ip route) - آیا MySQL روی IP خصوصی گوش میدهد؟ (
ss -tlnp | grep 3306) - آیا UFW قانون allow برای زیرشبکه دارد؟ (
sudo ufw status verbose)
گام ۴: تست نهایی و پایش
برای اطمینان از اینکه ترافیک از اینترنت عبور نمیکند، میتوانید از ابزار traceroute استفاده کنید:
traceroute -n 10.10.0.20
خروجی باید فقط یک یا دو hop داشته باشد (مثلاً gateway داخلی و خود سرور). اگر hopهای زیادی میبینید، یعنی ترافیک از مسیر اشتباهی میرود.
همچنین پورت 3306 روی IP عمومی را از بیرون تست کنید:
nc -zv 203.0.113.20 3306
این دستور باید با خطای Connection refused یا timed out مواجه شود. اگر موفق شد، یعنی فایروال یا bind-address بهدرستی تنظیم نشده است.
مزایای امنیتی و عملکردی شبکه خصوصی
با این معماری، چند مزیت مهم به دست میآورید:
- حذف سطح حمله: پورت دیتابیس از دید اینترنت پنهان است. اسکنرهای خودکار دیگر آن را پیدا نمیکنند.
- کاهش تأخیر: ترافیک از مسیر داخلی دیتاسنتر عبور میکند، نه از مسیر اینترنت که ممکن است چندین hop اضافی داشته باشد.
- صرفهجویی در پهنای باند: ترافیک داخلی معمولاً رایگان یا بسیار ارزانتر از ترافیک اینترنت است.
- سادگی مدیریت: دیگر نیازی به چرخش IP دیتابیس یا استفاده از VPN پیچیده ندارید.
زمانبندی مهاجرت و ملاحظات عملی
اگر دیتابیس شما در حال حاضر روی IP عمومی کار میکند، مهاجرت را در پنجره نگهداری انجام دهید:
- تنظیمات bind-address را تغییر دهید و MySQL را ریاستارت کنید.
- فایل پیکربندی اپلیکیشن را به IP خصوصی تغییر دهید.
- اتصال را تست کنید و سپس قانون deny را در فایروال اضافه کنید.
- پورت 3306 روی IP عمومی را با ابزار خارجی تست کنید.
اگر چند اپلیکیشن دارید که به دیتابیس وصل میشوند، همه را همزمان تغییر دهید تا از قطعی ناخواسته جلوگیری شود.
جمعبندی
استفاده از شبکه خصوصی بین وبسرور و دیتابیس یک اقدام ساده اما حیاتی برای امنیت زیرساخت است. با چند دقیقه پیکربندی، ترافیک حساس دیتابیس را از اینترنت عمومی جدا میکنید، سطح حمله را بهشدت کاهش میدهید و تأخیر را بهبود میبخشید. این الگو در هر دیتاسنتری قابل پیادهسازی است و برای هر اپلیکیشنی که از دیتابیس استفاده میکند — از وردپرس تا برنامههای سفارشی — توصیه میشود.
اگر در محیط ابری کار میکنید، سرویسهای ServerNet امکان تعریف شبکه خصوصی مجازی (VPC) را فراهم میکنند که دقیقاً همین الگو را با چند کلیک پیادهسازی میکند. اما حتی در محیط فیزیکی، با هماهنگی تیم شبکه میتوانید VLAN اختصاصی خود را داشته باشید.
در نهایت، بهخاطر داشته باشید که امنیت یک لایه نیست. شبکه خصوصی اولین قدم است؛ اما همچنان باید رمزهای عبور قوی، احراز هویت دو مرحلهای برای دسترسی به سرور و پایش منظم لاگها را جدی بگیرید.