firewalld مدیر پیشفرض فایروال در AlmaLinux 9 و Rocky Linux 9 است. روی VPS Linux Infrawire شما کمک میکند فقط سرویسهای لازم را باز کنید، SSH را به آیپی خودتان محدود کنید و پورتها را هدایت کنید، بیآنکه به قوانین خام nftables دست بزنید.
بزرگترین خطر قطع شدن نشست SSH خودتان است. این راهنما حول همین نکته ساخته شده: هر تغییر پرخطر ابتدا در پیکربندی runtime آزمایش و سپس دائمی میشود.
📋 پیشنیازها
- یک VPS با AlmaLinux 9 یا Rocky Linux 9
- دسترسی SSH با کاربر root (آیپی و رمز root را در پنل کاربری خود مییابید)
- یک نشست SSH دوم که هنگام ویرایش قوانین باز نگه میدارید
1. نصب و راهاندازی firewalld
Bashdnf install -y firewalld systemctl enable --now firewalld firewall-cmd --state
آخرین دستور باید running چاپ کند. زون پیشفرض public است که از قبل SSH، Cockpit و کلاینت DHCPv6 را مجاز میکند و بقیه اتصالات ورودی را رد میکند.
2. شناخت زونها، سرویسها و پورتها
زون مجموعهای از قوانین است که روی یک رابط شبکه اعمال میشود. سرویس گروهی نامدار از پورتهاست (ssh یعنی 22/tcp، http یعنی 80/tcp، https یعنی 443/tcp).
Bashfirewall-cmd --get-default-zone firewall-cmd --get-active-zones firewall-cmd --list-all firewall-cmd --get-services | tr ' ' '\n' | head -20
دو پیکربندی وجود دارد. Runtime فوراً اعمال میشود و با بارگذاری مجدد یا ریبوت از بین میرود. پیکربندی دائمی (--permanent) روی دیسک ذخیره میشود اما فقط پس از firewall-cmd --reload فعال میشود.
3. باز کردن سرویسها و پورتها
Bash# سرویسها firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https # یک پورت سفارشی firewall-cmd --permanent --add-port=8080/tcp # یک بازه پورت firewall-cmd --permanent --add-port=30000-30100/udp # اعمال پیکربندی دائمی firewall-cmd --reload
برای بستن چیزی از گزینه متناظر --remove-service یا --remove-port استفاده کنید. اگر از کنسول وب استفاده نمیکنید سرویس cockpit را حذف کنید: firewall-cmd --permanent --remove-service=cockpit.
4. مجاز کردن SSH فقط از آیپی خودتان با rich rule
Rich ruleها شرطهایی مانند آدرس مبدأ را بیان میکنند. تا وقتی قانون محدودشده را آزمایش نکردهاید، قانون عمومی SSH را هرگز حذف نکنید.
Bash# 1. قانون را فقط در runtime اضافه کنید (به آیپی عمومی خودتان تغییر دهید) firewall-cmd --add-rich-rule='rule family="ipv4" source address="YOUR_IP/32" service name="ssh" accept' # 2. یک ترمینال جدید باز کنید و مطمئن شوید SSH از YOUR_IP هنوز کار میکند # 3. آن را دائمی کنید و سپس سرویس SSH باز برای همه را حذف کنید firewall-cmd --runtime-to-permanent firewall-cmd --permanent --remove-service=ssh firewall-cmd --reload
اگر آیپی شما تغییر کند دسترسی را از دست میدهید: کنسول VPS در پنل کاربری را بهعنوان راه بازیابی در دسترس نگه دارید. برای آدرس IPv6، family="ipv6" و آدرس IPv6 را بنویسید.
5. هدایت یک پورت
برای فرستادن ترافیک ورودی پورت 80 به برنامهای که روی همان سرور در پورت 8080 گوش میدهد:
Bashfirewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080 firewall-cmd --reload
برای هدایت به ماشین دیگر، toaddr=TARGET_IP را به گزینه forward-port اضافه کنید و masquerading را با firewall-cmd --permanent --add-masquerade فعال کنید. هسته نیز باید forwarding را مجاز کند که firewalld برای masquerading آن را مدیریت میکند.
6. بررسی پیکربندی
Bashfirewall-cmd --list-all firewall-cmd --list-rich-rules firewall-cmd --permanent --list-all ss -tlnp
فهرستهای runtime و دائمی را مقایسه کنید: پس از بارگذاری مجدد باید یکسان باشند. از ماشین دیگری با nc -zv VPS_IP 80 یک پورت را آزمایش کنید. سرویسی که گوش میدهد (ss -tlnp) فقط وقتی در دسترس است که فایروال پورتش را مجاز کند.
🛠️ عیبیابی
FirewallD is not running: آن را با systemctl enable --now firewalld راه بیندازید و خطاها را در journalctl -u firewalld ببینید.
قانون جدید اثری ندارد: از --permanent استفاده کردهاید اما بارگذاری مجدد نکردهاید. firewall-cmd --reload را اجرا کنید.
INVALID_SERVICE یا INVALID_ZONE: غلط تایپی در نام. نامهای معتبر را با firewall-cmd --get-services و --get-zones فهرست کنید.
SSH روی پورت سفارشی رد میشود با اینکه پورت باز است: SELinux باید پورت را بشناسد. semanage port -a -t ssh_port_t -p tcp 2222 را اجرا کنید (ابتدا policycoreutils-python-utils را نصب کنید)، پورت را در firewalld باز کنید و sshd را ریاستارت کنید.
دسترسی از دست رفته: از کنسول VPS در پنل کاربری استفاده کنید و سپس firewall-cmd --permanent --add-service=ssh و firewall-cmd --reload را اجرا کنید. از firewall-cmd --panic-on پرهیز کنید که تمام ترافیک از جمله نشست شما را قطع میکند.
🔒 VPS شما اکنون فقط همان چیزی را در معرض میگذارد که شما انتخاب میکنید و SSH در دسترس میماند!