FWKNOP(8) Fwknop Client FWKNOP(8)

fwknop - عملگر کوبش دیوار آتش (Firewall Knock Operator)

fwknop -A <'proto/ports'> -R|-a|-s -D <'host'> [گزینه‌ها]

fwknop یک طرح احراز هویت با نام «احراز هویت تک‌بسته‌ای» (Single Packet Authorization یا SPA) را برای پنهان‌سازی قدرتمند سرویس‌ها پیاده‌سازی می‌کند. روش SPA تنها به یک بسته رمزگذاری‌شده، غیرقابل بازپخش (non-replayable) و احراز هویت‌شده از طریق HMAC نیاز دارد تا درخواست دسترسی به سرویسی را که پشت یک دیوار آتش با سیاست پیش‌فرض مسدودسازی (default-drop) پنهان شده است، منتقل کند. کاربرد اصلی SPA استفاده از دیوار آتش برای مسدود کردن تمام تلاش‌ها جهت اتصال به سرویس‌هایی نظیر SSH است تا بهره‌برداری از آسیب‌پذیری‌ها (چه آسیب‌پذیری‌های روز صفر و چه کدهای وصله‌نشده) دشوارتر شود. هر سرویسی که با SPA پنهان شده باشد، طبیعتاً توسط Nmap قابل پویش و شناسایی نیست. پروژه fwknop به‌طور پیش‌فرض از چهار دیوار آتش مختلف پشتیبانی می‌کند: iptables، firewalld، PF و ipfw در لینوکس، OpenBSD، FreeBSD و Mac OS X. همچنین امکان استفاده از اسکریپت‌های سفارشی وجود دارد تا بتوان fwknop را برای پشتیبانی از سایر زیرساخت‌ها مانند ipset یا nftables گسترش داد.

روش SPA اساساً نسل بعدی پورت ناکینگ (Port Knocking یا PK) است، اما بسیاری از محدودیت‌های موجود در PK را برطرف کرده و در عین حال مزایای کلیدی آن را حفظ می‌کند. محدودیت‌های PK عبارتند از: دشواری عمومی در محافظت برابر حملات بازپخش (replay attacks)، عدم امکان پشتیبانی مطمئن از الگوریتم‌های رمزنگاری نامتقارن و طرح‌های HMAC، و امکان بسیار ساده برای اجرای حمله محروم‌سازی از سرویس (DoS) علیه سرور PK تنها با تزریق یک بسته اضافی جعلی به توالی PK هنگام عبور از شبکه (که باعث می‌شود سرور PK تصور کند کلاینت توالی صحیح را نمی‌داند). تمام این محدودیت‌ها در SPA حل شده‌اند. در عین حال، SPA سرویس‌ها را پشت یک سیاست دیوار آتش default-drop پنهان می‌کند، داده‌های SPA را به‌صورت غیرفعال (passive) دریافت می‌نماید (معمولاً از طریق libpcap یا روش‌های دیگر)، و عملیات استاندارد رمزنگاری را برای احراز هویت بسته‌های SPA و رمزگذاری/رمزگشایی پیاده‌سازی می‌کند.

این صفحه راهنما مربوط به کلاینت fwknop است که وظیفه ساخت بسته‌های SPA و ارسال آن‌ها در شبکه را بر عهده دارد. سمت سرور توسط دیمن fwknopd پیاده‌سازی می‌شود که شبکه را برای بسته‌های SPA شنود (sniff) کرده و با دیوار آتش محلی تعامل می‌کند تا اتصالات احراز هویت‌شده با SPA را مجاز سازد. توصیه می‌شود صفحه راهنمای fwknopd(8) را نیز مطالعه کنید. اطلاعات تفصیلی بیشتر را می‌توانید در راهنمای جامع آنلاین «Single Packet Authorization: A Comprehensive Guide to Strong Service Concealment with fwknop» بیابید (ببینید: http://www.cipherdyne.org/fwknop/docs/fwknop-tutorial.html).

بسته‌های SPA ایجادشده توسط fwknop از HMAC برای رمزنگاری احراز هویت‌شده در مدل «اول رمزگذاری سپس احراز هویت» (encrypt-then-authenticate) بهره می‌برند. هرچند استفاده از HMAC در حال حاضر اختیاری است (از طریق سوئیچ خط فرمان --use-hmac فعال می‌شود)، اما به سه دلیل شدیداً توصیه می‌شود: ۱) بدون HMAC، احراز هویت قوی رمزنگاری‌شده در fwknop امکان‌پذیر نیست مگر اینکه از GnuPG استفاده شود، که حتی در آن حالت نیز همچنان باید از HMAC استفاده گردد؛ ۲) یک HMAC که پس از رمزگذاری اعمال می‌شود، در برابر حملات تحلیل رمزنگاری اوراکل لایه‌گذاری حالت CBC (مانند حمله Vaudenay و ترفندهای مرتبط نظیر حمله "Lucky 13" علیه SSL) محافظت می‌کند؛ و ۳) کد مورد نیاز دیمن fwknopd برای تأیید HMAC بسیار ساده‌تر از کد مورد نیاز برای رمزگشایی بسته SPA است، بنابراین بسته SPA بدون HMAC معتبر اصلاً وارد توابع رمزگشایی نمی‌شود. دلیل ۳) دقیقاً علت این است که چرا حتی هنگام استفاده از رمزگذاری GnuPG نیز باید از HMAC استفاده شود؛ زیرا داده‌های SPA تا زمانی که HMAC بررسی و تأیید نشود، به توابع libgpgme فرستاده نمی‌شوند. کدهای GnuPG و libgpgme نسبتاً پیچیده هستند و محدود کردن توانایی مهاجم احتمالی برای تعامل با این کدها از طریق عملیات HMAC به حفظ وضعیت امنیتی قوی‌تر کمک می‌کند. ایجاد HMAC برای ارتباطات SPA علاوه بر کلید رمزگذاری عادی به یک کلید اختصاصی نیاز دارد و هر دو کلید را می‌توان با گزینه --key-gen تولید کرد.

ابزار fwknop بسته‌های SPA را یا با رمز قالبی Rijndael یا از طریق GnuPG و رمزهای نامتقارن مربوطه رمزگذاری می‌کند. اگر روش رمزگذاری متقارن انتخاب شود، طبق معمول کلید رمزگذاری بین کلاینت و سرور به اشتراک گذاشته می‌شود (برای جزئیات به فایل /etc/fwknop/access.conf در fwknopd مراجعه کنید). کلید رمزگذاری واقعی که برای رمزگذاری Rijndael استفاده می‌شود، از طریق الگوریتم استاندارد مشتق‌سازی کلید PBKDF1 تولید شده و در حالت CBC تنظیم می‌گردد. اگر روش GnuPG انتخاب شود، کلیدهای رمزگذاری از دسته‌کلیدهای GnuPG مشتق می‌شوند. بسته‌های SPA تولیدشده توسط کلاینت fwknop از قالب زیر (پیش از رمزگذاری و اعمال HMAC) پیروی می‌کنند:

random data (16 digits) [داده‌های تصادفی ۱۶ رقمی]
username [نام کاربری]
timestamp [برچسب زمان]
software version [نسخه نرم‌افزار]
mode [حالت: حالت دستور (۰) یا حالت دسترسی (۱)]
if command mode => command to execute [در حالت دستور => دستور برای اجرا]
else access mode  => IP,proto,port [در غیر این صورت حالت دسترسی => IP,proto,port]
message digest (SHA512 / SHA384 / SHA256 / SHA1 / MD5 / SHA3_256 / SHA3_512) [خلاصه پیام]

هر یک از فیلدهای فوق به دلیل متغیر بودن طول چند فیلد، با نویسه ":" از یکدیگر جدا می‌شوند و فیلدهایی که ممکن است شامل نویسه ":" باشند به‌صورت base64 کدگذاری می‌گردند. خلاصه پیام (به‌طور پیش‌فرض SHA256) بخشی از داده‌های در حال رمزگذاری است و مستقل از HMAC است که پس از رمزگذاری به داده‌های بسته SPA ضمیمه می‌شود. داده‌های تصادفی ۱۶ رقمی (حدود ۵۳ بیت) تضمین می‌کند که هیچ دو بسته SPA یکسان نباشند، و این مستقل از استفاده از PBKDF1 برای مشتق‌سازی کلید Rijndael در حالت CBC (که از مقدار نمک تصادفی ۸ بایتی استفاده می‌کند) است. از آنجا که fwknopd خلاصه SHA256 تمام بسته‌های معتبر ورودی SPA را ردیابی کرده و موارد تکراری را دور می‌اندازد، حملات بازپخش علیه fwknop امکان‌پذیر نیستند. در صورت تشخیص بازپخش، هشدارهای Syslog تولید می‌شوند.

به‌طور پیش‌فرض، کلاینت fwknop بسته‌های مجازسازی را روی پورت UDP شماره 62201 ارسال می‌کند، اما این مقدار با آرگومان --server-port قابل تغییر است (این امر مستلزم آن است که fwknopd برای دریافت داده‌های SPA روی پورت انتخابی پیکربندی شده باشد). همچنین fwknop می‌تواند بسته SPA را از طریق آرگومان --rand-port روی یک پورت تصادفی ارسال کند. برای جزئیات بیشتر به fwknopd(8) مراجعه کنید. برای نمونه‌های فراخوانی کلاینت fwknop به بخش مثال‌ها (EXAMPLES) مراجعه نمایید.

کلاینت fwknop بسیار سازگار و قابل‌حمل (portable) است و روی توزیع‌های مختلف لینوکس (تمامی توزیع‌های اصلی و توزیع‌های تعبیه‌شده نظیر OpenWRT)، FreeBSD، OpenBSD، Mac OS X و Cygwin در ویندوز اجرا می‌شود. همچنین یک کتابخانه به نام libfko وجود دارد که هر دو ابزار fwknop و fwknopd برای عملیات رمزگذاری/رمزگشایی بسته SPA و احراز هویت HMAC از آن استفاده می‌کنند. این کتابخانه می‌تواند برای استفاده برنامه‌های شخص ثالث از SPA تحت مجوز عمومی گنو (GPL v2+) به کار گرفته شود.

این آرگومان‌های الزامی را می‌توان از طریق خط فرمان یا از داخل فایل ~/.fwknoprc مشخص کرد (گزینه -n, --named-config و بخش «فایل FWKNOPRC» در زیر را ببینید).

-A, --access=<port list>

ارائه فهرستی از پورت‌ها و پروتکل‌ها برای دسترسی به یک رایانه راه دور که fwknopd را اجرا می‌کند. قالب این فهرست به‌صورت “+<proto>/<port>...<proto>/<port>+” است، مانند “tcp/22,udp/53”. نکته: اکثریت قریب به اتفاق موارد استفاده از fwknop نیازمند آرگومان -A هستند، اما ارسال دستورهای کامل با آرگومان --server-cmd از طریق بسته SPA برای اجرا توسط fwknopd به این آرگومان نیاز ندارد.

-D, --destination=<hostname/IP-address>

هدایت کلاینت fwknop برای احراز هویت با سرویس/دیمن fwknopd در نام میزبان یا نشانی IP مقصد مشخص‌شده. حالت اتصال توسط سرویس/دیمن fwknopd هنگام رمزگشایی و تجزیه بسته احراز هویت شناسایی می‌شود.

-R|-a|-s

یکی از این گزینه‌ها (توضیحات در ادامه) الزامی است تا به دیمن راه دور fwknopd اطلاع دهد چه نشانی IP باید از طریق دیوار آتش مجاز شود. توصیه می‌شود از گزینه‌های -R یا -a به جای -s استفاده کنید تا ارتباطات SPA در برابر حملات احتمالی مرد میانی (MITM) ایمن‌سازی شوند، و در سمت سرور متغیر REQUIRE_SOURCE_ADDRESS در فایل /etc/fwknop/access.conf تنظیم گردد. توجه داشته باشید که امن‌ترین گزینه -a است تا fwknop مجبور به ارسال درخواست HTTPS به https://www.cipherdyne.org/cgi-bin/myip برای تفکیک نشانی IP دارای قابلیت مسیریابی خارجی نباشد. استفاده از -a مستلزم آن است که کاربر از قبل نشانی IP خارجی شبکه‌ای را که fwknop روی آن اجرا می‌شود بداند.

-h, --help

چاپ پیام راهنمای خلاصه استفاده و خروج.

-G, --get-key=<file>

بارگیری کلید/گذرواژه رمزگذاری از فایل مشخص‌شده. فایل کلید برای هر نام میزبان یا نشانی IP مقصد شامل یک خط است که شامل دونقطه (":")، فاصله اختیاری و گذرواژه بوده و به یک خط جدید ختم می‌شود. توجه داشته باشید که خط آخر باید دارای نویسه خط جدید پایانی باشد. همچنین توجه داشته باشید: اگرچه این یک تسهیلات است، اما داشتن فایلی با گذرواژه‌های متن آشکار روی سیستم ایده خوبی نبوده و توصیه نمی‌شود. اینکه کلاینت fwknop کلید را از شما درخواست (prompt) کند، عموماً امن‌تر است. همچنین توجه داشته باشید که اگر کلیدی روی دیسک ذخیره شود، فایل rc ابزار fwknop سازوکار بسیار قدرتمندتری برای تعیین نه تنها کلید بلکه سایر گزینه‌ها نیز به شمار می‌رود.

--stdin

خواندن کلید/گذرواژه رمزگذاری از ورودی استاندارد (stdin). این گزینه می‌تواند مثلاً برای ارسال داده‌ها از طریق لوله (pipe) استفاده شود. این دستور شبیه به --fd 0 است.

--fd=<number>

تعیین شماره توصیف‌گر فایل برای خواندن کلید/گذرواژه از آن. این دستور مانع از درخواست گذرواژه از کاربر می‌شود، در صورتی که گذرواژه‌ای در بخش (stanza) اختصاصی کاربر یافت نشده باشد یا در خط فرمان ارائه نشده باشد. تنظیم توصیف‌گر فایل روی ۰ شبیه به دستور stdin است.

--get-hmac-key=<file>

بارگیری کلید/گذرواژه HMAC از فایل مشخص‌شده. مشابه قالب گزینه --get-key، فایل کلید HMAC شامل یک خط برای هر نام میزبان یا نشانی IP مقصد، یک دونقطه (":")، فاصله اختیاری و گذرواژه است که به یک خط جدید ختم می‌شود. توجه داشته باشید که خط آخر باید دارای نویسه خط جدید پایانی باشد. همچنین توجه کنید: داشتن فایلی با گذرواژه‌های متن آشکار روی سیستم توصیه نمی‌شود. درخواست کلید HMAC توسط کلاینت fwknop عموماً امن‌تر است. همچنین اگر کلیدی روی دیسک ذخیره می‌شود، فایل rc ابزار fwknop سازوکار قدرتمندتری است.

--key-gen

وادار کردن fwknop به تولید هر دو کلید Rijndael و HMAC که می‌توانند برای رمزگذاری و احراز هویت بسته SPA استفاده شوند. این کلیدها از /dev/urandom مشتق شده و پیش از چاپ در خروجی استاندارد به‌صورت base64 کدگذاری می‌شوند و برای درج در فایل “$HOME/.fwknoprc” (یا فایل ارجاع داده‌شده با --get-key) در نظر گرفته شده‌اند. چنین کلیدهایی عموماً بسیار امن‌تر از عبارات عبوری هستند که از طریق خط فرمان تایپ می‌شوند.

--key-gen-file=<file>

نوشتن کلیدهای تولیدشده در فایل مشخص‌شده. توجه داشته باشید که اگر فایل از قبل وجود داشته باشد، بازنویسی می‌شود. اگر این گزینه داده نشود، --key-gen کلیدها را در خروجی استاندارد می‌نویسد.

--key-len=<length>

تعیین تعداد بایت‌ها برای کلید تولیدشده Rijndael. حداکثر اندازه در حال حاضر ۱۲۸ بایت است.

--hmac-key-len=<length>

تعیین تعداد بایت‌ها برای کلید تولیدشده HMAC. حداکثر اندازه در حال حاضر ۱۲۸ بایت است.

-l, --last-cmd

اجرای fwknop با آرگومان‌های خط فرمان فراخوانی قبلی (در صورت وجود). آرگومان‌های قبلی از فایل ~/.fwknop.run استخراج می‌شوند.

-n, --named-config=<stanza name>

تعیین نام بخش پیکربندی در فایل “$HOME/.fwknoprc” برای دریافت دستورالعمل‌های پیکربندی و اجرا. این بخش‌های نام‌گذاری‌شده نیاز به به‌خاطرسپاری آرگومان‌های مختلف خط فرمان را برای فراخوانی‌های پرکاربرد fwknop برطرف می‌کنند. برای فهرستی از دستورالعمل‌های معتبر پیکربندی در فایل .fwknoprc، بخش با عنوان «فایل FWKNOPRC» را در ادامه ببینید.

--key-rijndael=<key>

تعیین کلید Rijndael در خط فرمان. از آنجا که ممکن است کلید برای ابزارهایی مانند ps در یونیکس قابل مشاهده باشد، این حالت فقط باید در مواردی استفاده شود که امنیت حیاتی نیست. درخواست کلید توسط کلاینت fwknop یا دریافت آن از طریق فایل “$HOME/.fwknoprc” عموماً امن‌تر است.

--key-base64-rijndael=<key>

تعیین کلید کدگذاری‌شده با base64 برای Rijndael. از آنجا که ممکن است کلید برای ابزارهایی مانند ps در یونیکس قابل مشاهده باشد، این فرم فقط باید در مواردی که امنیت بحرانی نیست استفاده شود. دریافت کلید از فایل “$HOME/.fwknoprc” یا درخواست کلاینت امن‌تر است.

--key-base64-hmac=<key>

تعیین کلید کدگذاری‌شده با base64 برای HMAC. از آنجا که ممکن است کلید برای ابزارهایی نظیر ps قابل مشاهده باشد، این فرم فقط باید در موارد غیرحساس استفاده شود.

--key-hmac=<key>

تعیین کلید خام HMAC (کدگذاری‌نشده با base64). از آنجا که کلید ممکن است برای ابزارهایی نظیر ps قابل مشاهده باشد، این فرم تنها در شرایط غیرحساس کاربرد دارد.

--rc-file=<file>

تعیین مسیر فایل rc ابزار fwknop (پیش‌فرض “$HOME/.fwknoprc” است).

--no-rc-file

انجام عملیات کلاینت fwknop بدون ارجاع به فایل “$HOME/.fwknoprc”.

--no-home-dir

جلوگیری از جستجوی کلاینت fwknop برای پوشه خانگی کاربر.

--save-rc-stanza=<stanza name>

ذخیره آرگومان‌های خط فرمان در بخش مشخص‌شده فایل “$HOME/.fwknoprc” با گزینه -n. اگر گزینه -n حذف شود، نام بخش به‌طور پیش‌فرض برابر با مقدار سرور مقصد (نام میزبان یا IP) داده‌شده در آرگومان -D خواهد بود.

--force-stanza

همراه با --save-rc-stanza برای بازنویسی تمام متغیرهای بخش مشخص‌شده استفاده می‌شود.

--stanza-list

تخلیه فهرستی از بخش‌های موجود در “$HOME/.fwknoprc”.

--show-last

نمایش آخرین آرگومان‌های خط فرمان استفاده‌شده توسط fwknop.

-E, --save-args-file=<file>

ذخیره آرگومان‌های خط فرمان در مسیر فایل مشخص‌شده. بدون این گزینه، و زمانی که --no-save-args نیز مشخص نشده باشد، مسیر پیش‌فرض ذخیره آرگومان‌ها ~/.fwknop.run است.

--no-save-args

آرگومان‌های خط فرمان ارائه‌شده هنگام اجرای fwknop را ذخیره نکند.

-T, --test

حالت آزمایشی. تولید داده‌های بسته SPA، اما بدون ارسال آن. در عوض، تفکیک فیلدهای داده SPA را چاپ کرده، سپس داده‌ها را از فرایند رمزگشایی و کدگشایی عبور داده و دوباره تفکیک آن‌ها را چاپ می‌کند. این در درجه اول یک ویژگی اشکال‌زدایی است.

-B, --save-packet=<file>

دستور به کلاینت fwknop برای نوشتن بسته جدیداً ایجادشده SPA در فایل مشخص‌شده تا بتوان آن را به‌صورت آفلاین بررسی کرد.

-b, --save-packet-append

پیوست کردن داده‌های بسته تولیدشده به فایل مشخص‌شده با گزینه -B.

--fault-injection-tag=<tag>

این گزینه تنها برای آزمون تزریق خطا در زمانی استفاده می‌شود که fwknop برای پشتیبانی از کتابخانه libfiu کامپایل شده باشد (ببینید: http://blitiri.com.ar/p/libfiu/). در شرایط عادی این گزینه استفاده نمی‌شود و هیچ نسخه بسته‌بندی‌شده‌ای از fwknop این کد را به‌صورت کامپایل‌شده ندارد، بنابراین این قابلیت در زمان اجرا فعال نیست. برای کامل بودن مستندات در اینجا ذکر شده است.

-v, --verbose

اجرای کلاینت fwknop در حالت پرگویی (verbose). این امر باعث می‌شود fwknop اطلاعات اضافی درباره دستور فعلی و داده‌های حاصل از SPA چاپ کند.

-V, --version

نمایش اطلاعات نسخه و خروج.

--use-hmac

تنظیم حالت HMAC برای رمزنگاری احراز هویت‌شده در ارتباطات SPA. از نسخه fwknop 2.5، این یک ویژگی اختیاری است، اما در نسخه‌های بعدی به حالت پیش‌فرض تبدیل خواهد شد.

-a, --allow-ip=<IP-address>

تعیین نشانی IP که باید از طریق دیوار آتش سرور مقصد fwknopd مجاز شود (این IP درون خود بسته SPA رمزگذاری می‌شود). این گزینه برای جلوگیری از حمله مرد میانی (MITM) مفید است که در آن بسته SPA می‌تواند در مسیر رهگیری شده و از یک IP متفاوت با نسخه اصلی ارسال شود. بنابراین اگر سرور fwknopd به نشانی مبدأ در هدر IP بسته SPA اعتماد کند، مهاجم دسترسی پیدا خواهد کرد. گزینه -a نشانی مبدأ را درون بسته رمزگذاری‌شده SPA قرار می‌دهد و بنابراین این حمله را خنثی می‌سازد. گزینه -a همچنین برای تعیین IP که هنگام جعل بسته SPA با گزینه --spoof-src دسترسی به آن داده می‌شود، کاربرد دارد. گزینه مرتبط دیگر -R است (در ادامه را ببینید) که به کلاینت fwknop دستور می‌دهد نشانی IP دارای قابلیت مسیریابی خارجی متصل به سیستم محلی را با پرس‌وجو از https://www.cipherdyne.org/cgi-bin/myip به‌طور خودکار تفکیک کند. این کار نشانی IP واقعی دیده‌شده از سیستم فراخواننده را برمی‌گرداند.

-g, --gpg-encryption

استفاده از رمزگذاری GPG روی بسته SPA (پیش‌فرض در صورت عدم تعیین، Rijndael است). نکته: استفاده از این گزینه همچنین نیازمند گیرنده GPG است (گزینه --gpg-recipient را به همراه سایر گزینه‌های مرتبط با GPG در زیر ببینید).

--hmac-digest-type=<digest>

تنظیم الگوریتم خلاصه HMAC برای رمزنگاری احراز هویت‌شده بسته‌های SPA. انتخاب‌ها عبارتند از: MD5، SHA1، SHA256 (پیش‌فرض)، SHA384، SHA512، SHA3_256 و SHA3_512.

-N, --nat-access=<internalIP:forwardPort>

سرور fwknopd امکان ارائه دسترسی SPA از طریق دیوار آتش iptables به یک سرویس داخلی را از طریق تعامل با قابلیت‌های NAT در iptables فراهم می‌کند. بنابراین اگر سرور fwknopd از یک شبکه داخلی روی فضای آدرس RFC-1918 محافظت می‌کند، یک کلاینت خارجی fwknop می‌تواند درخواست کند که سرور یک پورت خارجی را به یک IP داخلی فوروارد کند، به عنوان مثال “+--NAT-access 192.168.10.2,55000+”. در این حالت، دسترسی به 192.168.10.2 از طریق پورت 55000 به هر سرویسی که از طریق آرگومان --access درخواست شده است (معمولاً tcp/22) اعطا می‌شود. بنابراین پس از ارسال چنین بسته SPA، کاربر دستور “ssh -p 55000 user@host” را اجرا می‌کند و اتصال به‌طور خودکار به سیستم داخلی 192.168.10.2 هدایت می‌شود. توجه داشته باشید که پورت “55000” می‌تواند به‌صورت تصادفی از طریق آرگومان --nat-rand-port (که بعداً توضیح داده شده) تولید شود.

--nat-local

روی سرور fwknopd، عملیات NAT می‌تواند به‌جای فوروارد شدن به سیستم‌های دیگر، روی سیستم محلی اعمال شود. یعنی برای دیوارهای آتش iptables، اتصال به مثلاً پورت 55000 می‌تواند به پورت 22 روی سیستم محلی ترجمه شود. با استفاده از آرگومان --nat-local، می‌توان کلاینت fwknop را وادار به درخواست چنین دسترسی کرد. این بدان معناست که هر مهاجم خارجی پس از ارسال بسته SPA، تنها اتصالی روی پورت 55000 را مشاهده می‌کند به جای پورت مورد انتظار 22.

--nat-port

معمولاً fwknop برای درخواست دسترسی به یک پورت خاص مانند tcp/22 روی سیستمی که fwknopd را اجرا می‌کند استفاده می‌شود. با این حال با استفاده از آرگومان --nat-port، امکان درخواست دسترسی به یک سرویس (مجدداً مانند tcp/22) وجود دارد، اما این دسترسی از طریق پورت مشخص‌شده اعطا می‌شود (بنابراین آرگومان -p سپس در خط فرمان کلاینت SSH استفاده خواهد شد). آرگومان‌های خط فرمان --nat-local و --nat-access در fwknop را برای جزئیات بیشتر در مورد دسترسی به سرویس‌ها از طریق عملیات NAT ببینید.

--nat-rand-port

معمولاً fwknop برای درخواست دسترسی به یک پورت خاص مانند tcp/22 روی سیستمی که fwknopd را اجرا می‌کند استفاده می‌شود. با این حال با استفاده از آرگومان --nat-rand-port، می‌توان دسترسی به یک سرویس خاص (مجدداً مانند tcp/22) را درخواست کرد اما این دسترسی از طریق یک پورت تصادفی ترجمه‌شده اعطا شود. یعنی هنگامی که کلاینت fwknop در این حالت اجرا شد و پورت تصادفی انتخاب‌شده توسط fwknop نمایش داده شد، پورت مقصد استفاده‌شده توسط کلاینت بعدی باید طوری تغییر کند که با این پورت تصادفی مطابقت داشته باشد. برای SSH، این کار از طریق آرگومان -p انجام می‌شود. آرگومان‌های خط فرمان --nat-local و --nat-access را برای جزئیات بیشتر ببینید.

-p, --server-port=<port>

تعیین شماره پورتی که fwknopd بسته‌ها را از طریق libpcap یا ulogd pcap writer روی آن می‌پذیرد. به‌طور پیش‌فرض fwknopd بسته‌های مجازسازی را روی پورت UDP شماره 62201 جستجو می‌کند.

-P, --server-proto=<protocol>

تنظیم پروتکل (udp، tcp، http، udpraw، tcpraw یا icmp) برای بسته خروجی SPA. نکته: حالت‌های udpraw، tcpraw و icmp از سوکت‌های خام (raw sockets) استفاده می‌کنند و بنابراین برای اجرا نیازمند دسترسی ریشه (root) هستند. همچنین توجه کنید: حالت tcp انتظار دارد قبل از ارسال بسته SPA یک اتصال TCP با سرور برقرار کند. این کار معمولاً انجام نمی‌شود، اما برای سازگاری با Tor جهت ناشناسی قوی مفید است؛ ببینید: http://tor.eff.org/. در این حالت، سرور fwknopd باید پیکربندی شود تا روی پورت TCP هدف (که به‌طور پیش‌فرض 62201 است) گوش فرا دهد.

-Q, --spoof-src=<IP>

جعل نشانی مبدأ که کلاینت fwknop بسته‌های SPA را از آن ارسال می‌کند. این کار در سمت کلاینت نیازمند دسترسی root است زیرا به یک سوکت خام نیاز دارد. توجه داشته باشید که آرگومان --spoof-user را می‌توان در این حالت مشخص کرد تا هرگونه کلیدواژه REQUIRE_USERNAME را که ممکن است در /etc/fwknop/access.conf تعیین شده باشد برآورده سازد.

-r, --rand-port

دستور به کلاینت fwknop برای ارسال یک بسته SPA روی یک پورت مقصد تصادفی بین 10000 تا 65535. سرور fwknopd باید از متغیر PCAP_FILTER استفاده کند که برای پذیرش چنین بسته‌هایی پیکربندی شده باشد. برای مثال، متغیر PCAP_FILTER می‌تواند روی این مقدار تنظیم شود: “+udp dst portrange 10000-65535+”.

-R, --resolve-ip-https

این یک گزینه مهم است و به کلاینت fwknop دستور می‌دهد یک درخواست HTTPS به اسکریپتی که روی cipherdyne.org اجرا می‌شود ارسال کند که نشانی IP کلاینت را (همان‌طور که وب‌سرور می‌بیند) برمی‌گرداند. در برخی موارد، این کار برای تعیین نشانی IP که باید از طریق سیاست دیوار آتش در سمت سرور راه دور fwknopd مجاز شود لازم است. این گزینه زمانی مفید است که کلاینت fwknop روی سیستمی پشت یک نشانی نامشخص NAT استفاده می‌شود و IP خارجی رو به اینترنت برای کاربر شناخته‌شده نیست. نشانی کامل تفکیک برابر است با: https://www.cipherdyne.org/cgi-bin/myip، و توسط fwknop از طریق wget در حالت --secure-protocol دسترسی پیدا می‌کند. توجه داشته باشید که اگر نشانی IP با قابلیت مسیریابی خارجی کلاینت از قبل برای کاربر مشخص باشد، استفاده از گزینه -a عموماً امن‌تر است زیرا نیاز fwknop به ارسال هرگونه درخواست HTTPS را از بین می‌برد.

--resolve-url <url>

جایگزینی URL پیش‌فرض مورد استفاده برای تفکیک نشانی IP مبدأ. برای بهترین نتایج، URL مشخص‌شده در اینجا باید به یک سرویس وب اشاره کند که فقط یک نشانی IP را در بدنه پاسخ HTTP ارائه می‌دهد.

--resolve-http-only

این گزینه کلاینت fwknop را وادار می‌کند نشانی IP خارجی را از طریق HTTP به جای HTTPS تفکیک کند. شرایطی وجود دارد که ممکن است این کار ضروری باشد، مانند زمانی که wget در دسترس نیست (یا با پشتیبانی SSL کامپایل نشده است)، اما به‌طور کلی این کار توصیه نمی‌شود زیرا امکان حمله MITM را از طریق دستکاری پاسخ HTTP تفکیک IP فراهم می‌سازد. یا IP را به‌صورت دستی با -a مشخص کنید، یا از -R استفاده کرده و این گزینه را نادیده بگیرید.

-w, --wget-cmd=<wget full path>

تنظیم دستی مسیر کامل دستور wget. به‌طور معمول اسکریپت configure دستور wget را پیدا می‌کند، اما این گزینه می‌تواند برای تعیین مسیر در صورتی که در مکانی غیر استاندارد قرار داشته باشد استفاده شود.

-s, --source-ip

دستور به کلاینت fwknop برای تشکیل یک بسته SPA که شامل نشانی IP حالت خاص “+0.0.0.0+” است که به سرور SPA مقصد fwknopd اطلاع می‌دهد از نشانی IP مبدأ که بسته SPA از آن سرچشمه می‌گیرد به عنوان IP مجاز پس از تغییر مجموعه قوانین دیوار آتش استفاده کند. این گزینه در صورتی مفید است که کلاینت fwknop روی ماشینی پشت یک دستگاه NAT مستقر باشد و IP خارجی مشخص نباشد. با این حال، استفاده از این گزینه توصیه نمی‌شود و در عوض باید از گزینه‌های -a یا -R استفاده کرد. گزینه‌های نشانی مجاز -s، -R و -a مانعةالجمع (mutually exclusive) هستند.

-S, --source-port=<port>

تنظیم پورت مبدأ برای بسته خروجی SPA.

--server-resolve-ipv4

این گزینه کلاینت fwknop را وادار می‌کند هنگامی که از نام میزبان برای سرور SPA استفاده می‌شود، تنها یک نشانی IPv4 را از DNS بپذیرد. این امر در برخی موارد که DNS ممکن است هر دو نشانی IPv6 و IPv4 را برگرداند ضروری است.

-f, --fw-timeout=<seconds>

تعیین مدت زمانی (به ثانیه) که قانون دیوار آتش راه دور که دسترسی به یک سرویس را اعطا می‌کند باید فعال بماند. مقدار پیش‌فرض نگهداری‌شده توسط fwknopd برابر ۳۰ ثانیه است، اما هر اتصال برقرارشده می‌تواند پس از حذف قانون اولیه پذیرش، از طریق سازوکار ردیابی اتصال (connection tracking) که ممکن است توسط دیوار آتش ارائه شود، باز بماند.

-C, --server-cmd=<command to execute>

به جای درخواست دسترسی به یک سرویس با بسته SPA، آرگومان --server-cmd دستوری را مشخص می‌کند که توسط سرور fwknopd اجرا خواهد شد. این دستور درون بسته SPA رمزگذاری شده و طبق معمول توسط سرور fwknopd از روی شبکه شنود می‌شود.

-H, --http-proxy=<proxy-host>[:port]

تعیین یک پراکسی HTTP که کلاینت fwknop بسته SPA را از طریق آن ارسال خواهد کرد. استفاده از این گزینه به‌طور خودکار حالت انتقال بسته SPA (که معمولاً از طریق آرگومان --server-proto تنظیم می‌شود) را روی "http" قرار می‌دهد. همچنین می‌توانید با افزودن ":<port>" به نام یا IP میزبان پراکسی، پورت پراکسی را تعیین کنید.

-m, --digest-type=<digest>

تعیین الگوریتم خلاصه پیام برای استفاده در داده‌های SPA. انتخاب‌ها عبارتند از: MD5، SHA1، SHA256 (پیش‌فرض)، SHA384، SHA512، SHA3_256 و SHA3_512.

-M, --encryption-mode=<mode>

تعیین حالت رمزگذاری هنگامی که AES برای رمزگذاری بسته‌های SPA استفاده می‌شود. پیش‌فرض حالت CBC است، اما حالت‌های دیگری نظیر CFB یا OFB نیز قابل انتخاب هستند به شرطی که در سمت سرور نیز در فایل /etc/fwknop/access.conf از طریق متغیر ENCRYPTION_MODE تعیین شده باشند. به‌طور کلی، توصیه می‌شود این آرگومان را درج نکرده و بگذارید حالت پیش‌فرض (CBC) اعمال شود. توجه داشته باشید که می‌توان رشته “legacy” را تعیین کرد تا بسته‌های SPA با راهبرد بردار مقداردهی اولیه قدیمی که در نسخه‌های fwknop پیش از 2.5 استفاده می‌شد تولید شوند. با انتشار نسخه 2.5، fwknop بردارهای مقداردهی اولیه را به شیوه‌ای سازگار با OpenSSL از طریق الگوریتم PBKDF1 تولید می‌کند.

--time-offset-plus=<time>

به‌طور پیش‌فرض، دیمن fwknopd در سمت سرور همگام‌سازی زمان بین ساعت‌های سیستم‌های کلاینت و سرور را الزامی می‌کند. کلاینت fwknop زمان محلی را درون هر بسته SPA به عنوان برچسب زمان قرار می‌دهد تا پس از رمزگشایی توسط سرور fwknopd اعتبارسنجی شود. با این حال در برخی شرایط، اگر ساعت‌ها ناهمگام باشند و کاربر سیستم کلاینت دسترسی لازم برای تغییر تنظیمات ساعت محلی را نداشته باشد، ساخت بسته SPA با برچسب زمانی که سرور بپذیرد ممکن است دشوار باشد. در این وضعیت، گزینه --time-offset-plus به کاربر اجازه می‌دهد یک انحراف زمانی (مانند “60sec”، “60min”، “2days” و غیره) را مشخص کند که به زمان محلی اضافه می‌شود.

--time-offset-minus=<time>

این گزینه شبیه به گزینه --time-offset-plus (در بالا) است، اما انحراف زمانی مشخص‌شده را به جای افزودن، از برچسب زمان محلی کم می‌کند.

-u, --user-agent=<user-agent-string>

تنظیم User-Agent در HTTP برای تفکیک IP خارجی از طریق -R، یا برای ارسال بسته‌های SPA روی HTTP.

--use-wget-user-agent

به‌طور پیش‌فرض هنگامی که کلاینت fwknop نشانی IP خارجی را با wget از طریق SSL تفکیک می‌کند، User-Agent را روی “Fwknop/<version>” تنظیم می‌کند مگر اینکه از قبل به‌صورت دستی با گزینه --user-agent تعیین شده باشد. با این حال، گزینه --user-wget-user-agent اجازه می‌دهد رشته پیش‌فرض User-Agent برنامه wget بدون دخالت fwknop اعمال شود.

-U, --spoof-user=<user>

تعیین نام کاربری که درون بسته SPA گنجانده می‌شود. این به کلاینت fwknop امکان می‌دهد هر کلیدواژه غیر ریشه REQUIRE_USERNAME را روی سرور fwknopd برآورده سازد (حالت --spoof-src مستلزم آن است که کلاینت fwknop به عنوان root اجرا شود).

--icmp-type=<type>

در حالت -P icmp، مقدار نوع ICMP را که در هدر ICMP بسته SPA تنظیم می‌شود تعیین می‌کند. پیش‌فرض echo reply است.

--icmp-code=<code>

در حالت -P icmp، مقدار کد ICMP را که در هدر ICMP بسته SPA تنظیم می‌شود تعیین می‌کند. پیش‌فرض صفر است.

توجه داشته باشید که استفاده از GPG برای رمزگذاری/رمزگشایی SPA می‌تواند و باید شامل کلیدهای GPG باشد که توسط هر دو طرف (کلاینت و سرور) امضا شده‌اند. رویه اصلی برای این کار شامل مراحل زیر پس از انتقال کلید کلاینت به سرور و بالعکس است:

[spaserver]# gpg --import client.asc
[spaserver]# gpg --edit-key 1234ABCD
Command> sign
[spaclient]$ gpg --import server.asc
[spaclient]$ gpg --edit-key ABCD1234
Command> sign

اطلاعات جامع‌تر در این باره را می‌توانید در اینجا بیابید: http://www.cipherdyne.org/fwknop/docs/gpghowto.html.

--gpg-agent

دستور به fwknop برای دریافت گذرواژه کلید GnuPG از یک نمونه در حال اجرای gpg-agent (در صورت وجود).

--gpg-home-dir=<dir>

تعیین مسیر دایرکتوری GnuPG؛ معمولاً این مسیر از دایرکتوری خانگی کاربری که کلاینت fwknop را اجرا می‌کند مشتق می‌شود (بنابراین پیش‌فرض ~/.gnupg است). این گزینه زمانی مفید است که یک کاربر “root” بخواهد به یک ماشین راه دور متصل شود که سرویس/دیمن sshd آن اجازه ورود به کاربر root را نمی‌دهد.

--gpg-recipient=<key ID or Name>

تعیین شناسه کلید GnuPG، به عنوان مثال “+1234ABCD+” (خروجی "gpg —list-keys" را ببینید) یا نام کلید (نشانی ایمیل مرتبط) گیرنده پیام احراز هویت تک‌بسته‌ای. این کلید توسط سرور fwknopd وارد شده و کلید خصوصی مرتبط با آن برای رمزگشایی بسته SPA استفاده می‌شود. کلید گیرنده ابتدا باید به دسته‌کلید GnuPG کلاینت وارد شده باشد.

--gpg-signer-key=<key ID or Name>

تعیین شناسه کلید GnuPG، به عنوان مثال “+ABCD1234+” (خروجی "gpg --list-keys" را ببینید) یا نام کلید برای استفاده در امضای پیام SPA. از کاربر گذرواژه GnuPG مربوطه برای ایجاد امضا خواسته می‌شود. این کار یک سازوکار رمزنگاری قوی اضافه می‌کند تا دیمن fwknopd روی سرور راه دور بتواند هویت ایجادکننده پیام SPA را احراز کند.

--gpg-no-signing-pw

دستور به fwknop برای عدم دریافت عبارت عبور جهت استفاده از کلید امضای GnuPG. این گزینه برای آسان‌تر ساختن ایجاد بسته SPA در عملیات سمت کلاینت در محیط‌های خودکار که در آن‌ها عبارت عبور کلید امضا از دسته‌کلید GnuPG حذف شده است، ارائه گردیده است. با این حال، معمولاً بهتر است به جای این گزینه از gpg-agent استفاده شود.

فایل .fwknoprc برای تنظیم پارامترهای مختلف جهت لغو پارامترهای پیش‌فرض برنامه در زمان اجرا استفاده می‌شود. این فایل همچنین امکان تعریف بخش‌های پیکربندی نام‌گذاری‌شده (stanzas) اضافی را برای تنظیم پارامترهای برنامه در یک فراخوانی خاص فراهم می‌آورد.

کلاینت fwknop در صورتی که این فایل در دایرکتوری خانگی کاربر وجود نداشته باشد، آن را ایجاد خواهد کرد. این نسخه اولیه دارای برخی دستورالعمل‌های نمونه است که کامنت شده‌اند. ویرایش این فایل برای رفع نیازهای کاربر بر عهده خود اوست.

فایل .fwknoprc شامل یک ناحیه یا بخش پیکربندی پیش‌فرض است که دستورالعمل‌های سراسری پیکربندی را نگهداری می‌کند و پیش‌فرض‌های برنامه را لغو می‌نماید. شما می‌توانید این فایل را ویرایش کرده و بخش‌های نام‌گذاری‌شده اضافی ایجاد کنید که با گزینه -n یا --named-config قابل تعیین هستند. پارامترهای تعریف‌شده در بخش‌های نام‌گذاری‌شده، هرگونه دستورالعمل منطبق در بخش default را لغو خواهند کرد. توجه داشته باشید که گزینه‌های خط فرمان همچنان بر هرگونه دستورالعمل متناظر در .fwknoprc اولویت خواهند داشت.

دستورالعمل‌هایی برای انطباق با اکثر پارامترهای خط فرمان که fwknop پشتیبانی می‌کند وجود دارد. در اینجا فهرست فعلی هر دستورالعمل به همراه توضیح مختصر و گزینه‌های خط فرمان متناظر آن آمده است:

SPA_SERVER <hostname/IP-address>

تعیین نام میزبان یا IP سرور مقصد (fwknopd) (-D, --destination).

ALLOW_IP <IP-address>

تعیین نشانی مجاز در داده‌های SPA. نکته: این پارامتر گزینه‌های خط فرمان -a، -s و -R را پوشش می‌دهد. می‌توانید یک نام میزبان یا نشانی IP تعیین کنید (گزینه -a)، کلمه "source" را برای دستور به سرور fwknopd جهت پذیرش IP مبدأ بسته به عنوان IP مجاز مشخص کنید (گزینه -s)، یا از کلمه "resolve" استفاده کنید تا fwknop نشانی IP شبکه خارجی را از طریق درخواست HTTP تفکیک کند (گزینه -R).

ACCESS <port list>

تنظیم یک یا چند پروتکل/پورت برای باز شدن روی دیوار آتش (-A, --access). قالب این فهرست به‌صورت “+<proto>/<port>...<proto>/<port>+” است، مانند “tcp/22,udp/53”.

SPA_SERVER_PORT <port>

تنظیم پورت سرور مورد استفاده برای ارسال بسته SPA (-p, --server-port).

SPA_SERVER_PROTO <protocol>

تنظیم پروتکل مورد استفاده برای ارسال بسته SPA (-P, --server-proto).

KEY <passphrase>

این عبارت عبوری است که برای رمزگذاری بسته SPA استفاده می‌شود و در هر دو حالت رمزگذاری Rijndael یا GPG اعمال می‌گردد. کلید رمزگذاری واقعی که برای Rijndael استفاده می‌شود از الگوریتم PBKDF1 مشتق شده و کلید GPG از دسته‌کلید GPG مشخص‌شده مشتق می‌شود.

KEY_BASE64 <base64 encoded passphrase>

تعیین عبارت عبور رمزگذاری به‌صورت یک رشته کدگذاری‌شده با base64. این گزینه اجازه می‌دهد نویسه‌های غیر ascii در کلید رمزگشایی‌شده از base64 گنجانده شوند.

USE_HMAC <Y/N>

تنظیم حالت HMAC برای رمزنگاری احراز هویت‌شده بسته‌های SPA. این امر باعث می‌شود fwknop از کاربر یک کلید اختصاصی HMAC را که مستقل از کلید رمزگذاری است درخواست کند. به‌طور جایگزین، کلید HMAC را می‌توان با دستورالعمل‌های HMAC_KEY یا HMAC_KEY_BASE64 مشخص کرد (در ادامه را ببینید).

HMAC_KEY <key>

تعیین کلید HMAC برای رمزنگاری احراز هویت‌شده بسته‌های SPA. این گزینه از هر دو حالت رمزگذاری Rijndael و GPG پشتیبانی می‌کند و بر اساس مدل encrypt-then-authenticate اعمال می‌شود.

HMAC_KEY_BASE64 <base64 encoded key>

تعیین کلید HMAC به‌صورت یک رشته کدگذاری‌شده با base64. این گزینه اجازه می‌دهد نویسه‌های غیر ascii در کلید رمزگشایی‌شده از base64 گنجانده شوند.

HMAC_DIGEST_TYPE <digest algorithm>

تنظیم الگوریتم خلاصه HMAC مورد استفاده برای رمزنگاری احراز هویت‌شده بسته‌های SPA. انتخاب‌ها عبارتند از: MD5، SHA1، SHA256 (پیش‌فرض)، SHA384، SHA512، SHA3_256 و SHA3_512.

SPA_SOURCE_PORT <port>

تنظیم پورت مبدأ مورد استفاده برای ارسال بسته SPA (-S, --source-port).

FW_TIMEOUT <seconds>

تنظیم مقدار مهلت زمانی قانون دیوار آتش (-f, --fw-timeout).

RESOLVE_IP_HTTPS <Y/N>

تنظیم روی Y برای تفکیک خودکار IP دارای قابلیت مسیریابی خارجی مرتبط با کلاینت fwknop. این کار روی SSL از طریق wget در حالت --secure-protocol در برابر سرویس تفکیک IP موجود در https://www.cipherdyne.org/cgi-bin/myip انجام می‌شود.

RESOLVE_HTTP_ONLY <Y/N>

هنگامی که به کلاینت fwknop دستور داده می‌شود IP کلاینت خارجی را تفکیک کند، این گزینه در صورت تنظیم روی Y می‌تواند برای اجبار به اتصال HTTP به جای اتصال HTTPS استفاده شود. این گزینه زمانی کاربرد دارد که wget روی سیستم‌عامل محلی نصب نشده باشد، یا با کتابخانه SSL کامپایل نشده باشد.

RESOLVE_URL <url>

تنظیم یک URL که برای تفکیک نشانی IP مبدأ استفاده خواهد شد (--resolve-url).

WGET_CMD <wget full path>

تنظیم مسیر کامل دستور wget (مورد استفاده برای تفکیک IP کلاینت).

TIME_OFFSET <time>

تنظیم مقداری برای اعمال روی برچسب زمان در بسته SPA. این می‌تواند یک مقدار مثبت یا منفی باشد (--time-offset-plus/minus).

ENCRYPTION_MODE <mode>

تعیین حالت رمزگذاری هنگامی که AES استفاده می‌شود. این متغیر معادل آرگومان خط فرمان -M, --encryption-mode است. به‌طور کلی، توصیه می‌شود این آرگومان درج نشود و اجازه دهید پیش‌فرض (CBC) اعمال گردد. توجه داشته باشید که رشته “legacy” می‌تواند برای تولید بسته‌های SPA با راهبرد بردار مقداردهی اولیه قدیمی که در نسخه‌های fwknop پیش از 2.5 استفاده می‌شد تعیین گردد.

DIGEST_TYPE <digest algorithm>

تنظیم نوع خلاصه پیام SPA (-m, --digest-type). انتخاب‌ها عبارتند از: MD5، SHA1، SHA256 (پیش‌فرض)، SHA384، SHA512، SHA3_256 و SHA3_512.

USE_GPG <Y/N>

تنظیم روی Y برای تعیین استفاده از GPG جهت رمزگذاری (--gpg-encryption).

USE_GPG_AGENT <Y/N>

تنظیم روی Y برای تعامل fwknop با یک نمونه gpg-agent جهت دریافت گذرواژه کلید GPG (--gpg-agent). اطلاعات خود agent با متغیر محیطی GPG_AGENT_INFO مشخص می‌شود.

GPG_SIGNING_PW <passphrase>

این عبارت عبوری است که برای امضای داده‌های بسته SPA در حالت رمزگذاری GPG استفاده می‌شود و مترادفی برای متغیر KEY است (یعنی عبارت عبور امضا می‌تواند با متغیر KEY تعیین شود). بسته SPA با کلید سرور راه دور رمزگذاری شده و با کلید کلاینت محلی امضا می‌شود.

GPG_SIGNING_PW_BASE64 <base64 encoded passphrase>

تعیین عبارت عبور امضای GPG به‌صورت یک رشته کدگذاری‌شده با base64. این گزینه اجازه می‌دهد نویسه‌های غیر ascii در کلید رمزگشایی‌شده از base64 گنجانده شوند.

GPG_SIGNER <key ID or Name>

تعیین نام یا شناسه کلید GPG برای امضای داده‌های رمزگذاری‌شده با GPG در SPA (--gpg-signer-key).

GPG_RECIPIENT <key ID or Name>

تعیین نام یا شناسه کلید GPG برای گیرنده داده‌های رمزگذاری‌شده با GPG در SPA (--gpg-recipient-key).

GPG_HOMEDIR <dir>

تعیین دایرکتوری خانگی GPG (--gpg-home-dir). پیش‌فرض ~/.gnupg است.

GPG_EXE <path>

تعیین مسیر اجرایی GPG (--gpg-exe). پیش‌فرض /usr/bin/gpg است.

SPOOF_USER <user>

تنظیم نام کاربری در داده‌های SPA روی مقدار مشخص‌شده (-U, --spoof-user).

SPOOF_SOURCE_IP <IP>

تنظیم IP مبدأ بسته خروجی SPA روی مقدار مشخص‌شده (-Q, --spoof-source).

RAND_PORT <Y/N>

ارسال بسته SPA روی یک پورت تخصیص‌یافته تصادفی (-r, --rand-port).

KEY_FILE <file>

بارگیری کلید/گذرواژه رمزگذاری از یک فایل (-G, --get-key).

HTTP_USER_AGENT <agent string>

تنظیم User-Agent در HTTP برای تفکیک IP خارجی از طریق -R، یا برای ارسال بسته‌های SPA روی HTTP (-u, --user-agent).

USE_WGET_USER_AGENT <Y/N>

اجازه به استفاده از رشته پیش‌فرض User-Agent برنامه wget هنگام تفکیک IP خارجی به جای User-Agent ارائه‌شده توسط کلاینت fwknop.

NAT_ACCESS <internalIP:forwardPort>

کسب دسترسی NAT به یک سرویس داخلی محافظت‌شده توسط سرور fwknop (-N, --nat-access).

NAT_LOCAL <Y/N>

دسترسی به یک سرویس محلی از طریق یک پورت فورواردشده روی سیستم سرور fwknopd (--nat-local).

NAT_PORT <port>

تعیین پورت برای فوروارد جهت دسترسی به یک سرویس از طریق NAT (--nat-port).

NAT_RAND_PORT <Y/N>

وادار کردن کلاینت fwknop به اختصاص یک پورت تصادفی برای دسترسی NAT (--nat-rand-port).

SPOOF_USER، GPG_AGENT_INFO (تنها در حالت --gpg-agent استفاده می‌شود).

از آنجا که fwknop نشانی IP مجاز برای عبور از دیوار آتش را درون بار مفید رمزگذاری‌شده SPA قرار می‌دهد (مگر اینکه از -s استفاده شود که توصیه نمی‌شود و می‌تواند در پیکربندی سرور fwknopd ممنوع گردد)، بسته‌های SPA به سادگی قابل جعل هستند و این در این چارچوب یک ویژگی مثبت است. به این معنا که نشانی IP مبدأ یک بسته SPA توسط دیمن fwknopd نادیده گرفته می‌شود (هنگامی که متغیر REQUIRE_SOURCE_ADDRESS در فایل /etc/fwknop/access.conf تنظیم شده باشد) و تنها به نشانی IP که درون یک بسته SPA احراز هویت‌شده و به‌درستی رمزگشایی‌شده قرار دارد، اجازه عبور از دیوار آتش داده می‌شود. این امر این امکان را فراهم می‌کند که به عنوان مثال چنین به نظر برسد که www.yahoo.com در حال تلاش برای احراز هویت با سیستم هدف است، اما در واقعیت اتصال اصلی از یک IP ظاهراً نامرتبط برقرار خواهد شد.

مثال‌های زیر آرگومان‌های خط فرمانی را نشان می‌دهند که می‌توان در چند وضعیت مختلف به کلاینت fwknop ارائه داد:

مؤثرترین و ساده‌ترین راه برای استفاده از fwknop این است که کلاینت هر دو کلید رمزگذاری و HMAC را تولید کرده و سپس آن‌ها را همراه با مشخصات درخواست دسترسی در فایل “$HOME/.fwknoprc” ذخیره کند. کلیدها همچنین باید به سیستمی که fwknopd روی آن اجرا می‌شود منتقل شوند. کلاینت همچنین در صورتی که چندین سرور fwknopd روی سیستم‌های مختلف اجرا شوند، از مجموعه‌ای جداگانه از کلیدهای رمزگذاری و HMAC برای هر مقصد SPA پشتیبانی می‌کند.

بنابراین با فرض اینکه IP شماره 2.2.2.2 سیستمی است که fwknopd روی آن مستقر است و SSH توسط دیوار آتش روی آن سیستم در یک حالت مسدودسازی پیش‌فرض (default-drop) محافظت می‌شود، کلاینت را به این صورت اجرا کنید تا کلیدهای رمزگذاری و HMAC تولید شوند:

$ fwknop -A tcp/22 --use-hmac -R -D 2.2.2.2 --key-gen --save-rc-stanza --verbose
[+] Wrote Rijndael and HMAC keys to rc file: /home/user/.fwknoprc

با تولید و ذخیره آرگومان‌های درخواست دسترسی و کلیدهای رمزگذاری و HMAC در “$HOME/.fwknoprc”، خود کلیدها باید به سیستم 2.2.2.2 که fwknopd روی آن اجرا می‌شود منتقل شوند. طبق معمول، این کار باید از طریق روشی امن مانند SSH قبل از فعال شدن SPA و مسدود شدن SSHD توسط دیوار آتش انجام شود. در اینجا شکل بخش جدید 2.2.2.2 در فایل ~/.fwknoprc آمده است:

$ tail -n 8 /home/user/.fwknoprc
[2.2.2.2]
ACCESS                      tcp/22
SPA_SERVER                  2.2.2.2
KEY_BASE64                  HvUtIOramehLGKimD4ECXOzinaH4h3U8H1WXum7b54Q=
HMAC_KEY_BASE64             DLeLf93a3yBT2vhEpM+dWlirGta5GU+jdyG5uXp4461HgOtbqMem4gX0Bp2PJGzYZlbbcavcOM00UPm+0GqkXA==
USE_HMAC                    Y
VERBOSE                     Y
RESOLVE_IP_HTTPS            Y

کلیدها توده‌هایی از داده‌های تصادفی کدگذاری‌شده با base64 هستند و هر دو خط KEY_BASE64 و HMAC_KEY_BASE64 باید عیناً کپی شده و درون فایل /etc/fwknop/access.conf روی 2.2.2.2 قرار داده شوند. پس از انجام این کار، fwknopd می‌تواند روی آن سیستم راه‌اندازی شود، یک سیاست default-drop در برابر اتصالات SSH برقرار گردد و سپس دسترسی به SSH از طریق fwknop مدیریت شود. برای دسترسی به SSH، کافی است از آرگومان -n برای ارجاع به بخش 2.2.2.2 از فایل .fwknoprc استفاده کنید (برخی از خروجی‌های --verbose برای شفاف‌سازی آورده شده‌اند):

$ fwknop -n 2.2.2.2
FKO Field Values:
=================
   Random Value: 8950423288486978
       Username: mbr
      Timestamp: 1370194770
    FKO Version: 2.5
   Message Type: 1 (Access msg)
 Message String: 1.1.1.1,tcp/22
     Nat Access: <NULL>
    Server Auth: <NULL>
 Client Timeout: 0 (seconds)
    Digest Type: 3 (SHA256)
      HMAC Type: 3 (SHA256)
Encryption Type: 1 (Rijndael)
Encryption Mode: 2 (CBC)
...
$ ssh -l user 2.2.2.2
user@2.2.2.2's password:

رایج‌ترین کاربرد fwknop دستیابی به دسترسی SSH در یک سیستم راه دور است که دیمن fwknopd همراه با سیاست دیوار آتش default-drop روی آن مستقر شده است. دستور زیر این موضوع را نشان می‌دهد که در آن IP شماره 1.1.1.1 آدرسی است که باید از طریق دیوار آتش در حال اجرا روی 3.3.3.3 مجاز شود (توجه داشته باشید که فایل /etc/fwknop/access.conf که توسط fwknopd استفاده می‌شود باید دارای کلیدهای منطبق رمزگذاری و HMAC باشد، و جزئیات پیکربندی را می‌توان در صفحه راهنمای fwknopd(8) یافت). همچنین توجه کنید که مثال‌های زیر از کاربر می‌خواهند کلیدهای رمزگذاری و HMAC را از طریق stdin وارد کند به جای اینکه مانند مثال بالا در فایل “$HOME/.fwknoprc” روی دیسک بنویسد. با این حال تمام مثال‌های زیر را می‌توان تنها با افزودن آرگومان --save-rc-stanza به استفاده از فایل ~/.fwknoprc تبدیل کرد:

$ fwknop -A tcp/22 --use-hmac -a 1.1.1.1 -D 3.3.3.3
Enter encryption key:
Enter HMAC key:
$ ssh -l user 3.3.3.3
user@3.3.3.3's password:

اگر پرچم --verbose به خط فرمان اضافه شود، برخی از جزئیات بسته SPA در خروجی استاندارد چاپ می‌شوند (همه خروجی‌ها برای اختصار نشان داده نشده‌اند):

$ fwknop -A tcp/22 --use-hmac -a 1.1.1.1 -D 3.3.3.3 --verbose
Enter encryption key:
Enter HMAC key:
   Random Value: 1916307060193417
       Username: mbr
      Timestamp: 1368498909
    FKO Version: 2.5
   Message Type: 1 (Access msg)
 Message String: 1.1.1.1,tcp/22
     Nat Access: <NULL>
    Server Auth: <NULL>
 Client Timeout: 0 (seconds)
    Digest Type: 3 (SHA256)
      HMAC Type: 3 (SHA256)
Encryption Type: 1 (Rijndael)
Encryption Mode: 2 (CBC)

دسترسی هم‌زمان به چندین سرویس نیز پشتیبانی می‌شود و در اینجا نمونه‌ای از درخواست دسترسی به هر دو سرویس SSH و OpenVPN روی 3.3.3.3 آورده شده است:

$ fwknop -A "tcp/22,tcp/1194" --use-hmac -a 1.1.1.1 -D 3.3.3.3

موارد زیادی وجود دارد که کلاینت fwknop در شبکه‌ای پشت یک دستگاه NAT مستقر است و IP دارای قابلیت مسیریابی خارجی برای کاربر مشخص نیست. در این حالت، از سرویس تفکیک IP موجود در https://www.cipherdyne.org/cgi-bin/myip از طریق سوئیچ خط فرمان -R برای به دست آوردن نشانی IP کلاینت خارجی استفاده کنید. این روشی امن‌تر از استفاده از گزینه -s ذکرشده در بخش‌های قبلی این صفحه راهنما است، زیرا IP مبدأ درون بسته رمزگذاری‌شده قرار می‌گیرد به جای اینکه دیمن fwknopd دسترسی درخواستی را از هر نشانی IP که بسته SPA از آن سرچشمه می‌گیرد اعطا کند (یعنی استفاده از -s امکان حمله MITM را باز می‌گذارد):

$ fwknop -A tcp/22 --use-hmac -R -D 3.3.3.3

استفاده از حالت احراز هویت تک‌بسته‌ای برای دستیابی به دسترسی SSH و این بار استفاده از کلیدهای GnuPG برای رمزگذاری و رمزگشایی:

$ fwknop -A tcp/22 --use-hmac --gpg-sign ABCD1234 --gpg--recipient 1234ABCD -R -D 3.3.3.3

دستور به سرور fwknop در حال اجرا در 3.3.3.3 برای مجاز ساختن اتصال 1.1.1.1 به SSH، اما با جعل بسته مجازسازی از یک IP مرتبط با www.yahoo.com (نیازمند root در سیستم‌عامل کلاینت fwknop):

# fwknop --spoof-src "www.yahoo.com" -A tcp/22 --use-hmac -a 1.1.1.1 -D 3.3.3.3

هنگامی که fwknopd روی یک دیوار آتش iptables با سیستم‌های مستقر در پشت آن اجرا می‌شود، می‌توان از قابلیت‌های NAT ارائه‌شده توسط iptables برای دسترسی شفاف به سیستم‌های پشت دیوار آتش از طریق SPA بهره برد. در اینجا نمونه‌ای آورده شده است که در آن از کلاینت fwknop برای دستیابی به SSH در حال اجرا روی IP غیرقابل مسیریابی 192.168.10.23 که در شبکه پشت 3.3.3.3 مستقر است استفاده می‌شود. در این حالت، اتصال SSH برقرارشده به 3.3.3.3 از طریق NAT به‌طور خودکار به سیستم 192.168.10.2 ترجمه می‌شود:

$ fwknop -A tcp/22 -N 192.168.10.2:22 -R -D 3.3.3.3

با انتشار نسخه 2.5، fwknop تغییرات قابل توجهی را در استفاده از رمزنگاری تجربه کرد؛ از جمله افزودن پشتیبانی از رمزنگاری احراز هویت‌شده با HMAC برای هر دو حالت Rijndael و GnuPG، اطمینان از استفاده مناسب از PBKDF1 برای مشتق‌سازی کلید هنگام رمزگذاری بسته‌های SPA با Rijndael، و رفع چندین اشکال از نسخه‌های قبلی fwknop. به‌طور کلی، این بدان معناست که هنگام استفاده از Rijndael، بسته‌های SPA تولیدشده توسط نسخه 2.5 با نسخه‌های قبلی fwknop ناسازگار هستند. حالت رمزگذاری GnuPG تحت تأثیر این به‌روزرسانی‌ها قرار نگرفته است. با این حال حتی هنگام استفاده از Rijndael، سازگاری با نسخه‌های قبلی از طریق تنظیم حالت رمزگذاری legacy با گزینه -M در خط فرمان کلاینت fwknop و/یا متغیر ENCRYPTION_MODE در فایل /etc/fwknop/access.conf پشتیبانی می‌شود. به این ترتیب، یک سرور قدیمی‌تر از 2.5 می‌تواند بسته‌های SPA تولیدشده توسط کلاینت 2.5 و بالاتر را رمزگشایی کند (-M legacy را تنظیم کنید)، و یک سرور 2.5 و بالاتر می‌تواند بسته‌های SPA تولیدشده توسط کلاینت‌های قبل از 2.5 را رمزگشایی نماید (ENCRYPTION_MODE legacy را در فایل access.conf تنظیم کنید). توجه داشته باشید که HMAC تنها از نسخه 2.5 پشتیبانی می‌شود و یک ویژگی اختیاری است، بنابراین سازگاری با نسخه‌های قبلی تنها برای پیکربندی‌هایی است که در هیچ‌یک از دو طرف از HMAC استفاده نمی‌کنند. اکیداً توصیه می‌شود تمام کلاینت‌ها و سرورهای fwknop به نسخه 2.5 ارتقا یافته و از حالت جدید HMAC برای ارتباطات SPA با احراز هویت مناسب استفاده شود. پشتیبانی از سازگاری با نسخه‌های پیشین برای تسهیل ارتقای کلاینت‌ها و سرورها در یک رویکرد مرحله‌به‌مرحله استفاده می‌شود.

جهت تأکید، اگر سرور fwknopd به نسخه 2.5 (یا بالاتر) ارتقا یافته باشد، اما کلاینت‌های قدیمی‌تر نتوانند هم‌زمان ارتقا یابند، برای هر بخش SOURCE در فایل /etc/fwknop/access.conf خط زیر را اضافه کنید:

ENCRYPTION_MODE         legacy

علاوه بر این، اگر متغیر KEY دارای کلید رمزگذاری طولانی‌تر از ۱۶ بایت باشد، باید در فایل access.conf به ۱۶ نویسه کوتاه شود تا کلاینت‌های پیش از 2.5 به‌درستی کار کنند. این محدودیت در نسخه 2.5 برطرف شده است و انگیزه بیشتری برای ارتقای تمام کلاینت‌ها و سرورها به نسخه 2.5 یا بالاتر فراهم می‌کند.

حال با معکوس کردن سناریو، اگر کلاینت‌های fwknop ارتقا یافته باشند اما سرور fwknopd همچنان در نسخه‌ای قبل از 2.5 باشد، آرگومان -M legacy را به خط فرمان fwknop اضافه کنید:

$ fwknop -A tcp/22 -M legacy -R -D 2.2.2.2

کلاینت fwknop به کتابخانه libfko نیاز دارد که معمولاً در هر دو توزیع مبدأ و دودویی گنجانده شده و یک کتابخانه اختصاصی توسعه‌یافته توسط پروژه fwknop است. هر زمان که از سرور fwknopd استفاده می‌شود، libpcap یک وابستگی الزامی است. با این حال نسخه پیش‌روی 2.6 یک حالت شنونده UDP همراه با پشتیبانی از تفکیک دسترسی‌ها ارائه خواهد داد و در این حالت به libpcap نیاز نخواهد داشت. در حالت شنونده UDP، با وجود اینکه fwknopd به یک پورت UDP متصل می‌شود، بسته‌های SPA هرگز تصدیق (acknowledge) نمی‌شوند، بنابراین از دید یک مهاجم هیچ تفاوتی بین شنود غیرفعال شبکه توسط fwknopd در مقایسه با گوش دادن روی یک سوکت UDP از نظر قابلیت پویش وجود ندارد.

برای قابلیت‌های GPG، برنامه GnuPG نیز باید همراه با کتابخانه libgpgme به‌درستی نصب و پیکربندی شده باشد.

برای بهره‌مندی از تمام ویژگی‌های احراز هویت و مدیریت دسترسی دیمن/سرویس fwknopd، یک دیوار آتش فعال از نوع iptables، ipfw یا pf روی سیستم‌عامل زیربنایی مورد نیاز است.

جامع‌ترین روش برای دریافت اطلاعات تشخیصی در مورد fwknop، اجرای اسکریپت مجموعه آزمون test-fwknop.pl واقع در دایرکتوری test/ در سورس‌کدهای fwknop است. مجموعه آزمون، fwknop را از طریق تعداد زیادی آزمون زمان اجرا بررسی می‌کند، از valgrind پشتیبانی می‌نماید، نتایج هر دو رمزگذاری SPA و HMAC را در برابر OpenSSL اعتبارسنجی می‌کند، و حتی فازر (fuzzer) داخلی خود را برای ارتباطات SPA دارد (و fwknop در نسخه 2.6.4 از American Fuzzy Lop (AFL) اثر Michal Zalewski نیز پشتیبانی می‌کند). برای اطلاعات تشخیصی ابتدایی‌تر، fwknop می‌تواند با گزینه خط فرمان -T (یا --test) اجرا شود. این کار باعث می‌شود fwknop صرفاً اطلاعات بسته SPA را ایجاد و چاپ کند، سپس آن را از یک چرخه رمزگشایی/کدگشایی عبور داده و دوباره چاپ نماید. علاوه بر این، سوئیچ خط فرمان --verbose برای مشاهده جزئیات مختلف بسته SPA که در خروجی استاندارد چاپ می‌شوند مفید است.

fwknopd(8), iptables(8), pf(4), pfctl(8), ipfw(8), gpg(1), libfko documentation.

اطلاعات بیشتر درباره احراز هویت تک‌بسته‌ای را می‌توانید در مقاله “Single Packet Authorization with fwknop” موجود در http://www.cipherdyne.org/fwknop/docs/SPA.html بیابید. یک راهنمای جامع درباره عملکرد و تئوری fwknop در http://www.cipherdyne.org/fwknop/docs/fwknop-tutorial.html موجود است. این راهنما همچنین شامل اطلاعاتی درباره طراحی fwknop است که ممکن است برای علاقه‌مندان به اینکه چرا fwknop با سایر پیاده‌سازی‌های SPA تفاوت دارد، ارزش مطالعه داشته باشد.

پروژه fwknop از سیستم کنترل نسخه git به عنوان مخزن کد منبع خود همراه با Github برای ردیابی مسائل و نقاط عطف استفاده می‌کند:

$ git clone https://github.com/mrash/fwknop.git fwknop.git

توضیحات و تفاسیر بیشتر درباره احراز هویت تک‌بسته‌ای را می‌توانید از طریق فید توییتر Michael Rash بیابید: http://twitter.com/michaelrash, @michaelrash

توسعه‌دهندگان اصلی fwknop عبارتند از Michael Rash (ایجادکننده پروژه) <mbr@cipherdyne.org>، Damien Stuart <dstuart@dstuart.org>، و Jonathan Bennett <jbennett@incomsystems.biz>.

این نسخه «C» از fwknop از نسخه اصلی مبتنی بر Perl مشتق شده است که افراد زیادی که در جامعه متن‌باز فعال هستند در آن مشارکت داشته‌اند. فایل CREDITS را در سورس‌های fwknop ببینید، یا به https://github.com/mrash/fwknop/blob/master/CREDITS مراجعه کنید تا فهرست آنلاین مشارکت‌کنندگان را مشاهده نمایید. چند مشارکت‌کننده شایسته تقدیر ویژه هستند از جمله: Franck Joncourt، Max Kastanas، Vlad Glagolev، Sean Greven، Hank Leininger، Fernando Arnaboldi و Erik Gomez.

عبارت “Single Packet Authorization” توسط MadHat و Simple Nomad در کنفرانس BlackHat Briefings سال 2005 ابداع شد.

گزارش‌های اشکال را به dstuart@dstuart.org یا mbr@cipherdyne.org ارسال کنید، یا یک issue جدید در Github باز کنید (ببینید: https://github.com/mrash/fwknop.git). پیشنهادات و/یا نظرات نیز همیشه مورد استقبال قرار می‌گیرند. اطلاعات تکمیلی را می‌توانید در آرشیو لیست پستی fwknop بیابید (ببینید: https://lists.sourceforge.net/lists/listinfo/fwknop-discuss).

نرم‌افزار fwknop تحت مجوز عمومی همگانی گنو (GPL v2+) توزیع می‌شود و آخرین نسخه آن را می‌توان از http://www.cipherdyne.org دریافت کرد.

08/06/2018 Fwknop Client