پرش به مطلب اصلی

فایروال: ufw روی سرور و فایروال ابر آریانت

سرور ابری آریانت دو لایه‌ی فایروال دارد که می‌توانید هر دو را با هم استفاده کنید:

فایروال ابر آریانتufw
کجا اجرا می‌شودبیرون از سرور، در زیرساخت ابرداخل سیستم‌عامل سرور
مدیریتپنل، CLI، API و Terraformدستور ufw روی خود سرور
یک فایروال برای چند سروربله، با شناسه‌ی سرور یا برچسب (label)نه، هر سرور جدا
اگر سیستم‌عامل خراب یا اشتباه تنظیم شودهمچنان کار می‌کندممکن است از کار بیفتد

الگوی پیشنهادی: فایروال ابر فقط پورت‌هایی را که باید از اینترنت باز باشند می‌پذیرد (مثلاً SSH فقط از IP شما و وب از همه)، و ufw همان سیاست را روی خود سرور تکرار می‌کند و قوانین ریزتر (مثلاً پایگاه داده فقط از شبکه‌ی خصوصی) را اضافه می‌کند.

این آموزش برای سرور ابری آریانت با Ubuntu 24.04 است. بخش ufw روی Ubuntu 22.04 و سرور مجازی هم بدون تغییر کار می‌کند.

توجه

سرور ابری که هیچ فایروال ابری ندارد همه‌ی ترافیک ورودی را می‌پذیرد. برای هر سروری که IP عمومی دارد فایروال بگذارید.

پیش‌نیازها​

  • یک سرور ابری با Ubuntu 24.04 (اولین اتصال SSH و امن‌سازی)
  • IP عمومی کامپیوتر خودتان (مثلاً با curl -4 ifconfig.me)؛ در مثال‌ها 203.0.113.4
  • برای بخش CLI و API: CLI آریانت یا یک توکن API با دسترسی cloud:servers:write

۱. فایروال ابر در پنل​

  1. در منوی ابر، «امنیت ← فایروال‌ها» را باز کنید و فایروال جدید بسازید.
  2. قوانین ورودی را اضافه کنید، مثلاً:
    • TCP پورت 22 از 203.0.113.4/32 (فقط IP شما)
    • TCP پورت 80 و 443 از 0.0.0.0/0 و ::/0 (همه)
    • ICMP از همه، اگر می‌خواهید ping جواب بدهد
  3. فایروال را به سرور وصل کنید. فایروال‌های متصل به هر سرور در زبانه‌ی «فایروال» صفحه‌ی همان سرور دیده می‌شوند.

هنگام ساخت سرور جدید هم در مرحله‌ی «۵. فایروال» می‌توانید فایروال آماده را انتخاب کنید یا همان‌جا بسازید (راهنمای پنل ابر).

۲. فایروال ابر با CLI​

arianet cloud firewalls create --name web \
--rule direction=in,protocol=tcp,port=22,source=203.0.113.4/32 \
--rule direction=in,protocol=tcp,port=80,source=0.0.0.0/0,source=::/0 \
--rule direction=in,protocol=tcp,port=443,source=0.0.0.0/0,source=::/0 \
--rule direction=in,protocol=icmp,source=0.0.0.0/0,source=::/0

شناسه‌ی فایروال را از خروجی بردارید و آن را به سرورها اعمال کنید:

# one or more servers by id
arianet cloud firewalls apply-to <firewall-id> --server 12 --server 13 --wait

# or every server that has the label role=web, now and in the future
arianet cloud firewalls apply-to <firewall-id> --label-selector role=web --wait

با label selector، سرورهایی که بعداً برچسب role=web بگیرند خودکار همین فایروال را می‌گیرند و سرورهایی که برچسب را از دست بدهند، فایروال را هم از دست می‌دهند.

  • port یک پورت (80) یا بازه (1000-2000) است و فقط برای tcp و udp معنا دارد.
  • پروتکل‌ها: tcp، udp، icmp، esp و gre.
  • هر فایروال حداکثر ۵۰ قانون دارد.
  • arianet cloud firewalls rules set <id> --rule ... همه‌ی قوانین را یک‌جا جایگزین می‌کند؛ قوانین قبلی را هم در آن تکرار کنید.

۳. فایروال ابر با API​

BASE=https://api.ariaservice.net/cloud/v1
AUTH="Authorization: Bearer $ARIANET_TOKEN"

curl -s -X POST $BASE/firewalls -H "$AUTH" -H "Content-Type: application/json" -d '{
"name": "web",
"rules": [
{"direction": "in", "protocol": "tcp", "port": "22", "source_ips": ["203.0.113.4/32"]},
{"direction": "in", "protocol": "tcp", "port": "80", "source_ips": ["0.0.0.0/0", "::/0"]},
{"direction": "in", "protocol": "tcp", "port": "443", "source_ips": ["0.0.0.0/0", "::/0"]}
],
"server_ids": [12]
}'

اعمال با برچسب:

curl -s -X POST $BASE/firewalls/<firewall-id>/actions/apply_to_resources -H "$AUTH" \
-H "Content-Type: application/json" \
-d '{"apply_to": [{"type": "label_selector", "label_selector": {"selector": "role=web"}}]}'

PUT /firewalls/{id} نام و همه‌ی قوانین را جایگزین می‌کند. جزئیات در وب سرویس ابر و مرجع تعاملی API است. همین فایروال را با منبع arianet_firewall در Terraform هم می‌توانید تعریف کنید.

۴. ufw روی سرور​

ufw در اوبونتو نصب است ولی خاموش است. اول SSH را باز کنید، بعد فایروال را روشن کنید:

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw --force enable
sudo ufw status verbose

اگر Nginx نصب است، به جای دو خط وب می‌توانید sudo ufw allow 'Nginx Full' بزنید. فهرست پروفایل‌ها: sudo ufw app list.

قوانین ریزتر، مثلاً پایگاه داده فقط از شبکه‌ی خصوصی:

sudo ufw allow from 10.0.0.0/16 to any port 3306 proto tcp

حذف یک قانون:

sudo ufw status numbered
sudo ufw delete 4

ufw به‌طور پیش‌فرض قوانین را برای IPv6 هم اعمال می‌کند (IPV6=yes در /etc/default/ufw).

Docker و ufw

پورت‌هایی که Docker با -p یا ports: منتشر می‌کند، از قوانین ufw عبور می‌کنند؛ چون Docker قوانین iptables خودش را پیش از ufw می‌گذارد. فایروال ابر بیرون از سرور است و این مشکل را ندارد. جزئیات در نصب Docker.

بررسی​

از کامپیوتر خودتان (نه از روی سرور) پورت‌ها را امتحان کنید:

nc -zv -w 3 SERVER_IP 22     # succeeds from your IP
nc -zv -w 3 SERVER_IP 443 # succeeds if a service listens on 443
nc -zv -w 3 SERVER_IP 3306 # should time out

اگر پورتی در ufw باز است ولی از بیرون جواب نمی‌دهد، قوانین فایروال ابر را بررسی کنید: arianet cloud firewalls get <firewall-id>.

خطاهای رایج​

مشکلراه‌حل
پس از ufw enable اتصال SSH قطع شداز کنسول پنل وارد شوید و sudo ufw allow OpenSSH یا sudo ufw disable را اجرا کنید.
SSH از خانه کار می‌کند، از جای دیگر نهقانون پورت ۲۲ فقط IP خانه را می‌پذیرد. IP جدید را به فایروال ابر اضافه کنید، یا موقتاً از کنسول پنل وارد شوید.
سرویس فقط روی 127.0.0.1 گوش می‌دهدفایروال مشکلی ندارد؛ با sudo ss -tlnp آدرس گوش دادن سرویس را ببینید.
rules set قوانین قبلی را پاک کرداین دستور (و PUT /firewalls/{id}) همه‌ی قوانین را جایگزین می‌کند؛ فهرست کامل را بفرستید یا از --rules-file استفاده کنید.
invalid_label_selectorقالب selector را بررسی کنید: key=value، key!=value، key یا !key، جداشده با کاما.

قدم بعدی​

سرور خود را بسازید​

در ابر آریانت یک فایروال را با یک برچسب روی ده‌ها سرور اعمال کنید و هزینه را ساعتی بپردازید. در پنل آریانت به «سرور ابری / Cloud Computing» بروید، فایروال بسازید و هنگام ساخت سرور آن را انتخاب کنید.