knockd(1) knockd(1) نام (NAME) knockd - سرور پورت ناکینگ (شنود توالی پورت‌ها) خلاصه دستور (SYNOPSIS) knockd [گزینه‌ها] توضیحات (DESCRIPTION) برنامه knockd یک سرور پورت ناکینگ (port-knock) است. این دیمن تمام ترافیک روی یک رابط شبکه اترنت (یا PPP) را شنود می‌کند و به دنبال توالی‌های خاصی از «کوبیدن» (knock) روی پورت‌ها می‌گردد. کلاینت با ارسال بسته‌های TCP (یا UDP) به یک پورت روی سرور، این ضربه‌ها را ایجاد می‌کند. نیازی نیست این پورت باز باشد -- از آنجا که knockd در سطح لایه پیوند (link-layer) شنود می‌کند، تمامی ترافیک را حتی اگر به مقصد یک پورت بسته باشد مشاهده می‌نماید. هنگامی که سرور یک توالی مشخص از ضربه به پورت‌ها را شناسایی کند، دستوری را که در فایل پیکربندی‌اش تعریف شده اجرا می‌کند. از این سازوکار می‌توان برای باز کردن موقت روزنه‌هایی در دیوار آتش جهت دسترسی سریع استفاده کرد. گزینه‌ها (OPTIONS) -i, --interface مشخص کردن رابط شبکه جهت شنود. مقدار پیش‌فرض eth0 است. -d, --daemon اجرا به صورت یک دیمن در پس‌زمینه. این حالت معمولاً برای کارکرد استاندارد سرور مطلوب است. -c, --config مشخص کردن مسیر سفارشی برای فایل پیکربندی. مقدار پیش‌فرض /etc/knockd.conf است. -D, --debug چاپ پیام‌های اشکال‌زدایی (دیباگ). -l, --lookup جستجوی نام‌های دامنه (DNS) برای ورودی‌های گزارش لاگ. این گزینه ممکن است یک ریسک امنیتی باشد! بخش نکات امنیتی (SECURITY NOTES) را مشاهده کنید. -4, --only-ip-v4 نادیده گرفتن بسته‌های IPv6 و پردازش اختصاصی IPv4. -v, --verbose نمایش پیام‌های وضعیت با جزئیات کامل. -V, --version نمایش نسخه برنامه. -h, --help نمایش راهنمای دستور و ساختار گزینه‌ها. پیکربندی (CONFIGURATION) برنامه knockd تمامی مجموعه‌های ناک/رویداد را از یک فایل پیکربندی می‌خواند. هر ناک/رویداد با یک نشانگر عنوان به صورت [name] آغاز می‌شود که در آن name نام رویدادی است که در لاگ ثبت خواهد شد. نشانگر ویژه [options] برای تعریف گزینه‌های سراسری به کار می‌رود. مثال ۱: این مثال از دو رویداد ناک استفاده می‌کند. اولی به کلاینت اجازه دسترسی به پورت ۲۲ (SSH) را می‌دهد و دومی پس از پایان کار، پورت را می‌بندد. این حالت هنگامی کاربرد دارد که از یک فایروال بسیار سخت‌گیرانه (سیاست DENY) استفاده می‌کنید و می‌خواهید دسترسی محتاطانه و ایمن داشته باشید. [options] logfile = /var/log/knockd.log [openSSH] sequence = 7000,8000,9000 seq_timeout = 10 tcpflags = syn command = /usr/sbin/iptables -A INPUT -s %IP% --dport 22 -j ACCEPT [closeSSH] sequence = 9000,8000,7000 seq_timeout = 10 tcpflags = syn command = /usr/sbin/iptables -D INPUT -s %IP% --dport 22 -j ACCEPT مثال ۲: این مثال از یک ناک منفرد برای کنترل دسترسی به پورت ۲۲ (SSH) استفاده می‌کند. پس از دریافت موفقیت‌آمیز توالی ناک، دیمن دستور start_command را اجرا کرده، به مدت زمان مشخص‌شده در cmd_timeout صبر می‌کند و سپس stop_command را اجرا می‌نماید. این شیوه برای بستن خودکار پورت پس از اتصال کلاینت بسیار مفید است. توالی ناک در این مثال از هر دو پورت UDP و TCP استفاده می‌کند. [options] logfile = /var/log/knockd.log [opencloseSSH] sequence = 2222:udp,3333:tcp,4444:udp seq_timeout = 15 tcpflags = syn,ack start_command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --syn -j ACCEPT cmd_timeout = 5 stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --syn -j ACCEPT مثال ۳: این مثال به جای استفاده از یک توالی ثابت، از مجموعه‌ای از توالی‌های یک‌بارمصرف که از یک فایل خوانده می‌شوند (توالی‌های یک‌بارمصرف) بهره می‌برد که با دستورالعمل one_time_sequences مشخص می‌شود. پس از هر ناک موفق، توالی استفاده‌شده باطل می‌شود و برای ناک بعدی باید از توالی معتبر بعدی در فایل استفاده گردد. این قابلیت مانع از اجرای حملات بازپخش (Replay Attack) توسط مهاجم پس از شنود یا کشف توالی در شبکه می‌شود. [options] logfile = /var/log/knockd.log [opencloseSMTP] one_time_sequences = /etc/knockd/smtp_sequences seq_timeout = 15 tcpflags = fin,!ack start_command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 25 -j ACCEPT cmd_timeout = 5 stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 25 -j ACCEPT مثال ۴: مثالی برای پشتیبانی همزمان از IPv4 و IPv6. می‌توانید برای هر یک از این دو پروتکل دستور اختصاصی تعریف کنید. [options] logfile = /var/log/knockd.log [opencloseSMTP] one_time_sequences = /etc/knockd/smtp_sequences seq_timeout = 15 tcpflags = fin,!ack start_command = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 25 -j ACCEPT start_command_6 = /usr/sbin/ip6tables -A INPUT -s %IP% -p tcp --dport 25 -j ACCEPT cmd_timeout = 5 stop_command = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 25 -j ACCEPT stop_command_6 = /usr/sbin/ip6tables -D INPUT -s %IP% -p tcp --dport 25 -j ACCEPT پیکربندی: دستورالعمل‌های سراسری (CONFIGURATION: GLOBAL DIRECTIVES) UseSyslog ثبت گزارش رویدادها از طریق تابع ()syslog. با این کار ورودی‌های لاگ در /var/log/messages یا معادل آن درج می‌شوند. LogFile = /path/to/file ثبت مستقیم لاگ‌ها در یک فایل، معمولاً /var/log/knockd.log. PidFile = /path/to/file مسیر فایل PID مورد استفاده هنگام اجرا در حالت دیمن، پیش‌فرض: /var/run/knockd.pid. Interface = رابط شبکه‌ای که باید شنود شود. فقط نام آن باید داده شود نه مسیر دستگاه (مثلاً "eth0" نه "/dev/eth0"). پیش‌فرض: eth0. پیکربندی: دستورالعمل‌های ناک/رویداد (CONFIGURATION: KNOCK/EVENT DIRECTIVES) Sequence = [:],[:][,[:] ...] مشخص کردن توالی پورت‌ها در ناک اختصاصی. اگر پورت اشتباهی با همان فلگ‌ها دریافت شود، تلاش ناک باطل می‌شود. به صورت اختیاری می‌توانید پروتکل مورد استفاده را برای هر پورت جداگانه تعیین کنید (پیش‌فرض TCP است). One_Time_Sequences = /path/to/one_time_sequences_file فایل حاوی توالی‌های یک‌بارمصرف. به جای استفاده از یک توالی ثابت، knockd توالی مورد استفاده را از این فایل می‌خواند. پس از هر تلاش موفقیت‌آمیز ناک، این توالی با درج نویسه '#' در ابتدای خط مربوطه غیرفعال می‌شود. سپس توالی معتبر بعدی از فایل جایگزین آن خواهد شد. از آنجا که اولین نویسه با '#' جایگزین می‌شود، پیشنهاد می‌شود یک فاصله (space) در ابتدای هر خط قرار دهید؛ در غیر این صورت پس از استفاده، نخستین رقم توالی با '#' بازنویسی خواهد شد. هر خط در فایل توالی‌های یک‌بارمصرف دقیقاً حاوی یک توالی با ساختاری مشابه دستورالعمل Sequence است. خطوطی که با نویسه '#' شروع شوند نادیده گرفته می‌شوند. نکته: هنگام اجرای knockd این فایل را ویرایش نکنید! Seq_Timeout = مدت زمان انتظار برای تکمیل توالی به ثانیه. اگر زمان پیش از تکمیل ناک به پایان برسد، تلاش جاری نادیده گرفته و لغو می‌شود. TCPFlags = fin|syn|rst|psh|ack|urg توجه انحصاری به بسته‌هایی که این فلگ در آن‌ها تنظیم شده است. هنگام استفاده از فلگ‌های TCP، برنامه knockd بسته‌های TCP که با این فلگ‌ها مطابقت ندارند را نادیده می‌گیرد. این رفتار با حالت عادی متفاوت است که در آن دریافت یک بسته نادرست کل توالی را باطل کرده و کلاینت را مجبور به شروع دوباره می‌کرد. استفاده از "TCPFlags = syn" هنگام آزمایش روی اتصال SSH بسیار مفید است، زیرا ترافیک SSH معمولاً با ناک تداخل پیدا کرده و آن را باطل می‌کند. چندین فلگ را با کاما جدا کنید (مثلاً TCPFlags = syn,ack,urg). فلگ‌ها را می‌توان با علامت "!" به صورت صریح مستثنی کرد (مثلاً TCPFlags = syn,!ack). Target = استفاده از آدرس IP مشخص‌شده به جای آدرس تشخیص‌داده‌شده برای Interface هنگام تطبیق Sequence. این قابلیت زمانی مفید است که knockd روی یک روتر اجرا می‌شود و می‌خواهید در پاسخ به تلاش اتصال به یک میزبان روت‌شده واکنشی نشان دهید -- برای مثال، اجرای etherwake جهت ارسال بسته WOL به میزبان. Start_Command = مشخص کردن دستوری که هنگام ناک صحیح پورت با IPv4 توسط کلاینت اجرا می‌شود. تمامی نمونه‌های %IP% با آدرس IP ارسال‌کننده ناک جایگزین خواهند شد. دستورالعمل Command نام مستعاری برای Start_Command است. Start_Command_6 = مشخص کردن دستوری که هنگام ناک صحیح پورت با IPv6 توسط کلاینت اجرا می‌شود. تمامی نمونه‌های %IP% با آدرس IP ارسال‌کننده ناک جایگزین خواهند شد. دستورالعمل Command_6 نام مستعاری برای Start_Command_6 است. در صورت عدم تعیین، به صورت خودکار به مقدار Start_Command مربوط به IPv4 بازمی‌گردد. می‌توانید از مقدار خالی برای عدم انجام هیچ عملیاتی استفاده کنید. Cmd_Timeout = مدت زمان انتظار (به ثانیه) میان اجرای Start_Command و Stop_Command. این دستورالعمل اختیاری است و تنها در صورت استفاده از Stop_Command لازم خواهد بود. Stop_Command = مشخص کردن دستوری که پس از گذشت Cmd_Timeout ثانیه از اجرای Start_Command اجرا خواهد شد. تمامی نمونه‌های %IP% با آدرس IP ارسال‌کننده ناک جایگزین می‌شوند. این دستورالعمل اختیاری است. Stop_Command_6 = مشخص کردن دستوری که پس از گذشت Cmd_Timeout ثانیه از اجرای Start_Command_6 اجرا خواهد شد. تمامی نمونه‌های %IP% با آدرس IP ارسال‌کننده ناک جایگزین می‌شوند. این دستورالعمل اختیاری است. در صورت عدم تعیین، به صورت خودکار به مقدار Stop_Command مربوط به IPv4 بازمی‌گردد. می‌توانید از مقدار خالی برای عدم انجام هیچ عملیاتی استفاده کنید. نکات امنیتی (SECURITY NOTES) استفاده از گزینه خط فرمان -l یا --lookup برای حل نام‌های دامنه (DNS) در ورودی‌های لاگ ممکن است یک ریسک امنیتی به شمار آید! اگر مهاجم بتواند ترافیک DNS میزبان اجراکننده knockd را شنود کند، ممکن است پورت نخست توالی را کشف نماید. همچنین میزبانی که قرار است مخفی و پنهان بماند (مثلاً به جای پاسخ با بسته ACK+RST، بسته‌های ارسالی به پورت‌های بسته TCP را بی‌صدا دور می‌ریزد)، اگر مهاجم به نخستین پورت (ناشناس) از یک توالی ضربه بزند، ممکن است با ارسال درخواست DNS برای حل نام، حضور خود را آشکار سازد. همچنین ببینید (SEE ALSO) برنامه knock کلاینت همراه پورت ناکینگ است، گرچه می‌توان به جای آن از telnet یا netcat برای ناک‌های ساده TCP استفاده کرد. برای ناک‌های پیشرفته‌تر، برنامه‌های hping، sendip یا packit را ببینید. نویسنده (AUTHOR) Judd Vinet knockd 0.8 April 22, 2021 knockd(1)