یک سناریوی خیلی رایج: یک سرور اجارهای یا یک اتصال خانگی دارید که فقط یک IP عمومی به شما داده است، ولی میخواهید چند ماشین مجازی راه بیندازید که هم به اینترنت دسترسی داشته باشند و هم از بیرون قابل دسترسی باشند. با یک IP چطور این کار شدنی است؟ در این بخش دقیقاً همین کار را قدمبهقدم انجام میدهیم.
این چهارمین بخش از مجموعهی Proxmox است. در بخشهای قبل نصب، ساخت ماشین و ذخیرهسازی و پشتیبانگیری را دیدیم. حالا سراغ شبکه در دنیای واقعی میرویم.
مشکل: فقط یک IP عمومی
پل پیشفرض Proxmox یعنی vmbr0 به کارت شبکهی فیزیکی و همان IP عمومی سرور وصل است. اگر همهی ماشینها را روی vmbr0 بگذارید، هرکدام یک IP عمومی جدا میخواهند که معمولاً ندارید. راهحل این است که یک شبکهی خصوصی داخلی بسازیم و سرور را وسط کار بگذاریم تا مثل یک روتر عمل کند:
ایده ساده است: ماشینها روی یک شبکهی خصوصی (مثلاً 10.10.10.0/24) قرار میگیرند و سرور برای آنها نقش دروازه را بازی میکند. دو کار لازم داریم: یکی برای خروج ماشینها به اینترنت (NAT/masquerade) و یکی برای ورود از بیرون به یک ماشین مشخص (port forwarding یا همان DNAT).
گام ۱: ساخت پل داخلی vmbr1
در پنل، گره سرور را انتخاب کنید و به System > Network بروید. روی «Create» بزنید و «Linux Bridge» را انتخاب کنید. برخلاف vmbr0، این پل به هیچ کارت فیزیکی وصل نمیشود؛ فقط یک آدرس داخلی میگیرد و کادر «Bridge ports» را خالی میگذاریم.
vmbr1 با آدرس 10.10.10.1/24. کادر «Bridge ports» را خالی میگذاریم تا پل به کارت فیزیکی وصل نشود.بعد از ساخت، روی «Apply Configuration» بزنید تا پل فعال شود. حالا در فهرست شبکه، هم vmbr0 و هم vmbr1 را فعال (Active) میبینید.
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
خط اول اجازه میدهد سرور بستهها را بین کارتها عبور دهد. خط دوم میگوید هر بستهای که از شبکهی 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
میتوانید بررسی کنید که قوانین درست اعمال شدهاند:
vmbr1 با آدرس 10.10.10.1/24 بالا است.با همین الگو میتوانید پورتهای مختلف را به ماشینهای مختلف بدهید؛ مثلاً 8081 به ماشین دوم و 2222 به SSH یک ماشین دیگر. هر پورت، یک در ورودی به یک ماشین.
گام ۴: وصل کردن ماشین به شبکهی داخلی
حالا کافی است کارت شبکهی ماشین را به جای vmbr0 روی vmbr1 بگذارید. این کار را هنگام ساخت ماشین یا بعداً از تب Hardware و ویرایش «Network Device» انجام میدهید.
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) و ذخیرهسازی مشترک است.
بخشهای این مجموعه
- بخش ۱: نصب Proxmox
- بخش ۲: ساخت اولین ماشین مجازی
- بخش ۳: ذخیرهسازی و پشتیبانگیری
- بخش ۴: شبکه، از یک IP به چند ماشین (همین بخش)
- بخش ۵: خوشه و دسترسپذیری بالا
- بخش ۶: ذخیرهسازی مشترک با Ceph
- بخش ۷: پشتیبانگیری با Proxmox Backup Server