Port Knocking چیست و چرا برای SSH استفاده میشود؟
Port Knocking روشی است که در آن پورت حساس مثل SSH دائماً برای همه اینترنت باز نمیماند. کاربر قبل از اتصال، دنبالهای مشخص از درخواستها را به چند پورت میفرستد و سرویس knockd پس از تشخیص توالی صحیح، Rule فایروال را برای IP همان کاربر تغییر میدهد.
به زبان ساده، Port Knocking مثل یک «در پشتی مخفی» عمل میکند. پورت SSH شما برای همه بسته است و هیچکس حتی نمیتواند تشخیص دهد که سرویس SSH روی سرور شما در حال اجراست. فقط کسی که «رمز ضربه» یا همان توالی صحیح پورتها را بداند، میتواند در را موقتاً باز کند. این تکنیک بهعنوان یک لایه امنیتی اضافه (Defense in Depth) در کنار SSH Key و فایروال استفاده میشود، نه بهجای آنها [citation:13][citation:16].
نکته امنیتی حیاتی: Port Knocking جایگزین SSH Key، فایروال و تنظیمات امن OpenSSH نیست. از آن فقط بهعنوان یک لایه اضافه استفاده کنید. اگر SSH Key و احراز هویت قوی ندارید، Port Knocking بهتنهایی امنیت شما را تأمین نمیکند [citation:8][citation:16].
Port Knocking چطور کار میکند؟
فرایند Port Knocking در چند مرحله ساده انجام میشود:
- پورت SSH بسته است: فایروال سرور شما طوری تنظیم شده که پورت ۲۲ (SSH) برای همه بسته باشد. اگر کسی با
nmapاسکن کند، پورت SSH را «filtered» یا «closed» میبیند [citation:8][citation:13]. - ارسال توالی Knock: شما از کلاینت خود، درخواستهای TCP (یا UDP) را به ترتیب مشخصی به چند پورت میفرستید. مثلاً پورتهای ۷۰۰۰، ۸۰۰۰ و ۹۰۰۰ [citation:5].
- تشخیص توالی: سرویس knockd روی سرور، ترافیک شبکه را در سطح Link-layer بررسی میکند و اگر توالی صحیح را ببیند، دستور تعریفشده را اجرا میکند [citation:1][citation:5].
- باز شدن موقت پورت SSH: دستور اجرا شده، یک Rule فایروال اضافه میکند که فقط برای IP شما پورت ۲۲ را باز میکند. این Rule معمولاً بعد از مدتی بهصورت خودکار حذف میشود [citation:12].
- اتصال SSH: حالا میتوانید با SSH به سرور وصل شوید.
- بستن پورت (اختیاری): بعد از اتمام کار، میتوانید توالی دیگری بفرستید تا Rule فایروال حذف شود و پورت دوباره بسته شود [citation:5].
نکته مهم: پورتهایی که Knock به آنها فرستاده میشود نیازی نیست باز باشند. چون knockd در سطح Link-layer گوش میدهد، حتی بستههای ارسالی به پورتهای بسته را هم میبیند [citation:1][citation:5].
چرا از Port Knocking استفاده میشود؟
دلایل اصلی استفاده از Port Knocking عبارتند از:
- مخفی کردن سرویس SSH از اسکنرها: وقتی پورت SSH بسته است، رباتها و اسکنرهای خودکار نمیتوانند آن را پیدا کنند. این یعنی حملات Brute Force و اسکن خودکار هرگز به مرحله لاگین نمیرسند [citation:8].
- کاهش سطح حمله: هر سرویس باز روی اینترنت، یک نقطه ورود بالقوه است. با بستن SSH و باز کردن آن فقط برای IPهای مجاز، سطح حمله بهشدت کاهش مییابد [citation:14].
- لایه اضافی در کنار SSH Key: حتی اگر مهاجمی بتواند پورت SSH را پیدا کند، بدون دانستن توالی Knock نمیتواند به سرویس دسترسی پیدا کند [citation:13].
محدودیتها و ضعفهای Port Knocking
Port Knocking با وجود مزایایش، ضعفهای مهمی هم دارد که باید بدانید:
- آسیبپذیری در برابر Replay Attack: اگر کسی توالی Knock شما را روی شبکه شنود کند (Sniffing)، میتواند همان توالی را دوباره بفرستد و به SSH دسترسی پیدا کند [citation:5][citation:14]. برای مقابله با این مشکل، میتوان از
one_time_sequencesدر knockd استفاده کرد که هر توالی فقط یک بار معتبر است [citation:1][citation:5]. - آسیبپذیری در برابر IP Spoofing: مهاجم میتواند بستههای Knock را با IP جعلی بفرستد و بعد از باز شدن پورت، از IP واقعی خودش متصل شود. برخی پیادهسازیهای پیشرفته مثل P4-sKnock این مشکل را با احراز هویت دو مرحلهای حل کردهاند [citation:2].
- مشکل پشت NAT: اگر کلاینت شما پشت NAT باشد و شبکهای با Packet Filtering داشته باشد، ممکن است بستههای Knock بهدرستی به سرور نرسند یا ترتیب آنها بههم بریزد [citation:6].
- پیچیدگی عملیاتی: برای هر اتصال SSH باید اول Knock بزنید. این کار با اسکریپت ساده میشود، اما در شرایط اضطراری ممکن است فراموش کنید [citation:8].
گزینه پیشرفتهتر: Single Packet Authorization (SPA)
بهجای Port Knocking سنتی، میتوانید از Single Packet Authorization (SPA) استفاده کنید که در ابزاری مثل fwknop پیادهسازی شده است. SPA یک بسته رمزنگاریشده واحد را به سرور میفرستد که شامل اطلاعات احراز هویت و درخواست دسترسی است [citation:3][citation:15].
مزایای SPA نسبت به Port Knocking:
- غیرقابل تکرار (Non-replayable): هر بسته SPA شامل یک Timestamp و داده تصادفی است و فقط یک بار معتبر است. حتی اگر مهاجم بسته را شنود کند، نمیتواند دوباره از آن استفاده کند [citation:10].
- امنیت بیشتر: بسته SPA رمزنگاری شده است، بنابراین حتی اگر مهاجم آن را ببیند، نمیتواند محتوای آن را بفهمد [citation:10].
- توالی قابل کشف نیست: برخلاف Port Knocking که توالی پورتها میتواند کشف شود، در SPA هیچ توالی پورتی وجود ندارد که قابل حدس زدن باشد [citation:3].
پیشنیازها
- Ubuntu/Debian VPS با دسترسی sudo
- SSH فعال و تستشده
- UFW یا nftables/iptables
- Web Console یا دسترسی فیزیکی برای Recovery (حیاتی!)
هشدار جدی: قبل از بستن پورت SSH، حتماً یک Console یا روش دسترسی پشتیبان (مثل Web Console ارائهدهنده VPS) داشته باشید. اگر knockd درست کار نکند، ممکن است برای همیشه از سرور قفل شوید [citation:8].
نصب knockd در Ubuntu
sudo apt update sudo apt install knockd
بعد از نصب، سرویس knockd بهصورت پیشفرض غیرفعال است. برای فعالسازی، فایل /etc/default/knockd را ویرایش کنید:
sudo nano /etc/default/knockd
مقدار START_KNOCKD=0 را به START_KNOCKD=1 تغییر دهید و مطمئن شوید KNOCKD_OPTS به Interface درست اشاره میکند [citation:13]:
START_KNOCKD=1 KNOCKD_OPTS="-i eth0"
برای پیدا کردن نام Interface واقعی:
ip -br link show
تنظیم توالی باز و بسته شدن SSH
فایل کانفیگ اصلی /etc/knockd.conf را باز کنید:
sudo nano /etc/knockd.conf
محتویات را به این صورت تنظیم کنید:
[options] logfile = /var/log/knockd.log Interface = eth0
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 10
tcpflags = syn
command = /usr/sbin/ufw allow from %IP% to any port 22 proto tcp
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 10
tcpflags = syn
command = /usr/sbin/ufw delete allow from %IP% to any port 22 proto tcp
توضیح پارامترها:
- sequence: ترتیب پورتهایی که باید Knock به آنها فرستاده شود [citation:5].
- seq_timeout: حداکثر زمان (ثانیه) برای دریافت کل توالی [citation:5].
- tcpflags: نوع فلگ TCP که باید در بستهها باشد.
synیعنی فقط بستههای SYN (درخواست اتصال) شمارش میشوند [citation:5]. - command: دستوری که بعد از تشخیص توالی اجرا میشود.
%IP%با IP کلاینت جایگزین میشود [citation:5].
گزینه Auto-Close با cmd_timeout
بهجای تعریف دو توالی جداگانه برای باز و بسته کردن، میتوانید از start_command و stop_command با cmd_timeout استفاده کنید. این روش باعث میشود پورت بعد از مدت مشخصی خودکار بسته شود [citation:5][citation:12]:
[opencloseSSH] sequence = 7000,8000,9000 seq_timeout = 10 tcpflags = syn start_command = /usr/sbin/ufw allow from %IP% to any port 22 proto tcp cmd_timeout = 60 stop_command = /usr/sbin/ufw delete allow from %IP% to any port 22 proto tcp
در این حالت، بعد از Knock موفق، پورت ۲۲ برای IP شما باز میشود و بعد از ۶۰ ثانیه بهصورت خودکار بسته میشود [citation:12].
فعالسازی سرویس و تست
sudo systemctl enable --now knockd sudo systemctl status knockd
برای دیدن لاگهای knockd در حین تست:
sudo tail -f /var/log/knockd.log
ارسال Knock از Client
روی کلاینت (لپتاپ یا سرور دیگر)، ابزار knock را نصب کنید:
sudo apt install knockd
سپس توالی Knock را بفرستید:
knock SERVER_IP 7000 8000 9000 ssh USER@SERVER_IP
میتوانید از پروتکلهای مختلف هم استفاده کنید:
knock -v SERVER_IP 7000:udp 8000:tcp 9000:udp
عیبیابی
اگر Port باز نشد، این موارد را بررسی کنید:
- Interface درست: نام Interface در
/etc/knockd.confو/etc/default/knockdباید یکی باشد و با Interface واقعی سرور مطابقت کند [citation:8]. - ترتیب Knock: ترتیب پورتها باید دقیقاً همان چیزی باشد که در کانفیگ تعریف شده [citation:8].
- Protocol: اگر در کانفیگ
tcpflags = synدارید، باید بستههای TCP SYN بفرستید. برای UDP، این گزینه را حذف کنید [citation:5]. - لاگ knockd: فایل
/var/log/knockd.logرا بررسی کنید تا ببینید آیا Knock دریافت شده یا نه [citation:1]. - Rule فایروال: بعد از Knock موفق، با
sudo ufw statusبررسی کنید که Rule اضافه شده باشد [citation:8]. - NAT و Packet Filtering: اگر پشت NAT هستید، ممکن است بستههای Knock بهدرستی نرسند [citation:6].
اشتباهات رایج
- فراموش کردن Console پشتیبان: اگر بعد از بستن SSH، knockd درست کار نکند و Console نداشته باشید، از سرور قفل میشوید [citation:8].
- استفاده از پورتهای رزرو شده: پورتهایی مثل ۸۰ یا ۴۴۳ را برای Knock انتخاب نکنید. از پورتهای بالا و تصادفی استفاده کنید [citation:12].
- نداشتن one_time_sequences: اگر توالی ثابت باشد، مهاجم میتواند آن را Sniff کند و دوباره بفرستد (Replay Attack). برای امنیت بیشتر، از
one_time_sequencesاستفاده کنید [citation:5]. - فراموش کردن غیرفعال کردن Rule دائمی SSH: اگر قبلاً Rule دائمی SSH در UFW دارید، باید آن را حذف کنید وگرنه Port Knocking بیفایده است [citation:8].
مقاله مرتبط: نصب SSH در Ubuntu
اگر OpenSSH هنوز نصب و تست نشده، ابتدا راهنمای نصب SSH را کامل کنید.
سؤالات متداول
Port Knocking چیست؟
روشی برای اجرای یک Action پس از دریافت توالی مشخصی از درخواستهای پورت است؛ معمولاً برای بازکردن موقت دسترسی SSH برای IP کاربر [citation:13].
آیا Port Knocking جایگزین SSH Key است؟
خیر؛ فقط یک لایه اضافه است و باید همراه SSH Key، فایروال و Hardening استفاده شود [citation:8].
knockd چه کاری انجام میدهد؟
ترافیک Interface را برای توالی Knock بررسی میکند و پس از Match شدن Command تعریفشده را اجرا میکند [citation:1][citation:5].
اگر Knock کار نکرد چه کنم؟
Interface، Protocol، ترتیب Portها، لاگ سرویس، UFW و NAT مسیر Client را بررسی کنید [citation:8].
آیا پورتهای Knock باید باز باشند؟
لزومی ندارد؛ knockd میتواند Packetهای مقصد پورت بسته را نیز مشاهده کند [citation:1][citation:5].
Port Knocking در برابر Replay Attack آسیبپذیر است؟
بله، اگر توالی ثابت باشد. برای مقابله، از one_time_sequences در knockd استفاده کنید که هر توالی فقط یک بار معتبر است [citation:5].
تفاوت Port Knocking و SPA چیست؟
SPA (Single Packet Authorization) مثل fwknop، یک بسته رمزنگاریشده غیرقابل تکرار میفرستد و امنیت بسیار بالاتری نسبت به Port Knocking سنتی دارد [citation:3][citation:10].
منابع و مستندات
برای تست امن Port Knocking به VPS نیاز داری؟
روی سرور واقعی بدون Console آزمایشی Ruleهای SSH را ناگهانی تغییر نده. برای ساخت محیط تست میتوانی از VPS ایران استفاده کنی.
تماس با پشتیبانی ایرانیکاسرور: 021-91302467






دیدگاهها (۰)