معمولا برای راهاندازی یک Bare-metal (سرور اختصاصی) برای چند اپلیکیشن یا یک اپلیکیشن با مقیاس متوسط یا بزرگ از تعداد بیش از یک ماشین مجازی (Virtual Machine / VM) استفاده میشود تا سرویس ها، امکانات مختلف مانند سرور گیت و ایمیل، و یا Node های Cloud را بتوان روی VM های مختلف راهاندازی کرد.
هر یک از VM های یک سرور میتوانند دارای Public IP باشند و بطور مستقل از اینترنت در دسترس باشند، اما در این صورت علاوه بر نیاز به Public IP به تعداد VM ها و عدم انعطاف پذیری، حفظ امنیت VM ها نیز مشکل خواهد بود. یک معماری مرسوم که در این آموزش به آن میپردازیم، ساخت یک شبکه خصوصی (Private Network) بر روی VM ها است. در این معماری حداقل یک Public IP و یک VM بعنوان واسطه کافی است و با تمرکز بر امنیت آن میتوان امنیت بالایی برای کل VM ها برقرار کرد.
در این ساختار، VM هایی که نیاز به Public IP دارند شامل Network Gateway (برای شبکه خصوصی)، Application Gateway (نقطه ورود درخواست های کاربران) و Bastion (نقطه ورود درخواست های SSH) میشود. این سه سرور میتوانند سه VM مجزا با سه Public IP باشند یا اینکه یک VM با یک Public IP هر سه نقش را ایفا کند.
هر شبکه کامپیوتری به یک Network Gateway نیاز دارد؛ چرا که ارتباط بین Node های آن شبکه و ارتباط با اینترنت از طریق آن امکان پذیر میشود. برای راه اندازی Network Gateway، باید یک VM با دو Interface شبکه، یکی برای دسترسی به اینترنت و دیگری برای شبکه خصوصی ایجاد کنیم.
پس از ایجاد VM برای Network Gateway، باید Interface های آن را پیکرهبندی کنیم. به عنوان مثال، در سیستم عامل Debian، با ویرایش فایل زیر میتوان اینترفیس ها را مدیریت کرد. در این فایل، اینترفیس ens192 برای اتصال به اینترنت و ens224 برای شبکه خصوصی تعریف شدهاند.
File: /etc/network/interfaces
# The loopback network interface auto lo iface lo inet loopback # The public network interface allow-hotplug ens192 iface ens192 inet static address 13.13.13.13/24 gateway 13.13.13.1 dns-nameservers 8.8.8.8 8.8.4.4 # The private network interface auto ens224 iface ens224 inet static address 192.168.0.1/24 dns-nameservers 8.8.8.8 8.8.4.4
در اینترفیس ens192 از یک IP Range با آدرس 13.13.13.13/24 و Gateway با آدرس 13.13.13.1 استفاده شده که باید آنرا مطابق با IP Range و Gateway خود تغییر کنید. در اینترفیس ens224 برای شبکه خصوصی IP Range با آدرس 192.168.0.1/24 را انتخاب شده است که البته هر IP Range مجاز و آزاد برای شبکه های خصوصی را به دلخواه میتوان وارد کرد. در انتها با دستور زیر سرویس networking را Restart کنید تا تغییرات اعمال شود.
sudo systemctl restart networking
اکنون با استفاده از ابزار iptables مسیریابی شبکه خصوصی را تعریف میکنیم. برای این منظور، دستورات زیر را به ترتیب اجرا میکنیم.
echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o ens192 -j MASQUERADE iptables -A INPUT -i ens224 -j ACCEPT iptables -A INPUT -i ens192 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -j ACCEPT
توجه کنید که تاثیر دستورات بالا بطور پیشفرض پس از Reboot شدن سرور از بین میروند. برای رفع این مشکل میتوانید دستورات بالا را در یک فایل shell بریزید و آنرا بصورت یک سرویس با قابلیت Start up در بیاورید یا از ابزار iptables-persistent کمک بگیرید تا دستورات iptables را بطور دائمی ذخیره کنید.
حال که سرور Network Gateway راه اندازی شد، میتوانید از IP های آزاد در IP Range تعریف شده، یعنی 192.168.0.2 تا 192.168.0.254 برای VM های دیگر استفاده کنید تا در شبکه خصوصی ایجاد شده قرار بگیرند و به اینترنت نیز دسترسی داشته باشند.
بیشتر بخوانید:
https://linuxconfig.org/how-to-make-iptables-rules-persistent-after-reboot
https://tecadmin.net/run-shell-script-as-systemd-service/
سرور Application Gateway نقطه ورود درخواست های کاربران خواهد بود. معمولا بر روی این سرور یک Web Server با قابلیت Reverse Proxy مانند NGINX نصب میشود که درخواست ها را دریافت و به VM های مربوطه Forward کند.
برای Application Gateway میتوانید سرور جدایی درنظر بگیرید که مانند سرور Network Gateway دارای دو Interface شبکه، یکی برای Public IP و دیگری برای Private IP (مانند 192.168.0.2) باشد و یا اینکه از همان سرور Network Gateway استفاده کنید.
به عنوان مثال، فایل های زیر، کانفیگ های NGINX برای دو سرویس با دامنه های domain1.com و domain2.com هستند که درخواست های ورودی به دامنه domain1.com را به VM به آدرس 192.168.0.4 و درخواست های ورودی به دامنه domain2.com را به VM به آدرس 192.168.0.5 منتقل میکنند.
File: /etc/nginx/sites-enabled/domain1.com
server { listen 80; server_name domain1.com; location / { proxy_pass http://192.168.0.4:80; } }
File: /etc/nginx/sites-enabled/domain2.com
server { listen 80; server_name domain2.com; location / { proxy_pass http://192.168.0.5:80; } }
بیشتر بخوانید:
https://www.linode.com/docs/guides/use-nginx-reverse-proxy/
امکان اتصال به VM ها از طریق SSH، نیازمند دسترسی از اینترنت به آنهاست. سرور های Network Gateway و Application Gateway به دلیل داشتن Public IP در این خصوص مشکلی ندارند اما بقیه VM ها تنها یک Private IP خواهند داشت و خارج از شبکه خصوصی در دسترس نخواهند بود. برای حل این مشکل به یک سرور مجهز به Public IP به نام سرور Bastion نیاز داریم. این سرور نقش واسطه SSH را ایفا میکند تا بتوان خارج از شبکه خصوصی به VM های Private درون شبکه خصوصی دسترسی داشت.
سرور Bastion مانند Application Gateway میتواند جدا یا همان سرور Network Gateway باشد. در صورت جدا بودن باید یک VM جدید با دو Interface، یکی برای Public IP و دیگری برای Private IP (مانند 192.168.0.3) ایجاد کرد.
برای راهاندازی سرور Bastion ابتدا با دستور زیر یک کاربر جدید (مثلا با نام bastion) ایجاد کنید.
sudo useradd -s /sbin/nologin bastion
دستور بالا یک کاربر بدون دسترسی به Shell ایجاد میکند. عدم دسترسی به Shell باعث میشود کاربر نتواند به محتویات سرور bastion دسترسی داشته باشه چرا که این سرور قرار است تنها یک واسطه (پروکسی) برای اتصال به دیگر VM ها باشد.
در گام بعدی، کلید عمومی SSH کاربران مجاز را به فایل زیر در سرور bastion اضافه کنید:
/home/bastion/.ssh/authorized_keys
همچنین همان کلید را به فایل authorized_keys در VM های مربوطه نیز اضافه کنید.
کاربران برای دسترسی به VM های Private در شبکه خصوصی، مثلا VM4 یا VM5 با آدرس های 192.168.0.4 و 192.168.0.5، از طریق سرور Bastion با آدرس 13.13.13.13 باید قطعه کانفیگ زیر را به فایل SSH Config در کامپیوتر شخصی خود اضافه کنند.
SSH Config in MacOS: /Users/{username}/.ssh/config
SSH Config in Linux: /home/{username}/.ssh/config
SSH Config in Windows: C:\Users\{username}\.ssh\config
Host bastion User bastion Port 22 HostName 13.13.13.13 Host vm4 User root ProxyCommand ssh bastion -W 192.168.0.4:%p Host vm5 User root ProxyCommand ssh bastion -W 192.168.0.5:%p
پیکرهبندی بالا بعنوان SSH Config، ابتدا هاست bastion به آدرس 13.13.13.13 و پورت 22 را تعریف میکند. در ادامه هاست های vm4 و vm5 را با آدرس های 192.168.0.4 و 192.168.0.5 تعریف میکند که اتصال آنها از طریق هاست تعریف شده bastion و کاربر پیشفرض root خواهد بود.
اکنون به عنوان مثال، با دستورات زیر در کامپیوتر شخصی خود میتوانید به vm5 متصل شوید:
# login using default port (22) as root user ssh vm5 # login using another port as root user ssh vm5 -p 666 # login using default port (22) as another user ssh milad@vm5 # login using another port as another user ssh milad@vm5 -p 666
برای ایجاد VM های دیگر تنها یک Interface برای Private IP کافی است. فایل زیر مثالی از پیکرهبندی Interface برای یک VM خصوصی مانند vm5 است.
File: /etc/network/interfaces
# The loopback network interface auto lo iface lo inet loopback # The private network interface auto ens224 iface ens224 inet static address 192.168.0.5/24 dns-nameservers 8.8.8.8 8.8.4.4
در این پست یک معماری مرسوم برای VM های یک سرور Bare-metal (اختصاصی) شرح داده شد. هدف از این معماری، استفاده حداقلی از Public IP ها، انعطاف پذیری و تمرکز بر روی امنیت VM ها است. معماری شرح داده شده یک معماری پایه است و معماری های خاص متناسب با سرویس مورد نظر بر روی آن ایجاد میشود.