IODINE(8) System Manager's Manual IODINE(8)

iodine - ایجاد تونل داده‌های IPv4 از طریق یک سرور DNS

iodine [-v]

iodine [-h]

iodine [-4] [-6] [-f] [-r] [-u user ] [-P password ] [-m fragsize ] [-t chrootdir ] [-d device ] [-R rdomain ] [-m fragsize ] [-M namelen ] [-z context ] [-F pidfile ] [-T dnstype ] [-O downenc ] [-L 0|1 ] [-I interval ] [ nameserver ] topdomain

iodined [-v]

iodined [-h]

iodined [-4] [-6] [-c] [-s] [-f] [-D] [-u user ] [-t chrootdir ] [-d device ] [-m mtu ] [-l listen_ip4 ] [-L listen_ip6 ] [-p port ] [-n ( auto | external_ip ) ] [-b dnsport ] [-P password ] [-z context ] [-F pidfile ] [-i max_idle_time ] tunnel_ip [ /netmask ] topdomain

iodine امکان ایجاد تونل برای داده‌های IPv4 را از طریق یک سرور DNS فراهم می‌کند. این قابلیت در شرایطی که دسترسی به اینترنت با فایروال مسدود شده باشد اما پرس‌وجوهای DNS مجاز باشند، می‌تواند بسیار مفید باشد. این ابزار برای کارکرد به یک دستگاه TUN/TAP نیاز دارد. پهنای باند به صورت نامتقارن است، به طوری که در یک شبکه آزمایشی LAN سیمی، حداکثر نرخ اندازه‌گیری‌شده ۶۸۰ کیلوبیت بر ثانیه برای ارسال (آپلود) و ۲.۳ مگابیت بر ثانیه برای دریافت (دانلود) بوده است. توان عملیاتی پایدار و واقعی روی یک شبکه وای‌فای با استفاده از کش DNS سازمانی (carrier-grade)، حدود ۵۰ کیلوبیت بر ثانیه برای ارسال و بیش از ۲۰۰ کیلوبیت بر ثانیه برای دریافت اندازه‌گیری شده است. iodine برنامه کلاینت و iodined برنامه سرور است.

توجه: سرور و کلاینت باید دقیقاً از یک پروتکل یکسان استفاده کنند. در اکثر موارد، این به معنای اجرای یک نسخه یکسان از iodine است. متأسفانه پیاده‌سازی سازگاری رو به جلو و رو به عقب برای پروتکل معمولاً امکان‌پذیر نیست.

چاپ اطلاعات نسخه و خروج.
چاپ راهنمای نحوه استفاده و خروج.
ادامه اجرا در پیش‌زمینه.
-4
اجبار یا اجازه فقط برای پرس‌وجوهای DNS از نوع IPv4.
-6
اجبار یا اجازه فقط برای پرس‌وجوهای DNS از نوع IPv6.
تنزیل امتیازات و اجرا با هویت کاربر 'user' پس از راه‌اندازی تونل.
انتقال ریشه (chroot) به 'chrootdir' پس از راه‌اندازی تونل.
استفاده از دستگاه TUN به نام 'device' به جای دستگاه معمولی، که در لینوکس dnsX و در سایر سیستم‌ها tunX است. در Mac OS X 10.6، این می‌تواند utunX نیز باشد که تلاش می‌کند از یک دستگاه utun تعبیه‌شده در سیستم‌عامل استفاده کند.
استفاده از 'password' برای احراز هویت. در صورت عدم استفاده، stdin به عنوان ورودی استفاده خواهد شد. فقط ۳۲ نویسه اول مورد استفاده قرار می‌گیرد.
اعمال کانتکست SELinux با عنوان 'context' پس از مقداردهی اولیه.
ایجاد 'pidfile' و نوشتن شناسه فرایند (PID) درون آن.

رد شدن از حالت UDP خام (raw). در صورت عدم استفاده، iodine تلاش می‌کند آدرس IP عمومی میزبان iodined را دریافت کرده و بررسی کند آیا مستقیماً در دسترس است یا خیر. اگر در دسترس باشد، ترافیک به جای بازپخش‌کننده (relay) دی‌ان‌اس به سرور ارسال می‌شود.
استفاده از دامنه مسیریابی OpenBSD با عنوان 'rdomain' برای اتصال DNS.
اجبار حداکثر اندازه قطعه (fragment size) در دریافت. در صورت عدم تعیین این گزینه، کلاینت به طور خودکار حداکثر اندازه قطعه قابل قبول در دریافت را بررسی می‌کند.
حداکثر طول نام‌های میزبان در ارسال، پیش‌فرض ۲۵۵. محدوده قابل استفاده تقریباً ۱۰۰ تا ۲۵۵. از این گزینه برای کاهش پهنای باند ارسال به نفع پهنای باند دریافت استفاده کنید. همچنین برای سرورهای DNS که هنگام استفاده از نام‌های میزبان با طول کامل عملکرد نامطمئنی دارند (که این وضعیت زمانی مشخص می‌شود که بررسی خودکار اندازه قطعه هر بار نتایج بسیار متفاوتی برمی‌گرداند) مفید است.
بازنویسی نوع درخواست DNS. به طور پیش‌فرض، تشخیص خودکار انواع درخواست‌های فعال DNS را بررسی کرده و نوع درخواستی را که انتظار می‌رود بیشترین پهنای باند را ارائه دهد انتخاب خواهد کرد. با این حال، ممکن است مشخص شود که یک رله DNS محدودیت‌هایی اعمال می‌کند که وضعیت را تغییر می‌دهد، و این ممکن است منجر به این شود که یک نوع درخواست DNS «غیرمنتظره» پهنای باند بیشتری فراهم کند. در این صورت، از این گزینه برای لغو تشخیص خودکار استفاده کنید. به ترتیب (مورد انتظار) کاهش پهنای باند، انواع درخواست‌های پشتیبانی‌شده عبارتند از: NULL, PRIVATE, TXT, SRV, MX, CNAME و A (که CNAME برمی‌گرداند). توجه داشته باشید که SRV, MX و A ممکن است یا حتماً باعث پرس‌وجوهای بیشتر توسط سرورهای نام کش «هوشمند» برای به دست آوردن آدرس IP واقعی شوند که ممکن است سرعت را کاهش دهد یا کاملاً با شکست مواجه شود. نوع PRIVATE از مقدار ۶۵۳۹۹ (در محدوده 'private use') استفاده می‌کند و به سرورهایی نیاز دارد که RFC 3597 را پیاده‌سازی کرده باشند.
اجبار نوع کدگذاری داده‌های دریافتی برای تمام پاسخ‌های انواع پرس‌وجو به جز NULL. پیش‌فرض به صورت خودکار تشخیص داده می‌شود، اما ممکن است برای کدک‌های پیشرفته‌تر همه مشکلات را شناسایی نکند. از این گزینه برای بازنویسی تشخیص خودکار استفاده کنید. Base32 پایین‌ترین سطح کدک است و همیشه باید کار کند؛ این کدک زمانی استفاده می‌شود که تشخیص خودکار ناموفق باشد. Base64 پهنای باند بیشتری فراهم می‌کند، اما ممکن است روی همه سرورهای نام کار نکند. Base64u مشابه Base64 است با این تفاوت که به جای علامت مثبت ('+') از زیرخط ('_') استفاده می‌کند، و احتمالاً در جاهایی که Base64 کار نمی‌کند، کار خواهد کرد. Base128 از مقادیر بایتی بالا (عمدتاً حروف با اعراب در iso8859-1) استفاده می‌کند که ممکن است با برخی از سرورهای نام کار کند. برای پرس‌وجوهای TXT، Raw حداکثر کارایی را ارائه می‌دهد، اما این تنها در صورتی کار خواهد کرد که مسیر سرور نام برای پاسخ‌هایی که فرض می‌شود «متن خوانا» هستند کاملاً بدون تغییر (8-bit-clean) باشد.
سوییچ حالت تنبل (lazy-mode). -L1 (پیش‌فرض): استفاده از حالت تنبل برای بهبود کارایی و کاهش تأخیر. اقلیت بسیار کمی از رله‌های DNS به نظر می‌رسد قادر به مدیریت الگوی ترافیکی حالت تنبل نیستند، که منجر به عدم انتقال یا انتقال بسیار ناچیز داده‌ها می‌شود. کلاینت iodine این موضوع را تشخیص داده و سعی می‌کند به حالت سنتی (legacy) بازگردد، اما این کار ممکن است همیشه کارساز نباشد. در این شرایط از -L0 برای اجبار به اجرا در حالت سنتی استفاده کنید (مستلزم -I1 است).
حداکثر فاصله زمانی بین درخواست‌ها (پینگ‌ها) به طوری که سرورهای DNS واسط دچار وقفه زمانی (timeout) نشوند. پیش‌فرض در حالت تنبل ۴ است که در بیشتر موارد به خوبی کار می‌کند. هنگامی که خطاهای SERVFAIL بیش از حد رخ دهد، iodine به طور خودکار این مقدار را به ۱ کاهش می‌دهد. برای دستیابی به حداقل مطلق ترافیک DNS، این مقدار را به خوبی بالاتر از ۴ افزایش دهید، اما نه آن‌قدر بالا که خطاهای SERVFAIL شروع به رخ دادن کنند. برخی رله‌های DNS با وقفه‌های بسیار کم وجود دارند، به ویژه dnsadvantage.com (ultradns)، که حتی با -I1 نیز خطاهای SERVFAIL می‌دهند؛ داده‌ها همچنان عبور خواهند کرد و می‌توان این خطاها را نادیده گرفت. حداکثر مقدار کاربردی ۵۹ است، زیرا iodined اتصال کلاینت را پس از ۶۰ ثانیه عدم فعالیت می‌بندد.

غیرفعال کردن بررسی آدرس IP کلاینت در تمام درخواست‌های ورودی. به طور پیش‌فرض، درخواست‌هایی که از آدرس‌های IP نامطابق ارسال می‌شوند رد خواهند شد، اما این مسئله در صورت هدایت درخواست‌ها از طریق خوشه‌ای از سرورهای DNS مشکلاتی ایجاد می‌کند.
تلاش نکردن برای پیکربندی آدرس IP یا MTU. این گزینه فقط زمانی باید استفاده شود که از قبل دستگاه مورد نظر را پیکربندی کرده باشید.
افزایش سطح اشکال‌زدایی. سطح ۱ اطلاعات مربوط به هر بسته RX/TX را چاپ می‌کند. مستلزم گزینه -f است. در سطح ۲ (-DD) یا بالاتر، پرس‌وجوهای DNS به صورت تحت‌اللفظی چاپ خواهند شد. هنگام استفاده از کدگذاری ارسال Base128، این مورد به بهترین وجه به عنوان متن ISO Latin-1 به جای UTF-8 (غیرمجاز) دیده می‌شود. این کار به راحتی با "LC_ALL=C luit iodined -DD ..." انجام می‌شود (ببینید: luit(1)).
تنظیم 'mtu' به عنوان اندازه MTU برای دستگاه tun. این مقدار هنگام ورود به سیستم برای کلاینت ارسال خواهد شد و کلاینت از همان MTU برای دستگاه tun خود استفاده خواهد کرد. پیش‌فرض ۱۱۳۰ است. توجه داشته باشید که ترافیک DNS در صورت لزوم به طور خودکار تکه‌تکه (fragment) خواهد شد.
تنظیم سرور برای شنود فقط روی 'listen_ip4' جهت درخواست‌های ورودی IPv4. به طور پیش‌فرض، درخواست‌های ورودی از تمام رابط‌ها (0.0.0.0) پذیرفته می‌شوند. می‌توان از یک نام دامنه به عنوان آرگومان استفاده کرد - از دامنه‌ای استفاده کنید که فقط یک رکورد A دارد. اگر listen_ip4 برابر 'external' باشد، iodined از سرویس DNS سایت opendns.com برای بازیابی IP خارجی میزبان استفاده کرده و از آن به عنوان آدرس شنود استفاده می‌کند.
تنظیم سرور برای شنود فقط روی 'listen_ip6' جهت درخواست‌های ورودی IPv6. به طور پیش‌فرض، درخواست‌های ورودی از تمام رابط‌ها (::) پذیرفته می‌شوند. می‌توان از یک نام دامنه به عنوان آرگومان استفاده کرد - از دامنه‌ای استفاده کنید که فقط یک رکورد AAAA دارد.
تنظیم سرور برای شنود روی 'port' به جای ۵۳ برای ترافیک. اگر 'listen_ip4' شامل localhost نباشد، این 'port' می‌تواند همان 'dnsport' باشد. نکته: باید خودتان مطمئن شوید که درخواست‌های DNS به این پورت فوروارد می‌شوند.
آدرس IP برای بازگرداندن در پاسخ‌های NS. پیش‌فرض بازگرداندن آدرسی است که به عنوان مقصد در پرس‌وجو استفاده شده است. اگر external_ip برابر 'auto' باشد، iodined از سرویس DNS سایت opendns.com برای بازیابی IP خارجی میزبان استفاده کرده و از آن برای پاسخ‌های NS استفاده می‌کند.
اگر این پورت مشخص شود، تمام درخواست‌های ورودی خارج از دامنه تونل به این پورت روی localhost فوروارد خواهند شد تا توسط یک DNS واقعی مدیریت شوند. اگر 'listen_ip' شامل localhost نباشد، این 'dnsport' می‌تواند با 'port' یکسان باشد. نکته: فوروارد کردن کاملاً شفاف نیست و استفاده از آن در محیط‌های عملیاتی توصیه نمی‌شود.
متوقف کردن خودکار سرور پس از max_idle_time ثانیه در صورتی که هیچ ترافیکی دریافت نشده باشد. برای مؤثر بودن، این باید با فعال‌سازی در صورت نیاز (on demand) در systemd یا upstart ترکیب شود.

سرور نام مورد استفاده برای بازپخش ترافیک DNS. این می‌تواند هر سرور نام بازپخش‌کننده یا سرور در حال اجرای iodined (در صورت در دسترس بودن) باشد. این فیلد می‌تواند به عنوان آدرس IPv4/IPv6 یا به عنوان نام میزبان ارائه شود. این آرگومان اختیاری است و اگر مشخص نشود، سرور نام از فایل /etc/resolv.conf خوانده خواهد شد.
ترافیک DNS به صورت پرس‌وجو برای زیردامنه‌های تحت 'topdomain' ارسال خواهد شد. این معمولاً یک زیردامنه از دامنه‌ای است که شما مالک آن هستید. برای دستیابی به گذردهی بهتر از یک نام دامنه کوتاه استفاده کنید. اگر nameserver همان سرور iodined باشد، می‌توان topdomain را آزادانه انتخاب کرد. این آرگومان باید در کلاینت و سرور یکسان باشد.

این آدرس IP سرور روی رابط tun است. به کلاینت شماره IP بعدی در محدوده داده خواهد شد. توصیه می‌شود از محدوده‌های 10.0.0.0 یا 172.16.0.0 استفاده شود. نت‌ماسک پیش‌فرض /27 است که می‌توان با تعیین آن در اینجا تغییرش داد. استفاده از شبکه کوچک‌تر تعداد کاربران هم‌زمان را محدود خواهد کرد.
انتظار می‌رود ترافیک DNS به عنوان پرس‌وجو برای زیردامنه‌های تحت 'topdomain' دریافت شود. این معمولاً زیردامنه‌ای از دامنه‌ای است که شما مالک آن هستید. برای دستیابی به گذردهی بهتر از یک نام دامنه کوتاه استفاده کنید. این آرگومان باید در کلاینت و سرور یکسان باشد. پرس‌وجوها برای دامنه‌هایی غیر از 'topdomain' در صورت تعیین گزینه -b فوروارد می‌شوند، در غیر این صورت نادیده گرفته خواهند شد (drop می‌شوند). topdomain می‌تواند با '*' شروع شود که اجازه می‌دهد تمام دامنه‌های منتهی به همان پسوند پذیرفته شوند.

برای مشاهده هم یک سناریوی آزمایش سریع و هم توضیح مفصل درباره استقرار در دنیای واقعی، فایل README را ببینید.

ورود به سیستم یک هش چالش-پاسخ MD5 نسبتاً امن است و گذرواژه هرگز از شبکه عبور نمی‌کند. با این حال، تمام داده‌های دیگر به هیچ وجه رمزگذاری نمی‌شوند. ترافیک DNS همچنین در برابر حملات بازپخش (replay)، تزریق (injection) و مرد میانی (man-in-the-middle) آسیب‌پذیر است، به ویژه هنگامی که iodined با گزینه -c استفاده شود. استفاده از تونل‌سازی ssh یا vpn اکیداً توصیه می‌شود. روی سرور و کلاینت، از iptables، pf یا سایر فایروال‌ها برای مسدود کردن تمام ترافیک ورودی از رابط‌های tun به جز پورت‌های استفاده‌شده برای ssh یا vpn استفاده کنید.

اگر متغیر محیطی IODINE_PASS تنظیم شده باشد، iodine به جای درخواست گذرواژه، از مقدار تعیین‌شده به عنوان گذرواژه استفاده خواهد کرد. گزینه -P همچنان اولویت دارد.

اگر متغیر محیطی IODINED_PASS تنظیم شده باشد، iodined به جای درخواست گذرواژه، از مقدار تعیین‌شده به عنوان گذرواژه استفاده خواهد کرد. گزینه -P همچنان اولویت دارد.

فایل README در توزیع کد منبع حاوی اطلاعات دقیق‌تر و جامع‌تری است.

ثبت باگ‌ها در https://github.com/yarrick/iodine

Erik Ekman <yarrick@kryo.se> و Bjorn Andersson <flex@kryo.se>. با مشارکت عمده Anne Bezemer.

APR 2023 User Manuals