| CURVETUN(8) | netsniff-ng toolkit | CURVETUN(8) |
نام (NAME)
curvetun - یک تونل سبکوزن ip4/6 مبتنی بر curve25519
خلاصه دستور (SYNOPSIS)
curvetun [گزینهها]
توضیحات (DESCRIPTION)
دستور curvetun یک تونل IP چندکاربره سبکوزن و پرسرعت مبتنی بر رمزنگاری منحنی بیضوی (ECDH) برای لینوکس است که بر پایه epoll(2) طراحی شده است. این ابزار از رابطهای TUN/TAP لینوکس استفاده کرده و از نگاشتهای {IPv4, IPv6} بر روی {IPv4, IPv6} با استفاده از پروتکلهای حامل UDP یا TCP پشتیبانی میکند.
این برنامه دارای یک درخت فوروارد بسته داخلی است، بنابراین چندین کاربر با IPهای مختلف میتوانند از طریق یک دستگاه تونل واحد در سمت سرور مدیریت شوند؛ همچنین جریانها برای پردازش به شیوهای بهینه از نظر مصرف پردازنده (CPU) زمانبندی میشوند، دستکم در شرایطی که پروتکل حامل TCP باشد.
برای مدیریت کلید، از رمزنگاری کلید عمومی مبتنی بر منحنیهای بیضوی استفاده میشود و بستهها بهصورت سرتاسری (end-to-end) توسط رمز جریانی متقارن Salsa20 رمزگذاری شده و توسط کد اصالتسنجی پیام Poly1305 اعتبارسنجی میشوند؛ کلیدها نیز از پیش با پروتکل توافق کلید ECDH به نام Curve25519 محاسبه شدهاند.
رمزنگاری این ابزار بر اساس کتابخانه شبکه و رمزنگاری دانیل جی. برنشتاین با نام “NaCl” طراحی شده است. از نظر طراحی، curvetun هیچ الگو یا شماره پورت پیشفرضی که قطعیت دهد اتصال یک جریان خاص واقعاً در حال اجرای curvetun است، ارائه نمیدهد.
با این حال، چنانچه برای دور زدن فیلترینگ و سانسور نیازهای بیشتری دارید، میتوانید از ترکیب curvetun با ابزارهایی مانند obfsproxy پروژه تور یا Telex استفاده کنید. افزون بر این، curvetun شما را در برابر حملات بازپخش (replay attacks) و حملات مرد میانی دیفی-هلمن (DH man-in-the-middle) محافظت میکند. علاوه بر آن، ثبت رویدادها در syslog سمت سرور را نیز میتوان غیرفعال کرد تا از افشای اطلاعات حیاتی اتصال کاربران جلوگیری شود.
- 1.
- ابزار obfsproxy از پروژه تور (TOR)
- 2.
- پروژه Telex، ابزار ضدسانسور در زیرساخت شبکه
گزینهها (OPTIONS)
- -d <tundev>, --dev <tundev>
- نام دستگاه تونلی که در حال ایجاد است را مشخص میکند. اگر این گزینه تنظیم نشود، نامهای پیشفرض curves{0,1,2,..} برای سرور curvetun و curvec{0,1,2,...} برای کلاینت curvetun استفاده میشوند.
- -p <num>, --port <num>
- پورتی را که سرور curvetun باید روی آن شنود کند مشخص میکند. هیچ پورت پیشفرضی برای curvetun وجود ندارد، بنابراین تنظیم این گزینه برای راهاندازی سرور الزامی است. این گزینه فقط مخصوص سرور است.
- -t <server>, --stun <server>
- در صورت نیاز، یک جستجوی STUN را جهت نمایش نگاشت IP عمومی به پورت و ایجاد روزنه در فایروال (punch a hole) فعال میکند. در صورتی که مطمئن نیستید از چه سرور STUN استفاده کنید، از ''--stun stunserver.org'' استفاده فرمایید.
- -c[=alias], --client[=alias]
- اجرای curvetun در حالت کلاینت و اتصال به نام مستعار ارتباطی تعیینشده در فایل پیکربندی.
- -k, --keygen
- تولید جفتکلید عمومی و خصوصی. این کار باید در ابتدا انجام شود.
- -x, --export
- برونریزی ترکیب کاربر و کلید در خروجی استاندارد (stdout) بهصورت یک خط تکی.
- -C, --dumpc
- تخلیه و نمایش تمام کلاینتهای شناختهشدهای که اجازه اتصال به سرور محلی curvetun را دارند و خروج.
- -S, --dumps
- تخلیه و نمایش تمام سرورهای شناختهشدهای که curvetun در نقش کلاینت میتواند به آنها متصل شود و خروج.
- -D, --nofork
- عدم اجرای فرآیند در پسزمینه (fork نکردن) در هنگام راهاندازی کلاینت یا سرور.
- -s, --server
- اجرای curvetun در حالت سرور. پارامترهای اضافی مورد نیاز است؛ دستکم تعیین پورتی که کلاینتها بتوانند به آن متصل شوند الزامی است.
- -N, --no-logging
- غیرفعال کردن تمام ثبت لاگ اطلاعات کاربران در curvetun. از این گزینه میتوان برای امکان اتصال ناشناستر کاربران curvetun استفاده کرد. این گزینه فقط مخصوص سرور است.
- -u, --udp
- استفاده از UDP به عنوان پروتکل حامل به جای TCP. بهطور پیشفرض، پروتکل حامل TCP است. این گزینه فقط مخصوص سرور است.
- -4, --ipv4
- تعیین پروتکل IPv4 به عنوان پروتکل شبکه زیربنایی مورد استفاده روی دستگاه تونل. پروتکل IPv4 حالت پیشفرض است. این گزینه فقط مخصوص سرور است.
- -6, --ipv6
- تعیین پروتکل IPv6 به عنوان پروتکل شبکه زیربنایی مورد استفاده روی دستگاه تونل. این گزینه فقط مخصوص سرور است.
- -v, --version
- نمایش اطلاعات نسخه و خروج.
- -h, --help
- نمایش راهنمای کاربر و خروج.
مثالهای کاربردی (USAGE EXAMPLES)
- curvetun --server -4 -u -N --port 6666 --stun stunserver.org
- اجرای curvetun در حالت سرور با پروتکل شبکه IPv4 و پروتکل حامل انتقال UDP. سرور curvetun به اتصالات ورودی روی پورت 6666 گوش فرا میدهد و هنگام راهاندازی، یک جستجوی STUN روی stunserver.org انجام میدهد.
- curvetun --client=ethz
- اجرای curvetun در حالت کلاینت و اتصال به نام مستعار ارتباطی تعیینشده ''ethz'' که در فایل پیکربندی ~/.curvetun/servers تعریف شده است.
- curvetun --keygen
- تولید جفتکلیدهای اولیه و ذخیره آنها در دایرکتوری ~/.curvetun/
- curvetun --export
- برونریزی دادههای کاربر در خروجی استاندارد برای پیکربندی یک سرور curvetun.
رمزنگاری (CRYPTOGRAPHY)
تونلهای IP رمزگذاریشده اغلب برای ایجاد شبکههای خصوصی مجازی (VPN) استفاده میشوند؛ جایی که بخشهایی از شبکه تنها از طریق یک بستر ناامن یا غیرقابل اعتماد مانند اینترنت قابل دسترسی هستند. تنها تعداد انگشتشماری ابزار نرمافزاری برای ساخت چنین تونلها یا VPNهایی وجود دارند. دو نماینده محبوب این نرمافزارها OpenVPN و VTUN هستند.
نرمافزار VTUN همچنین رابطهای TUN/TAP را به هسته لینوکس معرفی کرد. VTUN تنها دارای یک ماژول رمزنگاری بسیار ابتدایی است که با نیازهای رمزنگاری امروزی همخوانی ندارد. بهطور پیشفرض، الگوریتم MD5 برای ایجاد کلیدهای ۱۲۸ بیتی برای رمز متقارن BlowFish در حالت ECB استفاده میشود [1].
اگرچه OpenSSL در هر دو ابزار VTUN و OpenVPN به کار رفته است، اما OpenVPN از نظر تنوع الگوریتمهای رمزنگاری و اعتبارسنجی کاربران امکانات بسیار غنیتری دارد. با این وجود، اجازه دادن به کاربران برای انتخاب الگوریتمهای رمزنگاری یا روشهای احراز هویت لزوماً رویکرد خوبی نیست: مدیران سیستم ممکن است سرعت را بر امنیت ترجیح دهند و الگوریتمهای رمزنگاری ضعیفی را انتخاب کنند، بهطوری که سیستم ارتباطی عملاً با حالتی که هیچ رمزی ندارد تفاوتی نداشته باشد؛ یا ممکن است گذرواژههای ضعیفی را برای رمزنگاری متقارن برگزینند یا با داشتن حق انتخاب بیش از حد میان الگوریتمها و نداشتن تجربه کافی در انتخاب گزینه مناسب، پیکربندی سیستم ارتباطی را با اشتباه مواجه کنند.
در کنار مسائل مدیریتی، چالشهای توسعه نرمافزار نیز مطرح است. کتابخانههای رمزنگاری مانند OpenSSL ساختار بسیار درهمتنیدهای دارند و آنچنان سطحپایین و پیچیدهاند که درک کامل یا کاربرد صحیح آنها دشوار است، بهگونهای که زمینهساز آسیبپذیریهای متعددی در چنین نرمافزارهایی میشوند.
در سال ۲۰۱۰، رمزنگاران تانیا لانگه (Tanja Lange) و دانیل جی. برنشتاین (Daniel J. Bernstein) یک کتابخانه رمزنگاری برای شبکه با نام NaCl (خوانده میشود ''سالت'') ایجاد و منتشر کردند. کتابخانه NaCl مشکلاتی مانند موارد ذکر شده در OpenSSL را رفع میکند و برخلاف کاربرد عام OpenSSL، با تمرکزی قدرتمند بر رمزنگاری احرازهویتشده با کلید عمومی بر پایه منحنیهای بیضوی ساخته شده است که در curvetun مورد استفاده قرار گرفته است. به نقل از دانیل جی. برنشتاین:
"الگوریتم RSA تا حدی قدیمیتر از رمزنگاری منحنی بیضوی است: RSA در سال ۱۹۷۷ معرفی شد، در حالی که رمزنگاری منحنی بیضوی در سال ۱۹۸۵ معرفی گردید. با این وجود، RSA نقاط ضعف بسیار بیشتری نسبت به رمزنگاری منحنی بیضوی نشان داده است. سطح امنیت واقعی RSA در اواخر دهه ۱۹۷۰ توسط غربال خطی، در دهه ۱۹۸۰ با غربال درجه دوم و ECM، و در دهه ۱۹۹۰ توسط غربال میدان اعداد بهشدت کاهش یافت. در مقایسه، حملات اندکی علیه برخی منحنیهای بیضوی نادر با ساختارهای جبری خاص توسعه یافته است، و با اینکه توان رایانشی در دسترس مهاجمان بهطور قابل پیشبینی افزایش یافته، منحنیهای بیضوی معمول امروزه دقیقاً به همان اندازه توان محاسباتی برای شکسته شدن نیاز دارند که بیست سال پیش نیاز داشتند.
استاندارد IEEE P1363 رمزنگاری منحنی بیضوی را در اواخر دهه ۱۹۹۰ استانداردسازی کرد، از جمله فهرستی سختگیرانه از معیارهای امنیتی برای منحنیهای بیضوی. مؤسسه NIST از معیارهای IEEE P1363 برای انتخاب پانزده منحنی بیضوی خاص در پنج سطح امنیتی مختلف استفاده کرد. در سال ۲۰۰۵، آژانس امنیت ملی آمریکا (NSA) استاندارد جدید ''Suite B'' را صادر کرد و منحنیهای بیضوی NIST را (در دو سطح امنیتی خاص) برای تمام رمزنگاریهای کلید عمومی توصیه نمود و توصیههای قبلی خود در مورد RSA را پس گرفت."
ابزار curvetun از یک منحنی بیضوی خاص به نام Curve25519 استفاده میکند که در مقاله زیر معرفی شده است: Daniel J. Bernstein, ''Curve25519: new Diffie-Hellman speed records,'' pages 207-228 in Proceedings of PKC 2006, edited by Moti Yung, Yevgeniy Dodis, Aggelos Kiayias, and Tal Malkin, Lecture Notes in Computer Science 3958, Springer, 2006, ISBN 3-540-33851-9.
این منحنی بیضوی از تمام معیارهای امنیتی استاندارد IEEE P1363 پیروی میکند. همچنین توصیههای جدیدی را رعایت میکند که در عین بهبود سرعت، به ''مصونیت در برابر کانالهای جانبی'' (side-channel immunity) و ''امنیت پیچشی'' (twist security) دست مییابند. مفهوم این امر این است که پیادهسازیهای امن Curve25519 بهمراتب سادهتر و سریعتر از پیادهسازیهای امن مثلاً NIST P-256 هستند؛ فرصتهای کمتری برای پیادهسازان وجود دارد تا اشتباهاتی مرتکب شوند که امنیت را به خطر بیندازد، و اشتباهات نیز بسیار راحتتر توسط بازبینها کشف میشوند.
مهاجمی که یک میلیارد دلار صرف تراشههای منظوره خاص برای حمله به Curve25519 کند، با استفاده از بهترین حملات موجود امروزی، پس از یک سال محاسبات تنها حدود ۱ شانس در 1000000000000000000000000000 برای شکستن Curve25519 خواهد داشت. میتوان به سطوح امنیتی مشابهی با RSA سههزار بیتی (3000-bit) دست یافت، اما رمزگذاری و اصالتسنجی با RSA سههزار بیتی بههیچوجه برای مدیریت ترافیک تونل بهاندازه کافی سریع نبوده و به فضای بسیار بیشتری در بستههای شبکه نیاز خواهد داشت.
- 1.
- تحلیل امنیتی VTun
- 2.
- کتابخانه شبکه و رمزنگاری NaCl
راهنمای راهاندازی (SETUP HOWTO)
اگر پیش از این curvetun را اجرا نکردهاید، لازم است یک بار راهاندازی اولیه را انجام دهید.
ابتدا اطمینان حاصل کنید که ساعتهای سرور و کلاینتها بهصورت دورهای همگامسازی میشوند، برای نمونه با اجرای دیمن NTP. این کار برای محافظت در برابر حملات بازپخش (replay attacks) ضروری است. همچنین مطمئن شوید که دسترسی خواندن و نوشتن به /dev/net/tun دارید. نباید curvetun را با دسترسی ریشه (root) اجرا کنید! سپس پس از اطمینان از این موضوع، گام اول تولید کلیدها و فایلهای پیکربندی است. در هر دو سمت کلاینت و سرور دستور زیر را اجرا کنید:
curvetun -k
از شما یک نام کاربری خواسته میشود. میتوانید از نشانی ایمیل یا هر نام مناسب دیگری استفاده کنید. در اینجا فرض میکنیم که 'mysrv1' را در سمت سرور و 'myclient1' را در سمت کلاینت وارد کردهاید.
اکنون تمام فایلهای مورد نیاز زیر دایرکتوری ~/.curvetun ایجاد شدهاند. این فایلها شامل “priv.key”، “pub.key”، “username”، “clients” و “servers” هستند.
فایلهای “clients” و “servers” در ابتدا خالی هستند و باید پر شوند. فایل “clients” مخصوص سرور است تا بداند چه کلاینتهایی مجاز به اتصال هستند. فایل “servers” مخصوص کلاینت است تا بتواند سرورهای curvetun را برای اتصال انتخاب کند. هر دو فایل بسیار ساده هستند، بهگونهای که یک خط پیکربندی به ازای هر کلاینت یا سرور کفایت میکند.
کلاینت باید دادههای کلید عمومی خود را برای سرور برونریزی کند:
curvetun -x
که رشتهای با فرمت زیر را چاپ میکند:
myclient1;11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11 \_______/ \_____________________________________________________________________________________________/ username 32 byte public key for 'myclient1'
این خط به مدیر سرور تحویل داده میشود (بله، سناریوی تبادل دستی کلید در محل را فرض میکنیم که در آن مثلاً مدیر سیستم سرور و کلاینتها را راهاندازی میکند)، که در آن مدیر سرور این ورودی را به فایل ''clients'' خود اضافه میکند:
server$ echo "myclient1;11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:" \
"11:11:11:11:11:11:11:11:11:11:11:11:11:11:11" >> ~/.curvetun/clients
مدیر سرور میتواند بهصورت زیر بررسی کند که آیا سرور آن را بهدرستی ثبت کرده است یا خیر:
server$ curvetun -C
که تمام کلاینتهای تحلیلشده را از ''~/.curvetun/clients'' چاپ میکند. این فرآیند بهسادگی میتواند خودکارسازی شده یا برای مثال با Perl و LDAP اسکریپتنویسی شود.
اکنون، کلاینت ''myclient1'' برای سرور شناخته شده است؛ این کار پیکربندی سرور را کامل میکند. مرحله بعد اعلام این نکته به کلاینت است که باید به کجا به سرور متصل شود.
در این مثال فرض میکنیم سرور تونل دارای یک آدرس IP عمومی مثلاً 1.2.3.4 است، روی پورت 6666 اجرا میشود و از UDP به عنوان پروتکل حامل استفاده میکند. در صورتی که پشت NAT هستید، میتوانید از گزینه ''--stun'' برای راهاندازی سرور استفاده کنید تا نگاشت خود را دریافت نمایید. با این حال، در این مثال با 1.2.3.4، پورت 6666 و پروتکل UDP ادامه میدهیم.
ابتدا، سرور باید کلید خود را بهصورت زیر برای کلاینت برونریزی کند:
server$ curvetun -x
که رشتهای با فرمت زیر چاپ میکند:
mysrv1;22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22
\____/ \_____________________________________________________________________________________________/
username 32 byte public key for 'mysrv1'
^-- you need this public key
بنابراین، اکنون آدرس IP سرور، پورت سرور، پروتکل انتقال سرور و کلید عمومی سرور را در اختیار دارید. در سمت کلاینت میتوان همه این موارد را بهصورت زیر در فایل پیکربندی قرار داد:
client$ echo "myfirstserver;1.2.3.4;6666;udp;22:22:22:22:22:22:22:22:22:22:" \
"22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:22:" \
"22:22" >> ~/.curvetun/servers
کلاینت میتواند پیکربندی خود را با دستور زیر بررسی کند:
client$ curvetun -S
سپس سرور را با دستورات زیر اجرا میکنیم:
server$ curvetun -s -p 6666 -u server# ifconfig curves0 up server# ifconfig curves0 10.0.0.1/24
سپس، کلاینت را با دستورات زیر اجرا میکنیم:
client$ curvetun -c=myfirstserver client# ifconfig curvec0 up client# ifconfig curvec0 10.0.0.2/24
همچنین، اطلاعات، خطاها یا هشدارهای سمت کلاینت در syslog ظاهر خواهند شد! اکنون باید بتوانیم به سرور پینگ بفرستیم:
client$ ping 10.0.0.1
تمام شد! مثال مسیریابی (Routing):
فرض کنید IP عمومی سمت سرور روی eth0 برای نمونه 1.2.3.4 است:
server$ ... start curvetun server ... server# ifconfig curves0 up server# ifconfig curves0 10.0.0.1/24 server# echo 1 > /proc/sys/net/ipv4/ip_forward server# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE server# iptables -A FORWARD -i eth0 -o curves0 -m state --state RELATED,ESTABLISHED -j ACCEPT server# iptables -A FORWARD -i curves0 -o eth0 -j ACCEPT
و IP سمت کلاینت روی eth0 برای نمونه 5.6.7.8 است:
client$ ... start curvetun client ... client# ... lookup your default gateway (e.g. via route, here: 5.6.7.9) ... client# ifconfig curvec0 up client# ifconfig curvec0 10.0.0.2/24 client# route add -net 1.2.3.0 netmask 255.255.255.0 gw 5.6.7.9 dev eth0 client# route add default gw 10.0.0.1 client# route del default gw 5.6.7.9
کار با موفقیت انجام شد؛ وبگردی و تبادل ایمیل ایمنی را از طریق تونلهای curvetun تجربه کنید!
نکته (NOTE)
این نرمافزار یک نمونه اولیه و آزمایشی است که برای پژوهشگران در نظر گرفته شده است. این ابزار به مرور زمان به بلوغ خواهد رسید، اما در حال حاضر استفاده از آن در شرایطی که جان انسانها در خطر است توصیه نمیشود.
اشکالات (BUGS)
تونلزنی سیاهچاله (Blackhole tunneling) در حال حاضر پشتیبانی نمیشود.
حقوقی و مجوز (LEGAL)
ابزار curvetun تحت نسخه 2.0 از مجوز عمومی گنو (GNU GPL) منتشر شده است.
تاریخچه (HISTORY)
curvetun در ابتدا توسط Daniel Borkmann برای مجموعه ابزار netsniff-ng نوشته شد. این پروژه هماکنون توسط Tobias Klauser <tklauser@distanz.ch> و Daniel Borkmann <dborkma@tik.ee.ethz.ch> نگهداری میشود.
همچنین ببینید (SEE ALSO)
netsniff-ng(8), trafgen(8), mausezahn(8), bpfc(8), ifpps(8), flowtop(8), astraceroute(8)
نویسنده (AUTHOR)
صفحه راهنما توسط Daniel Borkmann نوشته شده است.
پاورقی و کلوفون (COLOPHON)
این صفحه بخشی از پروژه ابزار netsniff-ng لینوکس است. توضیحات مربوط به پروژه و اطلاعات پیرامون گزارش اشکالات را میتوانید در نشانی http://netsniff-ng.org بیابید.
| 03 March 2013 | Linux |