مجله ایرانیکاسرورآموزش سرور، هاست، وردپرس و شبکه
آموزشی

چرا FusionPBX داخلی‌ها را Ban می‌کند؟ رفع مشکل Fail2Ban بدون کاهش امنیت

اگر چند داخلی FusionPBX ناگهان Register نمی‌شوند، پنل وب از یک شعبه باز نمی‌شود یا حتی SSH همان دفتر از دسترس خارج شده است، ممکن است مشکل از FreeSWITCH یا رمز داخلی نباشد؛ Fail2Ban…

چرا FusionPBX داخلی‌ها را Ban می‌کند؟ رفع مشکل Fail2Ban بدون کاهش امنیت
خلاصه سریع این آموزش

اگر چند داخلی FusionPBX ناگهان Register نمی‌شوند، پنل وب از یک شعبه باز نمی‌شود یا حتی SSH همان دفتر از دسترس خارج شده است، ممکن است مشکل از FreeSWITCH یا…

۲۲ دقیقه مطالعه ۰ دیدگاه ۲۵ مهر ۱۴۰۵ آخرین به‌روزرسانی
اگر چند داخلی FusionPBX ناگهان Register نمی‌شوند، پنل وب از یک شعبه باز نمی‌شود یا حتی SSH همان دفتر از دسترس خارج شده است، ممکن است مشکل از FreeSWITCH یا رمز داخلی نباشد؛ Fail2Ban می‌تواند Public IP مشترک آن دفتر را Ban کرده باشد.

این اتفاق مخصوصاً زمانی دیده می‌شود که چند تلفن پشت یک NAT قرار دارند و فقط یکی از آن‌ها Password قدیمی، Domain اشتباه یا Provisioning ناقص دارد. Fail2Ban خطاهای تکراری همان یک Phone را از یک Public IP می‌بیند و در نهایت کل IP را مسدود می‌کند؛ در نتیجه همه داخلی‌های آن شعبه هم‌زمان Offline به نظر می‌رسند.

راه‌حل درست خاموش‌کردن Fail2Ban نیست. باید مشخص کنیم کدام Jail IP را Ban کرده، کدام Log باعث Trigger شده، کدام Device یا Login خطا تولید کرده و فقط در صورت نیاز ignoreip محدود و امن بسازیم.

در این آموزش از تشخیص Ban تا Unban هدفمند، بررسی Jailهای FusionPBX و FreeSWITCH، پیدا کردن Log Source، تنظیم امن Whitelist و جلوگیری از Brute Force را مرحله‌به‌مرحله انجام می‌دهیم.

اصل مهم امنیتی: اگر یک IP قانونی Ban شده است، Fail2Ban را Stop نکنید و همه Banها را پاک نکنید. اول Jail مسئول را پیدا کنید، همان IP را Unban کنید، علت واقعی را برطرف کنید و فقط برای IPهای واقعاً قابل اعتماد Whitelist بسازید.

فهرست مطالب

Fail2Ban در FusionPBX چه کاری انجام می‌دهد؟

Fail2Ban فایل‌های Log را مانیتور می‌کند و وقتی تعداد مشخصی Failure از یک IP در یک بازه زمانی دیده شود، آن IP را با Action تعریف‌شده در Firewall مسدود می‌کند.

در نصب رسمی FusionPBX، Fail2Ban همراه سیستم نصب و از قبل برای چند سرویس آماده می‌شود.

هدف آن محافظت از بخش‌هایی مثل:

🔹 SSH

🔹 پنل وب FusionPBX

🔹 NGINX

🔹 FreeSWITCH و SIP

🔹 Provisioning

در برابر تلاش‌های تکراری و Brute Force است.

چرا یک IP Ban شده می‌تواند هم‌زمان SIP، Web و SSH را قطع کند؟

در فایل رسمی فعلی Installer، بسیاری از Jailها از Action زیر استفاده می‌کنند:

iptables-allports

یعنی اگر IP داخل آن Jail Ban شود، فقط Port خاص Jail بسته نمی‌شود؛ ممکن است تمام Portها برای آن IP Drop شوند.

به همین دلیل یک کاربر ممکن است ابتدا متوجه شود Phone رجیستر نمی‌شود و چند دقیقه بعد ببیند:

🔹 پنل FusionPBX هم باز نمی‌شود.

🔹 SSH از همان اینترنت قطع شده است.

🔹 تمام تلفن‌های پشت همان مودم Offline شده‌اند.

این رفتار در بسیاری از موارد نشانه خرابی VPS نیست؛ Public IP شما در Fail2Ban Ban شده است.

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

فرض کنید ۱۵ تلفن در یک دفتر هستند و همه از یک مودم اینترنت استفاده می‌کنند.

از دید FusionPBX، همه آن‌ها ممکن است با یک Public IP دیده شوند:

203.0.113.25

اگر فقط یک تلفن Password قدیمی داشته باشد و دائماً REGISTER ناموفق بفرستد، Fail2Ban Source IP را می‌بیند؛ نه اینکه الزاماً بداند این Failure فقط متعلق به یک دستگاه از ۱۵ دستگاه است.

اگر آن IP Ban شود، تمام تلفن‌های همان NAT تحت تأثیر قرار می‌گیرند.

قبل از هر تغییر، Public IP کاربر را مشخص کنید

برای عیب‌یابی دقیق باید بدانید کدام IP را دنبال می‌کنید.

اگر کاربر از Branch یا Office تماس گرفته است، Public IP اینترنت آن دفتر را مشخص کنید.

بعد آن IP را در Fail2Ban و Logها جست‌وجو می‌کنیم.

در مثال‌های این مقاله از:

203.0.113.25

به‌عنوان IP مستندسازی استفاده می‌کنیم؛ آن را با IP واقعی خود جایگزین کنید.

مرحله ۱: وضعیت کلی Fail2Ban را ببینید

systemctl status fail2ban --no-pager

سپس:

fail2ban-client status

خروجی فهرست Jailهای فعال را نشان می‌دهد.

همه Jailهایی که در فایل وجود دارند لزوماً فعال نیستند

این نکته برای FusionPBX مهم است.

در فایل رسمی فعلی Debian Installer، برخی Jailهای SIP تعریف شده‌اند اما به‌صورت پیش‌فرض:

enabled = false

هستند.

از جمله:

🔹 freeswitch

🔹 freeswitch-acl

🔹 freeswitch-ip

🔹 auth-challenge-ip

🔹 sip-auth-challenge

🔹 sip-auth-failure

🔹 fusionpbx-404

در مقابل، در فایل فعلی Installer Jailهایی مثل:

🔹 ssh

🔹 fusionpbx

🔹 fusionpbx-mac

🔹 nginx-404

🔹 nginx-dos

فعال هستند.

اما مستند رسمی FusionPBX برای افزایش امنیت توصیه می‌کند Jailهای `freeswitch-ip` و `auth-challenge-ip` نیز فعال شوند؛ بنابراین روی بسیاری از سرورهای Production این دو Jail را فعال خواهید دید.

مرحله ۲: بفهمیم IP دقیقاً در کدام Jail Ban شده است

برای هر Jail مشکوک:

fail2ban-client status freeswitch-ip

یا:

fail2ban-client status auth-challenge-ip
fail2ban-client status sip-auth-failure
fail2ban-client status fusionpbx

به بخش:

Banned IP list

دقت کنید.

در نسخه‌های جدید Fail2Ban یک راه سریع‌تر هم وجود دارد

اگر نسخه نصب‌شده از دستور `banned` پشتیبانی می‌کند:

fail2ban-client banned 203.0.113.25

می‌تواند Jailهایی را که IP در آن‌ها Ban شده نشان دهد.

اگر فرمان روی نسخه شما شناخته نشد، همان روش `status` برای Jailها را استفاده کنید.

مرحله ۳: Log خود Fail2Ban را بررسی کنید

FusionPBX در مستندات خود این فایل را برای ثبت Banها معرفی می‌کند:

/var/log/fail2ban.log

برای IP موردنظر:

grep "203.0.113.25" /var/log/fail2ban.log | tail -n 50

خروجی معمولاً مشخص می‌کند کدام Jail عمل Ban را انجام داده است.

مثلاً مفهومی شبیه:

[freeswitch-ip] Ban 203.0.113.25

بلافاصله مشخص می‌کند دنبال کدام Filter برویم.

اگر fail2ban.log نداریم

در برخی تنظیمات Log به systemd journal می‌رود.

journalctl -u fail2ban --since "1 hour ago" --no-pager

را بررسی کنید.

مرحله ۴: Log Source همان Jail را پیدا کنید

فقط دانستن Jail کافی نیست.

باید بفهمیم چه خطی باعث Match شده است.

در فایل فعلی FusionPBX، Jailهای SIP مانند:

🔹 freeswitch

🔹 freeswitch-acl

🔹 freeswitch-ip

🔹 auth-challenge-ip

🔹 sip-auth-challenge

🔹 sip-auth-failure

معمولاً این Log Source را دارند:

/var/log/freeswitch/freeswitch.log

خطاهای همان IP را در FreeSWITCH پیدا کنید

grep "203.0.113.25" /var/log/freeswitch/freeswitch.log | tail -n 100

حالا Timestamp قبل از Ban را بررسی کنید.

Jail freeswitch-ip دقیقاً دنبال چه چیزی است؟

Filter فعلی `freeswitch-ip` پیام‌هایی با مفهوم زیر را Match می‌کند:

Can't find user [extension@SERVER-IP] from CLIENT-IP

یعنی یک Client تلاش کرده User را روی Realm مبتنی بر IP سرور پیدا کند و FreeSWITCH چنین Userای در آن Realm پیدا نکرده است.

چرا Register کردن به IP خام می‌تواند مشکل بسازد؟

FusionPBX معماری Domain-based دارد.

اگر Extension متعلق به:

pbx.example.com

باشد ولی Phone به‌جای Domain مستقیماً Public IP را به‌عنوان SIP Server/Realm استفاده کند، FreeSWITCH ممکن است User را در Domain اشتباه جست‌وجو کند.

همین خطا دقیقاً چیزی است که Jail `freeswitch-ip` برای تشخیص Registration روی IP هدف قرار می‌دهد.

مستند FusionPBX نیز FQDN را توصیه می‌کند

FusionPBX صریحاً توصیه می‌کند Endpointها به Domain/FQDN رجیستر شوند، چون بیشتر اسکن‌های خودکار مستقیم Public IP را هدف می‌گیرند.

پس اگر Jailهای:

freeswitch-ip
auth-challenge-ip

را فعال کرده‌اید، همه Phoneها را از IP خام به FQDN منتقل کنید.

auth-challenge-ip چه چیزی را Match می‌کند؟

Filter فعلی این Jail روی Warningهای FreeSWITCH با مفهوم:

SIP auth challenge (INVITE|REGISTER) ... @SERVER-IP ... from ip CLIENT-IP

کار می‌کند.

در فایل فعلی Installer:

maxretry = 1
findtime = 60
bantime = 86400

برای این Jail تعریف شده است.

یعنی اگر آن را فعال کنید، یک Match می‌تواند IP را ۲۴ ساعت Ban کند.

این Jailها را غیرفعال کنیم؟

اگر همه Phoneها و Providerها با FQDN درست تنظیم شده‌اند، فعال‌بودن این Jailها لایه دفاعی ارزشمندی در برابر Botهایی ایجاد می‌کند که مستقیم Public IP را Scan می‌کنند.

پس اولین راه‌حل:

enabled=false

نیست.

اول Endpoint قانونی را درست کنید.

Jail sip-auth-failure چه زمانی مهم می‌شود؟

اگر این Jail را فعال کرده باشید، Authentication Failureهای تکراری می‌توانند IP را Ban کنند.

در فایل فعلی Installer مقدار نمونه آن:

maxretry = 6
findtime = 60
bantime = 7200

است.

یعنی چند Password اشتباه پشت سر هم می‌تواند دو ساعت Ban ایجاد کند.

سناریوی واقعی: یک تلفن، کل شعبه را Ban می‌کند

فرض کنید شعبه ۱۰ تلفن دارد.

داخلی 1004 چند روز قبل Password آن تغییر کرده اما Provisioning Phone هنوز Password قبلی را دارد.

Phone هر چند ثانیه تلاش می‌کند Register شود.

همه تلفن‌ها از Public IP زیر خارج می‌شوند:

203.0.113.25

Fail2Ban چند Failure را از همین IP می‌بیند و آن را Ban می‌کند.

نتیجه:

داخلی 1004 خراب بوده، اما داخلی‌های 1001 تا 1010 هم قطع می‌شوند.

در چنین حالتی فقط Unban کافی نیست

اگر فوراً:

unban

کنید ولی Password 1004 را اصلاح نکنید، چند ثانیه یا چند دقیقه بعد همان IP دوباره Ban می‌شود.

پس ترتیب درست:

تشخیص → توقف Failure → Unban → Retest

است.

مرحله ۵: همان IP را هدفمند Unban کنید

فرض کنیم Jail مسئول:

sip-auth-failure

است.

فقط همان IP را از همان Jail آزاد کنید:

fail2ban-client set sip-auth-failure unbanip 203.0.113.25

برای freeswitch-ip

fail2ban-client set freeswitch-ip unbanip 203.0.113.25

چرا Restart کردن Fail2Ban روش خوبی برای Unban نیست؟

مستند قدیمی FusionPBX اشاره می‌کند Restart کردن Fail2Ban می‌تواند Blockها را پاک کند.

اما این کار مشکل مهمی دارد:

ممکن است مهاجمان واقعی را هم آزاد کند.

Fail2Ban خودش Unban هدفمند را پشتیبانی می‌کند؛ بنابراین برای آزادکردن یک شعبه، کل سرویس را Restart نکنید.

اگر IP در چند Jail Ban شده باشد

Unban کردن فقط یک Jail کافی نیست.

همه Jailهایی که IP را Ban کرده‌اند مشخص کنید و IP را از همان‌ها آزاد کنید.

در نسخه‌های جدید Fail2Ban همچنین دستور:

fail2ban-client unban 203.0.113.25

می‌تواند IP را از Banهای مدیریت‌شده Fail2Ban آزاد کند، اما روی Production بهتر است ابتدا Jail مسئول را پیدا کنید تا علت اصلی مشخص بماند.

مرحله ۶: بعد از Unban فوراً Registration را مانیتور کنید

در یک Terminal:

tail -f /var/log/fail2ban.log

و در Terminal دیگر:

tail -f /var/log/freeswitch/freeswitch.log

Phone را دوباره Register کنید.

اگر همان Failure دوباره شروع شد، هنوز علت اصلی حل نشده است.

مرحله ۷: مشخص کنید کدام داخلی Failure تولید می‌کند

در Log FreeSWITCH معمولاً Extension/Username در همان پیام خطا دیده می‌شود.

مثلاً اگر چندین بار نام:

1004

را می‌بینید، همان تلفن را موقتاً از شبکه جدا کنید.

سپس:

🔹 Password داخلی را با Provisioning مقایسه کنید.

🔹 Auth ID را بررسی کنید.

🔹 SIP Server را FQDN صحیح قرار دهید.

🔹 Realm/Domain را بررسی کنید.

🔹 Configuration قدیمی ذخیره‌شده روی Phone را پاک یا اصلاح کنید.

Jail fusionpbx مربوط به SIP نیست

Jail:

[fusionpbx]

در فایل فعلی Installer فعال است و Log آن:

/var/log/auth.log

است.

Filter آن خطاهایی با مفهوم:

🔹 FusionPBX authentication failed

🔹 Provision attempt bad password

را دنبال می‌کند.

اگر Admin Password را چند بار اشتباه بزنیم چه می‌شود؟

در تنظیم فعلی Installer برای Jail `fusionpbx`:

maxretry = 20
findtime = 60
bantime = 3600

تعریف شده است.

یعنی تعداد زیادی Authentication Failure در یک دقیقه می‌تواند IP را یک ساعت Ban کند.

اگر Provisioning Script یا Application اشتباه Credential می‌فرستد، رسیدن به این حد بسیار سریع‌تر از ورود دستی کاربر اتفاق می‌افتد.

nginx-404 و nginx-dos را هم فراموش نکنید

گاهی کاربر تصور می‌کند Phone باعث Ban شده، در حالی که یک Scanner، Monitoring Tool یا Browser روی همان Public IP صدها Request اشتباه به پنل می‌فرستد.

Jailهای:

nginx-404
nginx-dos

Logهای:

/var/log/nginx/access*.log

را مانیتور می‌کنند.

پس همیشه Jail مسئول را ثابت کنید

اگر IP شما Ban شده است، این فرض‌ها را نکنید:

«حتماً Password SIP اشتباه بوده.»

«حتماً FreeSWITCH Ban کرده.»

«حتماً یک Attack بوده.»

Log Fail2Ban مشخص می‌کند Jail مسئول کدام است؛ Log Source همان Jail علت دقیق را نشان می‌دهد.

جدول Jailهای مهم FusionPBX

Jail Log اصلی سناریوی معمول
ssh /var/log/auth.log Login ناموفق SSH
fusionpbx /var/log/auth.log ورود ناموفق پنل یا Provisioning Password
fusionpbx-mac /var/log/syslog خطاهای مرتبط با MAC/Provisioning
freeswitch-ip /var/log/freeswitch/freeswitch.log REGISTER به IP/Realm نامعتبر
auth-challenge-ip /var/log/freeswitch/freeswitch.log Auth Challenge روی Realm مبتنی بر IP
sip-auth-failure /var/log/freeswitch/freeswitch.log Password/Auth ناموفق SIP
nginx-404 /var/log/nginx/access*.log تعداد زیاد 404
nginx-dos /var/log/nginx/access*.log Request Rate غیرعادی

مرحله ۸: آیا واقعاً باید IP را Whitelist کنیم؟

Whitelist یا `ignoreip` زمانی منطقی است که IP واقعاً قابل اعتماد و کنترل‌شده باشد.

نمونه‌های مناسب‌تر:

🔹 Public IP ثابت دفتر مرکزی

🔹 Public IP ثابت شعبه سازمان

🔹 IP ثابت SBC تحت مدیریت شما

🔹 IPهای رسمی SIP Carrier که از منبع معتبر گرفته شده‌اند

🔹 IP ثابت VPN Gateway مدیریتی

چه چیزی را نباید Whitelist کنیم؟

این موارد معمولاً انتخاب خطرناکی هستند:

🔹 کل Range یک ISP

🔹 شبکه CGNAT کاربران

🔹 0.0.0.0/0

🔹 یک /16 یا /8 فقط برای راحتی

🔹 IPی که نمی‌دانید متعلق به چه دستگاهی است

اگر یک IP در Ignore List باشد، Fail2Ban Failureهای آن را برای Jail مربوطه Ban نمی‌کند؛ بنابراین Whitelist بزرگ مستقیماً سطح دفاع را کاهش می‌دهد.

Whitelist سراسری یا فقط یک Jail؟

این یکی از تصمیم‌های مهم امنیتی است.

اگر IP ثابت دفتر مدیریت شما است و به:

🔹 SSH

🔹 پنل FusionPBX

🔹 SIP

دسترسی دارد، Whitelist سراسری ممکن است قابل توجیه باشد.

اما برای SIP Carrier بهتر است فقط Jailهای SIP را Ignore کنید تا مثلاً دسترسی Web آن IP بدون دلیل از محافظت خارج نشود.

روش پیشنهادی برای تغییرات پایدار Fail2Ban

Fail2Ban upstream توصیه می‌کند فایل‌های `.conf` اصلی را تغییر ندهید و Customization را داخل فایل‌های `.local` قرار دهید.

برای تنظیمات اختصاصی خود می‌توانید فایل جدا بسازید:

nano /etc/fail2ban/jail.d/99-fusionpbx-local.local

Whitelist سراسری برای یک Office IP ثابت

نمونه:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.25

IP را با Public IP ثابت واقعی جایگزین کنید.

برای Carrier بهتر است Scope محدودتر باشد

مثلاً:

[freeswitch-ip]
ignoreip = 127.0.0.1/8 ::1 198.51.100.20

[auth-challenge-ip]
ignoreip = 127.0.0.1/8 ::1 198.51.100.20

[sip-auth-failure]
ignoreip = 127.0.0.1/8 ::1 198.51.100.20

این روش فقط Jailهای SIP مشخص‌شده را برای آن Carrier Ignore می‌کند.

بعد از تغییر Config اول Syntax را تست کنید

fail2ban-client -t

اگر Config سالم بود:

fail2ban-client reload

چرا Reload بهتر از Restart است؟

در Fail2Ban جدید، `reload` Configuration را بدون Restart کردن Server Process دوباره بارگذاری می‌کند.

این کار برای تغییر Ignore List مناسب‌تر است و فعالانه همه Banهای موجود را پاک نمی‌کند.

در مقابل Stop/Start یا Restart می‌تواند وضعیت Firewall Actionها را بازسازی کند و برای یک تغییر ساده لازم نیست.

بعد از Reload بررسی کنید ignoreip واقعاً Load شده است

برای Jail موردنظر:

fail2ban-client get freeswitch-ip ignoreip

یا:

fail2ban-client get sip-auth-failure ignoreip

را اجرا کنید.

این مرحله مهم است؛ فقط وجود IP در فایل Configuration ثابت نمی‌کند Runtime همان Config را Load کرده است.

Whitelist موقت بدون ویرایش فایل

Fail2Ban اجازه می‌دهد در Runtime به یک Jail Ignore IP اضافه کنید:

fail2ban-client set freeswitch-ip addignoreip 203.0.113.25

این برای عیب‌یابی موقت مفید است.

اما برای تنظیم دائمی، آن را داخل Config `.local` بنویسید؛ Runtime Change به‌تنهایی جای Configuration پایدار را نمی‌گیرد.

برای حذف Ignore موقت

fail2ban-client set freeswitch-ip delignoreip 203.0.113.25

آیا می‌شود Hostname یا DDNS را Whitelist کرد؟

مستند FusionPBX اشاره می‌کند `ignoreip` می‌تواند IP، CIDR یا DNS Hostname داشته باشد و حتی برای Dynamic IP از سرویس DDNS استفاده شود.

اما برای یک PBX حساس، اگر امکان دارید راه‌های قابل پیش‌بینی‌تر بهترند:

🔹 Public IP ثابت

🔹 VPN بین شعبه و PBX

🔹 Static Egress IP

Whitelist بر اساس Hostname یک Dependency جدید به DNS اضافه می‌کند و باید رفتار Resolution روی نسخه Fail2Ban خودتان تست شود.

کاربر خانگی با IP پویا را Global Whitelist نکنید

اگر یک کاربر Remote هر چند روز Public IP جدید می‌گیرد، اضافه‌کردن کل Range ISP به Ignore List راه‌حل امنی نیست.

برای چنین کاربری بهتر است:

🔹 Credential و Domain درست شود.

🔹 VPN استفاده شود.

🔹 TLS و Password قوی فعال باشد.

🔹 Jail Threshold متناسب با رفتار واقعی تنظیم شود.

مرحله ۹: Jail بیش از حد حساس است یا Client واقعاً خراب است؟

قبل از افزایش `maxretry`، Log واقعی را بررسی کنید.

اگر یک Phone طی یک دقیقه ۵۰ Password اشتباه می‌فرستد، مشکل از Threshold نیست.

Phone یا Provisioning خراب است.

اما اگر یک مدل Phone در Boot طبیعی خودش چند Event مشابه تولید می‌کند و Filter آن‌ها را اشتباه Failure می‌بیند، باید Filter و Threshold را تست کنید.

Filter را با fail2ban-regex تست کنید

مثلاً برای `freeswitch-ip`:

fail2ban-regex \
/var/log/freeswitch/freeswitch.log \
/etc/fail2ban/filter.d/freeswitch-ip.conf

برای Auth Challenge:

fail2ban-regex \
/var/log/freeswitch/freeswitch.log \
/etc/fail2ban/filter.d/auth-challenge-ip.conf

این تست نشان می‌دهد چه تعداد خط از Log با Regex Jail Match می‌شوند.

قبل از تغییر Regex، نمونه Log را ذخیره کنید

اگر Filter اشتباه Match می‌کند، فقط حدس نزنید.

چند خط واقعی قبل و بعد Event را ذخیره کنید و دقیقاً ببینید چه Patternای باعث Match شده است.

بعد در صورت نیاز Override محلی Filter بسازید؛ فایل اصلی Package را ویرایش نکنید چون Update ممکن است آن را بازنویسی کند.

مرحله ۱۰: maxretry، findtime و bantime را درست بفهمیم

maxretry تعداد Failure مجاز قبل از Ban است.

findtime بازه‌ای است که Fail2Ban Failureها را داخل آن می‌شمارد.

bantime مدت Ban است.

مثلاً:

maxretry = 6
findtime = 60
bantime = 7200

یعنی اگر شش Match در ۶۰ ثانیه رخ دهد، IP برای ۷۲۰۰ ثانیه Ban می‌شود.

افزایش maxretry همیشه راه‌حل نیست

اگر از:

6

به:

100

بروید فقط چون یک Phone خراب است، عملاً زمان بیشتری به Brute Force واقعی می‌دهید.

Threshold را فقط وقتی تغییر دهید که Log ثابت کند رفتار قانونی با Rule فعلی هم‌خوانی ندارد.

جلوگیری از Brute Force بدون Ban شدن کاربران واقعی

یک FusionPBX امن فقط به Fail2Ban وابسته نیست.

لایه‌های بهتر:

🔹 FQDN به‌جای Registration مستقیم روی IP

🔹 Password تصادفی و متفاوت برای هر Extension

🔹 TLS برای Signaling در صورت پشتیبانی Endpoint

🔹 Allowlist IPهای SIP Carrier در Firewall

🔹 محدودکردن پنل مدیریت به IP یا VPN مدیریتی

🔹 Fail2Ban با Jailهای مرتبط و Threshold منطقی

🔹 Monitoring لاگ Authentication

Password داخلی‌ها باید واقعاً تصادفی باشد

شماره داخلی را به‌عنوان Password استفاده نکنید.

مثلاً:

1001 / 1001
1002 / 123456
2000 / companyname

Credentialهای بسیار ضعیفی هستند.

هر Extension باید Password طولانی و منحصربه‌فرد داشته باشد.

Carrier را در Firewall محدود کنید، نه فقط Fail2Ban

اگر SIP Provider فقط از چند IP مشخص تماس می‌فرستد، بهتر است Firewall نیز فقط همان Sourceها را برای Profile خارجی مجاز کند.

در این حالت Botهای عمومی حتی قبل از رسیدن به Authentication سطح Application متوقف می‌شوند.

پنل FusionPBX را از اینترنت عمومی دور کنید

اگر امکان دارد Web Admin فقط از:

🔹 IP ثابت مدیریت

🔹 VPN

🔹 شبکه مدیریتی

دسترسی داشته باشد.

Fail2Ban خط دفاع مفیدی است، اما جایگزین محدودکردن سطح Exposure نیست.

اگر روی VPS کار می‌کنید SSH را هم مستقل امن کنید

Fail2Ban در Installer FusionPBX از SSH نیز محافظت می‌کند، اما بهتر است Login با SSH Key، محدودکردن Root Login و سیاست Firewall را جداگانه رعایت کنید.

برای این بخش می‌توانید راهنمای ایرانیکاسرور درباره امن‌سازی SSH از Root Login تا SSH Key و Fail2Ban را نیز ببینید.

چرا Global Whitelist برای Carrier همیشه ایده خوبی نیست؟

فرض کنید Carrier فقط SIP Trunk شما است.

اگر IP آن را در `[DEFAULT]` قرار دهید، همان IP از Jailهای Web و SSH هم Ignore می‌شود.

در حالی که Carrier به پنل Admin یا SSH نیازی ندارد.

برای چنین حالتی Per-Jail Ignore دقیق‌تر است.

اگر یک شعبه IP ثابت دارد چه کنیم؟

برای شعبه‌ای که ده‌ها تلفن پشت یک Public IP ثابت دارد، دو گزینه داریم:

روش اول: Credentialها و Domain را درست کنیم و Fail2Ban را بدون Whitelist نگه داریم.

روش دوم: اگر IP کاملاً تحت کنترل سازمان است، آن IP را برای Jailهای SIP یا در صورت نیاز کل Jailها Ignore کنیم.

روش اول Security بیشتری دارد.

روش دوم Availability بالاتری برای شعبه ایجاد می‌کند، اما اگر یکی از دستگاه‌های همان شعبه آلوده یا Credential داخلی سرقت شود Fail2Ban دیگر از آن Source IP محافظت نمی‌کند.

VPN برای شعبه راه‌حل تمیزتری است

اگر چند شعبه با تعداد Phone بالا دارید، Site-to-Site VPN می‌تواند معماری بهتری ایجاد کند.

در این حالت:

🔹 SIP لازم نیست آزادانه از اینترنت عبور کند.

🔹 Phoneها از آدرس‌های Private کنترل‌شده دیده می‌شوند.

🔹 سطح Attack Surface کاهش پیدا می‌کند.

🔹 Whitelistهای اینترنتی کمتری نیاز دارید.

اگر IP بعد از Unban هنوز وصل نمی‌شود چه کنیم؟

Fail2Ban فقط یکی از لایه‌هاست.

بررسی کنید:

۱. IP هنوز در Jail دیگری Ban نیست.

۲. Rule دستی Firewall آن را Block نکرده است.

۳. FreeSWITCH Registration درست است.

۴. Fail2Ban دوباره همان IP را Ban نکرده است.

۵. SIP Profile فعال است.

۶. DNS/FQDN درست است.

Ruleهای Fail2Ban را در iptables ببینید

iptables -L -n --line-numbers

برای پیدا کردن Chainهای Fail2Ban:

iptables -S | grep -i f2b

در Debian 12 ممکن است iptables روی backend مبتنی بر nftables کار کند، اما Interface سازگاری `iptables` همچنان Ruleها را نمایش می‌دهد.

به‌صورت دستی Rule Fail2Ban را از iptables پاک نکنید

اگر Fail2Ban خودش یک IP را مدیریت می‌کند، Rule را با:

iptables -D ...

به‌صورت دستی حذف نکنید، مگر اینکه دقیقاً بدانید چه می‌کنید.

Fail2Ban Database همچنان ممکن است IP را Ban بداند و State شما بین Firewall و Fail2Ban ناسازگار شود.

از `fail2ban-client unbanip` استفاده کنید.

روش استاندارد عیب‌یابی در کمتر از پنج دقیقه

مرحله ۱: Public IP شعبه را پیدا کنید.

مرحله ۲: `fail2ban-client status` را اجرا کنید.

مرحله ۳: `/var/log/fail2ban.log` را برای همان IP Search کنید.

مرحله ۴: Jail مسئول را مشخص کنید.

مرحله ۵: Log Source همان Jail را بررسی کنید.

مرحله ۶: Extension/Device خراب را پیدا و Failure را متوقف کنید.

مرحله ۷: همان IP را Targeted Unban کنید.

مرحله ۸: Phoneها را Re-register کنید.

مرحله ۹: اگر IP ثابت و قابل اعتماد است، درباره Whitelist محدود تصمیم بگیرید.

مرحله ۱۰: Fail2Ban Log را چند دقیقه مانیتور کنید.

یک جدول تشخیص سریع

نشانه مظنون اصلی اقدام
همه Phoneهای یک دفتر قطع‌اند Ban شدن Public IP مشترک fail2ban.log و Jailها را بررسی کنید
فقط یک داخلی Register نمی‌شود Credential/Domain خود Phone FreeSWITCH Log را بررسی کنید
Web + SSH + SIP هم‌زمان قطع‌اند allports Ban Jail مسئول و IP را پیدا کنید
بعد از Unban دوباره سریع Ban می‌شود Failure هنوز ادامه دارد Phone یا Provisioning خراب را متوقف کنید
freeswitch-ip Ban می‌کند Registration روی IP/Realm اشتباه Phone را روی FQDN صحیح تنظیم کنید
sip-auth-failure Ban می‌کند Password/Auth اشتباه Credential را اصلاح کنید
fusionpbx Ban می‌کند Web login یا Provisioning Failure /var/log/auth.log را بررسی کنید
nginx-dos Ban می‌کند Request Rate بالا NGINX access log و Client را بررسی کنید

پرسش‌های رایج

چرا FusionPBX همه داخلی‌های یک شعبه را با هم قطع می‌کند؟

اگر همه Phoneها پشت یک NAT و Public IP مشترک باشند، Failureهای یک Device می‌تواند باعث Ban شدن همان Public IP شود و در نتیجه تمام Phoneهای پشت آن IP قطع شوند.

چطور بفهمیم IP توسط کدام Jail Ban شده است؟

`fail2ban-client status` را برای مشاهده Jailهای فعال اجرا کنید و سپس وضعیت Jailهای مشکوک و `/var/log/fail2ban.log` را بررسی کنید. Log خود Fail2Ban معمولاً نام Jail مسئول Ban را ثبت می‌کند.

آیا Restart کردن Fail2Ban برای Unban کردن IP کار درستی است؟

برای رفع یک IP توصیه نمی‌شود، چون می‌تواند Banهای دیگر را هم تحت تأثیر قرار دهد. از دستور هدفمند `fail2ban-client set JAIL unbanip IP` استفاده کنید.

چرا freeswitch-ip تلفن قانونی را Ban می‌کند؟

یکی از علت‌های مهم این است که Phone به‌جای FQDN روی Public IP FusionPBX Register می‌شود و FreeSWITCH User را در Realm مبتنی بر IP پیدا نمی‌کند. FusionPBX برای Registration استفاده از FQDN را توصیه می‌کند.

ignoreip را کجا تنظیم کنیم؟

بهتر است Customization خود را در فایل `.local` مانند `/etc/fail2ban/jail.d/99-fusionpbx-local.local` قرار دهید، Config را با `fail2ban-client -t` تست و با `fail2ban-client reload` اعمال کنید.

آیا می‌توان کل Range ISP را Whitelist کرد؟

از نظر فنی CIDR قابل استفاده است، اما برای کاربران اینترنتی کار امنی نیست. Whitelist باید تا حد ممکن محدود به IP ثابت و واقعاً قابل اعتماد باشد.

آیا می‌توان فقط SIP Carrier را از Jailهای SIP مستثنا کرد؟

بله. به‌جای `[DEFAULT]` می‌توانید `ignoreip` را فقط در Jailهایی مانند freeswitch-ip، auth-challenge-ip و sip-auth-failure تعریف کنید.

فرق fail2ban.log و freeswitch.log چیست؟

`fail2ban.log` می‌گوید چه IPی توسط کدام Jail Ban یا Unban شده است؛ `freeswitch.log` Event واقعی SIP یا Authentication را نشان می‌دهد که Filter Fail2Ban از روی آن تصمیم گرفته است.

چرا بعد از Unban دوباره IP مسدود می‌شود؟

چون Failure اصلی هنوز ادامه دارد؛ معمولاً Phone با Password قدیمی، Domain اشتباه یا Provisioning نادرست دوباره خطا تولید می‌کند.

آیا خاموش‌کردن Fail2Ban راه حل است؟

خیر. روی PBX اینترنتی Fail2Ban یکی از لایه‌های مهم دفاع در برابر Password Guessing و Scannerهای SIP/Web است. علت False Positive یا Client خراب را اصلاح کنید و فقط در صورت نیاز Whitelist محدود بسازید.

جمع‌بندی

وقتی داخلی‌های FusionPBX ناگهان Register نمی‌شوند، قبل از تغییر Passwordها یا Restart کردن FreeSWITCH بررسی کنید آیا Public IP کاربر توسط Fail2Ban Ban شده است.

اول Jail فعال و Log Ban را پیدا کنید. سپس Log Source همان Jail را بخوانید تا مشخص شود علت واقعی Registration روی IP، Password اشتباه، Provisioning خراب، Login ناموفق پنل یا Request غیرعادی NGINX بوده است.

برای Unban، فقط همان IP را از همان Jail آزاد کنید. Restart کردن کل Fail2Ban برای رفع یک IP می‌تواند مهاجمان واقعی را هم آزاد کند و برای Production روش مناسبی نیست.

اگر Whitelist لازم است، آن را فقط برای IPهای ثابت و کاملاً قابل اعتماد ایجاد کنید و تا جای ممکن Scope آن را به Jail مرتبط محدود نگه دارید.

در FusionPBX همچنین Registration روی FQDN، Password تصادفی برای هر Extension، محدودکردن Carrier در Firewall و استفاده از VPN برای شعبه‌ها می‌تواند باعث شود Fail2Ban هم امنیت را حفظ کند و هم کاربران واقعی کمتر Ban شوند.

منابع و مستندات
Jailهای فعلی Installer، Log Sourceها، Ruleهای FusionPBX/FreeSWITCH، ignoreip و روش امن Unban/Reload با منابع رسمی FusionPBX و Fail2Ban تا ۱۷ اکتبر ۲۰۲۶ بررسی شده‌اند.
FusionPBX Security
مرجع رسمی Blocked IP، fail2ban.log، Jail Status، ignoreip، توصیه FQDN و فعال‌سازی freeswitch-ip و auth-challenge-ip
Installer 2026
مرجع تنظیم فعلی Jailها، enabled state، logpath، maxretry، findtime، bantime و actionهای allports در Installer رسمی
SIP Filter
مرجع Regex فعلی برای تشخیص Can’t find user روی Realm مبتنی بر IP و علت Ban شدن Registration مستقیم روی IP
Auth Challenge
مرجع Regex فعلی SIP auth challenge برای REGISTER و INVITE روی IP Realm
Web Login Filter
مرجع خطاهای authentication failed و provision attempt bad password که Jail پنل وب از آن‌ها استفاده می‌کند
Fail2Ban Upstream
مرجع رسمی status، unbanip، addignoreip، delignoreip، get ignoreip، test و reload بدون Restart کامل سرویس
Configuration Safety
مرجع ترتیب Load فایل‌ها و توصیه استفاده از jail.local یا jail.d/*.local به‌جای ویرایش مستقیم فایل‌های اصلی .conf
پیشنهاد ایرانیکاسرور برای FusionPBX امن و پایدار

داخلی‌های شعبه شما مرتب Ban می‌شوند یا FusionPBX روی اینترنت در معرض اسکن SIP است؟

در یک PBX اینترنتی، فقط نصب Fail2Ban کافی نیست. IP ثابت، Firewall درست، FQDN، SIP/TLS، Fail2Ban Jailهای مناسب و تفکیک دسترسی Carrier، شعبه و مدیریت باید کنار هم طراحی شوند تا هم حملات Brute Force مسدود شوند و هم یک تلفن اشتباه کل شرکت را Offline نکند.

روی سرور مجازی ایرانیکاسرور می‌توانید FusionPBX و FreeSWITCH را با IP ثابت اجرا کنید و قبل از انتقال شماره‌های اصلی، Jailها، NAT، SIP Profile، RTP، Fail2Ban و Backup را روی محیط واقعی تست کنید.

مشاوره FusionPBX، FreeSWITCH و Fail2Ban: 021-91302467

اشتراک‌گذاری مقاله
گفت‌وگو درباره آموزش

دیدگاه‌ها (۰)

هنوز دیدگاهی ثبت نشده است.

دیدگاه یا سؤال خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *