راه‌اندازی آسان Proxmox، بخش ۴: شبکه در عمل، از یک IP به چند ماشین

یک سناریوی خیلی رایج: یک سرور اجاره‌ای یا یک اتصال خانگی دارید که فقط یک IP عمومی به شما داده است، ولی می‌خواهید چند ماشین مجازی راه بیندازید که هم به اینترنت دسترسی داشته باشند و هم از بیرون قابل دسترسی باشند. با یک IP چطور این کار شدنی است؟ در این بخش دقیقاً همین کار را قدم‌به‌قدم انجام می‌دهیم.

این چهارمین بخش از مجموعه‌ی Proxmox است. در بخش‌های قبل نصب، ساخت ماشین و ذخیره‌سازی و پشتیبان‌گیری را دیدیم. حالا سراغ شبکه در دنیای واقعی می‌رویم.

مشکل: فقط یک IP عمومی

پل پیش‌فرض Proxmox یعنی vmbr0 به کارت شبکه‌ی فیزیکی و همان IP عمومی سرور وصل است. اگر همه‌ی ماشین‌ها را روی vmbr0 بگذارید، هرکدام یک IP عمومی جدا می‌خواهند که معمولاً ندارید. راه‌حل این است که یک شبکه‌ی خصوصی داخلی بسازیم و سرور را وسط کار بگذاریم تا مثل یک روتر عمل کند:

اینترنت 203.0.113.7 سرور Proxmox vmbr0 کارت فیزیکی + IP عمومی NAT + DNAT vmbr1 10.10.10.1/24 ماشین ۱ 10.10.10.10 ماشین ۲ 10.10.10.11 ماشین ۳ 10.10.10.12 خروج (Masquerade) DNAT :8080

ایده ساده است: ماشین‌ها روی یک شبکه‌ی خصوصی (مثلاً 10.10.10.0/24) قرار می‌گیرند و سرور برای آن‌ها نقش دروازه را بازی می‌کند. دو کار لازم داریم: یکی برای خروج ماشین‌ها به اینترنت (NAT/masquerade) و یکی برای ورود از بیرون به یک ماشین مشخص (port forwarding یا همان DNAT).

گام ۱: ساخت پل داخلی vmbr1

در پنل، گره سرور را انتخاب کنید و به System > Network بروید. روی «Create» بزنید و «Linux Bridge» را انتخاب کنید. برخلاف vmbr0، این پل به هیچ کارت فیزیکی وصل نمی‌شود؛ فقط یک آدرس داخلی می‌گیرد و کادر «Bridge ports» را خالی می‌گذاریم.

ساخت پل داخلی Linux Bridge با نام vmbr1
ساخت پل داخلی vmbr1 با آدرس 10.10.10.1/24. کادر «Bridge ports» را خالی می‌گذاریم تا پل به کارت فیزیکی وصل نشود.

بعد از ساخت، روی «Apply Configuration» بزنید تا پل فعال شود. حالا در فهرست شبکه، هم vmbr0 و هم vmbr1 را فعال (Active) می‌بینید.

فهرست شبکه با دو پل vmbr0 و vmbr1
هر دو پل فعال هستند: vmbr0 به بیرون وصل است و vmbr1 شبکه‌ی داخلی ماشین‌هاست.

گام ۲: خروج به اینترنت با NAT

آدرس‌های 10.10.10.x خصوصی‌اند و در اینترنت مسیریابی نمی‌شوند. برای اینکه ماشین‌ها بتوانند بیرون بروند، سرور باید بسته‌های آن‌ها را به IP عمومی خودش «ترجمه» کند. این همان masquerade است. اول مسیریابی (forwarding) را روشن می‌کنیم و بعد قانون NAT را اضافه می‌کنیم:

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o vmbr0 -j MASQUERADE
اجرای دستورهای فعال‌سازی forwarding و masquerade
روشن کردن IP forwarding و افزودن قانون masquerade روی سرور.

خط اول اجازه می‌دهد سرور بسته‌ها را بین کارت‌ها عبور دهد. خط دوم می‌گوید هر بسته‌ای که از شبکه‌ی 10.10.10.0/24 از طریق vmbr0 بیرون می‌رود، آدرس مبدأش به IP سرور تغییر کند. همین یعنی خروج ماشین‌ها به اینترنت.

گام ۳: دسترسی از بیرون با port forwarding

حالا برعکس: می‌خواهیم کسی از اینترنت به یک سرویس روی یکی از ماشین‌ها برسد. چون فقط یک IP داریم، از شماره‌ی پورت استفاده می‌کنیم. مثلاً پورت 8080 روی سرور را به پورت 80 ماشین اول (10.10.10.10) هدایت می‌کنیم:

iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 8080 \
    -j DNAT --to-destination 10.10.10.10:80

می‌توانید بررسی کنید که قوانین درست اعمال شده‌اند:

بررسی قوانین NAT و وضعیت پل vmbr1
قوانین masquerade و DNAT اعمال شده‌اند و پل vmbr1 با آدرس 10.10.10.1/24 بالا است.

با همین الگو می‌توانید پورت‌های مختلف را به ماشین‌های مختلف بدهید؛ مثلاً 8081 به ماشین دوم و 2222 به SSH یک ماشین دیگر. هر پورت، یک در ورودی به یک ماشین.

گام ۴: وصل کردن ماشین به شبکه‌ی داخلی

حالا کافی است کارت شبکه‌ی ماشین را به جای vmbr0 روی vmbr1 بگذارید. این کار را هنگام ساخت ماشین یا بعداً از تب Hardware و ویرایش «Network Device» انجام می‌دهید.

تنظیم پل کارت شبکه‌ی ماشین روی vmbr1
وصل کردن کارت شبکه‌ی ماشین به پل داخلی vmbr1.

داخل خود ماشین هم باید یک آدرس از همان شبکه بگذارید و دروازه را روی آدرس پل تنظیم کنید. روی یک ماشین دبیان یا اوبونتو چیزی شبیه این:

# /etc/network/interfaces  (داخل ماشین مجازی)
auto eth0
iface eth0 inet static
    address 10.10.10.10/24
    gateway 10.10.10.1
    dns-nameservers 1.1.1.1

این قوانین بعد از ری‌استارت پاک می‌شوند

دستورهای iptables که دستی زدیم، موقتی‌اند. برای ماندگار شدن، آن‌ها را به تعریف پل در فایل /etc/network/interfaces اضافه کنید تا با هر بار بالا آمدن شبکه دوباره اجرا شوند.

# /etc/network/interfaces  (روی سرور Proxmox)
auto vmbr1
iface vmbr1 inet static
    address 10.10.10.1/24
    bridge-ports none
    bridge-stp off
    bridge-fd 0
    post-up   echo 1 > /proc/sys/net/ipv4/ip_forward
    post-up   iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o vmbr0 -j MASQUERADE
    post-down iptables -t nat -D POSTROUTING -s 10.10.10.0/24 -o vmbr0 -j MASQUERADE
    post-up   iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 8080 -j DNAT --to-destination 10.10.10.10:80
    post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 8080 -j DNAT --to-destination 10.10.10.10:80

راه تمیزتر برای وب‌سایت‌ها: reverse proxy

Port forwarding برای هر سرویس یک پورت جدا می‌خواهد و برای وب‌سایت‌ها زیبا نیست (کسی نمی‌خواهد آدرس را با :8080 وارد کند). اگر چند ماشین دارید که همه روی پورت ۸۰ و ۴۴۳ سرویس وب می‌دهند، بهتر است یک reverse proxy جلوی همه بگذارید. پروکسی روی پورت‌های ۸۰ و ۴۴۳ گوش می‌دهد و بر اساس نام دامنه، هر درخواست را به ماشین درست می‌فرستد:

# نمونه‌ی ساده با nginx روی سرور یا یک ماشین جلویی
server {
    server_name app1.example.com;
    location / { proxy_pass http://10.10.10.10; }
}
server {
    server_name app2.example.com;
    location / { proxy_pass http://10.10.10.11; }
}

با این کار ده‌ها وب‌سایت می‌توانند پشت یک IP و همان دو پورت استاندارد کار کنند و مدیریت گواهی SSL هم یک‌جا انجام می‌شود. ابزارهایی مثل Traefik یا Nginx Proxy Manager این کار را حتی ساده‌تر می‌کنند.

جمع‌بندی

دیدیم که با یک IP عمومی هم می‌شود چند ماشین داشت: یک پل داخلی می‌سازیم، با NAT خروجی به اینترنت می‌دهیم، با port forwarding یا reverse proxy ورودی را مدیریت می‌کنیم. همین چند قانون ساده، همان ترفندی است که خیلی از سرورهای واقعی از آن استفاده می‌کنند.

قدم بعدی برای استفاده‌ی جدی و سازمانی، رفتن از یک سرور تکی به سمت خوشه (cluster)، دسترس‌پذیری بالا (HA) و ذخیره‌سازی مشترک است.

بخش‌های این مجموعه

← بازگشت به وبلاگ