فایروال: 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
۱. فایروال ابر در پنل
- در منوی ابر، «امنیت ← فایروالها» را باز کنید و فایروال جدید بسازید.
- قوانین ورودی را اضافه کنید، مثلاً:
- TCP پورت
22از203.0.113.4/32(فقط IP شما) - TCP پورت
80و443از0.0.0.0/0و::/0(همه) - ICMP از همه، اگر میخواهید
pingجواب بدهد
- TCP پورت
- فایروال را به سرور وصل کنید. فایروالهای متصل به هر سرور در زبانهی «فایروال» صفحهی همان سرور دیده میشوند.
هنگام ساخت سرور جدید هم در مرحلهی «۵. فایروال» میتوانید فایروال آماده را انتخاب کنید یا همانجا بسازید (راهنمای پنل ابر).
۲. فایروال ابر با 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 با -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» بروید، فایروال بسازید و هنگام ساخت سرور آن را انتخاب کنید.