دسته بندی:

نصب فایروال APF در لینوکس

نصب فایروال APF در لینوکس

حدود ۱۰ دقیقه مطالعه

APF یا Advanced Policy Firewall یک لایه‌ی سیاست‌گذاری روی iptables (netfilter) است که به‌جای نوشتن زنجیره‌های خام، قواعد فایروال را از روی چند متغیر در یک فایل پیکربندی می‌سازد و بارگذاری می‌کند. برخلاف تصور رایج، این پروژه رها نشده است: نسخه‌ی 2.0.1 در فوریه‌ی ۲۰۲۶ و نسخه‌ی 2.0.2 در آوریل ۲۰۲۶ منتشر شده‌اند و نسخه‌ی امروزی یونیت systemd، پشتیبانی دوپشته‌ی IPv6، سازگاری با Docker و بسته‌های آماده‌ی RPM و DEB دارد. این راهنما نصب و پیکربندی همین نسخه‌ی جدید را نشان می‌دهد و در پایان می‌گوید کجا بهتر است به‌جای APF سراغ firewalld یا nftables بروید.

فایروال لینوکس

APF چیست و روی چه چیزی سوار می‌شود

APF خودش موتور فیلترینگ نیست. مجموعه‌ای از اسکریپت‌های Bash است که فایل پیکربندی /etc/apf/conf.apf را می‌خواند و از روی آن قواعد iptables را تولید و اجرا می‌کند. جذابیت اصلی‌اش هم همین است: برای باز کردن یک پورت کافی است شماره‌اش را به یک متغیر اضافه کنید، نه اینکه زنجیره و ترتیب قواعد را دستی بچینید.

نکته‌ی مهم برای سال ۲۰۲۶ این است که مستندات رسمی نسخه‌ی ۲ صراحتا هر دو backend یعنی iptables-legacy و iptables-nft را پشتیبانی‌شده اعلام می‌کند. یعنی روی توزیع‌های امروزی که پشت صحنه از nftables استفاده می‌کنند هم APF کار می‌کند، چون دستور iptables روی آنها یک لایه‌ی ترجمه روی همان nftables است.

پلتفرم‌هایی که پروژه رسما پشتیبانی‌شان را اعلام کرده: RHEL و Rocky Linux و AlmaLinux نسخه‌های ۸ و ۹، Debian 12، Ubuntu 20.04 و Ubuntu 24.04، و برای سازگاری با محیط‌های قدیمی CentOS 7 و CentOS 6. توجه کنید که CentOS 6 در سال ۲۰۲۰، CentOS 8 در ۲۰۲۱ و CentOS 7 در تابستان ۲۰۲۴ به پایان پشتیبانی رسیده‌اند؛ اینکه APF هنوز رویشان اجرا می‌شود دلیلی برای نگه داشتن آن سیستم‌عامل‌ها نیست. برای نصب تازه سراغ AlmaLinux یا Rocky Linux بروید.

روی سرور مجازی ایران که دسترسی کامل مدیریتی دارید و می‌توانید سیستم‌عامل و نرم‌افزار دلخواهتان را نصب کنید، مسیر نصب APF دقیقا همین است که در ادامه می‌آید.

پیش از نصب: فقط یک فایروال فعال باشد

شایع‌ترین دلیل رفتار غیرقابل پیش‌بینی فایروال، فعال بودن هم‌زمان دو ابزار است که هر کدام قواعد خودشان را می‌نویسند. پس اول ابزار فعلی را غیرفعال کنید:

systemctl disable --now firewalld
systemctl disable --now ufw

درباره‌ی CSF هم یک به‌روزرسانی لازم است: شرکت ConfigServer در ۳۱ اوت ۲۰۲۵ فعالیتش را متوقف کرد و پیش از تعطیلی، آخرین نسخه یعنی v15.00 را با مجوز GPLv3 منتشر کرد. بنابراین اگر تا امروز CSF را گزینه‌ی پیش‌فرض سرورهای کنترل‌پنل‌دار می‌دانستید، بدانید که نگهداری آن حالا بر عهده‌ی فورک‌های جامعه‌ی کاربری است و پیش از تکیه بر آن باید مشخص کنید کدام فورک را دنبال می‌کنید.

نصب APF

ساده‌ترین راه، بسته‌ی رسمی توزیع شماست. برای خانواده‌ی RHEL بسته‌های el7 تا el10 و برای دبیان و اوبونتو بسته‌ی deb منتشر می‌شود:

dnf install ./apf-2.0.2-1.el9.noarch.rpm
apt install ./apf_2.0.2-1_all.deb

اگر ترجیح می‌دهید از سورس نصب کنید، پروژه یک اسکریپت نصب تک‌مرحله‌ای دارد:

tar -xzf apf-2.0.2.tar.gz
cd advanced-policy-firewall-2.0.2
bash install.sh

تفاوت این دو مسیر در محل قرار گرفتن فایل اجرایی است: نصب با بسته آن را در /usr/sbin/apf و نصب با اسکریپت در /usr/local/sbin/apf می‌گذارد. فایل‌های پیکربندی در هر دو حالت زیر /etc/apf هستند. اگر نسخه‌ی قبلی APF روی سرور بوده، نصب جدید آن را در مسیری با الگوی /etc/apf.DDMMYYYY-EPOCH بکاپ می‌گیرد و یک لینک /etc/.bk.last به آخرین بکاپ می‌سازد؛ برای انتقال تنظیم‌های قدیمی هم اسکریپت importconf در پوشه‌ی extras هست.

پیکربندی: فایل conf.apf

تمام کار در /etc/apf/conf.apf انجام می‌شود. بالای هر متغیر توضیح کاملش نوشته شده و ارزش دارد که یک‌بار از بالا تا پایین بخوانیدش. حداقل چیزهایی که باید تنظیم کنید:

  • IFACE_UNTRUSTED: رابط شبکه‌ای که به اینترنت وصل است و قواعد روی آن اعمال می‌شود. مقدار پیش‌فرض eth0 است، ولی روی توزیع‌های امروزی نام رابط معمولا چیزی مثل ens3 یا enp1s0 است. نام واقعی را با ip -br link ببینید و همان را بنویسید.
  • IFACE_TRUSTED: رابط‌هایی که ترافیکشان کاملا از فایروال عبور می‌کند. اگر مطمئن نیستید، خالی بگذارید.
  • IG_TCP_CPORTS: پورت‌های TCP ورودی مجاز، با کاما جدا و با زیرخط برای بازه. مثلا IG_TCP_CPORTS="22,80,443".
  • IG_UDP_CPORTS: همان برای UDP؛ اگر سرویس UDP ندارید خالی بماند.
  • IG_ICMP_TYPES: انواع ICMP ورودی مجاز.
  • USE_IPV6: با مقدار 1 قواعد ip6tables هم در کنار IPv4 اعمال می‌شود. اگر سرورتان IPv6 دارد این را روشن کنید، وگرنه فقط نیمی از سطح حمله را بسته‌اید.
  • EGF: فیلترینگ خروجی. به‌طور پیش‌فرض 0 است و پورت‌های مجاز خروجی در EG_TCP_CPORTS تعریف می‌شوند. روشن کردنش اختیاری است؛ اگر سرور شما کارهای متنوعی انجام می‌دهد، اول با احتیاط تستش کنید.

پیش از هر راه‌اندازی مجدد، پیکربندی را اعتبارسنجی کنید تا خطای تایپی وسط کار غافلگیرتان نکند:

apf --validate

روی سرور اختصاصی که یک ماشین فیزیکی کامل با منابع سخت‌افزاری بدون اشتراک است، معمولا بیش از یک کارت شبکه دارید؛ آنجا دقت روی IFACE_UNTRUSTED و IFACE_TRUSTED اهمیت دوچندان پیدا می‌کند، چون اشتباه گرفتن رابط داخلی و خارجی یعنی یا همه‌چیز باز می‌ماند یا مدیریت سرور قطع می‌شود.

DEVEL_MODE؛ بیمه‌ی قفل نشدن پشت فایروال

شایع‌ترین حادثه هنگام کار با فایروال، قطع شدن دسترسی SSH خودتان است. APF برای همین یک مکانیزم داخلی دارد: متغیر DEVEL_MODE که روی نصب‌های تازه با مقدار 1 فعال است و با یک کران‌جاب، هر پنج دقیقه فایروال را متوقف می‌کند. یعنی اگر قواعد را اشتباه نوشتید و خودتان را بیرون گذاشتید، خیلی زود دوباره به سرور می‌رسید.

دو نکته درباره‌اش: اول اینکه تا وقتی این حالت روشن است فایروال شما دائمی نیست، پس بعد از اطمینان حتما DEVEL_MODE="0" بگذارید و APF را ری‌استارت کنید. دوم اینکه صرف نظر از این قابلیت، این دو عادت را هم رعایت کنید:

  • یک نشست SSH دوم باز نگه دارید و تا وقتی مطمئن نشده‌اید نبندیدش. نشست باز به‌خاطر قاعده‌ی وضعیت زنده می‌ماند، ولی اتصال تازه ممکن است رد شود؛ پس تست واقعی، باز کردن یک اتصال جدید است.
  • آی‌پی خودتان را پیش از هر چیز به فهرست مجاز اضافه کنید: apf -a 203.0.113.10 "admin". این کار بدون نیاز به ری‌استارت فایروال اعمال می‌شود.

راه‌اندازی، بوت و بررسی

روی سیستم‌های امروزی APF هنگام نصب یونیت apf.service را نصب می‌کند و اسکریپت نصب وقتی /run/systemd/system را ببیند همین مسیر را انتخاب می‌کند. پس راه‌اندازی و فعال‌سازی روی بوت با systemd انجام می‌شود: اگر هنوز با اسکریپت‌های قدیمی chkconfig کار می‌کنید، خطای service httpd does not support chkconfig دلیل این تغییر را توضیح می‌دهد.

systemctl enable --now apf
systemctl status apf

روی سیستم‌های قدیمی بدون systemd، اسکریپت /etc/init.d/apf نصب و با chkconfig فعال می‌شود. مهم است که فقط یکی از این روش‌ها را به کار ببرید و مثلا هم‌زمان یونیت systemd و خط rc.local نداشته باشید.

برای کنترل دستی، سه دستور اصلی این‌ها هستند: apf -s برای بارگذاری قواعد، apf -r برای پاک کردن و بارگذاری دوباره، و apf -f برای پاک کردن کامل قواعد. بعد از راه‌اندازی، این سه بررسی را انجام دهید:

  • خلاصه‌ی وضعیت فایروال با apf --info و فهرست قواعد فعال با apf --rules.
  • اینکه واقعا چه سرویسی روی چه پورتی گوش می‌دهد، با ss -tulpn.
  • و مهم‌تر از همه، تست از یک ماشین بیرونی: nc -vz SERVER_IP 443. تست از داخل خود سرور بی‌معنی است، چون ترافیک از رابط lo عبور می‌کند و اصلا به قواعد ورودی نمی‌رسد.

لاگ وضعیت APF در /var/log/apf_log است و با apf -t می‌توانید ورقش بزنید. نسخه‌ی ۲ علاوه بر آن یک مسیر ممیزی ساختاریافته به‌صورت JSONL در /var/log/apf/audit.log می‌نویسد که برای فهمیدن اینکه چه کسی چه زمانی چه قاعده‌ای را عوض کرده مفید است. حجم لاگ را زیر نظر داشته باشید؛ روی سروری که مدام اسکن می‌شود این فایل‌ها سریع بزرگ می‌شوند، پس برایشان چرخش لاگ تعریف کنید.

مدیریت روزمره

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

  • اجازه یا منع دائمی: apf -a HOST و apf -d HOST؛ حذف از همه‌ی فهرست‌ها با apf -u HOST.
  • اجازه یا منع موقت با زمان انقضا: apf -td 203.0.113.50 1h "brute force". فهرست موقت‌ها با apf --temp-list و پاک کردنشان با apf --temp-flush.
  • جست‌وجو در قواعد و فایل‌های اعتماد: apf -g 203.0.113.50.
  • خروجی کامل متغیرهای پیکربندی برای عیب‌یابی: apf -o.

اگر از CSF مهاجرت می‌کنید — پیکربندی پایه آن در راهنمای پیکربندی CSF آمده است — دستور apf --csf-help نگاشت دستورهای CSF به معادل APF را نشان می‌دهد؛ نسخه‌ی ۲ حتی چند نام‌مستعار مثل -ar و -dr را هم برای همین منظور پذیرفته است.

اگر ترجیح می‌دهید مدیریت فنی سرور را به کارشناسان بسپارید، سرور مجازی مدیریت‌شده ایران گزینه‌ای است که نصب و پیکربندی کنترل‌پنل‌ها، عیب‌یابی نرم‌افزارهای نصب‌شده و پشتیبانی فنی در آن بر عهده‌ی تیم آنلاین سرور است.

خطاهای رایجی که وقت می‌گیرند

  • پورت در APF باز است ولی سرویس روی 127.0.0.1 گوش می‌دهد و از بیرون در دسترس نیست؛ خروجی ss -tulpn این را لو می‌دهد.
  • USE_IPV6 خاموش مانده و سرویس روی IPv6 بدون محافظت باز است. اگر سرور آدرس IPv6 دارد، این را روشن کنید.
  • نام رابط شبکه در IFACE_UNTRUSTED با نام واقعی سیستم فرق دارد و قواعد عملا جای درستی اعمال نمی‌شوند.
  • DEVEL_MODE فراموش شده و روی 1 مانده؛ فایروال هر پنج دقیقه خودش را خاموش می‌کند و شما فکر می‌کنید کار می‌کند.
  • روی سروری که Docker دارد، کانتینرها قواعد خودشان را اضافه می‌کنند. APF نسخه‌ی ۲ برای همین DOCKER_COMPAT را دارد که به‌طور پیش‌فرض روی auto است و هنگام پاک‌سازی فقط زنجیره‌های خودش را حذف می‌کند؛ با این حال محدودیت‌های خودتان را در زنجیره‌ی DOCKER-USER بنویسید.
  • فیلتر بالادستی شبکه یا سرویس‌دهنده هم ممکن است دخیل باشد؛ اگر پورتی باز است ولی از بیرون پاسخ نمی‌دهد، فقط سرور را مقصر ندانید.

کجا به‌جای APF سراغ firewalld یا nftables برویم

APF زنده و به‌روز است، ولی همچنان روی لایه‌ی iptables می‌نشیند و رد هت این لایه را منسوخ اعلام کرده و گفته در یکی از نسخه‌های اصلی آینده حذف خواهد شد. اگر افق کارتان بلندمدت است یا محیطتان استاندارد توزیع را می‌طلبد، دو گزینه‌ی دیگر منطقی‌ترند:

  • firewalld: پیش‌فرض خانواده‌ی RHEL. مفهوم Zone دارد، تغییر موقت و دائمی را از هم جدا می‌کند و پشت صحنه روی nftables می‌نویسد. باز کردن سرویس‌ها با firewall-cmd --permanent --add-service=https و اعمال با firewall-cmd --reload انجام می‌شود.
  • nftables: اگر کنترل کامل و یک فایل قاعده‌ی خوانا می‌خواهید، /etc/nftables.conf را بنویسید و با nft -f /etc/nftables.conf اتمیک بارگذاری کنید.

یک نمونه‌ی کمینه با سیاست بستن پیش‌فرض، که همان کاری را می‌کند که یک پیکربندی معمولی APF انجام می‌دهد:

table inet filter {
  chain input {
    type filter hook input priority filter; policy drop;
    iif "lo" accept
    ct state established,related accept
    ct state invalid drop
    meta l4proto { icmp, ipv6-icmp } accept
    tcp dport { 22, 80, 443 } accept
  }
}

معادل DEVEL_MODE را هم می‌توانید دستی بسازید. پیش از اعمال قواعد یک بازگشت زمان‌دار بگذارید تا اگر خودتان را قفل کردید، سرور خودبه‌خود آزاد شود:

systemd-run --on-active=10min /usr/sbin/nft flush ruleset
systemd-run --on-active=10min /usr/bin/systemctl stop firewalld

بعد از اطمینان، تایمر را با systemctl list-timers پیدا و متوقف کنید. در firewalld هم برای تغییرهای آزمایشی می‌توانید از قاعده‌ی موقت استفاده کنید: firewall-cmd --add-port=8443/tcp --timeout=5m که خودش پس از مهلت پاک می‌شود و روی پیکربندی دائمی اثری نمی‌گذارد. و در هر دو ابزار لاگ را روشن نگه دارید؛ در firewalld با firewall-cmd --set-log-denied=all و در nftables با گذاشتن یک خط log prefix "fw-drop: " پیش از قاعده‌ی drop، که خروجی‌اش را با journalctl -k می‌بینید.

جمع‌بندی: APF در سال ۲۰۲۶ همچنان یک گزینه‌ی معتبر و فعال است و اگر با منطق آن راحت‌اید، نسخه‌ی ۲ را نصب کنید، آی‌پی خودتان را مجاز کنید، DEVEL_MODE را تا پایان تنظیمات روشن نگه دارید و در آخر خاموشش کنید. اگر هم ترجیح می‌دهید روی ابزار پیش‌فرض توزیع بمانید، firewalld یا nftables همان اصول را پیاده می‌کنند. در هر دو حالت، اگر جایی گیر کردید یا نمی‌خواهید ریسک قطع دسترسی را بپذیرید، از پشتیبانی و مدیریت سرور کمک بگیرید که هاردنینگ و فایروال سرورهای لینوکسی و ویندوزی هم بخشی از آن است. فهرست کارهای پایه‌ای که پیش از رسیدن به فایروال باید روی خود سیستم‌عامل انجام شود در امن‌سازی لینوکس آمده است.

آموزش‌های مرتبط