| knockd(1) | knockd(1) |
نام (NAME)
knockd - سرور پورت ناکینگ (شنود توالی پورتها)
خلاصه دستور (SYNOPSIS)
knockd [گزینهها]
توضیحات (DESCRIPTION)
برنامه knockd یک سرور پورت ناکینگ (port-knock) است. این دیمن تمام ترافیک روی یک رابط شبکه اترنت (یا PPP) را شنود میکند و به دنبال توالیهای خاصی از «کوبیدن» (knock) روی پورتها میگردد. کلاینت با ارسال بستههای TCP (یا UDP) به یک پورت روی سرور، این ضربهها را ایجاد میکند. نیازی نیست این پورت باز باشد -- از آنجا که knockd در سطح لایه پیوند (link-layer) شنود میکند، تمامی ترافیک را حتی اگر به مقصد یک پورت بسته باشد مشاهده مینماید. هنگامی که سرور یک توالی مشخص از ضربه به پورتها را شناسایی کند، دستوری را که در فایل پیکربندیاش تعریف شده اجرا میکند. از این سازوکار میتوان برای باز کردن موقت روزنههایی در دیوار آتش جهت دسترسی سریع استفاده کرد.
گزینهها (OPTIONS)
- -i, --interface <int>
- مشخص کردن رابط شبکه جهت شنود. مقدار پیشفرض eth0 است.
- -d, --daemon
- اجرا به صورت یک دیمن در پسزمینه. این حالت معمولاً برای کارکرد استاندارد سرور مطلوب است.
- -c, --config <file>
- مشخص کردن مسیر سفارشی برای فایل پیکربندی. مقدار پیشفرض /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] برای تعریف گزینههای سراسری به کار میرود.
مثال ۱:
[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
مثال ۲:
[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
مثال ۳:
[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
مثال ۴:
[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 = <interface_name>
- رابط شبکهای که باید شنود شود. فقط نام آن باید داده شود نه مسیر دستگاه (مثلاً "eth0" نه "/dev/eth0"). پیشفرض: eth0.
پیکربندی: دستورالعملهای ناک/رویداد (CONFIGURATION: KNOCK/EVENT DIRECTIVES)
- Sequence = <port1>[:<tcp|udp>],<port2>[:<tcp|udp>][,<port3>[:<tcp|udp>] ...]
- مشخص کردن توالی پورتها در ناک اختصاصی. اگر پورت اشتباهی با همان فلگها دریافت شود، تلاش ناک باطل میشود. به صورت اختیاری میتوانید پروتکل مورد استفاده را برای هر پورت جداگانه تعیین کنید (پیشفرض TCP است).
- One_Time_Sequences = /path/to/one_time_sequences_file
- فایل حاوی
توالیهای
یکبارمصرف.
به جای
استفاده از
یک توالی
ثابت، knockd
توالی مورد
استفاده را
از این فایل
میخواند.
پس از هر
تلاش
موفقیتآمیز
ناک، این
توالی با
درج نویسه '#'
در ابتدای
خط مربوطه
غیرفعال
میشود. سپس
توالی
معتبر بعدی
از فایل
جایگزین آن
خواهد شد.
از آنجا که اولین نویسه با '#' جایگزین میشود، پیشنهاد میشود یک فاصله (space) در ابتدای هر خط قرار دهید؛ در غیر این صورت پس از استفاده، نخستین رقم توالی با '#' بازنویسی خواهد شد.
هر خط در فایل توالیهای یکبارمصرف دقیقاً حاوی یک توالی با ساختاری مشابه دستورالعمل Sequence است. خطوطی که با نویسه '#' شروع شوند نادیده گرفته میشوند.
نکته: هنگام اجرای knockd این فایل را ویرایش نکنید!
- Seq_Timeout = <timeout>
- مدت زمان انتظار برای تکمیل توالی به ثانیه. اگر زمان پیش از تکمیل ناک به پایان برسد، تلاش جاری نادیده گرفته و لغو میشود.
- TCPFlags = fin|syn|rst|psh|ack|urg
- توجه
انحصاری به
بستههایی
که این فلگ
در آنها
تنظیم شده
است. هنگام
استفاده از
فلگهای TCP،
برنامه knockd
بستههای TCP
که با این
فلگها
مطابقت
ندارند را
نادیده
میگیرد.
این رفتار
با حالت
عادی
متفاوت است
که در آن
دریافت یک
بسته
نادرست کل
توالی را
باطل کرده و
کلاینت را
مجبور به
شروع
دوباره
میکرد.
استفاده از
"TCPFlags = syn" هنگام
آزمایش روی
اتصال SSH
بسیار مفید
است، زیرا
ترافیک SSH
معمولاً با
ناک تداخل
پیدا کرده و
آن را باطل
میکند.
چندین فلگ را با کاما جدا کنید (مثلاً TCPFlags = syn,ack,urg). فلگها را میتوان با علامت "!" به صورت صریح مستثنی کرد (مثلاً TCPFlags = syn,!ack).
- Target = <ip-address>
- استفاده از آدرس IP مشخصشده به جای آدرس تشخیصدادهشده برای Interface هنگام تطبیق Sequence. این قابلیت زمانی مفید است که knockd روی یک روتر اجرا میشود و میخواهید در پاسخ به تلاش اتصال به یک میزبان روتشده واکنشی نشان دهید -- برای مثال، اجرای etherwake جهت ارسال بسته WOL به میزبان.
- Start_Command = <command>
- مشخص کردن دستوری که هنگام ناک صحیح پورت با IPv4 توسط کلاینت اجرا میشود. تمامی نمونههای %IP% با آدرس IP ارسالکننده ناک جایگزین خواهند شد. دستورالعمل Command نام مستعاری برای Start_Command است.
- Start_Command_6 = <command>
- مشخص کردن دستوری که هنگام ناک صحیح پورت با IPv6 توسط کلاینت اجرا میشود. تمامی نمونههای %IP% با آدرس IP ارسالکننده ناک جایگزین خواهند شد. دستورالعمل Command_6 نام مستعاری برای Start_Command_6 است. در صورت عدم تعیین، به صورت خودکار به مقدار Start_Command مربوط به IPv4 بازمیگردد. میتوانید از مقدار خالی برای عدم انجام هیچ عملیاتی استفاده کنید.
- Cmd_Timeout = <timeout>
- مدت زمان انتظار (به ثانیه) میان اجرای Start_Command و Stop_Command. این دستورالعمل اختیاری است و تنها در صورت استفاده از Stop_Command لازم خواهد بود.
- Stop_Command = <command>
- مشخص کردن دستوری که پس از گذشت Cmd_Timeout ثانیه از اجرای Start_Command اجرا خواهد شد. تمامی نمونههای %IP% با آدرس IP ارسالکننده ناک جایگزین میشوند. این دستورالعمل اختیاری است.
- Stop_Command_6 = <command>
- مشخص کردن دستوری که پس از گذشت 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 <jvinet@zeroflux.org>
| April 22, 2021 | knockd 0.8 |