knockd(1) knockd(1)

knockd - سرور پورت ناکینگ (شنود توالی پورت‌ها)

knockd [گزینه‌ها]

برنامه knockd یک سرور پورت ناکینگ (port-knock) است. این دیمن تمام ترافیک روی یک رابط شبکه اترنت (یا PPP) را شنود می‌کند و به دنبال توالی‌های خاصی از «کوبیدن» (knock) روی پورت‌ها می‌گردد. کلاینت با ارسال بسته‌های TCP (یا UDP) به یک پورت روی سرور، این ضربه‌ها را ایجاد می‌کند. نیازی نیست این پورت باز باشد -- از آنجا که knockd در سطح لایه پیوند (link-layer) شنود می‌کند، تمامی ترافیک را حتی اگر به مقصد یک پورت بسته باشد مشاهده می‌نماید. هنگامی که سرور یک توالی مشخص از ضربه به پورت‌ها را شناسایی کند، دستوری را که در فایل پیکربندی‌اش تعریف شده اجرا می‌کند. از این سازوکار می‌توان برای باز کردن موقت روزنه‌هایی در دیوار آتش جهت دسترسی سریع استفاده کرد.

مشخص کردن رابط شبکه جهت شنود. مقدار پیش‌فرض eth0 است.
اجرا به صورت یک دیمن در پس‌زمینه. این حالت معمولاً برای کارکرد استاندارد سرور مطلوب است.
مشخص کردن مسیر سفارشی برای فایل پیکربندی. مقدار پیش‌فرض /etc/knockd.conf است.
چاپ پیام‌های اشکال‌زدایی (دیباگ).
جستجوی نام‌های دامنه (DNS) برای ورودی‌های گزارش لاگ. این گزینه ممکن است یک ریسک امنیتی باشد! بخش نکات امنیتی (SECURITY NOTES) را مشاهده کنید.
-4, --only-ip-v4
نادیده گرفتن بسته‌های IPv6 و پردازش اختصاصی IPv4.
نمایش پیام‌های وضعیت با جزئیات کامل.
نمایش نسخه برنامه.
نمایش راهنمای دستور و ساختار گزینه‌ها.

برنامه 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

ثبت گزارش رویدادها از طریق تابع ()syslog. با این کار ورودی‌های لاگ در /var/log/messages یا معادل آن درج می‌شوند.
ثبت مستقیم لاگ‌ها در یک فایل، معمولاً /var/log/knockd.log.
مسیر فایل PID مورد استفاده هنگام اجرا در حالت دیمن، پیش‌فرض: /var/run/knockd.pid.
رابط شبکه‌ای که باید شنود شود. فقط نام آن باید داده شود نه مسیر دستگاه (مثلاً "eth0" نه "/dev/eth0"). پیش‌فرض: eth0.

مشخص کردن توالی پورت‌ها در ناک اختصاصی. اگر پورت اشتباهی با همان فلگ‌ها دریافت شود، تلاش ناک باطل می‌شود. به صورت اختیاری می‌توانید پروتکل مورد استفاده را برای هر پورت جداگانه تعیین کنید (پیش‌فرض TCP است).
فایل حاوی توالی‌های یک‌بارمصرف. به جای استفاده از یک توالی ثابت، knockd توالی مورد استفاده را از این فایل می‌خواند. پس از هر تلاش موفقیت‌آمیز ناک، این توالی با درج نویسه '#' در ابتدای خط مربوطه غیرفعال می‌شود. سپس توالی معتبر بعدی از فایل جایگزین آن خواهد شد.

از آنجا که اولین نویسه با '#' جایگزین می‌شود، پیشنهاد می‌شود یک فاصله (space) در ابتدای هر خط قرار دهید؛ در غیر این صورت پس از استفاده، نخستین رقم توالی با '#' بازنویسی خواهد شد.

هر خط در فایل توالی‌های یک‌بارمصرف دقیقاً حاوی یک توالی با ساختاری مشابه دستورالعمل Sequence است. خطوطی که با نویسه '#' شروع شوند نادیده گرفته می‌شوند.

نکته: هنگام اجرای knockd این فایل را ویرایش نکنید!

مدت زمان انتظار برای تکمیل توالی به ثانیه. اگر زمان پیش از تکمیل ناک به پایان برسد، تلاش جاری نادیده گرفته و لغو می‌شود.
توجه انحصاری به بسته‌هایی که این فلگ در آن‌ها تنظیم شده است. هنگام استفاده از فلگ‌های TCP، برنامه knockd بسته‌های TCP که با این فلگ‌ها مطابقت ندارند را نادیده می‌گیرد. این رفتار با حالت عادی متفاوت است که در آن دریافت یک بسته نادرست کل توالی را باطل کرده و کلاینت را مجبور به شروع دوباره می‌کرد. استفاده از "TCPFlags = syn" هنگام آزمایش روی اتصال SSH بسیار مفید است، زیرا ترافیک SSH معمولاً با ناک تداخل پیدا کرده و آن را باطل می‌کند.

چندین فلگ را با کاما جدا کنید (مثلاً TCPFlags = syn,ack,urg). فلگ‌ها را می‌توان با علامت "!" به صورت صریح مستثنی کرد (مثلاً TCPFlags = syn,!ack).

استفاده از آدرس IP مشخص‌شده به جای آدرس تشخیص‌داده‌شده برای Interface هنگام تطبیق Sequence. این قابلیت زمانی مفید است که knockd روی یک روتر اجرا می‌شود و می‌خواهید در پاسخ به تلاش اتصال به یک میزبان روت‌شده واکنشی نشان دهید -- برای مثال، اجرای etherwake جهت ارسال بسته WOL به میزبان.
مشخص کردن دستوری که هنگام ناک صحیح پورت با IPv4 توسط کلاینت اجرا می‌شود. تمامی نمونه‌های %IP% با آدرس IP ارسال‌کننده ناک جایگزین خواهند شد. دستورالعمل Command نام مستعاری برای Start_Command است.
مشخص کردن دستوری که هنگام ناک صحیح پورت با IPv6 توسط کلاینت اجرا می‌شود. تمامی نمونه‌های %IP% با آدرس IP ارسال‌کننده ناک جایگزین خواهند شد. دستورالعمل Command_6 نام مستعاری برای Start_Command_6 است. در صورت عدم تعیین، به صورت خودکار به مقدار Start_Command مربوط به IPv4 بازمی‌گردد. می‌توانید از مقدار خالی برای عدم انجام هیچ عملیاتی استفاده کنید.
مدت زمان انتظار (به ثانیه) میان اجرای Start_Command و Stop_Command. این دستورالعمل اختیاری است و تنها در صورت استفاده از Stop_Command لازم خواهد بود.
مشخص کردن دستوری که پس از گذشت Cmd_Timeout ثانیه از اجرای Start_Command اجرا خواهد شد. تمامی نمونه‌های %IP% با آدرس IP ارسال‌کننده ناک جایگزین می‌شوند. این دستورالعمل اختیاری است.
مشخص کردن دستوری که پس از گذشت Cmd_Timeout ثانیه از اجرای Start_Command_6 اجرا خواهد شد. تمامی نمونه‌های %IP% با آدرس IP ارسال‌کننده ناک جایگزین می‌شوند. این دستورالعمل اختیاری است. در صورت عدم تعیین، به صورت خودکار به مقدار Stop_Command مربوط به IPv4 بازمی‌گردد. می‌توانید از مقدار خالی برای عدم انجام هیچ عملیاتی استفاده کنید.

استفاده از گزینه خط فرمان -l یا --lookup برای حل نام‌های دامنه (DNS) در ورودی‌های لاگ ممکن است یک ریسک امنیتی به شمار آید! اگر مهاجم بتواند ترافیک DNS میزبان اجراکننده knockd را شنود کند، ممکن است پورت نخست توالی را کشف نماید. همچنین میزبانی که قرار است مخفی و پنهان بماند (مثلاً به جای پاسخ با بسته ACK+RST، بسته‌های ارسالی به پورت‌های بسته TCP را بی‌صدا دور می‌ریزد)، اگر مهاجم به نخستین پورت (ناشناس) از یک توالی ضربه بزند، ممکن است با ارسال درخواست DNS برای حل نام، حضور خود را آشکار سازد.

برنامه knock کلاینت همراه پورت ناکینگ است، گرچه می‌توان به جای آن از telnet یا netcat برای ناک‌های ساده TCP استفاده کرد. برای ناک‌های پیشرفته‌تر، برنامه‌های hping، sendip یا packit را ببینید.

Judd Vinet <jvinet@zeroflux.org>
April 22, 2021 knockd 0.8