| openvpn(8) | System Manager's Manual | openvpn(8) |
نام (NAME)
openvpn - دیمن تونل امن IP و شبکه خصوصی مجازی (VPN)
خلاصه دستور (SYNOPSIS)
openvpn [ options ... ] openvpn --help
مقدمه (INTRODUCTION)
برنامه OpenVPN یک دیمن VPN متنباز اثر James Yonan است. از آنجا که OpenVPN تلاش میکند یک ابزار فراگیر VPN با انعطافپذیری بسیار بالا باشد، گزینههای فراوانی در این صفحه راهنما وجود دارد. اگر در استفاده از OpenVPN تازهکار هستید، شاید بهتر باشد مستقیماً به بخش مثالها بروید تا نحوه ساخت VPNهای ساده در خط فرمان را بدون نیاز به فایل پیکربندی مشاهده کنید.
همچنین توجه داشته باشید که مستندات و مثالهای بیشتری در وبسایت OpenVPN وجود دارد: https://openvpn.net
و اگر مایلید نسخه کوتاهتری از این راهنما را ببینید، پیام نحوه استفاده openvpn را بررسی کنید که با اجرای openvpn بدون هیچ پارامتری قابل مشاهده است.
توضیحات (DESCRIPTION)
برنامه OpenVPN یک دیمن VPN قدرتمند و بسیار منعطف است. OpenVPN از امنیت SSL/TLS، پلزدن اترنت (ethernet bridging)، انتقال تونل TCP یا UDP از طریق پروکسیها یا NAT، پشتیبانی از آدرسهای IP پویا و DHCP، مقیاسپذیری برای صدها یا هزاران کاربر، و سازگاری با اکثر پلتفرمهای اصلی سیستمعامل پشتیبانی میکند.
برنامه OpenVPN وابستگی نزدیکی به کتابخانه OpenSSL دارد و بیشتر قابلیتهای رمزنگاری خود را از آن میگیرد.
برنامه OpenVPN از رمزنگاری سنتی با استفاده از کلید مخفی از پیش بهاشتراکگذاشتهشده (حالت Static Key) یا امنیت کلید عمومی (حالت SSL/TLS) با استفاده از گواهیهای کلاینت و سرور پشتیبانی میکند. OpenVPN همچنین از تونلهای رمزنگارینشده TCP/UDP پشتیبانی میکند.
برنامه OpenVPN برای کار با رابط شبکه مجازی TUN/TAP که روی بیشتر پلتفرمها وجود دارد طراحی شده است.
در مجموع، OpenVPN قصد دارد بسیاری از ویژگیهای کلیدی IPSec را همراه با ردپای نسبتاً سبکی ارائه دهد.
گزینهها (OPTIONS)
برنامه OpenVPN اجازه میدهد هر گزینهای چه در خط فرمان و چه در یک فایل پیکربندی قرار گیرد. اگرچه تمام گزینههای خط فرمان با یک خطتیره دوگانه آغازین ("--") شروع میشوند، اما این پیشوند هنگام قرار گرفتن گزینه در فایل پیکربندی میتواند حذف شود.
گزینههای عمومی (Generic Options)
این بخش گزینههای عمومی را پوشش میدهد که بدون در نظر گرفتن حالت پیکربندی OpenVPN در دسترس هستند.
- --help
- نمایش گزینهها.
- --auth-nocache
- نامهای
کاربری/گذرواژههای
--askpass یا --auth-user-pass را
در حافظه
مجازی کش
نکنید.
در صورت تعیین شدن، این دستورالعمل باعث میشود OpenVPN بلافاصله ورودیهای نامکاربری/گذرواژه را پس از استفاده فراموش کند. در نتیجه، هر زمان که OpenVPN به نامکاربری/گذرواژه نیاز داشته باشد، ورودی را از stdin درخواست میکند که ممکن است چندین بار در طول مدت نشست OpenVPN اتفاق بیفتد.
هنگام استفاده از --auth-nocache در ترکیب با یک فایل کاربر/گذرواژه و --chroot یا --daemon، حتماً از یک مسیر مطلق استفاده کنید.
- --cd dir
- تغییر
دایرکتوری
به dir پیش از
خواندن
هرگونه
فایل مانند
فایلهای
پیکربندی،
فایلهای
کلید،
اسکریپتها
و غیره. dir
باید یک
مسیر مطلق
همراه با "/"
در ابتدا و
بدون
هرگونه
ارجاع به
دایرکتوری
فعلی مانند
. یا .. باشد.
این گزینه زمانی مفید است که OpenVPN را در حالت --daemon اجرا میکنید و میخواهید تمام فایلهای کنترلی OpenVPN خود را در یک مکان تجمیع نمایید.
- --chroot dir
- اجرای chroot به
dir پس از
مقداردهی
اولیه.
گزینه --chroot
اساساً dir
را به عنوان
ریشه درخت
دایرکتوری
(/) بازتعریف
میکند.
بنابراین OpenVPN
قادر
نخواهد بود
به هیچ
فایلی خارج
از این درخت
دسترسی
پیدا کند.
این امر از
دیدگاه
امنیتی
میتواند
مطلوب باشد.
از آنجا که عملیات chroot تا پس از مقداردهی اولیه به تعویق میافتد، بیشتر گزینههای OpenVPN که به فایلها ارجاع میدهند در بستر پیش از chroot عمل خواهند کرد.
در بسیاری از موارد، پارامتر dir میتواند به یک دایرکتوری خالی اشاره کند، با این حال ممکن است هنگام اجرای اسکریپتها یا راهاندازیهای مجدد پس از عملیات chroot پیچیدگیهایی ایجاد شود.
نکته: کتابخانه SSL احتمالاً نیاز دارد که /dev/urandom در داخل دایرکتوری chroot یعنی dir در دسترس باشد. این به این دلیل است که کتابخانههای SSL گاهی نیاز به جمعآوری تصادفیسازی تازه دارند. هستههای لینوکس جدیدتر و برخی از BSDها یک فراخوان سیستمی getrandom() یا getentropy() پیادهسازی کردهاند که نیاز به در دسترس بودن /dev/urandom را برطرف میسازد.
- --compat-mode version
- این گزینه
روشی راحت
برای تغییر
مقادیر
پیشفرض OpenVPN
جهت
سازگاری
بیشتر با
نسخه
مشخصشده
version فراهم
میکند.
تمام
تغییراتی
که این
گزینه
اعمال
میکند را
میتوان با
استفاده از
گزینههای
پیکربندی
جداگانه
نیز به دست
آورد.
نسخه مشخصشده با این گزینه، نسخه همتای OpenVPN است که OpenVPN باید تلاش کند با آن سازگار باشد. بهطور کلی OpenVPN باید بدون این گزینه با دو نسخه قبلی سازگار باشد. برای نمونه OpenVPN 2.6.0 باید بدون این گزینه با 2.5.x و 2.4.x سازگار باشد. با این حال، ممکن است موارد خاصی وجود داشته باشد که حتی در این حالتها نیز به این گزینه نیاز داشته باشند.
نکته: استفاده از این گزینه، مقادیر پیشفرض را به مقادیری که دیگر توصیه نمیشوند بازمیگرداند و در صورت امکان باید از آن اجتناب شود.
جدول زیر جزئیات تغییرات پیشفرضها را بر اساس نسخه مشخصشده نشان میدهد.
- 2.5.x یا پایینتر: اگر هیچ گزینه فشردهسازی دیگری وجود نداشته باشد، --allow-compression asym بهطور خودکار به پیکربندی اضافه میشود.
- 2.4.x یا پایینتر: رمزنگار موجود در --cipher به --data-ciphers اضافه میشود.
- 2.3.x یا پایینتر: --data-ciphers-fallback بهطور خودکار با همان رمزنگار --cipher اضافه میشود.
- 2.3.6 یا پایینتر: زمانی که --tls-version-min بهطور صریح تنظیم نشده باشد، --tls-version-min 1.0 به پیکربندی اضافه میشود.
در صورت عدم نیاز، باید از این گزینه اجتناب شود. تنظیم این گزینه میتواند امنیت را کاهش دهد یا ویژگیهایی مانند data-channel offloading را غیرفعال کند.
- --config file
- بارگذاری
گزینههای
پیکربندی
اضافی از file
که در آن هر
خط معادل یک
گزینه خط
فرمان است،
اما --
ابتدایی
حذف شده
است.
اگر --config file تنها گزینه برای دستور openvpn باشد، میتوان --config را حذف کرد و دستور را به صورت openvpn file اجرا کرد.
توجه داشته باشید که پروندههای پیکربندی میتوانند تا عمق معقولی تو در تو باشند.
میتوان از نویسههای نقلقول دوگانه یا تکی (""، '') برای در بر گرفتن پارامترهای تکی شامل فاصلههای خالی استفاده کرد، و نویسههای "#" یا ";" در ستون اول میتوانند برای نشان دادن توضیحات به کار روند.
توجه داشته باشید که OpenVPN 2.0 و بالاتر برای نویسههایی که درون نقلقول تکی نیستند، گریز شل مبتنی بر بکاسلش را انجام میدهد، بنابراین نگاشتهای زیر باید رعایت شوند:
\\ Maps to a single backslash character (\).
\" Pass a literal doublequote character ("), don't
interpret it as enclosing a parameter.
\[SPACE] Pass a literal space or tab character, don't
interpret it as a parameter delimiter.
برای نمونه در Windows، از دو بکاسلش برای نمایش مسیرها استفاده کنید:
secret "c:\\OpenVPN\\secret.key"
برای نمونههای پروندههای پیکربندی، نگاه کنید به https://openvpn.net/community-resources/how-to
در اینجا یک پرونده پیکربندی نمونه آمده است:
# # Sample OpenVPN configuration file for # using a pre-shared static key. # # '#' or ';' may be used to delimit comments. # Use a dynamic tun device. dev tun # Our remote peer remote mypeer.mydomain # 10.1.0.1 is our local VPN endpoint # 10.1.0.2 is our remote VPN endpoint ifconfig 10.1.0.1 10.1.0.2 # Our pre-shared static key secret static.key
- --daemon progname
- پس از تکمیل
تمام توابع
مقداردهی
اولیه، به
یک دیمن
تبدیل شود.
نحوهای معتبر:
daemon daemon progname
این گزینه باعث میشود تمام پیامها و خروجیهای خطا به پرونده syslog (مانند /var/log/messages) ارسال شوند، به جز خروجی اسکریپتها و دستورهای ifconfig، که مگر در صورت تغییر مسیر، به /dev/null خواهند رفت. تغییر مسیر syslog بلافاصله در نقطهای که --daemon در خط فرمان تجزیه میشود رخ میدهد، هرچند نقطه تبدیل به دیمن شدن بعداً انجام میشود. اگر یکی از گزینههای --log وجود داشته باشد، جایگزین تغییر مسیر syslog خواهد شد.
پارامتر اختیاری progname باعث میشود OpenVPN نام برنامه خود را به صورت progname به ثبتکننده سیستم گزارش دهد. این امر میتواند در پیوند دادن پیامهای OpenVPN در پرونده syslog با تونلهای خاص مفید باشد. در صورت مشخص نشدن، progname به صورت پیشفرض برابر با openvpn است.
هنگامی که OpenVPN با گزینه --daemon اجرا میشود، تلاش میکند تبدیل به دیمن شدن را تا تکمیل اکثر توابع مقداردهی اولیه که قادر به ایجاد خطاهای مهلک هستند، به تاخیر بیندازد. این بدان معناست که اسکریپتهای مقداردهی اولیه میتوانند وضعیت بازگشتی دستور openvpn را برای یک نشانه نسبتاً قابل اعتماد از اینکه آیا دستور به درستی مقداردهی اولیه شده و وارد حلقه رخداد ارسال بسته شده است یا خیر، بررسی کنند.
در OpenVPN، اکثریت قریب به اتفاق خطاهایی که پس از مقداردهی اولیه رخ میدهند، غیرمهلک هستند.
نکته: به محض اینکه OpenVPN به دیمن تبدیل شد، دیگر نمیتواند نام کاربری، گذرواژه یا عبارت عبور کلید را درخواست کند. این امر پیامدهای خاصی دارد، از جمله اینکه استفاده از یک کلید خصوصی محافظتشده با گذرواژه با شکست مواجه خواهد شد، مگر اینکه از گزینه --askpass برای اعلام به OpenVPN جهت درخواست عبارت عبور استفاده شود.
علاوه بر این، استفاده از --daemon همراه با --auth-user-pass (وارد شده در کنسول) و --auth-nocache به محض انجام مذاکره مجدد کلید (و احراز هویت مجدد) با شکست مواجه خواهد شد.
- --disable-occ
- منسوخشده
غیرفعالسازی
"بررسی
سازگاری
گزینهها"
(OCC) در
پیکربندیهایی
که از TLS
استفاده
نمیکنند.
در صورت شناسایی ناسازگاری گزینهها بین همتاها، پیام هشداری ارسال نمیشود. یک مثال از ناسازگاری گزینه زمانی است که یک همتا از --dev tun و همتای دیگر از --dev tap استفاده کند.
استفاده از این گزینه توصیه نمیشود، اما بهعنوان راهحلی موقت در شرایطی که نسخه جدید OpenVPN باید به یک نسخه قدیمی متصل شود فراهم شده است.
- --engine engine-name
- فعالسازی
قابلیت
موتور
رمزنگاری
سختافزاری
OpenSSL.
نحوهای معتبر:
engine engine engine-name
اگر engine-name مشخص شده باشد، از یک موتور رمزنگاری خاص استفاده میشود. از گزینه مستقل --show-engines برای فهرست کردن موتورهای رمزنگاری پشتیبانیشده توسط OpenSSL استفاده کنید.
- --group group
- مشابه گزینه --user، این گزینه شناسه گروه (GID) فرایند OpenVPN را پس از راهاندازی اولیه به group تغییر میدهد.
- --ignore-unknown-option args
- نحو معتبر:
ignore-unknown-option opt1 opt2 opt3 ... optN
هنگامی که یکی از گزینههای opt1 ... optN در پرونده پیکربندی مشاهده شود، اگر این نسخه از OpenVPN از آن گزینه پشتیبانی نکند، پردازش پرونده پیکربندی شکست نمیخورد. برای پشتیبانی از تعداد بیشتری از گزینهها جهت نادیدهگرفتن، میتوان چندین گزینه --ignore-unknown-option را مشخص کرد.
این گزینه باید با احتیاط استفاده شود، زیرا دلایل امنیتی موجهی وجود دارد که اگر OpenVPN مشکلی در پرونده پیکربندی تشخیص دهد متوقف شود. با این حال، دلایل موجهی نیز وجود دارد که ویژگیهای نرمافزاری جدید هنگام مواجهه با نسخههای قدیمیتر بهآرامی تنزل یابند.
گزینه --ignore-unknown-option از OpenVPN 2.3.3 به بعد در دسترس است.
- --iproute cmd
- تنظیم دستور جایگزین برای اجرا به جای دستور پیشفرض iproute2. ممکن است بهمنظور اجرای OpenVPN در یک محیط بدون دسترسی ممتاز استفاده شود.
- --keying-material-exporter args
- ذخیره Exported Keying Material
[RFC5705] با
اندازه len
بایت (باید
بین ۱۶ و
۴۰۹۵ بایت
باشد) با
استفاده از
label در محیط
(exported_keying_material) جهت
استفاده
توسط
افزونهها
در
فراخوانی
برگشتی
OPENVPN_PLUGIN_TLS_FINAL.
نحو معتبر:
keying-material-exporter label len
توجه داشته باشید که labels برونریزنده پتانسیل تداخل با برچسبهای موجود PRF را دارند. بهمنظور جلوگیری از این مسئله، برچسبها باید با EXPORTER آغاز شوند.
- --mlock
- غیرفعالسازی
صفحهبندی
حافظه با
فراخوانی
تابع POSIX mlockall.
مستلزم این
است که OpenVPN در
ابتدا با
دسترسی root
اجرا شود
(اگرچه OpenVPN
میتواند
بعداً با
استفاده از
گزینه --user
شناسه
کاربری (UID)
خود را کاهش
دهد).
استفاده از این گزینه تضمین میکند که دادههای کلید و دادههای تونل به دلیل عملیات صفحهبندی حافظه مجازی که در اکثر سیستمهای عامل مدرن رخ میدهد، هرگز بر روی دیسک نوشته نشوند. این گزینه تضمین میکند حتی اگر مهاجمی بتواند سیستم اجراکننده OpenVPN را هک کند، نتواند پرونده swap سیستم را برای بازیابی کلیدهای موقت (ephemeral) قبلی که برای بازهای زمانی تحت کنترل گزینههای --reneg (به زیر مراجعه کنید) استفاده و سپس دور ریخته شدهاند، پویش کند.
نقطه ضعف استفاده از --mlock این است که میزان حافظه فیزیکی موجود برای سایر برنامهها را کاهش میدهد.
محدودیت میزان حافظهای که میتوان قفل کرد و نحوه اعمال این محدودیت به سیستمعامل وابسته است. در لینوکس محدودیت پیشفرضی که یک فرایند غیرممتاز میتواند قفل کند (RLIMIT_MEMLOCK) پایین است، و اگر دسترسیها بعداً کاهش یابند، تخصیصهای حافظه در آینده بهاحتمال بسیار زیاد با شکست مواجه خواهند شد. این محدودیت را میتوان با استفاده از ulimit یا دستورات systemd بسته به نحوه راهاندازی OpenVPN افزایش داد.
اگر پلتفرم دارای فراخوانی سیستمی getrlimit(2) باشد، OpenVPN پیش از فراخوانی mlockall(2) میزان حافظه قابل قفل با mlock را بررسی میکند و اگر کمتر از ۱۰۰ مگابایت پیکربندی شده باشد، تلاش میکند محدودیت را به ۱۰۰ مگابایت افزایش دهد. مقدار ۱۰۰ مگابایت تا حدی دلخواه است - برای یک استقرار متوسط OpenVPN کافی است، اما اگر تعداد کلاینتهای همزمان بالا باشد، مصرف حافظه ممکن است فراتر از آن برود.
- --nice n
- تغییر اولویت فرایند پس از راهاندازی اولیه (n بزرگتر از 0 اولویت پایینتر و n کمتر از صفر اولویت بالاتر است).
- --providers providers
- بارگیری فهرست ارائهدهندگان (OpenSSL). این گزینه عمدتاً برای استفاده از یک ارائهدهنده خارجی جهت مدیریت کلید مانند tpm2-openssl یا برای بارگیری ارائهدهنده legacy با دستور زیر کاربرد دارد:
--providers legacy default
رفتار تغییر این گزینه در حین ارسال SIGHUP ممکن است مناسب نباشد. اگر نیاز به تغییر/افزودن/حذف این گزینه دارید، OpenVPN را بهطور کامل بازراهاندازی کنید.
- --remap-usr1 signal
- کنترل
اینکه
سیگنالهای
SIGUSR1
تولیدشده
به صورت
داخلی یا
خارجی به SIGHUP
(راهاندازی
مجدد بدون
حفظ وضعیت)
یا SIGTERM (خروج)
نگاشت مجدد
شوند یا
خیر.
signal میتواند روی SIGHUP یا SIGTERM تنظیم شود. به صورت پیشفرض، هیچ نگاشت مجددی رخ نمیدهد.
- --script-security level
- این دستورالعمل امکان کنترل در سطح خطمشی (policy) را بر استفادهٔ OpenVPN از برنامهها و اسکریپتهای خارجی فراهم میکند. مقادیر کمتر level محدودکنندهتر و مقادیر بالاتر آزادتر هستند. تنظیمات برای level:
- 0
- اکیداً بدون فراخوانی برنامههای خارجی.
- 1
- (پیشفرض) تنها فراخوانی فایلهای اجرایی توکار مانند ifconfig، ip، route، یا netsh.
- 2
- اجازه فراخوانی فایلهای اجرایی توکار و اسکریپتهای تعریفشده توسط کاربر.
- 3
- اجازه ارسال گذرواژهها به اسکریپتها از طریق متغیرهای محیطی (به طور بالقوه ناامن).
نسخههای OpenVPN قبل از v2.3 همچنین از یک پرچم method پشتیبانی میکردند که مشخص میکرد OpenVPN چگونه باید دستورات و اسکریپتهای خارجی را فراخوانی کند. این میتوانست execve یا system باشد. از نسخه OpenVPN 2.3 به بعد، این پرچم دیگر پذیرفته نمیشود.
برخی دستورالعملها مانند --up اجازه میدهند گزینهها به اسکریپت خارجی ارسال شوند. در این موارد اطمینان حاصل کنید که نام اسکریپت حاوی هیچ فاصلهای (space) نباشد، در غیر این صورت تجزیهکنندهٔ پیکربندی دچار خطا خواهد شد چون نمیتواند تشخیص دهد نام اسکریپت در کجا پایان مییابد و گزینههای اسکریپت از کجا شروع میشوند.
در ویندوز هنگام اجرای پروندههای غیر اجرایی، داشتن مسیر کامل به مفسر اسکریپت یک الزام قطعی است. این مورد برای پروندههای اجرایی مانند فایلهای .exe، .com، .bat یا .cmd لازم نیست. به عنوان مثال، اگر یک اسکریپت Visual Basic دارید، باید از این نحو استفاده کنید:
--up 'C:\\Windows\\System32\\wscript.exe C:\\Program\ Files\\OpenVPN\\config\\my-up-script.vbs'
لطفاً به علامتهای نقلقول تکی و اسکیپ کردن بکاسلشها (\\) و نویسهٔ فاصله توجه داشته باشید.
- --setcon context
- اعمال context
مربوط به SELinux
پس از
مقداردهی
اولیه. این
اساساً به
لطف SELinux،
امکان
محدود کردن
حقوق
دسترسی OpenVPN
تنها به
عملیات I/O
شبکه را
فراهم
میکند. این
فراتر از --user
و --chroot عمل
میکند،
چرا که آن
دو با وجود
اینکه
ویژگیهای
امنیتی
عالی
هستند،
متأسفانه
در برابر
ارتقای سطح
دسترسی (privilege escalation)
از طریق
اکسپلویت
یک
فراخوانی
سیستمیِ
آسیبپذیر
محافظت
نمیکنند.
البته
میتوانید
هر سه را
ترکیب
کنید، اما
توجه داشته
باشید از
آنجا که setcon
نیاز به
دسترسی به /proc
دارد، باید
آن را درون
پوشه chroot
فراهم کنید
(مثلاً با mount --bind).
از آنجا که عملیات setcon تا پس از مقداردهی اولیه به تعویق میافتد، OpenVPN میتواند تنها به فراخوانیهای سیستمی مربوط به شبکه محدود شود، در حالی که با اعمال context پیش از راهاندازی (مانند موردی که برای OpenVPN در SELinux Reference Policies ارائه شده است) مجبور خواهید بود مواردی را که فقط هنگام مقداردهی اولیه لازم هستند نیز مجاز کنید.
مانند chroot، اجرای اسکریپتها یا راهاندازیهای مجدد پس از عملیات setcon میتواند پیچیدگیهایی ایجاد کند، به همین دلیل باید استفاده از گزینه --persist-tun را جداً مد نظر قرار دهید.
- --status args
- نوشتن
وضعیت
عملیاتی در
file هر n
ثانیه
یکبار. در
صورت مشخص
نشدن، n به
صورت
پیشفرض 60
است.
نحوهای معتبر:
status file status file n
همچنین با ارسال سیگنال SIGUSR2 میتوان وضعیت را در syslog نوشت.
با فعال بودن قابلیت چند-کاربری (multi-client) روی یک سرور، پرونده وضعیت شامل فهرستی از کلاینتها و یک جدول مسیریابی است. در این حالت قالب خروجی را میتوان با گزینه --status-version کنترل کرد.
برای کلاینتها یا نمونههای در حال اجرا در حالت point-to-point، این پرونده شامل آمار ترافیک خواهد بود.
- --status-version n
- تنظیم
شماره نسخه
قالب
پرونده
وضعیت به n.
این گزینه تنها بر پرونده وضعیت در سرورهایی تأثیر میگذارد که قابلیت multi-client روی آنها فعال است. مقادیر معتبر برای نسخه وضعیت:
- 1
- قالب سنتی (پیشفرض). فهرست کلاینت شامل فیلدهای زیر است که با کاما از هم جدا شدهاند: Common Name، Real Address، Bytes Received، Bytes Sent، Connected Since.
- 2
- قالبی مطمئنتر برای پردازش خارجی. در مقایسه با نسخه 1، فهرست کلاینت شامل چند فیلد اضافی است: Virtual Address، Virtual IPv6 Address، Username، Client ID، Peer ID، Data Channel Cipher. نسخههای آینده ممکن است تعداد فیلدها را افزایش دهند.
- 3
- همانند 2، اما فیلدها با تب (tab) جدا شدهاند.
- --test-crypto
- یک
خودآزمایی
(self-test) از
گزینههای
رمزنگاری OpenVPN
با
رمزگذاری و
رمزگشایی
بستههای
آزمایشی با
استفاده از
گزینههای
رمزنگاری
کانال داده
که در بالا
مشخص
شدهاند،
انجام
میدهد. این
گزینه برای
کارکرد به
یک همتا (peer)
نیاز
ندارد،
بنابراین
میتواند
بدون --dev یا
--remote مشخص شود.
کاربرد معمول --test-crypto چیزی شبیه به این خواهد بود:
openvpn --test-crypto
یا
openvpn --test-crypto --verb 9
این گزینه برای آزمایش OpenVPN پس از پورت شدن آن به یک بستر (پلتفرم) جدید، یا جداسازی مشکلات در کامپایلر، کتابخانه رمزنگاری OpenSSL یا کد رمزنگاری OpenVPN بسیار مفید است. از آنجا که این یک حالت خودآزمایی است، مشکلات رمزگذاری و احراز هویت را میتوان مستقل از مسائل شبکه و تونل اشکالزدایی کرد.
نسخههای قدیمیتر OpenVPN از آرگومان --secret برای مشخص کردن یک کلید ایستا برای این آزمایش استفاده میکردند. نسخههای جدیدتر یک کلید تصادفی برای آزمایش تولید میکنند.
- --tmp-dir dir
- یک
دایرکتوری
dir را برای
پروندههای
موقت به جای
مقدار
پیشفرض TMPDIR
(یا "/tmp" در
صورت تنظیم
نشدن) مشخص
میکند.
توجه داشته
باشید که
این مسیر
باید پس از
واگذاری
دسترسیهای
ریشه (root privileges)
توسط
پردازش
اصلی قابل
نوشتن باشد.
این دایرکتوری برای ارتباط با اسکریپتها و افزونهها استفاده خواهد شد:
- اسکریپتهای --client-connect و قلاب افزونه OPENVPN_PLUGIN_CLIENT_CONNECT برای تولید پویای پیکربندی ویژه کلاینت client_connect_config_file و بازگرداندن موفقیت/شکست از طریق client_connect_deferred_file هنگام استفاده از روش اتصال کلاینت معوق (deferred)
- قلابهای افزونه OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY که موفقیت/شکست را از طریق auth_control_file هنگام استفاده از روش احراز هویت معوق و احراز هویت در انتظار از طریق auth_pending_file بازمیگردانند.
- --use-prediction-resistance
- مقاومت در
برابر
پیشبینی
(prediction resistance) را در RNG
مربوط به mbed TLS
فعال
میکند.
فعالسازی مقاومت در برابر پیشبینی باعث میشود RNG در هر فراخوانی برای داده تصادفی، مقداردهی اولیه مجدد (reseed) شود. مقداردهی مجدد مکرر میتواند استخر آنتروپی (entropy pool) هسته را به سرعت تخلیه کند.
اگر به این گزینه نیاز دارید، لطفاً اجرای دیمنی را در نظر بگیرید که به استخر هسته، آنتروپی اضافه میکند.
- --user user
- شناسه
کاربری (User ID)
پردازش OpenVPN را
پس از
مقداردهی
اولیه به user
تغییر داده
و
دسترسیها
را در طول
پردازش
کاهش
میدهد. این
گزینه برای
محافظت از
سیستم در
حالتی که یک
طرف متخاصم
بتواند
کنترل یک
نشست OpenVPN را به
دست آورد
مفید است.
اگرچه
ویژگیهای
امنیتی OpenVPN
این اتفاق
را نامحتمل
میسازد،
اما به
عنوان خط
دفاعی دوم
ارائه شده
است.
با تنظیم user روی یک کاربر بدون دسترسی ویژه که به اجرای openvpn اختصاص داده شده است، میزان آسیبی که طرف متخاصم میتواند ایجاد کند محدود میشود. البته پس از سلب دسترسیها، نمیتوانید آنها را به یک نشست OpenVPN بازگردانید. این بدان معناست که برای مثال، اگر میخواهید دیمن OpenVPN را با یک سیگنال SIGUSR1 بازنشانی کنید (برای نمونه در پاسخ به بازنشانی DHCP)، باید از یک یا چند گزینه از گزینههای --persist استفاده کنید تا اطمینان حاصل شود که OpenVPN برای راهاندازی مجدد نیازی به اجرای هیچ عملیات دارای دسترسی ویژه ندارد (مانند خواندن مجدد پروندههای کلید یا اجرای ifconfig روی دستگاه TUN).
نکته: نسخههای قبلی openvpn از nobody به عنوان نمونه کاربر بدون دسترسی ویژه استفاده میکردند. استفاده واقعی از این کاربر توصیه نمیشود زیرا معمولاً از قبل توسط سایر سرویسهای سیستم استفاده میشود. همیشه یک کاربر اختصاصی برای openvpn ایجاد کنید.
- --writepid file
- شناسه پردازش اصلی (PID) مربوط به OpenVPN را در پرونده file مینویسد.
گزینههای ثبت گزارش (Log options)
- --echo parms
- مقادیر parms
را در خروجی
لاگ پژواک (echo)
میکند.
برای استفاده جهت ارسال پیامها به یک برنامه کنترلکننده که خروجی لاگ OpenVPN را دریافت میکند طراحی شده است.
- --errors-to-stderr
- خطاها را به جای stdout به stderr ارسال میکند، مگر اینکه خروجی لاگ توسط یکی از گزینههای --log تغییر مسیر داده شده باشد.
- --log file
- پیامهای
گزارش را در
پرونده file
خروجی
میدهد، از
جمله خروجی
به stdout/stderr که
توسط
اسکریپتهای
فراخوانیشده
تولید
میشود. اگر
پرونده file
از قبل وجود
داشته
باشد،
محتوای آن
پاک (truncate)
میشود. این
گزینه
بلافاصله
پس از تجزیه
در خط فرمان
اعمال
میشود و در
صورت تعیین
--daemon،
جایگزین
خروجی syslog
خواهد شد.
این گزینه
در تمام طول
چرخه اجرای
OpenVPN پایدار
است و با SIGHUP،
SIGUSR1 یا --ping-restart
بازنشانی
نخواهد شد.
توجه داشته باشید که در ویندوز، هنگامی که OpenVPN به عنوان یک سرویس راهاندازی میشود، ثبت گزارش به صورت پیشفرض و بدون نیاز به مشخص کردن این گزینه انجام میگیرد.
- --log-append file
- پیامهای گزارش را به انتهای پرونده file اضافه میکند. اگر پرونده file وجود نداشته باشد، ایجاد خواهد شد. این گزینه دقیقاً مانند --log عمل میکند با این تفاوت که به جای بازنویسی و پاک کردن، به انتهای پرونده لاگ اضافه میکند.
- --machine-readable-output
- همیشه برچسبهای زمانی و پرچمهای پیام را در پیامهای لاگ بنویس، حتی زمانی که در حالت عادی پیشوند نمیخورند. به طور خاص، این مورد برای پیامهای لاگ ارسالشده به stdout اعمال میشود.
- --mute n
- ثبت حداکثر n پیام متوالی در همان دستهبندی. این گزینه برای محدود کردن لاگهای تکراری انواع پیامهای مشابه مفید است.
- --mute-replay-warnings
- بیصدا کردن خروجی هشدارهای بازپخش (replay)، که یک هشدار نادرست رایج در شبکههای WiFi هستند. این گزینه امنیت کد حفاظت در برابر بازپخش را حفظ میکند بدون اینکه پرگوییهای مربوط به هشدارهای بستههای تکراری را به همراه داشته باشد.
- --suppress-timestamps
- جلوگیری از نوشتن برچسبهای زمانی در پیامهای لاگ، حتی زمانی که در حالت عادی پیشوند میخورند. به طور خاص، این مورد برای پیامهای لاگ ارسالشده به stdout اعمال میشود.
- --syslog progname
- هدایت خروجی لاگ به لاگر سیستم (syslog)، اما بدون تبدیل شدن به دیمن. برای توضیح پارامتر progname به دستورالعمل --daemon در بالا مراجعه کنید.
- --verb n
- تنظیم پرگویی (verbosity) خروجی روی n (پیشفرض 1). هر سطح تمام اطلاعات سطوح قبلی را نشان میدهد. سطح 3 در صورتی که یک خلاصهی خوب از آنچه رخ میدهد بدون غرق شدن در خروجی میخواهید، پیشنهاد میشود.
- 0
- بدون خروجی به جز خطاهای مهلک.
- 1 تا 4
- محدوده استفاده عادی.
- 5
- نویسههای R و W را برای هر خواندن و نوشتن بسته در کنسول خروجی میدهد، حروف بزرگ برای بستههای TCP/UDP و حروف کوچک برای بستههای TUN/TAP استفاده میشوند.
- 6 تا 11
- محدوده اطلاعات اشکالزدایی (debug) (برای اطلاعات بیشتر در مورد سطوح اشکالزدایی، پرونده errlevel.h را در کد منبع ببینید).
گزینههای پروتکل (Protocol options)
گزینههای این بخش بر ویژگیهای موجود در پروتکل ارتباطی (wire protocol) اوپنویپیان تأثیر میگذارند. بسیاری از این گزینهها همچنین گزینههای رمزنگاری کانال داده را در پروتکل ارتباطی OpenVPN تعریف میکنند. این گزینهها باید به شیوهای سازگار بین هر دو سمت محلی و دوردست پیکربندی شوند.
- --allow-compression mode
- همانطور
که در گزینه
--compress توضیح
داده شده
است،
فشردهسازی
یک گزینه
بالقوه
خطرناک است.
این گزینه
امکان
کنترل
رفتار OpenVPN را
در هنگام
استفاده و
مجاز بودن
فشردهسازی
فراهم
میکند.
آرگومان mode میتواند یکی از مقادیر زیر باشد:
- asym
- برنامه OpenVPN فقط بستههای ورودی را از حالت فشرده خارج میکند اما بستههای خروجی را فشرده نمیکند. این همچنین امکان مهاجرت جهت غیرفعالسازی فشردهسازی را فراهم میکند، زمانی که تغییر همزمان پیکربندی سرور و کلاینت برای حذف فشردهسازی گزینهای امکانپذیر نیست.
- no (پیشفرض)
- برنامه OpenVPN هرگونه فشردهسازی را رد خواهد کرد. اگر بارگذاری کانال داده (data-channel offloading) فعال باشد، OpenVPN علاوه بر این فریمبندی فشردهسازی (stub) را نیز رد خواهد کرد.
- yes
- منسوخشده این گزینه یک نام مستعار برای asym است. پیش از این فشردهسازی را برای بستههای خروجی فعال میکرد، اما OpenVPN اکنون هرگز بستهها را هنگام ارسال فشرده نمیکند.
- --auth alg
- احراز
اصالت
بستههای
کانال داده
و (در صورت
فعال بودن)
بستههای
کانال
کنترل tls-auth با
HMAC با
استفاده از
الگوریتم
خلاصه پیام
alg. (پیشفرض
SHA1 است).
الگوریتم HMAC
یک
الگوریتم
احراز
اصالت پیام
(MAC) رایج است
که از یک
رشته داده،
یک
الگوریتم
هش امن و یک
کلید برای
تولید یک
امضای
دیجیتال
استفاده
میکند.
پروتکل کانال داده OpenVPN از روش encrypt-then-mac استفاده میکند (یعنی ابتدا یک بسته را رمزگذاری میکند سپس متن رمزشده حاصل را HMAC میکند)، که از حملات padding oracle جلوگیری میکند.
اگر یک حالت رمز AEAD (مانند GCM) انتخاب شود، الگوریتم --auth مشخصشده برای کانال داده نادیده گرفته میشود و روش احراز اصالت رمز AEAD به جای آن استفاده میشود. توجه داشته باشید که alg همچنان خلاصه استفادهشده برای tls-auth را تعیین میکند.
در حالت رمزنگاری کلید ایستا (static-key)، کلید HMAC در پرونده کلید تولید شده توسط --genkey گنجانده میشود. در حالت TLS، کلید HMAC به صورت پویا تولید شده و بین همتاها از طریق کانال کنترل TLS به اشتراک گذاشته میشود. اگر OpenVPN بستهای با HMAC نامعتبر دریافت کند، آن بسته را دور میاندازد (drop). معمولاً HMAC مقدار ۱۶ یا ۲۰ بایت به هر بسته اضافه میکند. برای غیرفعال کردن احراز اصالت، alg=none را تنظیم کنید.
برای اطلاعات بیشتر درباره HMAC به https://tools.ietf.org/html/rfc2104 مراجعه کنید.
- --cipher alg
- این گزینه دیگر نباید در حالت TLS استفاده شود و هنوز به دو دلیل وجود دارد:
- سازگاری با پیکربندیهای قدیمی که هنوز آن را به همراه دارند؛
- اجازه دادن به کاربرانی که به همتاهای OpenVPN قدیمیتر از نسخه 2.6.0 متصل میشوند تا --cipher را به همان روش طرف مقابل پیکربندی کنند. این میتواند از هشدارهای اندازه MTU/فریم جلوگیری کند.
پیش از 2.4.0، این گزینه برای انتخاب رمزی که باید روی کانال داده پیکربندی شود استفاده میشد، با این حال، نسخههای بعدی معمولاً این دستورالعمل را به نفع یک رمز مذاکرهشده نادیده میگرفتند. از نسخه 2.6.0 به بعد، این گزینه هنگام پیکربندی رمز در حالت TLS همیشه نادیده گرفته میشود.
اگر مایل به مشخص کردن رمز مورد استفاده در کانال داده هستید، لطفاً --data-ciphers (برای مذاکره عادی) و --data-ciphers-fallback (برای یک گزینه جایگزین زمانی که مذاکره نمیتواند انجام شود چون همتای دیگر قدیمی است یا مذاکره را غیرفعال کرده است) را ببینید.
برای مشاهده رمزهای موجود در OpenVPN، از گزینه --show-ciphers استفاده کنید.
برای غیرفعال کردن رمزنگاری، alg را روی none تنظیم کنید.
- --compress algorithm
- منسوخشده
فعالسازی
یک
الگوریتم
فشردهسازی.
فشردهسازی
معمولاً
توصیه
نمیشود.
تونلهای VPN
که از
فشردهسازی
استفاده
میکنند در
معرض بردار
حمله VORACLE
هستند.
همچنین
پارامتر migrate
در زیر را
ببینید.
پارامتر algorithm میتواند lzo، lz4، lz4-v2، stub، stub-v2، migrate یا خالی باشد. LZO و LZ4 الگوریتمهای فشردهسازی متفاوتی هستند که LZ4 عموماً بهترین کارایی را با کمترین مصرف CPU ارائه میدهد.
گونههای lz4-v2 و stub-v2 چارچوببندی بهتری را پیادهسازی میکنند که در صورت عدم امکان فشردهسازی بستهها، سرباری اضافه نمیکند. تمام گونههای دیگر در مقایسه با نبود چارچوببندی فشردهسازی، همیشه یک بایت اضافی برای چارچوببندی میافزایند.
بهویژه stub-v2 اساساً با نبود فشردهسازی و نبود چارچوببندی فشردهسازی یکسان است زیرا سرآیند آن نسخه ۵ IP را در پیکربندی tun مشخص میکند و میتواند برای غیرفعالسازی کامل فشردهسازی در کلاینتها استفاده (یا سوءاستفاده) شود. (گزینه migrate در زیر را ببینید)
اگر پارامتر algorithm مقدار stub، stub-v2 یا خالی باشد، فشردهسازی خاموش خواهد شد، اما چارچوببندی بسته برای فشردهسازی همچنان فعال میماند و اجازه میدهد تنظیمات متفاوتی بعداً push شود. علاوه بر این، stub و stub-v2 اعلان پشتیبانی از فشردهسازی lzo و lz4 را از طریق متغیرهای IV_ به سرور غیرفعال میکنند.
نکته: گزینه stub (یا خالی) با گزینه قدیمیتر --comp-lzo no سازگار نیست.
استفاده از migrate به عنوان الگوریتم فشردهسازی، حالت مهاجرت ویژهای را فعال میکند. این قابلیت امکان گذار از گزینههای --compress/--comp-lzo به نبود فشردهسازی را فراهم میسازد. این گزینه سرور را روی حالت بدون فشردهسازی تنظیم میکند و سرور برای تمام کلاینتهایی که فشردهسازی در پیکربندی آنها وجود ندارد، رفتاری یکسان با سروری بدون گزینه فشردهسازی خواهد داشت. با این حال، اگر کلاینتی شناسایی شود که نشاندهنده استفاده از فشردهسازی باشد (از طریق OCC)، سرور در صورت پشتیبانی کلاینت بهطور خودکار --push compress stub-v2 را به پیکربندی ویژه کلاینت اضافه میکند و در غیر این صورت به comp-lzo no تغییر وضعیت داده و --push comp-lzo را به پیکربندی ویژه کلاینت اضافه میکند.
*ملاحظات امنیتی*
فشردهسازی و رمزنگاری ترکیبی حساس است. اگر یک مهاجم بتواند (بخشهایی از) متن آشکار بستههای حاوی اطلاعات محرمانه را بداند یا کنترل کند، در صورت فعال بودن فشردهسازی ممکن است بتواند اطلاعات محرمانه را استخراج کند. برای مثال حملات CRIME و BREACH روی TLS و VORACLE روی VPNها را ببینید که از این روش برای شکستن رمزنگاری سوءاستفاده میکنند. اگر کاملاً مطمئن نیستید که موارد بالا در مورد ترافیک شما صدق نمیکند، توصیه میشود فشردهسازی را فعال نکنید.
به همین دلیل پشتیبانی از فشردهسازی از نسخههای کنونی OpenVPN حذف شده است. این برنامه همچنان بستههای فشردهشده دریافتی از طریق اتصال VPN را از حالت فشرده خارج میکند اما هرگز هیچ بسته خروجی را فشرده نخواهد کرد.
- --comp-lzo mode
- منسوخشده
فعالسازی
الگوریتم
فشردهسازی
LZO.
فشردهسازی
معمولاً
توصیه
نمیشود.
تونلهای VPN
که از
فشردهسازی
استفاده
میکنند در
معرض بردار
حمله VORACLE
هستند.
به طرف دیگر اتصال اجازه میدهد از فشردهسازی LZO استفاده کند. به دلیل تفاوت در قالب بسته، این ممکن است ۱ بایت اضافی به ازای هر بسته اضافه کند. در نسخههای کنونی OpenVPN هیچ فشردهسازی واقعی رخ نخواهد داد.
مقدار mode میتواند yes، no یا adaptive باشد اما دیگر هیچ تغییر رفتاری واقعی نخواهد داشت.
- --comp-noadapt
- منسوخشده این گزینه دیگر هیچ تأثیری ندارد زیرا نسخههای کنونی OpenVPN هرگز بستههای خروجی را فشرده نمیکنند.
- --key-direction
- روشی جایگزین برای تعیین پارامتر اختیاری direction برای گزینه --tls-auth. هنگام استفاده از پروندههای درونخطی مفید است (بخش پروندههای درونخطی را ببینید).
- --data-ciphers cipher-list
- محدود کردن
رمزهای
مجاز برای
مذاکره به
رمزهای
موجود در
cipher-list.
پارامتر
cipher-list فهرستی
از رمزهای
جداشده با
دونقطه (:)
است و در
صورت در
دسترس بودن
Chacha20-Poly1305 به صورت
پیشفرض
AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305 و در
غیر این
صورت AES-256-GCM:AES-128-GCM
است.
برای سرورها، نخستین رمز از cipher-list که توسط کلاینت نیز پشتیبانی شود، به کلاینتهایی که از مذاکره رمز پشتیبانی میکنند push خواهد شد.
برای جزئیات بیشتر بخش مربوط به Data channel cipher negotiation را ببینید. بهویژه اگر نیاز به پشتیبانی از کلاینتهای با نسخههای قدیمیتر از OpenVPN 2.4 دارید!
از OpenVPN 2.6 به بعد، یک رمز میتواند با پیشوند ? مشخص شود تا به عنوان اختیاری علامتگذاری گردد. این امکان را فراهم میکند تا رمزهایی در فهرست قرار گیرند که ممکن است در همه پلتفرمها موجود نباشند. برای نمونه AES-256-GCM:AES-128-GCM:?CHACHA20-POLY1305 تنها در صورتی Chacha20-Poly1305 را فعال میکند که کتابخانه SSL زیربنایی (و پیکربندی آن) از آن پشتیبانی کند.
از OpenVPN 2.7 به بعد کلیدواژه ویژه DEFAULT میتواند در رشته استفاده شود و با رمزهای پیشفرض جایگزین گردد. این میتواند برای افزودن یک رمز مجاز دیگر به فهرست رمزهای مجاز استفاده شود، مانند DEFAULT:AES-192-CBC برای استفاده از رمزهای پیشفرض و همچنین مجاز شمردن AES-192-CBC.
مذاکره رمز فقط در حالت کلاینت-سرور فعال است. یعنی اگر --mode روی server تنظیم شده باشد (سمت سرور، با تعیین --server اعمال میشود)، یا اگر --pull مشخص شده باشد (سمت کلاینت، با تعیین --client اعمال میشود).
اگر در طول مذاکره رمز، هیچ رمز مشترکی یافت نشود، اتصال قطع میشود. برای پشتیبانی از کلاینتهای قدیمی/سرورهای قدیمی که از مذاکره رمز پشتیبانی نمیکنند، --data-ciphers-fallback را ببینید.
اگر --compat-mode روی نسخهای قدیمیتر از 2.5.0 تنظیم شده باشد، رمز مشخصشده توسط --cipher در صورت عدم وجود، به --data-ciphers الحاق خواهد شد.
طول این فهرست پس از تبدیل به رمزهای OpenVPN به ۱۲۷ نویسه محدود شده است.
این گزینه در OpenVPN 2.4 به نام --ncp-ciphers شناخته میشد اما برای انعکاس دقیقتر معنای آن، در OpenVPN 2.5 به --data-ciphers تغییر نام یافت.
- --data-ciphers-fallback alg
- پیکربندی
رمزنگاری (cipher)
مورد
استفاده به
عنوان
پشتیبان،
در صورتی که
نتوانیم
تعیین کنیم
همتا (peer) مایل
به استفاده
از کدام
رمزنگاری
است.
این گزینه فقط باید برای اتصال به همتاهایی لازم باشد که نسخه OpenVPN 2.3 یا نسخههای قدیمیتر را اجرا میکنند و با --enable-small پیکربندی شدهاند (معمولاً در مسیریابها یا سایر دستگاههای تعبیهشده استفاده میشود).
- --allow-deprecated-insecure-static-crypto
- منسوخ شده این گزینه اجازه استفاده از OpenVPN بدون TLS را میدهد. این گزینه منسوخ شده است و در OpenVPN 2.8 حذف خواهد شد.
- --tran-window n
- پنجره گذار -- کلید قدیمی ما میتواند به مدت این تعداد ثانیه پس از شروع مذاکره مجدد کلید جدید فعال بماند (پیشفرض 3600 ثانیه). این ویژگی امکان گذار روان از کلید قدیمی به جدید را فراهم میکند و توالی مذاکره مجدد کلید را از مسیر حیاتی ارسال دادههای تونل حذف میکند.
- --force-tls-key-material-export
- این گزینه فقط در --mode server در دسترس است و استفاده از Keying Material Exporters (RFC 5705) را برای کلاینتها اجباری میکند. این میتواند برای شبیهسازی محیطی استفاده شود که در آن کتابخانه رمزنگاری دیگر از روش قدیمیتر برای تولید کلیدهای کانال داده پشتیبانی نمیکند. این گزینه به عنوان یک گزینه آزمایشی در نظر گرفته شده است و ممکن است در نسخههای آینده OpenVPN بدون اطلاع قبلی حذف شود.
گزینههای کلاینت (Client Options)
گزینههای کلاینت هنگام اتصال به یک سرور OpenVPN استفاده میشوند که در پیکربندی آن از --server، --server-bridge یا --mode server استفاده شده است.
- --allow-pull-fqdn
- به کلاینت اجازه میدهد نامهای DNS را (بهجای محدود بودن به آدرسهای IP) برای --ifconfig، --route و --route-gateway از سرور دریافت کند.
- --allow-recursive-routing
- هنگامی که این گزینه تنظیم شده باشد، OpenVPN بستههای ورودی tun را که مقصدی یکسان با میزبان دارند دور نمیاندازد (drop نمیکند).
- --auth-token token
- این
گزینهای
نیست که
مستقیماً
در هیچ فایل
پیکربندی
استفاده
شود، بلکه
این گزینه
از طریق یک
اسکریپت
--client-connect یا یک --plugin
که به
فراخوانیهای
OPENVPN_PLUGIN_CLIENT_CONNECT یا
OPENVPN_PLUGIN_CLIENT_CONNECT_V2 متصل
است ارسال (push)
میشود. این
گزینه
امکان
جایگزینی
گذرواژه
کلاینت با
یک توکن
احراز هویت
را در طول
چرخه حیات
کلاینت OpenVPN
فراهم
میکند.
هر زمان که اتصال مجدداً مذاکره شود و اسکریپت --auth-user-pass-verify یا --plugin با استفاده از قلاب OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY فعال گردد، این توکن را بهجای گذرواژه ارائهشده توسط کاربر منتقل میکند. توکن احراز هویت تنها با یک اتصال مجدد کامل قابل بازنشانی است که در آن سرور بتواند گزینههای جدید را به کلاینت ارسال کند. پس از تنظیم توکن احراز هویت، گذرواژه واردشده توسط کاربر هرگز حفظ نمیشود. اگر سمت سرور OpenVPN توکن احراز هویت را رد کند، کلاینت یک AUTH_FAILED دریافت کرده و ارتباط قطع میشود.
هدف از این کار، فعالسازی روشهای احراز هویت دو مرحلهای مانند HOTP یا TOTP است تا بدون نیاز به دریافت کد OTP جدید در هر بار مذاکره مجدد اتصال استفاده شوند. کاربرد دیگر، ذخیره موقت دادههای احراز هویت در سمت کلاینت بدون نیاز به ذخیره گذرواژه کاربر در حافظه در طول مدت نشست است.
برای استفاده از این ویژگی، اسکریپت --client-connect یا --plugin باید عبارت
push "auth-token UNIQUE_TOKEN_VALUE"
را در فایل/بافر دادههای پیکربندی پویا قرار دهد. این کار باعث میشود سرور OpenVPN این مقدار را به کلاینت ارسال کند، که گذرواژه محلی را با UNIQUE_TOKEN_VALUE جایگزین میکند.
کلاینتهای جدیدتر (+2.4.7) پس از یک احراز هویت ناموفق به روش گذرواژه اصلی بازمیگردند. کلاینتهای قدیمیتر به استفاده از مقدار توکن ادامه داده و بر اساس --auth-retry عمل میکنند.
- --auth-token-user base64username
- گزینه
همراه برای
--auth-token. این
گزینه
امکان
بازنویسی
نام کاربری
مورد
استفاده
کلاینت
هنگام
احراز هویت
مجدد با auth-token
را فراهم
میکند.
همچنین
امکان
استفاده از
--auth-token را در
ساختارهایی
که معمولاً
از نام
کاربری و
گذرواژه
استفاده
نمیکنند
فراهم
میسازد.
نام کاربری باید به صورت base64 کدگذاری شده باشد.
- --auth-user-pass
- احراز هویت
با سرور با
استفاده از
نام
کاربری/گذرواژه.
نحوهای معتبر:
auth-user-pass auth-user-pass up
اگر up مشخص شده باشد، باید فایلی حاوی نام کاربری/گذرواژه در ۲ خط باشد یا پرچمی به نام username-only تا نشان دهد نباید گذرواژهای درخواست شود. در حالت اول، اگر خط گذرواژه در فایل موجود نباشد، OpenVPN آن را درخواست خواهد کرد.
اگر up حذف شود، نام کاربری/گذرواژه از طریق کنسول درخواست خواهد شد.
این گزینه همچنین میتواند به صورت درونخطی قرار گیرد
<auth-user-pass> username [password] </auth-user-pass>
که در آن گذرواژه اختیاری است، و در صورت عدم وجود، از طریق کنسول درخواست میشود.
پرچم username-only برای استفاده با احراز هویت SSO در نظر گرفته شده است. در این حالت از کاربر نام کاربری خواسته میشود ولی گذرواژه خیر. بهجای آن، یک گذرواژه ساختگی [[BLANK]] به صورت داخلی تولید شده و به سرور ارسال میشود. برای چگونگی تأثیر این گزینه بر اعلان نام کاربری/گذرواژه از طریق واسط مدیریتی، به management-notes.txt مراجعه کنید. برای کنسول، این گزینه صرفاً اعلان درخواست گذرواژه را حذف میکند.
پرچم username-only نمیتواند همراه با تعبیه نام کاربری و/یا گذرواژه در فایل پیکربندی، یا هنگام خواندن آنها از یک فایل خارجی استفاده شود. در چنین مواردی، اگر فقط نام کاربری مد نظر است و درخواستی برای گذرواژه لازم نیست، یک گذرواژه ساختگی مانند 'no_passsword' نیز باید تعبیه شود. این پرچم همچنین با گزینه --static-challenge و پروتکل قدیمی dynamic challenge ناسازگار است.
پیکربندی سرور باید یک اسکریپت --auth-user-pass-verify را برای اعتبارسنجی نام کاربری/گذرواژه ارائهشده توسط کلاینت تعیین کند.
- --auth-retry type
- نحوه
پاسخدهی OpenVPN
به خطاهای
اعتبارسنجی
نام
کاربری/گذرواژه
را کنترل
میکند،
مانند پاسخ
سمت کلاینت
به پیام AUTH_FAILED
از سوی سرور
یا شکست در
اعتبارسنجی
گذرواژه
کلید خصوصی.
معمولاً برای جلوگیری از مهلک (fatal) بودن خطاهای احراز هویت در سمت کلاینت و اجازه درخواست مجدد نام کاربری/گذرواژه در صورت بروز خطا استفاده میشود.
پیام AUTH_FAILED زمانی توسط سرور ایجاد میشود که کلاینت در احراز هویت --auth-user-pass شکست بخورد، یا زمانی که اسکریپت سمت سرور --client-connect هنگام تلاش کلاینت برای اتصال، وضعیت خطا برگرداند.
type میتواند یکی از موارد زیر باشد:
- none
- کلاینت با یک خطای مهلک خارج میشود (این حالت پیشفرض است).
- nointeract
- کلاینت بدون درخواست مجدد برای نام کاربری/گذرواژه --auth-user-pass اتصال را دوباره امتحان میکند. از این گزینه برای کلاینتهای بدون ناظر (unattended) استفاده کنید.
- interact
- کلاینت قبل از تلاش مجدد برای برقراری اتصال، نام کاربری/گذرواژه --auth-user-pass و/یا گذرواژه کلید خصوصی را دوباره درخواست میکند.
توجه داشته باشید که با وجود اینکه این گزینه را نمیتوان push کرد، میتوان آن را از طریق رابط مدیریتی کنترل کرد.
- --client
- یک دستورالعمل کمکی برای سادهسازی پیکربندی حالت کلاینت در OpenVPN. این دستورالعمل معادل موارد زیر است:
pull tls-client
- --client-nat args
- این گزینه
کلاینتِ
قابل push، یک
قانون NAT
یکبهیک و
بدون وضعیت
(stateless) روی
آدرسهای
بستهها (نه
درگاهها)
تنظیم
میکند و در
مواردی
مفید است که
مسیرها یا
تنظیمات ifconfig
ارسالشده
(pushed) به کلاینت
باعث تداخل
در
آدرسدهی IP
شوند.
نحو معتبر:
client-nat snat|dnat network netmask alias
نمونهها:
client-nat snat 192.168.0.0 255.255.0.0 10.64.0.0 client-nat dnat 10.64.0.0 255.255.0.0 192.168.0.0
آرگومانهای network و netmask (برای مثال 192.168.0.0 255.255.0.0) دید محلی منبع را از دیدگاه کلاینت تعریف میکنند، در حالی که alias (برای مثال 10.64.0.0) دید دوردست را از دیدگاه سرور با استفاده از همان netmask مشخص میکند.
برای منابع متعلق به کلاینت از snat (یا NAT مبدأ) و برای منابع دوردست از dnat (یا NAT مقصد) استفاده کنید.
برای دریافت اطلاعات اشکالزدایی که تبدیل آدرسهای مبدأ/مقصد در بستهها را نشان میدهد، مقدار --verb 6 را تنظیم کنید.
- --connect-retry args
- به مدت n
ثانیه بین
تلاشهای
اتصال صبر
میکند
(پیشفرض 1).
تلاشهای
مکرر اتصال
مجدد پس از
۵ بار تلاش
برای هر remote،
با دو برابر
کردن زمان
انتظار پس
از هر تلاش
ناموفق
کُندتر
میشوند.
نحوهای معتبر:
connect retry n connect retry n max
اگر آرگومان اختیاری max مشخص شود، حداکثر زمان انتظار بر حسب ثانیه به آن مقدار محدود میشود (پیشفرض 300).
- --connect-retry-max n
- n تعداد دفعاتی را مشخص میکند که هر مدخل --remote یا <connection> امتحان میشود. تعیین n به صورت 1 هر مدخل را دقیقاً یک بار امتحان میکند. اتصال موفق این شمارنده را بازنشانی میکند (پیشفرض unlimited).
- --connect-timeout n
- به --server-poll-timeout مراجعه کنید.
- --dns args
- پیکربندی DNS
کلاینت
برای
استفاده با
اتصال.
نحوهای معتبر:
dns search-domains domain [domain ...] dns server n address addr[:port] [addr[:port] ...] dns server n resolve-domains domain [domain ...] dns server n dnssec yes|optional|no dns server n transport DoH|DoT|plain dns server n sni server-name
دستورالعمل --dns search-domains یک یا چند نام دامنه را دریافت میکند تا به عنوان پسوندهای دامنه DNS اضافه شوند. اگر این گزینه چندین بار در یک پیکربندی تکرار شود، دامنهها ضمیمه میشوند؛ بنابراین مثلاً نامهای دامنه ارسالشده توسط سرور موارد تعریفشده محلی را اصلاح و تکمیل میکنند.
دستورالعمل --dns server برای پیکربندی سرور DNS به شماره n استفاده میشود. شناسه سرور n باید مقداری بین -128 و 127 باشد. برای گزینههای DNS server ارسالشده (pushed)، این مقدار باید بین 0 و 127 باشد. شناسه سرور برای گروهبندی گزینهها و همچنین مرتبسازی فهرست سرورهای DNS پیکربندیشده استفاده میشود؛ شمارههای کمتر در ابتدا قرار میگیرند. سرورهای DNS ارسالشده به کلاینت، سرورهای DNS پیکربندیشده قبلی با همان شناسه را جایگزین میکنند. تنها گروه گزینههای مربوط به کمترین شناسه سرور اعمال میشود.
گزینه address آدرس(های) IPv4 و/یا IPv6 سرور DNS را پیکربندی میکند. حداکثر هشت آدرس برای هر سرور DNS قابل تعیین است. به صورت اختیاری میتوان یک درگاه را پس از علامت دونقطه اضافه کرد. در صورت افزودن درگاه، آدرسهای IPv6 باید داخل قلاب (براکت) قرار گیرند.
گزینه resolve-domains یک یا چند دامنه DNS را برای تعریف یک پیکربندی split-dns یا dns-routing میگیرد که در آن فقط دامنههای مشخصشده توسط سرور تحلیل (resolve) میشوند. سیستمهایی که از پیکربندی دقیق و جزئی دامنههای DNS پشتیبانی نمیکنند، این تنظیم را نادیده خواهند گرفت.
گزینه dnssec برای پیکربندی اعتبارسنجی رکوردهای DNSSEC استفاده میشود. در حالی که عملکرد دقیق ممکن است برای تحلیلکنندهها (resolvers) در سیستمهای مختلف متفاوت باشد، مقدار yes احتمالاً اعتبارسنجی را اجباری میکند، no آن را غیرفعال میسازد، و optional از آن به صورت فرصتطلبانه استفاده میکند.
گزینه transport قابلیت DNS-over-HTTPS (DoH) یا DNS-over-TLS (DoT) را برای یک سرور DNS فعال میکند. گزینه sni میتواند همراه با آنها برای مشخص کردن server-name جهت TLS server name indication به کار رود.
هر سرور باید حداقل یک آدرس پیکربندیشده داشته باشد تا پیکربندی معتبر باشد. تمام گزینههای دیگر را میتوان نادیده گرفت و حذف کرد.
توجه داشته باشید که ممکن است همه گزینهها روی تمام پلتفرمها پشتیبانی نشوند. به محض پیادهسازی پشتیبانی برای سیستمهای مختلف، اطلاعات مربوط به نحوه برخورد با گزینههای پشتیبانینشده به اینجا اضافه خواهد شد.
گزینه --dns در نهایت دستورالعمل --dhcp-option را منسوخ خواهد کرد. تا آن زمان، پیکربندی را در مکانهایی که --dhcp-option قرار میدهد جایگزین میکند، به طوری که --dns بر --dhcp-option اولویت خواهد داشت. بنابراین، امروزه میتوان از --dns برای مهاجرت از --dhcp-option استفاده کرد.
فقط ویندوز:
- 1.
- اگر tap-windows6 در حال استفاده باشد، سرورهای DNS به طور پیشفرض توسط DHCP تنظیم میشوند. در این حالت فقط --dns search-domains و --dns server n address .. با کمترین مقدار n تفسیر میشوند. همه گزینههای دیگر --dns نادیده گرفته میشوند. استفاده از درایور dco روش توصیهشده برای بهرهمندی از این ویژگیهای جدید است.
- 2.
- اگر --dns server n resolve-domains در حال استفاده باشد، آدرسهای سرور DNS متناظر با n تنها در صورتی روی رابط تنظیم میشوند که search-domains نیز مشخص شده باشد. در غیر این صورت این آدرسهای DNS فقط برای قواعد NRPT جهت split-DNS استفاده میشوند.
- --explicit-exit-notify n
- در حالت
کلاینت UDP یا
حالت
نقطه-به-نقطه
(point-to-point)، اگر
تونل
مجدداً
راهاندازی
شود یا
فرآیند OpenVPN
خارج شود،
اعلان خروج
را به
سرور/همتا
ارسال
میکند. در
حالت
کلاینت،
هنگام
خروج/راهاندازی
مجدد، این
گزینه به
سرور اطلاع
میدهد تا
به جای
انتظار
برای اتمام
مهلت زمانی
(timeout)، فوراً
شیء نمونه
کلاینت خود
را ببندد.
اگر هر دو سرور و کلاینت از ارسال این پیام از طریق کانال کنترل پشتیبانی کنند، پیام به عنوان یک پیام کانال کنترل ارسال میشود. در غیر این صورت پیام به عنوان پیام کانال داده ارسال خواهد شد، که توسط همتاهای دارای تخلیه بار سختافزاری (offloaded) کانال داده نادیده گرفته میشود.
پارامتر n (در صورت عدم وجود، پیشفرض 1) حداکثر تعداد تلاشهای کلاینت برای ارسال مجدد پیام اعلان خروج در حالت کانال داده را کنترل میکند.
در حالت سرور UDP، دستور کانال کنترل RESTART را به کلاینتهای متصل ارسال میکند. پارامتر n (در صورت عدم وجود، پیشفرض 1) رفتار کلاینت را کنترل میکند. با n = 1 کلاینت تلاش میکند مجدداً به همان سرور متصل شود، با n = 2 کلاینت به سرور بعدی میرود.
برنامه OpenVPN هیچ اعلان خروجی ارسال نخواهد کرد مگر اینکه این گزینه فعال باشد.
- --inactive args
- باعث
میشود OpenVPN پس
از n ثانیه
عدم فعالیت
روی دستگاه
TUN/TAP خارج شود.
طول مدت عدم
فعالیت از
زمان آخرین
بسته ورودی
یا خروجی
تونل
محاسبه
میشود.
مقدار
پیشفرض 0
ثانیه است
که این
ویژگی را
غیرفعال
میکند.
نحوهای معتبر:
inactive n inactive n bytes
اگر پارامتر اختیاری bytes مشخص شود، در صورتی که در مدت n ثانیه کمتر از bytes ترافیک مجموع ورودی/خروجی روی دستگاه tun/tap تولید شود، خارج میشود.
در هر صورت، بستههای پینگ داخلی OpenVPN (که فقط پیامهای keepalive هستند) و بستههای کنترل TLS به عنوان "فعالیت" در نظر گرفته نمیشوند و به عنوان ترافیک نیز شمارش نمیشوند، زیرا به صورت داخلی توسط OpenVPN استفاده شده و نشاندهنده فعالیت واقعی کاربر نیستند.
نکته: در FreeBSD همراه با DCO، به دلیل محدودیتهای پلتفرم، پاراگراف قبلی صادق نیست. در آن حالت، سربار کپسولهسازی و بستههای keepalive شمارش میشوند؛ بنابراین استفاده از این ویژگی به مقدار bytes به اندازه کافی بزرگ نیاز دارد تا این مقادیر اضافی را به حساب آورد.
- --proto-force p
- هنگام
پیمایش در
نمایههای
اتصال (connection profiles)،
فقط
نمایههایی
را در نظر
میگیرد که
از پروتکل p
(tcp | udp)
استفاده
میکنند.
توجه داشته باشید که این گزینه مشخصاً فقط بر اساس پروتکل لایه انتقال، یعنی UDP یا TCP فیلتر میکند. این موضوع بر اینکه IPv4 یا IPv6 به عنوان پروتکل IP استفاده شود تاثیری ندارد.
به دلایل پیادهسازی، این گزینه پسوندهای 4 و 6 را هنگام تعیین پروتکل میپذیرد (یعنی udp4 / udp6 / tcp4 / tcp6). با این حال، رفتار اینها همانند حالت بدون پسوند است و باید برای جلوگیری از سردرگمی از آنها اجتناب شود.
- --pull
- این گزینه
باید روی
کلاینتی
استفاده
شود که به
یک سرور
چندکلاینتی
متصل
میشود. این
گزینه به OpenVPN
مشخص
میکند که
باید
گزینههای
ارائهشده
(push شده) از سمت
سرور را
بپذیرد، به
شرطی که
بخشی از
مجموعه
مجاز
گزینههای
قابل ارائه
باشند (توجه
داشته
باشید که
گزینه --pull
توسط --client به
طور ضمنی
فعال
میشود).
به طور خاص، --pull به سرور اجازه میدهد تا مسیرها (routes) را به کلاینت بفرستد، بنابراین در شرایطی که به سرور برای داشتن کنترل بر جدول مسیریابی کلاینت اعتماد ندارید، نباید از --pull یا --client استفاده کنید.
- --pull-filter args
- فیلتر کردن
گزینههای
ارسال شده
از سرور به
کلاینت، در
سمت کلاینت.
نحوهای معتبر:
pull-filter accept text pull-filter ignore text pull-filter reject text
گزینههای دریافتی از سرور را در صورتی که گزینه با text شروع شود فیلتر میکند. پرچم عملیاتی accept به گزینه اجازه میدهد، ignore آن را حذف میکند و reject یک خطا مشخص کرده و راهاندازی مجدد با سیگنال SIGUSR1 را فعال میکند. فیلترها میتوانند چندین بار مشخص شوند و هر فیلتر به ترتیبی که تعریف شده اعمال میشود. فیلتر کردن هر گزینه به محض یافتن تطابق متوقف خواهد شد. گزینههای تطبیقنیافته به طور پیشفرض پذیرفته میشوند.
مقایسه پیشوند برای تطبیق text با گزینه دریافتی استفاده میشود، به طوری که
pull-filter ignore "route"
تمام گزینههای ارسالشده را که با route شروع میشوند حذف میکند، که برای مثال شامل route-gateway نیز خواهد بود. برای گنجاندن فاصلهها، text را داخل گیومه قرار دهید.
pull-filter accept "route 192.168.1." pull-filter ignore "route "
تمام مسیرهایی را که با 192.168.1 شروع نمیشوند حذف میکند.
توجه داشته باشید که reject ممکن است باعث یک چرخه مکرر از شکست و تلاش مجدد برای اتصال شود، مگر اینکه چندین ریموت مشخص شده باشد و اتصال به ریموت بعدی با موفقیت انجام شود. برای نادیده گرفتن بیسر و صدای یک گزینه ارسالشده از سرور، از ignore استفاده کنید.
هشدار: نمیتوان به pull-filter به عنوان یک اقدام امنیتی جهت محافظت در برابر گزینههای مخرب یا نامناسب ارائهشده توسط سرور اتکا کرد. به عنوان مثال، فیلتر میتواند با ارسال گزینههایی با فاصلههای اضافی بین کلمات یا سایر تغییرات در قالببندی دور زده شود.
- --push-peer-info
- ارسال اطلاعات اضافی درباره کارخواه به سرور. دادههای زیر همیشه به سرور ارسال میشوند:
- IV_VER=<version>
- نگارش OpenVPN کارخواه
- IV_PLAT=[linux|solaris|openbsd|mac|netbsd|freebsd|win]
- سکوی سیستمعامل کارخواه
- IV_PROTO
- جزئیات افزونههای پروتکل که همتا پشتیبانی میکند. این متغیر یک میدان بیتی است و بیتهای آن به شرح زیر تعریف میشوند:
- بیت ۰: رزرو شده، همیشه باید صفر باشد
- بیت ۱: همتا از سازوکار شناور peer-id پشتیبانی میکند
- بیت ۲: کارخواه انتظار یک push-reply دارد و سرور میتواند بدون منتظر ماندن برای دریافت push-request، این پاسخ را ارسال کند.
- بیت ۳: کارخواه قادر به اشتقاق کلید با استفاده از صادرکننده محتوای کلید بر اساس RFC5705 است.
- بیت ۴: کارخواه قادر به پذیرش آرگومانهای اضافی برای پیام AUTH_PENDING است.
- بیت ۵: کارخواه از انجام مذاکره قابلیتها در حالت P2P پشتیبانی میکند
- بیت ۶: کارخواه قادر به تجزیه و دریافت گزینه ارسالشده --dns است
- بیت ۷: کارخواه قادر به ارسال اعلان خروج از طریق کانال کنترلی با استفاده از پیام EXIT است. همچنین، کارخواه گزینه ارسالشده protocol-flags را برای قابلیت EKM میپذیرد
- بیت ۸: کارخواه قادر به پذیرش پیامهای AUTH_FAILED,TEMP است
- بیت ۹: کارخواه قادر به پشتیبانی از tls-crypt پویا است
- بیت ۱۰: کارخواه قادر به پشتیبانی از کلیدهای data epoch است
- IV_NCP=2
- رمزهای قابل مذاکره، کارخواه از --cipher ارسالشده توسط سرور پشتیبانی میکند؛ مقدار ۲ یا بیشتر نشان میدهد که کارخواه از AES-GCM-128 و AES-GCM-256 پشتیبانی میکند. متغیر IV_NCP به نفع IV_CIPHERS منسوخ شده است.
- IV_CIPHERS=<data-ciphers>
- کارخواه فهرست رمزهای پشتیبانیشده را که با گزینه --data-ciphers پیکربندی شدهاند به سرور اعلام میکند.
- IV_MTU=<max_mtu>
- کارخواه پشتیبانی از MTU قابلارسال و بیشینه MTU قابلپذیرش را اعلام میکند.
- IV_GUI_VER=<gui_id> <version>
- نگارش رابط کاربری در صورت در حال اجرا بودن، به عنوان مثال de.blinkt.openvpn 0.5.47 برای برنامه اندروید. این مقدار میتواند توسط رابط کاربری/گرافیکی کارخواه با استفاده از --setenv تنظیم شود.
- IV_SSO=[crtext,][openurl,][proxy_url]
- روشهای احراز هویت اضافی پشتیبانیشده توسط کارخواه. این مقدار میتواند توسط رابط کاربری/گرافیکی کارخواه با استفاده از --setenv تنظیم شود.
پرچمهای زیر به این بستگی دارند که کدام قالبهای فشردهسازی کامپایل شدهاند و آیا فشردهسازی توسط گزینهها مجاز است یا خیر. برای جزئیات بیشتر به بخش گزینههای پروتکل مراجعه کنید.
- IV_LZO=1
- در صورتی که کارخواه از فشردهسازی LZO پشتیبانی کند.
- IV_LZO_STUB=1
- در صورتی که کارخواه با قابلیت LZO stub ساخته شده باشد. این مورد تنها زمانی ارسال میشود که IV_LZO=1 ارسال نشده باشد. این بدان معناست که کارخواه میتواند با سروری که با --comp-lzo no پیکربندی شده ارتباط برقرار کند.
- IV_LZ4=1 and IV_LZ4v2=1
- در صورتی که کارخواه از فشردهسازی LZ4 پشتیبانی کند.
- IV_COMP_STUB=1 and IV_COMP_STUBv2=1
- در صورتی که کارخواه از فشردهسازی stub پشتیبانی کند. این بدان معناست که کارخواه میتواند با سروری که با --compress پیکربندی شده ارتباط برقرار کند.
هنگامی که --push-peer-info فعال باشد، اطلاعات تکمیلی شامل دادههای زیر خواهد بود:
- IV_HWADDR=<string>
- این مورد به عنوان یک شناسه یکتا و پایدار برای کارخواه در نظر گرفته شده است. مقدار رشته میتواند هر رشته اسکی (ASCII) خوانا تا ۶۴ بایت باشد. OpenVPN 2.x و برخی پیادهسازیهای دیگر از نشانی MAC واسط کارخواه که برای دسترسی به دروازه پیشفرض استفاده میشود، استفاده میکنند. اگر این رشته توسط کارخواه تولید شود، باید در نشستهای مستقل و ترجیحاً در نصبهای مجدد و ارتقاها سازگار و حفظ شود.
- IV_SSL=<version string>
- نگارش کتابخانه SSL مورد استفاده کارخواه، برای مثال OpenSSL 1.0.2f 28 Jan 2016.
- IV_PLAT_VER=x.y
- نگارش سیستمعامل، برای مثال 6.1 برای Windows 7. این مقدار میتواند توسط رابط کاربری/گرافیکی کارخواه با استفاده از --setenv تنظیم شود. در سیستمهای Windows این مورد به صورت خودکار توسط خود openvpn تعیین میشود. در سایر سکوها، OpenVPN به طور پیشفرض اطلاعات بازگردانده شده توسط فراخوان سیستمی uname() در فیلد release را ارسال میکند که معمولاً نگارش هسته در حال اجرا است. با این حال، این مورد به شدت به سیستم وابسته است.
- UV_<name>=<value>
- متغیرهای محیطی کارخواه که نام آنها با UV_ آغاز میشود.
- --remote args
- نام میزبان
دوردست یا
نشانی IP،
درگاه و
پروتکل.
نحوهای معتبر:
remote host remote host port remote host port proto
آرگومانهای port و proto اختیاری هستند. کلاینت OpenVPN تلاش خواهد کرد تا به یک سرور در host:port متصل شود. آرگومان proto پروتکل مورد استفاده در هنگام اتصال به میزبان دوردست را مشخص میکند و میتواند tcp یا udp باشد. برای اجبار اتصالات IPv4 یا IPv6، یک پسوند 4 یا 6 اضافه کنید؛ مانند udp4 / udp6 / tcp4 / tcp6.
در سمت کلاینت، میتوان چندین گزینهٔ --remote را برای افزونگی مشخص کرد که هر یک به یک سرور مجزای OpenVPN، به ترتیبی که در فهرست گزینههای --remote آمده است، اشاره دارند. مشخص کردن چندین گزینهٔ --remote برای این منظور، حالت خاصی از ویژگی عمومیتر نمایهٔ اتصال (connection-profile) است. مستندات <connection> را در زیر ببینید.
در صورت شکست اتصال، کلاینت به سراغ میزبان بعدی در فهرست میرود. توجه داشته باشید که در هر زمان معین، کلاینت OpenVPN حداکثر به یک سرور متصل خواهد بود.
مثالها:
remote server1.example.net remote server1.example.net 1194 remote server2.example.net 1194 tcp
- نکته:
- از آنجا که UDP
اتصالناپذیر
است، شکست
اتصال توسط
گزینههای
--ping و --ping-restart
تعریف
میشود.
همچنین، اگر از چندین گزینهٔ --remote استفاده میکنید، و دسترسیهای root را در کلاینت با --user و/یا --group کاهش میدهید، و کلاینت روی سیستمعاملی غیر از ویندوز اجرا میشود، در صورتی که کلاینت نیاز به تغییر سرور داشته باشد و آن سرور تنظیمات متفاوتی برای TUN/TAP یا مسیر (route) ارسال کند، ممکن است کلاینت دسترسیهای لازم برای بستن و بازگشایی مجدد رابط TUN/TAP را نداشته باشد. این امر میتواند باعث خروج کلاینت با یک خطای مهلک شود.
اگر --remote مشخص نشده باشد، OpenVPN به بستههای رسیده از هر نشانی IP گوش میدهد، اما تا زمانی که تمام آزمونهای احراز هویت را نگذرانند روی آنها عملیاتی انجام نمیدهد. این الزام احراز هویت برای تمام همتایان بالقوه برقرار است، حتی آنهایی که از نشانیهای IP شناختهشده و بهظاهر معتمد ارسال میشوند (جعل نشانی IP مبدأ در بستههای UDP بسیار آسان است).
هنگامی که در حالت TCP استفاده شود، --remote به عنوان یک فیلتر عمل کرده و اتصال از هر میزبانی را که با host مطابقت نداشته باشد، رد میکند.
اگر host یک نام DNS باشد که به چندین نشانی IP ترجمه میشود، OpenVPN آنها را به ترتیبی که getaddrinfo() سیستم ارائه میدهد امتحان خواهد کرد؛ بنابراین اولویتبندی و تصادفیسازی DNS توسط کتابخانهٔ سیستم انجام میشود. مگر اینکه نسخهٔ IP با مشخصهٔ پروتکل (پسوند 4/6) اجبار شده باشد، OpenVPN هر دو نشانی IPv4 و IPv6 را به ترتیبی که getaddrinfo() بازمیگرداند، امتحان خواهد کرد.
- --remote-random
- هنگامی که چندین نشانی/درگاه --remote مشخص شده باشد، یا اگر از نمایههای اتصال استفاده میشود، در ابتدا ترتیب فهرست را به عنوان نوعی راهکار پایه برای توازن بار، تصادفی میکند.
- --remote-random-hostname
- یک رشتهٔ تصادفی (۶ بایت، ۱۲ نویسهٔ شانزدهشانزدهی/hex) به نام میزبان اضافه میکند تا از کش شدن DNS جلوگیری شود. برای مثال، "foo.bar.gov" به "<random-chars>.foo.bar.gov" تغییر خواهد یافت.
- --resolv-retry n
- در صورت
ناموفق
بودن
ترجمهٔ نام
میزبان
برای --remote،
قبل از
اعلام شکست
به مدت n
ثانیه
ترجمه را
مجدداً
تلاش
میکند.
برای تلاش نامحدود، مقدار n را روی infinite تنظیم کنید.
به طور پیشفرض، --resolv-retry infinite فعال است. میتوانید با تنظیم n=0 آن را غیرفعال کنید.
- --preresolve
- ترجمهٔ
نامهای
میزبان
پیکربندیشده
در --remote، --local،
--http-proxy و --socks-proxy در
زمان
راهاندازی
و قبل از
برقراری
اتصال.
نشانیهای ترجمهشده کش شده و برای اتصالات مجدد دوباره استفاده میشوند، بنابراین OpenVPN پس از تلاش اولیه برای اتصال، این نامهای میزبان را مجدداً ترجمه نخواهد کرد. این ویژگی میتواند به پیکربندیهایی که در آنها هنگام غیرفعال بودن VPN، سرویس DNS در دسترس نیست کمک کند، اما ممکن است برای نامهای پویای DNS یا در زمان رومینگ بین شبکههایی که در دسترس بودن خانوادهٔ آدرس تغییر میکند (مانند DNS64/NAT64)، نتیجهٔ معکوس داشته باشد.
- --single-session
- پس از اتصال
اولیه به یک
همتای
دوردست،
هرگونه
اتصال جدید
را ممنوع
میکند.
استفاده از
این گزینه
به این معنی
است که یک
همتای
دوردست
نمیتواند
وصل شود،
قطع شود و
سپس دوباره
متصل گردد.
اگر دیمن با یک سیگنال یا --ping-restart بازنشانی شود، اجازهٔ یک اتصال جدید را خواهد داد.
میتوان از --single-session به همراه --ping-exit یا --inactive برای ایجاد یک نشست پویای یکتا که پس از اتمام خارج میشود، استفاده کرد.
- --server-poll-timeout n
- هنگام اتصال به سرور دوردست، قبل از امتحان کردن سرور بعدی، بیش از n ثانیه برای دریافت پاسخ منتظر نمیماند. مقدار پیشفرض 120 است. این مهلت زمانی شامل زمان انتظار پروکسی و اتصال TCP نیز میشود.
- --static-challenge args
- فعالسازی
پروتکل
چالش/پاسخ
ایستا
نحو معتبر:
static-challenge text echo [format]
متن چالش text به کاربر نمایش داده میشود که توضیح میدهد چه اطلاعاتی درخواست شده است. پرچم echo مشخص میکند که آیا ورودی کاربر باید روی صفحه نمایش داده شود یا خیر. مقادیر معتبر echo برابر با 0 یا 1 هستند. گزینه اختیاری format مشخص میکند که آیا گذرواژه و پاسخ باید با استفاده از پروتکل SCRV1 ترکیب شوند (format = scrv1) یا فقط الحاق گردند (format = concat). پیشفرض scrv1 است.
برای توضیحات درباره پروتکل چالش/پاسخ OpenVPN، پرونده management-notes.txt را در توزیع OpenVPN ببینید.
- --http-proxy args
- اتصال به
میزبان
دوردست از
طریق یک
پراکسی HTTP.
این گزینه
حداقل به یک
آرگومان
نشانی server و
port نیاز
دارد. در
صورت نیاز
به Proxy-Authenticate
مربوط به HTTP،
میتوان
نام یک
پرونده authfile
حاوی
نامکاربری
و گذرواژه
در ۲ خط را
مشخص کرد،
یا از stdin
برای
دریافت از
کنسول
استفاده
نمود.
همچنین
محتوای آن
میتواند
با گزینه
--http-proxy-user-pass در
پرونده
پیکربندی
مشخص شود
(بخش INLINE FILE SUPPORT را
ببینید).
آخرین آرگومان اختیاری auth-method است که باید یکی از none، basic یا ntlm2 باشد.
احراز هویت HTTP Digest نیز پشتیبانی میشود، اما فقط از طریق پرچمهای auto یا auto-nct (در زیر). این باید جایگزین آرگومان authfile شود.
پرچم auto باعث میشود OpenVPN به صورت خودکار auth-method را تشخیص دهد و در صورت نیاز، اعتبار نامکاربری/گذرواژه را از stdin یا رابط مدیریتی درخواست کند. این پرچم در OpenVPN نسخه ۲.۱ یا بالاتر وجود دارد.
پرچم auto-nct (بدون احراز هویت متنی آشکار) به OpenVPN دستور میدهد که روش احراز هویت را به طور خودکار تعیین کند، اما پروتکلهای احراز هویت ضعیف مانند HTTP Basic Authentication را رد کند.
نمونهها:
# no authentication http-proxy proxy.example.net 3128 # basic authentication, load credentials from file http-proxy proxy.example.net 3128 authfile.txt # basic authentication, ask user for credentials http-proxy proxy.example.net 3128 stdin # NTLM authentication, load credentials from file http-proxy proxy.example.net 3128 authfile.txt ntlm2 # determine which authentication is required, ask user for credentials http-proxy proxy.example.net 3128 auto # determine which authentication is required, but reject basic http-proxy proxy.example.net 3128 auto-nct # determine which authentication is required, but set credentials http-proxy proxy.example.net 3128 auto http-proxy-user-pass authfile.txt # basic authentication, specify credentials inline http-proxy proxy.example.net 3128 "" basic <http-proxy-user-pass> username password </http-proxy-user-pass>
توجه داشته باشید که پشتیبانی از پراکسیهای NTLMv1 در OpenVPN 2.7 حذف شد. اکنون ntlm یک نام مستعار برای ntlm2 است؛ یعنی OpenVPN همیشه تلاش خواهد کرد از احراز هویت NTLMv2 استفاده کند.
- --http-proxy-user-pass userpass
- بازنویسی
اطلاعات
نامکاربری/گذرواژه
برای --http-proxy.
اگر به صورت
یک گزینه
درونخطی
مشخص شود
(بخش INLINE FILE SUPPORT را
ببینید)، به
عنوان
نامکاربری/گذرواژه
جدا شده با
خط جدید
تفسیر
میشود.
هنگامی که
در خط فرمان
مشخص شود
مشابه
آرگومان
سوم --http-proxy به
عنوان یک
نام پرونده
تفسیر
میگردد.
نمونه:
<http-proxy-user-pass> username password </http-proxy-user-pass>
- --http-proxy-option args
- تنظیم گزینههای گسترشیافته پراکسی HTTP. به یک گزینه type به عنوان آرگومان و یک parameter اختیاری برای نوع نیاز دارد. برای تنظیم چندین گزینه تکرار شود.
- VERSION version
- تنظیم شماره نسخه HTTP روی version (پیشفرض 1.0).
- AGENT user-agent
- تنظیم رشته "User-Agent" برای HTTP روی user-agent.
- CUSTOM-HEADER name content
- سرآیند سفارشی را با نام name و محتوای content به عنوان محتوای سرآیند سفارشی HTTP اضافه میکند.
نمونهها:
http-proxy-option VERSION 1.1 http-proxy-option AGENT OpenVPN/2.4 http-proxy-option X-Proxy-Flag some-flags
- --socks-proxy args
- اتصال به میزبان دوردست از طریق یک پروکسی Socks5. یک آرگومان ضروری server مورد نیاز است. بهصورت اختیاری یک port (پیشفرض 1080) و authfile میتوانند داده شوند. پرونده authfile فایلی حاوی نامکاربری و گذرواژه در ۲ خط است، یا stdin میتواند برای درخواست ورودی از کنسول استفاده شود.
گزینههای سرور
از نسخه OpenVPN 2.0 به بعد، حالت سرور TCP/UDP چندکلاینتی (multi-client) پشتیبانی میشود و میتواند با گزینه --mode server فعال گردد. در حالت سرور، OpenVPN روی یک درگاه (port) واحد برای اتصالات ورودی کلاینت گوش فرا میدهد. تمامی اتصالات کلاینت از طریق یک رابط tun یا tap واحد مسیریابی خواهند شد. این حالت برای مقیاسپذیری طراحی شده است و باید بتواند صدها یا حتی هزاران کلاینت را روی سختافزار بهاندازه کافی سریع پشتیبانی کند. احراز هویت SSL/TLS باید در این حالت استفاده شود.
- --auth-gen-token args
- یک توکن
احراز هویت
به
کلاینتهایی
که با
موفقیت
احراز هویت
شدهاند
بازمیگرداند.
نحو معتبر:
auth-gen-token [lifetime] [renewal-time] [external-auth]
پس از احراز هویت موفقیتآمیز نامکاربری/گذرواژه، سرور OpenVPN با این گزینه یک توکن احراز هویت موقت ایجاد کرده و آن را به کلاینت ارسال میکند (push). در مذاکرات مجدد (renegotiation) بعدی، کلاینت OpenVPN این توکن را بهجای گذرواژه کاربر ارسال خواهد کرد. در سمت سرور، سرور احراز هویت توکن را بهصورت داخلی انجام میدهد و هیچ احراز هویت اضافهای را در برابر سازوکارهای احراز هویت خارجی نامکاربری/گذرواژه پیکربندیشده انجام نخواهد داد.
توکنهای پیادهسازیشده با این سازوکار شامل یک برچسب زمانی اولیه و یک برچسب زمانی تمدید هستند و توسط HMAC ایمنسازی شدهاند.
آرگومان lifetime مشخص میکند توکن تولیدشده برای چه مدت معتبر است. طول عمر بر حسب ثانیه تعریف میشود. اگر طول عمر تنظیم نشود یا روی 0 تنظیم گردد، توکن هرگز منقضی نخواهد شد.
اگر renewal-time تنظیم نشود، مقدار پیشفرض آن reneg-sec خواهد بود.
توکن یا پس از رسیدن به lifetime پیکربندیشده توکن، یا پس از تمدید نشدن به مدت بیش از ۲ * renewal-time ثانیه منقضی خواهد شد. به کلاینتها در هر مذاکره مجدد TLS توکنهای تمدیدشده ارسال میشود. اگر renewal-time کمتر از reneg-sec باشد، سرور در هر reneweal-time ثانیه یک توکن احراز هویت موقت بهروزرسانیشده ارسال خواهد کرد. این کار برای بیاعتبار کردن توکن در صورتی که کلاینت برای مدتزمان طولانی قطع شده باشد انجام میشود، در حالی که همزمان طول عمر بسیار طولانیتری را برای توکن کلاینتهای فعال فراهم میکند.
این ویژگی برای محیطهایی مفید است که برای استفاده از گذرواژههای یکبارمصرف (OTP) بهعنوان بخشی از احراز هویت نامکاربری/گذرواژه پیکربندی شدهاند و آن سازوکار احراز هویت از auth-token پشتیبانی نمیکند.
هنگامی که کلیدواژه external-auth وجود داشته باشد، روش احراز هویت عادی همیشه فراخوانی خواهد شد، حتی اگر auth-token موفقیتآمیز باشد. بهطور معمول در صورت موفقیت یا شکست اعتبارسنجی auth-token، سایر روشهای احراز هویت نادیده گرفته میشوند.
این گزینه این تصمیم را به روشهای احراز هویت خارجی واگذار کرده و اعتبار حساب را بررسی کرده و سایر بررسیها را انجام میدهد.
در این حالت، محیط دارای متغیر session_id خواهد بود که شناسه نشست حاصل از auth-gen-token را در خود نگه میدارد. همچنین یک متغیر محیطی session_state موجود است. این متغیر نشان میدهد که آیا auth-token موفقیتآمیز بوده است یا خیر. این متغیر میتواند مقادیر زیر را داشته باشد:
- Initial
- هیچ توکنی از کلاینت دریافت نشده است.
- Authenticated
- توکن معتبر است و منقضی نشده است.
- Expired
- توکن معتبر است اما منقضی شده است.
- Invalid
- توکن نامعتبر است (شکست در HMAC یا طول نادرست).
- AuthenticatedEmptyUser / ExpiredEmptyUser
- توکن با نامکاربری ارسالشده از سوی کلاینت معتبر نیست، اما اگر فرض کنیم که بهجای آن یک نامکاربری خالی استفاده شده بود، معتبر (یا منقضی) میبود. این دو مورد یک راهکار موقت برای رفتار OpenVPN 3 هستند. اگر این راهکار موقت مورد نیاز نباشد، این دو مورد باید همانند Invalid مدیریت شوند.
هشدار: از این ویژگی تنها در صورتی استفاده کنید که میخواهید روش احراز هویت شما در هر اعتبارسنجی فراخوانی شود. از آنجا که احراز هویت خارجی فراخوانی میشود، لازم است موفقیت یا شکست احراز هویت را نیز اعلام کند. اکیداً توصیه میشود در صورت auth-token نامعتبر/منقضیشده (Invalid/Expired) با گزینه external-auth، شکست احراز هویت بازگردانده شود مگر اینکه کلاینت بتواند به روش قابلقبول دیگری (مانند گواهی کلاینت) احراز هویت کند، در غیر این صورت بازگرداندن موفقیت منجر به دور زدن احراز هویت خواهد شد (مشابه بازگرداندن موفقیت برای گذرواژه نادرست از یک اسکریپت). در صورتی که توکن منقضیشده (Expired) پذیرفته شود، توکن شناسه نشست و زمان شروع توکن اصلی (منقضیشده) را حفظ خواهد کرد.
نکته: نامکاربری برای --auth-gen-token میتواند توسط --override-username بازنویسی شود. در این حالت گزینه --auth-token-user و یک توکن احراز هویت معتبر برای آن نامکاربری بهجای نامکاربری اصلی که کلاینت با آن احراز هویت کرده بود نیز به کلاینت ارسال خواهد شد.
- --auth-gen-token-secret file
- پروندهای را مشخص میکند که کلید مخفی مربوط به HMAC مورد استفاده در --auth-gen-token را نگه میدارد. اگر file وجود نداشته باشد، OpenVPN در هنگام راهاندازی یک کلید مخفی تصادفی تولید خواهد کرد. اگر auth-token باید پس از راهاندازی مجدد سرور معتبر بماند، یا اگر کلاینت باید بتواند با auth-token خود بین چندین سرور OpenVPN جابهجا شود، این پرونده باید استفاده شود.
- --auth-user-pass-optional
- اجازه برقراری اتصال به کلاینتهایی که نامکاربری/گذرواژه تعیین نمیکنند. به طور معمول، هنگامی که --auth-user-pass-verify یا --management-client-auth مشخص شده باشند (یا یک ماژول پلاگین احراز هویت)، دیمن سرور OpenVPN از کلاینتهای در حال اتصال میخواهد که نامکاربری و گذرواژه را مشخص کنند. این گزینه ارسال نامکاربری/گذرواژه توسط کلاینتها را اختیاری میکند و مسئولیت پذیرش یا رد کلاینت بر اساس عوامل دیگر (مانند تنظیم فیلدهای گواهی X509) را به ماژول/اسکریپت احراز هویت تعریفشده توسط کاربر واگذار مینماید. هنگامی که از این گزینه استفاده شود و کلاینت متصلشونده نامکاربری/گذرواژهای ارسال نکند، ماژول/اسکریپت احراز هویت تعریفشده توسط کاربر، نامکاربری و گذرواژه را به صورت رشتههای خالی ("") خواهد دید. ماژول/اسکریپت احراز هویت باید دارای منطقی برای تشخیص این وضعیت و پاسخدهی مناسب باشد.
- --ccd-exclusive
- الزام داشتن یک فایل --client-config-dir برای کلاینت متصلشونده به عنوان شرط احراز هویت.
- --client-config-dir dir
- تعیین
دایرکتوری
dir برای
فایلهای
پیکربندی
سفارشی
کلاینت. پس
از آنکه یک
کلاینت
متصلشونده
احراز هویت
شد، OpenVPN در این
دایرکتوری
به دنبال
فایلی با
همان نام common name
گواهی X509
کلاینت
میگردد.
اگر فایل
منطبقی
وجود داشته
باشد، برای
گزینههای
پیکربندی
مخصوص
کلاینت باز
و تجزیه
میشود. اگر
فایل
منطبقی
پیدا نشود،
OpenVPN در عوض
تلاش
میکند
فایل
پیشفرضی
به نام "DEFAULT"
را باز و
تجزیه کند،
که ممکن است
ارائه شده
باشد اما
الزامی
نیست. توجه
داشته
باشید که
فایلهای
پیکربندی
باید پس از
رها کردن
امتیازات root
توسط
فرایند OpenVPN
قابل
خواندن
باشند.
این فایل میتواند یک آدرس IP ثابت را برای کلاینت مربوطه با استفاده از --ifconfig-push و همچنین زیرشبکههای ثابتی که متعلق به کلاینت هستند را با استفاده از --iroute مشخص کند.
یکی از ویژگیهای مفید این گزینه این است که اجازه میدهد فایلهای پیکربندی کلاینت هنگام فعال بودن سرور، بدون نیاز به راهاندازی مجدد سرور، به راحتی ایجاد، ویرایش یا حذف شوند.
گزینههای زیر در زمینه مختص کلاینت مجاز هستند: --push، --push-reset، --push-remove، --iroute، --ifconfig-push، --vlan-pvid و --config.
نکته: برنامه OpenVPN از CN دقیقاً همانطور که در گواهی نوشته شده استفاده میکند. اما از آنجا که این یک دسترسی به فایل است، سیستمفایل ممکن است تداخل ایجاد کند. نکته مهم این است که OpenVPN دو CN را که تنها در بزرگی و کوچکی حروف با هم تفاوت دارند به عنوان نامهای متفاوت در نظر میگیرد، اما یک سیستمفایل حساس نبودن به حروف بزرگ و کوچک (مانند آنچه ممکن است در Windows یا macOS مشاهده کنید) با آنها یکسان رفتار میکند. هنگامی که گواهیهای خود را ایجاد میکنید مطمئن شوید که CNها به اندازه کافی متفاوت هستند تا مشکلی ایجاد نشود. هنگام اعتماد به یک CA خارجی، توجه داشته باشید که این یک بردار حمله بالقوه از طریق گواهیهای مخرب ایجاد شده است که از این مسئله سوءاستفاده میکنند.
- --client-to-client
- از آنجا که
حالت سرور OpenVPN
چندین
کلاینت را
از طریق یک
رابط tun یا tap
تکی مدیریت
میکند،
عملاً یک
مسیریاب
است. پرچم
--client-to-client به OpenVPN
میگوید
ترافیک
کلاینت-به-کلاینت
را به صورت
داخلی
مسیریابی
کند، به جای
اینکه تمام
ترافیک
مبدأ
کلاینت را
به رابط TUN/TAP
ارسال
نماید.
هنگامی که این گزینه استفاده میشود، هر کلاینت سایر کلاینتهایی را که در حال حاضر متصل هستند "خواهد دید". در غیر این صورت، هر کلاینت فقط سرور را خواهد دید. اگر میخواهید ترافیک تونل را با استفاده از قوانین سفارشی و به ازای هر کلاینت فایروالبندی کنید، از این گزینه استفاده نکنید.
لطفاً توجه داشته باشید که هنگام استفاده از data channel offload این گزینه هیچ اثری ندارد. بستهها همیشه به رابط تونل ارسال شده و سپس بر اساس جدول مسیریابی سیستم مسیریابی میشوند.
- --disable
- غیرفعال
کردن اتصال
یک کلاینت
خاص (بر
اساس common name). از
این گزینه
برای
غیرفعال
کردن
کلاینت به
دلیل به خطر
افتادن
کلید یا
گذرواژه
استفاده
نکنید. در
عوض از یک CRL
(فهرست
ابطال
گواهی)
استفاده
کنید (گزینه
--crl-verify را
ببینید).
این گزینه باید با یک نمونه کلاینت خاص مرتبط باشد، به این معنی که یا باید در یک فایل پیکربندی نمونه کلاینت با استفاده از --client-config-dir مشخص شود یا به صورت پویا با استفاده از یک اسکریپت --client-connect تولید گردد.
- --connect-freq args
- اجازه به
حداکثر n
اتصال جدید
در هر sec
ثانیه از
طرف
کلاینتها.
نحو معتبر:
connect-freq n sec
این گزینه برای مهار حملات DoS طراحی شده است که با استفاده از گواهیهایی که در نهایت احراز هویت آنها با شکست مواجه میشود، سرور را با درخواستهای اتصال غرق میکنند.
این محدودیت پس از --connect-freq-initial اعمال میشود و فقط برای کلاینتهایی اعمال میگردد که مصافحه سهطرفه را کامل کردهاند یا کلاینتهایی که از --tls-crypt-v2 بدون پشتیبانی از کوکی (آرگومان allow-noncookie برای --tls-crypt-v2) استفاده میکنند.
با این حال، این یک راهکار ناقص است، زیرا در یک سناریوی واقعی DoS، ممکن است اتصالات مشروع نیز رد شوند.
برای بهترین محافظت در برابر حملات DoS در حالت سرور، از --proto udp و --tls-auth یا --tls-crypt استفاده کنید.
- --connect-freq-initial args
- (فقط UDP) اجازه
به حداکثر n
پاسخ بسته
اتصال
اولیه در هر
sec ثانیه از
سرور OpenVPN به
کلاینتها.
نحو معتبر:
connect-freq-initial n sec
برنامه OpenVPN از نسخه 2.6 به بعد در پاسخدهی به بستههای اتصال اولیه بسیار کارآمد عمل میکند. در صورت محدود نکردن پاسخهای اولیه، دیمن OpenVPN میتواند در حملات بازتابی مورد سوءاستفاده قرار گیرد. این گزینه برای محدود کردن نرخ پاسخدهی OpenVPN به حملات اولیه طراحی شده است.
تلاشهای اتصالی که مصافحه سهطرفه اولیه را تکمیل کنند، جزو این محدودیت محاسبه نخواهند شد. پیشفرض، اجازه به ۱۰۰ اتصال اولیه در هر ۱۰ ثانیه است.
- --duplicate-cn
- به چندین کلاینت با نام مشترک (common name) یکسان اجازه اتصال همزمان میدهد. در صورت نبود این گزینه، OpenVPN با اتصال یک کلاینت جدید با همان نام مشترک، ارتباط کلاینت پیشین را قطع خواهد کرد.
- --ifconfig-pool args
- استخری از
زیرشبکهها
را برای
تخصیص پویا
به
کلاینتهای
متصلشونده،
مشابه با یک
کارگزار DHCP
کنار
میگذارد.
نحو معتبر:
ifconfig-pool start-IP end-IP [netmask]
برای تونلهای نوع tun، به هر کلاینت یک زیرشبکه /30 اختصاص داده میشود (جهت سازگاری با کلاینتهای ویندوز). برای تونلهای نوع tap، نشانیهای منفرد تخصیص مییابند، و پارامتر اختیاری netmask نیز به کلاینتها تحویل (push) داده میشود.
- --ifconfig-ipv6-pool args
- یک استخر
نشانی IPv6 را
برای تخصیص
پویا به
کلاینتها
مشخص
میکند.
آرگومانهای معتبر:
ifconfig-ipv6-pool ipv6addr/bits
استخر از ipv6addr شروع میشود و با آفست تعیینشده از ابتدای استخر IPv4 مطابقت دارد. اگر بخش میزبان نشانی IPv6 دادهشده 0 باشد، استخر از ipv6addr +1 شروع میشود.
- --ifconfig-pool-persist args
- دادههای
ifconfig-pool را در
فواصل
زمانی seconds
(پیشفرض
600)، و
همچنین
هنگام شروع
و خاتمه
برنامه، در
file
ذخیره/بازیابی
میکند.
نحو معتبر:
ifconfig-pool-persist file [seconds]
هدف این گزینه، برقراری یک ارتباط بلندمدت بین کلاینتها (مشخصشده با نام مشترک آنها) و نشانی IP مجازی اختصاصیافته به آنها از ifconfig-pool است. حفظ یک ارتباط بلندمدت برای کلاینتها مناسب است زیرا به آنها امکان میدهد تا بهطور مؤثر از گزینه --persist-tun استفاده کنند.
پارامتر file یک پرونده متنی ASCII جداشده با کاما است، در قالب <Common-Name>,<IP-address>.
اگر seconds = 0 باشد، با file بهصورت فقطخواندنی رفتار میشود. این حالت زمانی کاربرد دارد که بخواهید از file بهعنوان یک پرونده پیکربندی استفاده کنید.
توجه داشته باشید که ورودیهای این پرونده توسط OpenVPN صرفاً بر اساس ارتباطات پیشین بین یک نام مشترک و نشانی IP، بهصورت پیشنهادی در نظر گرفته میشوند. آنها تضمین نمیکنند که نام مشترک دادهشده همیشه همان نشانی IP مشخصشده را دریافت کند. در صورت نیاز به تخصیص تضمینشده، از --ifconfig-push استفاده کنید.
- --ifconfig-push args
- نقاط
پایانی IP
مجازی را
برای تونل
کلاینت
ارسال (push)
میکند، که
تخصیص
پویای --ifconfig-pool
را لغو
مینماید.
نحو معتبر:
ifconfig-push local remote-netmask [alias]
پارامترهای local و remote-netmask مطابق با دستورالعمل --ifconfig تنظیم میشوند که میخواهید روی دستگاه کلاینت جهت پیکربندی انتهای دورست تونل اجرا شود. توجه داشته باشید که پارامترهای local و remote-netmask از دیدگاه کلاینت هستند، نه سرور. آنها میتوانند بهجای نشانی IP، نامهای DNS باشند که در این صورت هنگام اتصال کلاینت، روی سرور برطرف (resolve) میشوند.
پارامتر اختیاری alias ممکن است در مواردی استفاده شود که NAT باعث ایجاد تفاوت بین دید کلاینت از نقطه پایانی محلی خود با دید سرور شود. در این حالت local/remote-netmask به دید سرور اشاره دارد در حالی که alias/remote-netmask به دید کلاینت اشاره خواهد کرد.
این گزینه باید با یک نمونه کلاینت مشخص مرتبط باشد، به این معنی که باید یا در یک پرونده پیکربندی نمونه کلاینت با استفاده از --client-config-dir تعیین شود یا بهطور پویا با استفاده از یک اسکریپت --client-connect تولید گردد.
همچنین به یاد داشته باشید که یک دستورالعمل --route حاوی local را در پرونده پیکربندی اصلی OpenVPN بگنجانید، تا هسته بداند مسیر آن را به سمت رابط TUN/TAP سرور هدایت کند.
الگوریتم داخلی انتخاب نشانی IP کلاینت در OpenVPN بهصورت زیر عمل میکند:
- 1.
- استفاده از پرونده تولیدشده با اسکریپت --client-connect برای IP ایستا (انتخاب نخست).
- 2.
- استفاده از پرونده --client-config-dir برای IP ایستا (انتخاب بعدی).
- 3.
- استفاده از تخصیص --ifconfig-pool برای IP پویا (انتخاب پایانی).
هنگامی که DCO فعال باشد و IP در شبکه مشخصشده توسط --ifconfig قرار نداشته باشد، OpenVPN یک مسیر میزبان /32 برای نشانی IP مربوط به local نصب خواهد کرد.
- --ifconfig-ipv6-push args
- برای
پیکربندی
ایستای
رابط IPv6 به
ازای هر
کلاینت در
--client-config-dir، جهت
اطلاعات
بیشتر به
--client-config-dir و --ifconfig-push
مراجعه
کنید.
نحو معتبر:
ifconfig-ipv6-push ipv6addr/bits ipv6remote
هنگامی که DCO فعال است و نشانی IP در شبکه مشخصشده توسط --ifconfig-ipv6 قرار ندارد، OpenVPN یک مسیر میزبان /128 برای نشانی IP ipv6addr نصب خواهد کرد.
- --multihome [same-interface]
- یک کارساز UDP چندمقصدی (multi-homed) را پیکربندی میکند. این گزینه زمانی نیاز است که یک کارساز بیش از یک نشانی IP دارد (مانند چند رابط یا نشانیهای IP ثانویه)، و از --local برای اجبار اتصال تنها به یک نشانی خاص استفاده نمیکند. این گزینه چند جستوجوی اضافی به مسیر بسته اضافه میکند تا اطمینان حاصل شود بستههای پاسخ UDP همیشه از نشانیای ارسال میشوند که کلاینت با آن گفتگو میکند. این ویژگی در تمام پلتفرمها پشتیبانی نمیشود و پردازش بیشتری میافزاید، بنابراین بهطور پیشفرض فعال نیست.
- نکات:
- این گزینه تنها برای کارسازهای UDP مرتبط است.
- از نسخه 2.7.0 به بعد، OpenVPN رابط ورودی بسته را نادیده گرفته و انتخاب رابط خروجی را به سازوکارهای عادی مسیریابی/سیاست سیستمعامل واگذار میکند ("set ipi_ifindex=0").
- اگر پرچم same-interface اضافه شود، OpenVPN شناسه (index) رابط ورودی را در شناسه رابط خروجی کپی کرده و تلاش میکند بسته را از همان رابطی که وارد شده به بیرون بفرستد (= بازگرداندن رفتار پیشین OpenVPN). اگر هیچ مسیر قابل استفادهای در آن رابط وجود نداشته باشد، این کار ممکن است کار نکند.
- سیستمهای BSD* برای IPv4 از یک API متفاوت استفاده میکنند که در هر صورت شناسه رابط را ارائه نمیدهد (IP_RECVDSTADDR)، بنابراین تفاوت در آنجا تنها برای IPv6 اعمال میشود.
- --iroute args
- یک مسیر
داخلی به یک
کلاینت خاص
ایجاد
میکند.
پارامتر
netmask، در صورت
حذف شدن، به
صورت
پیشفرض
255.255.255.255 خواهد
بود.
نحو معتبر:
iroute network [netmask]
این دستورالعمل میتواند برای مسیریابی یک زیرشبکه ثابت از کارساز به یک کلاینت خاص، فارغ از اینکه کلاینت از کجا متصل میشود، استفاده شود. به یاد داشته باشید که باید مسیر را به جدول مسیریابی سیستم نیز اضافه کنید (مانند استفاده از دستورالعمل --route). دلیل نیاز به دو مسیر این است که دستورالعمل --route بسته را از هسته به OpenVPN هدایت میکند. پس از ورود به OpenVPN، دستورالعمل --iroute آن را به کلاینت خاص هدایت مینماید.
با این حال، هنگام استفاده از DCO، دستورالعمل --iroute معمولاً برای DCO جهت پیکربندی کامل جدول مسیریابی کافی است. دستورالعمل اضافی --route تنها زمانی لازم است که رفتار مورد انتظار، مسیریابی ترافیک یک شبکه خاص به رابط VPN باشد حتی زمانی که کلاینت مربوطه متصل نیست (سپس ترافیک دور ریخته خواهد شد).
این گزینه باید یا در یک پرونده پیکربندی نمونه کلاینت با استفاده از --client-config-dir مشخص شود، یا به صورت پویا با استفاده از یک اسکریپت --client-connect تولید گردد.
دستورالعمل --iroute همچنین تعامل مهمی با --push "route ..." دارد. --iroute اساساً زیرشبکهای را تعریف میکند که متعلق به یک کلاینت خاص است (ما این کلاینت را A مینامیم). اگر میخواهید کلاینتهای دیگر بتوانند به زیرشبکه A دسترسی پیدا کنند، میتوانید از --push "route ..." همراه با --client-to-client برای اعمال این کار استفاده کنید. برای اینکه تمام کلاینتها زیرشبکه A را ببینند، OpenVPN باید این مسیر را به تمام کلاینتها به جز A ارسال (push) کند، زیرا زیرشبکه از قبل متعلق به A است. OpenVPN این کار را با ارسال نکردن مسیر به کلاینتی که با یکی از irouteهای آن کلاینت مطابقت دارد انجام میدهد.
- --iroute-ipv6 args
- برای
پیکربندی
مسیر
ایستای IPv6 به
ازای هر
کلاینت در
--client-config-dir، جهت
جزئیات
بیشتر
درباره
نحوه
راهاندازی
و استفاده
از آن و
چگونگی
تعامل --iroute و
--route، به --iroute
مراجعه
کنید.
نحو معتبر:
iroute-ipv6 ipv6addr/bits
- --max-clients n
- کارساز را به حداکثر n کلاینت همزمان محدود میکند. پیشفرض 1024 است.
- --max-routes-per-client n
- حداکثر n
مسیر داخلی
را به ازای
هر کلاینت
مجاز
میداند
(پیشفرض 256).
این مورد
برای کمک به
مهار حملات
DoS طراحی شده
است که در
آن یک
کلاینت
احراز هویت
شده کارساز
را با
بستههایی
که به نظر
میرسد از
چندین
نشانی MAC
منحصربهفرد
میآیند
غرق (flood)
میکند و
کارساز را
مجبور
میسازد تا
با گسترش
جدول
مسیریابی
داخلی خود،
حافظه
مجازی را به
اتمام
برساند. این
دستورالعمل
میتواند
در یک
پرونده
--client-config-dir
استفاده
شود یا توسط
یک اسکریپت
--client-connect بهطور
خودکار
تولید شود
تا مقدار
سراسری را
برای یک
کلاینت خاص
بازنویسی
کند.
توجه داشته باشید که این دستورالعمل بر جدول مسیریابی داخلی OpenVPN تأثیر میگذارد، نه جدول مسیریابی هسته.
- --override-username username
- نام کاربری
یک اتصال را
به نام
کاربری
مشخصشده
تغییر
میدهد. این
نام کاربری
توسط --auth-gen-token
نیز
استفاده
خواهد شد.
با این حال،
نام کاربری
جایگزینشده
تنها پس از
خوانده شدن
--client-config-dir و
اجرای
اسکریپتهای
--auth-user-pass-verify و --client-connect
اعمال
میشود.
همچنین --username-as-common-name از نام کاربری ارائهشده توسط کلاینت به عنوان common-name استفاده خواهد کرد. توصیه میشود در صورت استفاده از گزینهٔ --username-as-common-name از بهکارگیری گزینهٔ --override-username خودداری کنید.
نام کاربری تغییریافته در خروجی وضعیت و همچنین توسط گزینهٔ --auth-gen-token دریافت خواهد شد. همچنین در صورت فعال بودن --auth-gen-token، با استفاده از --auth-token-user به کلاینت ارسال (push) میشود.
به صورت داخلی در تمام مذاکرات مجدد بعدی، نام کاربری ارائهشده توسط کلاینت با نام کاربری ارائهشده توسط --override-username جایگزین خواهد شد. اگر کلاینت به نام کاربری دیگری تغییر یابد که هم با نام کاربری اولیه و هم با نام کاربری جایگزینشده متفاوت باشد، کلاینت رد خواهد شد.
هنگام استفاده از --override-username و گزینههای مرتبط، باید دقت ویژهای به خرج داد تا هر دو نام کاربری اولیهٔ کلاینت و نام کاربری جایگزینشده به درستی مدیریت شوند تا از دور زدن احراز هویت/مجوزدهی جلوگیری شود.
این گزینه عمدتاً برای مواردی در نظر گرفته شده است که از گواهیها و احراز هویت چندعاملی استفاده میکنند و بنابراین نام کاربریای که بتوان برای --auth-gen-token استفاده کرد ارائه نمیدهند، تا امکان تعیین نام کاربری در این سناریوها فراهم شود.
اگر دستورالعمل --auth-token توسط اسکریپت/پلاگین دیگری یا رابط مدیریتی ارسال میشود، تولید و ارسال --auth-token-user را نیز مد نظر قرار دهید.
- --port-share args
- اشتراکگذاری
پورت TCP
برنامهٔ OpenVPN
با سرویسی
دیگر
نحو معتبر:
port-share host port [dir]
هنگام اجرا در حالت کارساز TCP، پورت OpenVPN را با برنامهٔ دیگری مانند یک کارساز HTTPS به اشتراک میگذارد. اگر OpenVPN اتصالی به پورت خود را تشخیص دهد که از پروتکلی غیر از پروتکل OpenVPN استفاده میکند، اتصال را به کارساز در host:port پروکسی میکند. در حال حاضر فقط برای کار با HTTP/HTTPS طراحی شده است، هرچند از نظر تئوری گسترش آن به پروتکلهای دیگر مانند ssh امکانپذیر است.
آرگومان dir یک دایرکتوری اختیاری را مشخص میکند که در آن برای هر اتصال پروکسی، یک پروندهٔ موقت با نام N شامل محتوای C به صورت پویا ایجاد میشود؛ که در آن C مقدار IP:port مبدأ اتصال کلاینت و N مقدار IP:port مبدأ اتصال به دریافتکنندهٔ پروکسی است. این دایرکتوری میتواند توسط دریافتکنندهٔ پروکسی به عنوان یک واژهنامه برای تشخیص مبدأ اتصال استفاده شود. هر پروندهٔ ایجادشده پس از قطع اتصال پروکسیشده، به طور خودکار حذف خواهد شد.
در Windows پیادهسازی نشده است.
- --push option
- ارسال یک
گزینه از
پروندهٔ
پیکربندی
به کلاینت
جهت اجرای
از راه دور.
توجه داشته
باشید که option
باید داخل
گیومه
دوتایی ("")
قرار گیرد.
کلاینت
باید در
پروندهٔ
پیکربندی
خود --pull را
مشخص کند.
مجموعه
گزینههایی
که میتوان
ارسال کرد
هم از نظر
امکانپذیری
و هم از نظر
امنیتی
محدود است.
برخی
گزینهها
مانند
مواردی که
اسکریپت
اجرا
میکنند
ممنوع
هستند،
زیرا عملاً
به یک
کارساز
نفوذیافته
اجازه
میدهند کد
دلخواه را
روی کلاینت
اجرا کند.
گزینههای
دیگر مانند
پارامترهای
TLS یا MTU قابل
ارسال
نیستند،
زیرا
کلاینت
باید پیش از
برقراری
اتصال با
کارساز از
آنها مطلع
باشد.
این فهرستی جزئی از گزینههایی است که در حال حاضر قابل ارسال هستند: --route، --route-gateway، --route-delay، --redirect-gateway، --ip-win32، --dhcp-option، --dns، --inactive، --ping، --ping-exit، --ping-restart، --setenv، --auth-token، --persist-tun، --echo، --comp-lzo، --socket-flags، --sndbuf، --rcvbuf، --session-timeout
نکته: استفاده از --push نیازمند اجرای OpenVPN در حالت --mode server (یا استفاده از یکی از دستورالعملهای کمکی --server یا --server-bridge) است.
- --push-remove opt
- حذف
انتخابی
تمام
گزینههای
--push منطبق با
"opt" از فهرست
گزینههای
یک کلاینت.
مقدار opt به
عنوان یک
زیررشته با
کل رشتهٔ
گزینهٔ
ارسالی به
کلاینت
تطبیق داده
میشود؛
بنابراین
--push-remove route تمام
دستورات --push route
... و --push route-ipv6 ... را
حذف خواهد
کرد، در
حالی که --push-remove
"route-ipv6 2001:" تنها
مسیرهای IPv6
مربوط به
شبکههای
2001:... را حذف
میکند.
گزینهٔ --push-remove تنها میتواند در بافت مخصوص کلاینت، مانند یک پرونده در --client-config-dir، یا اسکریپت یا پلاگین --client-connect استفاده شود - مشابه --push-reset، اما انتخابیتر.
نکته: برای تغییر یک گزینه، میتوان از --push-remove برای حذف مقدار قبلی استفاده کرد و سپس گزینهٔ --push جدیدی با مقدار تازه افزود.
نکته ۲: به دلیل جزئیات پیادهسازی، 'ifconfig' و 'ifconfig-ipv6' تنها با تطابق دقیق روی نام گزینه قابل حذف هستند (push-remove ifconfig)؛ هیچ تطابق زیررشتهای و هیچ تطابقی بر اساس آرگومان آدرس IPv4/IPv6 امکانپذیر نیست.
- --push-reset
- عدم به ارث
بردن فهرست
push سراسری
برای یک
نمونه
کلاینت خاص.
این گزینه
را در یک
بافت مخصوص
کلاینت،
مانند یک
پروندهٔ
پیکربندی
--client-config-dir مشخص
کنید. این
گزینه،
گزینههای
--push را در سطح
پروندهٔ
پیکربندی
سراسری
نادیده
میگیرد.
نکته: گزینهٔ --push-reset بسیار فراگیر است: تقریباً تمام گزینهها را از فهرست گزینههای ارسالی حذف میکند. در بسیاری از موارد، برخی از این گزینهها باید بعداً دوباره پیکربندی شوند - به ویژه، --topology subnet و --route-gateway از دست خواهند رفت و این امر در بسیاری از موارد پیکربندی کلاینت را مختل میکند. بنابراین، برای اکثر اهداف، --push-remove برای حذف انتخابی گزینههای push برای کلاینتهای مجزا مناسبتر است.
- --server args
- یک
دستورالعمل
کمکی
طراحیشده
برای
سادهسازی
پیکربندی
حالت سرور OpenVPN.
این
دستورالعمل
یک سرور OpenVPN را
راهاندازی
میکند که
نشانیها
را از
شبکه/ماسکشبکه
دادهشده
به
کلاینتها
اختصاص
میدهد. خود
سرور نشانی
.1 شبکه
دادهشده
را برای
استفاده
بهعنون
نقطه
پایانی سمت
سرور رابط
محلی TUN/TAP
برمیدارد.
اگر پرچم
اختیاری nopool
داده شود،
هیچ استخر
نشانی IP
پویایی
برای
کلاینتهای
VPN آماده
نخواهد شد.
نحو معتبر:
server network netmask [nopool]
برای نمونه، --server 10.8.0.0 255.255.255.0 به صورت زیر بسط مییابد:
mode server
tls-server
push "topology [topology]"
if dev tun AND (topology == net30 OR topology == p2p):
ifconfig 10.8.0.1 10.8.0.2
if !nopool:
ifconfig-pool 10.8.0.4 10.8.0.251
route 10.8.0.0 255.255.255.0
if client-to-client:
push "route 10.8.0.0 255.255.255.0"
else if topology == net30:
push "route 10.8.0.1"
if dev tap OR (dev tun AND topology == subnet):
ifconfig 10.8.0.1 255.255.255.0
if !nopool:
ifconfig-pool 10.8.0.2 10.8.0.253 255.255.255.0
push "route-gateway 10.8.0.1"
if route-gateway unset:
route-gateway 10.8.0.2
در صورتی که از پلزدن اترنت استفاده میکنید، از --server استفاده نکنید. به جای آن از --server-bridge استفاده کنید.
- --server-bridge args
- یک
دستورالعمل
کمکی مشابه
--server که برای
سادهسازی
پیکربندی
حالت سرور OpenVPN
در
پیکربندیهای
پلزدن
اترنت
طراحی شده
است.
نحوهای معتبر:
server-bridge gateway netmask pool-start-IP pool-end-IP server-bridge [nogw]
اگر --server-bridge بدون هیچ پارامتری استفاده شود، حالت پراکسی DHCP را فعال میکند که در آن کلاینتهای OpenVPN متصلشونده یک نشانی IP برای آداپتور TAP خود از سرور DHCP فعال در LAN سمت سرور OpenVPN دریافت میکنند. توجه داشته باشید که تنها کلاینتهایی که از اتصال یک کلاینت DHCP به آداپتور TAP پشتیبانی میکنند (مانند Windows) میتوانند این حالت را پشتیبانی کنند. پرچم اختیاری nogw (پیشرفته) مشخص میکند که اطلاعات دروازه نباید به کلاینت ارسال شود.
برای پیکربندی پلزدن اترنت، ابتدا باید از قابلیت پلزدن سیستمعامل خود برای پلزدن رابط TAP با رابط کارت شبکه اترنت استفاده کنید. برای نمونه، در لینوکس این کار با ابزار brctl انجام میشود، و در Windows XP در Network Connections Panel با انتخاب آداپتورهای اترنت و TAP و کلیک راست روی "Bridge Connections" انجام میگیرد.
سپس باید بهصورت دستی IP/netmask را روی رابط پل تنظیم کنید. پارامترهای gateway و netmask در --server-bridge را میتوان روی IP/netmask رابط پل، یا IP/netmask دروازه/مسیریاب پیشفرض در زیرشبکه پلشده تنظیم کرد.
در نهایت، یک محدوده IP را در زیرشبکه پلشده، که با pool-start-IP و pool-end-IP مشخص میشود، برای OpenVPN کنار بگذارید تا به کلاینتهای متصلشونده اختصاص دهد.
برای نمونه، server-bridge 10.8.0.4 255.255.255.0 10.8.0.128 10.8.0.254 به صورت زیر بسط مییابد:
mode server tls-server ifconfig-pool 10.8.0.128 10.8.0.254 255.255.255.0 push "route-gateway 10.8.0.4"
در نمونهای دیگر، --server-bridge (بدون پارامتر) به صورت زیر بسط مییابد:
mode server tls-server push "route-gateway dhcp"
یا --server-bridge nogw به صورت زیر بسط مییابد:
mode server tls-server
- --server-ipv6 args
- تابع راحتی
برای
فعالسازی
همزمان
تعدادی از
گزینههای
مربوط به IPv6،
از جمله
--ifconfig-ipv6، --ifconfig-ipv6-pool و
--push tun-ipv6.
نحو معتبر:
server-ipv6 ipv6addr/bits
ارسال دستورالعمل --tun-ipv6 برای کلاینتهای قدیمیتری انجام میشود که در پیکربندی خود به یک --tun-ipv6 صریح نیاز دارند.
- --stale-routes-check args
- حذف
مسیرهایی
که برای n
ثانیه
فعالیتی
نداشتهاند
(یعنی زمان
فرسودگی).
این بررسی
هر t ثانیه
(یعنی بازه
زمانی
بررسی) اجرا
میشود.
نحو معتبر:
stale-routes-check n [t]
اگر t مشخص نشده باشد، مقدار پیشفرض آن n خواهد بود.
تنها مسیرهایی که بهصورت پویا یاد گرفته شدهاند مشمول این بررسی هستند. مسیرهای اضافهشده از طریق پیکربندی، مانند مدخلهای --iroute و آدرس ifconfig ارسالشده به کلاینت، هرگز توسط آن حذف نمیشوند؛ آنها تنها هنگامی که اتصال کلاینت قطع شود حذف میگردند.
این گزینه به کوچک نگهداشتن جدول مسیریابی پویا کمک میکند. همچنین --max-routes-per-client را ببینید.
- --username-as-common-name
- استفاده از
نام کاربری
احراز
هویتشده
بهجای common-name
برگرفته از
گواهی
کلاینت
بهعنوان
common-name. نیاز
دارد که
شکلی از
اعتبارسنجی
--auth-user-pass فعال
باشد. از
آنجا که
جایگزینی
پس از
اعتبارسنجی
--auth-user-pass رخ
میدهد،
اسکریپت یا
پلاگین
اعتبارسنجی
همچنان common-name
را از گواهی
دریافت
خواهد کرد.
متغیر محیطی common_name که به اسکریپتها و پلاگینهای فراخوانیشده پس از احراز هویت (مانند اسکریپت client-connect) ارسال میشود و نام پروندههای پردازششده در دایرکتوری client-config با نام کاربری مطابقت خواهند داشت.
- --verify-client-cert mode
- مشخص
میکند که
آیا کلاینت
ملزم به
ارائه یک
گواهی
معتبر است
یا خیر.
گزینههای ممکن برای mode عبارتند از:
- none
- گواهی
کلاینت
الزامی
نیست.
کلاینت
تنها باید
با استفاده
از نام
کاربری/گذرواژه
احراز هویت
شود. توجه
داشته
باشید که
استفاده از
این
دستورالعمل
امنیت
کمتری نسبت
به الزام
گواهی برای
تمام
کلاینتها
دارد.
اگر از این دستورالعمل استفاده کنید، تمام مسئولیت احراز هویت بر عهده اسکریپت --auth-user-pass-verify شما خواهد بود، بنابراین در نظر داشته باشید که اشکالات موجود در اسکریپت شما میتواند امنیت VPN شما را به خطر بیندازد.
گزینه --verify-client-cert none از نظر عملکردی معادل --client-cert-not-required است.
- optional
- کلاینت
ممکن است یک
گواهی
ارائه دهد
اما ملزم به
انجام این
کار نیست.
هنگام
استفاده از
این
دستورالعمل،
باید از یک
اسکریپت
--auth-user-pass-verify نیز
استفاده
کنید تا
مطمئن شوید
که
کلاینتها
با استفاده
از یک
گواهی، یک
نام کاربری
و گذرواژه،
یا
احتمالاً
هر دو احراز
هویت
میشوند.
مجدداً، تمام مسئولیت احراز هویت بر عهده اسکریپت --auth-user-pass-verify شما خواهد بود، بنابراین به خاطر داشته باشید که اشکالات موجود در اسکریپت شما میتواند به طور بالقوه امنیت VPN شما را به خطر بیندازد.
- require
- این گزینه پیشفرض است. کلاینت ملزم به ارائه یک گواهی است، در غیر این صورت دسترسی به VPN رد میشود.
اگر از این دستورالعمل استفاده نکنید (یا از --verify-client-cert require استفاده کنید) اما یک اسکریپت --auth-user-pass-verify نیز مشخص نمایید، آنگاه OpenVPN احراز هویت دوگانه انجام خواهد داد. برای اینکه کلاینت احراز هویت شده و در VPN پذیرفته شود، باید هم اعتبارسنجی گواهی کلاینت و هم اسکریپت --auth-user-pass-verify موفقیتآمیز باشند.
- --vlan-tagging
- گزینه فقط
مخصوص سرور.
نمونه سرور
OpenVPN را به یک
سوئیچ
تبدیل
میکند که
بر اساس IEEE 802.1Q
از
برچسبگذاری
VLAN پشتیبانی
میکند.
دستگاه TAP سرور و هر یک از کلاینتهای متصل به عنوان یک درگاه سوئیچ در نظر گرفته میشوند. تمام درگاههای کلاینت در حالت بدون برچسب (untagged) هستند و دستگاه TAP سرور بسته به تنظیم --vlan-accept، دارای برچسب VLAN، بدون برچسب یا پذیرنده هر دو است.
فریمهای اترنت همراه با تگ پیشوند 802.1Q به اصطلاح "tagged" نامیده میشوند. اگر فیلد شناسه VLAN (یا VID) در چنین تگی غیر صفر باشد، فریم "VLAN-tagged" نامیده میشود. اگر VID صفر باشد، اما فیلد Priority Control Point (یا PCP) غیر صفر باشد، فریم "prio-tagged" نامیده میشود. اگر هیچ تگ 802.1Q وجود نداشته باشد، فریم "untagged" است.
با استفاده از گزینه --vlan-pvid v به ازای هر کلاینت (گزینه --client-config-dir را ببینید)، هر درگاه میتواند به یک VID مشخص مرتبط شود. بستهها تنها میتوانند بین درگاههایی که VID یکسانی دارند بازفرستاده شوند. بنابراین، کلاینتهای دارای VIDهای متفاوت کاملاً از یکدیگر جدا هستند، حتی اگر --client-to-client فعال باشد.
فیلتر کردن بستهها درون سرور OpenVPN انجام میشود. کلاینتها نباید هیچگونه پیکربندی برچسبگذاری VLAN اعمال کرده باشند.
گزینه --vlan-tagging بهطور پیشفرض غیرفعال است. هنگامی که غیرفعال باشد، OpenVPN هر فریم اترنتی را میپذیرد و هیچ پردازش خاصی برای بستههای دارای برچسب VLAN انجام نمیدهد.
این گزینه تنها در حالت --dev tap mode قابل فعالسازی است.
- --vlan-accept args
- سیاست
برچسبگذاری
VLAN را برای
دستگاه TAP
سرور
پیکربندی
میکند.
نحو معتبر:
vlan-accept all|tagged|untagged
حالتهای زیر در دسترس هستند:
- tagged
- تنها فریمهای دارای برچسب VLAN را میپذیرد. تنها بستههای دارای برچسب VLAN پذیرفته میشوند، در حالی که بستههای بدون برچسب یا دارای برچسب اولویت هنگام ورود به دستگاه TAP سرور دور انداخته میشوند.
- untagged
- تنها فریمهای بدون برچسب و دارای برچسب اولویت را میپذیرد. بستههای دارای برچسب VLAN پذیرفته نمیشوند، در حالی که بستههای بدون برچسب یا دارای برچسب اولویت که وارد دستگاه TAP سرور میشوند، با مقدار پیکربندیشده برای تنظیم سراسری --vlan-pvid برچسبگذاری میشوند.
- all (پیشفرض)
- همه فریمها را میپذیرد. همه بستهها پذیرفته شده و سپس به ترتیب مانند حالتهای untagged یا tagged با آنها رفتار میشود.
- Note:
- برخی سازندگان از درگاههای سوییچ فعال در حالت tagged با عنوان "trunk ports" و درگاههای سوییچ فعال در حالت untagged با عنوان "access ports" یاد میکنند.
بستههای هدایتشده از کلاینتها به سرور، با PVID کلاینت مبدا دارای برچسب VLAN میشوند، مگر اینکه VID با مقدار سراسری --vlan-pvid مطابقت داشته باشد که در این صورت برچسب حذف میشود.
اگر هیچ PVID مقداری برای یک کلاینت خاص پیکربندی نشده باشد (نگاه کنید به --vlan-pvid)، بستهها بهطور پیشفرض با ۱ برچسبگذاری میشوند.
- --vlan-pvid v
- مشخص
میکند یک
"port" با کدام
شناسه VLAN
مرتبط است.
تنها زمانی
معتبر است
که --vlan-tagging مشخص
شده باشد.
در زمینه کلاینت، این تنظیم مشخص میکند کلاینت با کدام شناسه VLAN مرتبط است. در زمینه سراسری، شناسه VLAN دستگاه TAP سرور تنظیم میشود. مورد دوم تنها برای حالتهای --vlan-accept untagged و --vlan-accept all معنا دارد.
مقادیر معتبر برای v از 1 تا 4094 است. مقدار سراسری بهطور پیشفرض 1 است. اگر هیچ --vlan-pvid در زمینه کلاینت مشخص نشده باشد، مقدار سراسری به ارث برده میشود.
در برخی پیادهسازیهای سوییچ، از PVID با عنوان "Native VLAN" نیز یاد میشود.
گزینههای رمزنگاری
اطلاعات کتابخانه SSL
- --show-ciphers
- (مستقل) نمایش تمام الگوریتمهای رمز برای استفاده با گزینه --cipher.
- --show-digests
- (مستقل) نمایش تمام الگوریتمهای خلاصه پیام برای استفاده با گزینه --auth.
- --show-tls
- (مستقل)
نمایش تمام
رمزهای TLS
پشتیبانیشده
توسط
کتابخانه
رمزنگاری. OpenVPN
از TLS برای
امنسازی
کانال
کنترل
استفاده
میکند، که
از طریق آن
کلیدهای
استفادهشده
برای
محافظت از
ترافیک
واقعی VPN
تبادل
میشوند.
رمزهای TLS از
بالاترین
اولویت
(امنترین)
به
پایینترین
مرتب
خواهند شد.
توجه داشته باشید که کارکرد واقعی یک مجموعه رمز در این فهرست به پیکربندی خاص هر دو طرف بستگی دارد (مثلاً هر دو طرف باید از رمز پشتیبانی کنند، و در صورت استفاده از گواهی RSA یک مجموعه رمز ECDSA کار نخواهد کرد، و غیره).
- --show-engines
- (مستقل) نمایش موتورهای شتابدهنده رمزنگاری سختافزاری فعلی که توسط کتابخانه OpenSSL پشتیبانی میشوند.
- --show-groups
- (مستقل) نمایش تمام منحنیها/گروههای بیضوی موجود برای استفاده با گزینههای --ecdh-curve و tls-groups.
تولید دادههای کلید
- --genkey args
- (مستقل)
تولید یک
کلید برای
استفاده از
نوع keytype. اگر keyfile
مشخص نشود
یا خالی رها
شود، کلید
در stdout چاپ
میشود.
برای انواع
مختلف keytype
بخشهای
زیر را
ببینید.
نحو معتبر:
--genkey keytype keyfile
آرگومانهای معتبر keytype عبارتند از:
secret کلیدهای سکرت مشترک استاندارد OpenVPN
tls-crypt نام مستعار برای secret
tls-auth نام مستعار برای secret
auth-token کلید مورد استفاده برای --auth-gen-token-key
tls-crypt-v2-server کلید سرور TLS Crypt v2
tls-crypt-v2-client کلید کلاینت TLS Crypt v2
نمونهها:
$ openvpn --genkey secret shared.key $ openvpn --genkey tls-crypt shared.key $ openvpn --genkey tls-auth shared.key $ openvpn --genkey tls-crypt-v2-server v2crypt-server.key $ openvpn --tls-crypt-v2 v2crypt-server.key --genkey tls-crypt-v2-client v2crypt-client-1.key
- •
- تولید Shared Secret Keys
تولید یک
سکرت
مشترک،
برای
استفاده با
گزینههای
--tls-auth یا --tls-crypt.
نحو:
$ openvpn --genkey tls-crypt|tls-auth keyfile
کلید در keyfile ذخیره میشود. هر دو حالت (tls-crypt و tls-auth) یک نوع کلید تولید میکنند. این نامهای مستعار برای راحتی اضافه شدهاند.
این پرونده باید از طریق یک کانال امن از پیش موجود مانند scp(1) با طرف مقابل به اشتراک گذاشته شود.
- •
- تولید TLS Crypt v2 Server key
یک کلید --tls-crypt-v2
را برای
استفاده
توسط سرور OpenVPN
تولید
میکند.
کلید در keyfile
ذخیره
میشود.
نحو:
--genkey tls-crypt-v2-server keyfile
- •
- تولید TLS Crypt v2 Client key
یک کلید --tls-crypt-v2
برای
استفاده
توسط
کلاینتهای
OpenVPN تولید
میکند.
کلید در keyfile
ذخیره
میشود.
نحو
--genkey tls-crypt-v2-client keyfile [metadata]
در صورت ارائه، metadata مشخصشده را در کلید کلاینت بستهبندیشده قرار میدهد. این متادیتا باید در قالب کدگذاریشده با base64 ارائه شود. متادیتا باید حداکثر ۷۳۳ بایت باشد (۹۸۰ نویسه در base64، البته توجه داشته باشید که ۹۸۰ نویسه base64 میتواند بیش از ۷۳۳ بایت را کدگذاری کند).
اگر متادیتایی ارائه نشود، OpenVPN از یک برچسب زمانی یونیکس ۶۴ بیتی به نمایندگی از زمان فعلی در UTC، کدگذاریشده به ترتیب شبکه، بهعنوان متادیتا برای کلید تولیدشده استفاده خواهد کرد.
یک کلید کلاینت tls-crypt-v2 با استفاده از یک کلید سرور بستهبندی میشود. بنابراین برای تولید کلید کلاینت، کاربر باید کلید سرور را با استفاده از گزینه --tls-crypt-v2 ارائه دهد.
سرورها میتوانند از --tls-crypt-v2-verify برای مشخص کردن یک دستور اعتبارسنجی متادیتا استفاده کنند.
- •
- تولید Authentication Token key
یک سکرت
جدید تولید
میکند که
میتواند
با --auth-gen-token-secret
استفاده
شود.
نحو:
--genkey auth-token [keyfile]
- نکته:
- این پرونده باید برای سرور محرمانه باقی بماند، زیرا هر کسی که به این پرونده دسترسی داشته باشد میتواند توکنهای احراز هویتی تولید کند که سرور OpenVPN آنها را معتبر خواهد شناخت.
مذاکره مجدد کانال داده
هنگام اجرای OpenVPN در حالت کلاینت/سرور، کانال داده از یک کلید رمزنگاری زودگذر جداگانه استفاده میکند که در فواصل زمانی منظم تعویض میشود.
- --reneg-bytes n
- مذاکره
مجدد کلید
کانال داده
پس از ارسال
یا دریافت n
بایت
(بهطور
پیشفرض با
یک استثنا
غیرفعال
است، به زیر
نگاه کنید).
OpenVPN اجازه
میدهد طول
عمر یک کلید
بر حسب
تعداد
بایتهای
رمزگذاری/رمزگشاییشده،
تعداد
بستهها یا
تعداد
ثانیهها
مشخص شود.
در صورت
برآورده
شدن هر یک
از این سه
معیار توسط
هر یک از
طرفین
ارتباط،
مذاکره
مجدد کلید
اجباری
خواهد شد.
در صورت استفاده از سایفرهایی با اندازه بلوک رمز کمتر از ۱۲۸ بیت، --reneg-bytes بهطور پیشفرض روی 64MB تنظیم میشود، مگر اینکه صریحاً با تعیین مقدار 0 غیرفعال شود؛ اما این کار بهشدت نهی میشود زیرا برای ایجاد محافظت در برابر بردار حمله SWEET32 طراحی شده است. برای اطلاعات بیشتر گزینه --cipher را ببینید.
هنگامی که تخلیه بار کانال داده (DCO) فعال باشد، این گزینه نادیده گرفته میشود. DCO از آستانههای مذاکره مجدد قابلپیکربندی پشتیبانی نمیکند؛ سازوکارهای خودکار مذاکره مجدد کلید برای سایفرهای امروزی کافی هستند.
- --reneg-pkts n
- مذاکره
مجدد کلید
کانال داده
پس از ارسال
و دریافت n
بسته
(بهطور
پیشفرض
غیرفعال
است).
هنگامی که تخلیه بار کانال داده (DCO) فعال باشد، این گزینه نادیده گرفته میشود. DCO از آستانههای مذاکره مجدد قابلپیکربندی پشتیبانی نمیکند؛ سازوکارهای خودکار مذاکره مجدد کلید برای سایفرهای امروزی کافی هستند.
- --reneg-sec args
- مذاکره مجدد کلید کانال داده حداکثر پس از max ثانیه (پیشفرض 3600) و حداقل min ثانیه (پیشفرض ۹۰٪ از max برای سرورها، و برابر با max برای کلاینتها).
reneg-sec max [min]
مقدار مؤثر استفادهشده برای --reneg-sec برای هر نشست بهصورت شبهتصادفی یکنواخت بین min و max انتخاب میشود.
با مقدار پیشفرض 3600، این امر منجر به یک مقدار مؤثر در هر نشست در محدوده 3240 .. 3600 ثانیه برای سرورها، یا دقیقاً ۳۶۰۰ ثانیه برای کلاینتها میشود.
هنگام استفاده از احراز هویت دومرحلهای، توجه داشته باشید که این مقدار پیشفرض ممکن است باعث شود کاربر نهایی مجبور شود هر ساعت یک بار مجدداً احراز هویت کند.
همچنین به یاد داشته باشید که این گزینه میتواند در هر دو سمت کلاینت و سرور استفاده شود، و هر سمتی که از مقدار کمتری استفاده کند، آغازگر مذاکره مجدد خواهد بود. یک اشتباه رایج این است که --reneg-sec در یک سمت روی مقدار بالاتری تنظیم شود در حالی که سمت دیگر اتصال همچنان از مقدار پیشفرض 3600 ثانیه استفاده میکند، به این معنی که مذاکره مجدد همچنان هر 3600 ثانیه یک بار رخ خواهد داد. راهحل این است که --reneg-sec را در هر دو سمت کلاینت و سرور افزایش دهید، یا آن را در یک سمت اتصال روی 0 تنظیم کنید (جهت غیرفعالسازی)، و در سمت دیگر روی مقدار دلخواه خود بگذارید.
گزینههای حالت TLS
حالت TLS قدرتمندترین حالت رمزنگاری OpenVPN از نظر امنیت و انعطافپذیری است. حالت TLS با ایجاد کانالهای کنترل و داده که روی یک درگاه تکین TCP/UDP تسهیم (multiplex) شدهاند، عمل میکند. OpenVPN یک نشست TLS را روی کانال کنترل آغاز میکند و از آن برای تبادل کلیدهای سایفر و HMAC جهت محافظت از کانال داده بهره میبرد. حالت TLS از یک لایه قابلیت اطمینان قدرتمند روی اتصال UDP برای تمامی ارتباطات کانال کنترل استفاده میکند، در حالی که کانال داده که دادههای رمزگذاریشده تونل از آن عبور میکنند، بدون هیچ واسطهای هدایت میشود. نتیجه دستیابی به بهترین مزایای هر دو حالت است: یک کانال داده سریع که روی UDP فقط با سربار توابع رمزگذاری، رمزگشایی و HMAC ارسال میشود، و یک کانال کنترل که تمامی قابلیتهای امنیتی TLS، شامل احراز هویت مبتنی بر گواهی و رازداری مستقیم دیفی-هلمن (Diffie Hellman forward secrecy) را فراهم میکند.
برای استفاده از حالت TLS، هر همتایی (peer) که OpenVPN را اجرا میکند باید جفت گواهی/کلید محلی خود (--cert و --key) را داشته باشد که توسط گواهی ریشه مشخصشده در --ca امضا شده است.
هنگامی که دو همتای OpenVPN به یکدیگر متصل میشوند، هر یک گواهی محلی خود را به دیگری ارائه میدهد. سپس هر همتا بررسی میکند که همتای مقابل گواهیای ارائه داده باشد که توسط گواهی ریشه اصلی مشخصشده در --ca امضا شده باشد.
اگر این بررسی در هر دو همتا موفقیتآمیز باشد، مذاکره TLS با موفقیت انجام میشود، هر دو همتای OpenVPN کلیدهای نشست موقت را تبادل خواهند کرد و انتقال داده در تونل آغاز میشود.
پروژه OpenVPN مجموعهای از اسکریپتها را برای مدیریت گواهیها و کلیدهای RSA ارائه میدهد: https://github.com/OpenVPN/easy-rsa
- --askpass file
- دریافت
گذرواژه
گواهی از
کنسول یا file
قبل از
تبدیل شدن
به دیمن.
نحوهای معتبر:
askpass askpass file
برای کاربرانی که دغدغههای امنیتی شدیدی دارند، این امکان وجود دارد که با یک گذرواژه از کلید خصوصی محافظت شود. البته این بدان معناست که با هر بار راهاندازی دیمن OpenVPN باید برای وارد کردن گذرواژه حضور داشته باشید. گزینه --askpass به شما اجازه میدهد OpenVPN را از خط فرمان اجرا کنید. این گزینه قبل از دیمن شدن، گذرواژه را از شما میپرسد. برای محافظت از یک کلید خصوصی با گذرواژه، هنگام استفاده از ابزار خط فرمان openssl برای مدیریت گواهیها و کلیدهای خصوصی باید گزینه -nodes را حذف کنید.
اگر file مشخص شده باشد، گذرواژه از سطر اول file خوانده میشود. به یاد داشته باشید که ذخیره گذرواژه در یک پرونده، تا حدی امنیت مضاعف ارائهشده توسط استفاده از کلید رمزگذاریشده را بیاثر میکند.
- --ca file
- پرونده مرجع صدور گواهی (CA) در قالب pem.، که با نام گواهی root (ریشه) نیز شناخته میشود. این پرونده میتواند شامل چندین گواهی با قالب pem. باشد که به هم متصل شدهاند. میتوانید با استفاده از دستوری مانند زیر، گواهی مرجع صدور گواهی و کلید خصوصی خود را بسازید:
openssl req -nodes -new -x509 -keyout ca.key -out ca.crt
سپس پرونده openssl.cnf خود را ویرایش کرده و متغیر certificate را طوری تغییر دهید که به گواهی ریشه جدید شما یعنی ca.crt اشاره کند.
تنها به منظور آزمایش، توزیع OpenVPN شامل یک گواهی CA نمونه (ca.crt) است. البته هرگز نباید از گواهیها و کلیدهای آزمایشی توزیعشده با OpenVPN در یک محیط عملیاتی استفاده کنید، زیرا به دلیل توزیع عمومی همراه با OpenVPN، کاملاً ناامن هستند.
- --capath dir
- دایرکتوری
حاوی
گواهیهای
معتبر (CAها و
CRLها). در mbed TLS در
دسترس نیست.
انتظار میرود CAهای موجود در دایرکتوری capath با الگوی <hash>.<n> نامگذاری شوند. انتظار میرود CRLها با الگوی <hash>.r<n> نامگذاری شوند. برای اطلاعات بیشتر، گزینهی -CApath از دستور openssl verify و گزینهی -hash از دستورهای openssl x509، openssl crl و X509_LOOKUP_hash_dir()(3) را ببینید.
مشابه گزینهی --crl-verify، استفاده از CRLها اجباری نیست - در صورت عدم وجود CRL مربوطه، OpenVPN یک هشدار معمول در لاگها ثبت میکند، اما اجازه برقراری اتصال داده خواهد شد.
- --cert file|uri
- گواهی
امضاشدهی
همتای محلی
در قالب pem. یا
به صورت یک URI --
باید توسط
مرجع صدور
گواهی که
گواهی آن در
--ca file در
پیکربندی
همتا قرار
دارد، امضا
شده باشد. URI
تنها زمانی
پشتیبانی
میشود که
برنامه با OpenSSL
3.0 یا بالاتر
ساخته شده و
ارائهدهندگان
(providers) مورد
نیاز
بارگذاری
شده باشند.
انواع URIهای
پشتیبانیشده
و نحو (syntax)
آنها به
ارائهدهندهها
بستگی دارد.
OpenSSL پشتیبانی
داخلی از URI
به شکل
"<file:/absolute/path>" دارد
که در این
حالت
پیشوند طرح
"file:" اختیاری
است و هر
قالب
پروندهای
که توسط OpenSSL
شناخته شود
(مانند PEM، PKCS12)
پشتیبانی
میشود.
پروتکل PKCS#11 URI (RFC 7512)
توسط pkcs11-provider
پشتیبانی
میشود.
هر همتا در یک اتصال OpenVPN که در حالت TLS اجرا میشود باید پرونده گواهی و پرونده کلید خصوصی مخصوص به خود را داشته باشد. علاوه بر این، هر گواهی باید توسط کلید مرجع صدور گواهی که کلید عمومی آن در پرونده مرجع صدور گواهی --ca قرار دارد امضا شده باشد. شما میتوانید به راحتی مرجع صدور گواهی خود را ایجاد کنید (به بالا مراجعه کنید) یا برای استفاده از یک سرویس تجاری مانند thawte.com هزینه بپردازید (که در این صورت به تأمین مالی دومین گردشگر فضایی جهان کمک خواهید کرد :). برای ایجاد یک گواهی، میتوانید از دستوری مانند زیر استفاده کنید:
openssl req -nodes -new -keyout mycert.key -out mycert.csr
اگر کلید خصوصی مرجع صدور گواهی شما روی دستگاه دیگری قرار دارد، درخواست امضای گواهی (mycert.csr) را به آن دستگاه منتقل کنید (این کار میتواند از طریق کانالی ناامن مانند ایمیل انجام شود). اکنون گواهی را با دستوری مانند زیر امضا کنید:
openssl ca -out mycert.crt -in mycert.csr
اکنون گواهی (mycert.crt) را به همتایی که ابتدا پرونده csr. را ایجاد کرده بود برگردانید (این کار میتواند روی یک بستر عمومی انجام شود). توجه داشته باشید که دستور openssl ca مکان کلید مرجع صدور گواهی را از پرونده پیکربندی خود مانند /usr/share/ssl/openssl.cnf میخواند -- همچنین توجه داشته باشید که برای عملکردهای مرجع صدور گواهی، باید پروندههای index.txt (میتواند خالی باشد) و serial (مقداردهی اولیه به 01) را آماده کنید.
- --crl-verify args
- بررسی
گواهی همتا
در برابر
فهرست
ابطال
گواهی (CRL).
نحو معتبر:
crl-verify file/directory flag
مثالها:
crl-verify crl-file.pem crl-verify /etc/openvpn/crls dir
یک CRL (فهرست ابطال گواهی) زمانی استفاده میشود که یک کلید مشخص لو رفته یا به خطر افتاده باشد اما کلیت PKI هنوز سالم و دستنخورده باشد.
فرض کنید یک ساختار PKI شامل یک CA، گواهی ریشه و تعدادی گواهی کلاینت دارید. فرض کنید یک لپتاپ حاوی کلید و گواهی کلاینت به سرقت رفته است. با افزودن گواهی سرقتشده به پرونده CRL، میتوانید هر اتصالی که تلاش میکند از آن استفاده کند را رد کنید، در حالی که یکپارچگی کلی PKI حفظ میشود.
تنها زمانی که بازسازی کل ساختار PKI از ابتدا ضروری خواهد بود، زمانی است که کلید گواهی ریشه خود به خطر افتاده باشد.
این گزینه اجباری نیست - اگر CRL مربوطه وجود نداشته باشد، OpenVPN هشداری را در لاگها ثبت میکند - برای مثال:
VERIFY WARNING: depth=0, unable to get certificate CRL
اما اتصال مجاز خواهد بود. اگر پرچم اختیاری dir مشخص شده باشد، حالت متفاوتی فعال میشود که در آن crl-verify به دایرکتوری اشاره میکند که شامل پروندههایی با نام شماره سریالهای باطلشده است (پروندهها میتوانند خالی باشند، محتوای آنها هرگز خوانده نمیشود). اگر کلاینتی درخواست اتصال دهد و شماره سریال گواهی آن کلاینت (رشته دهدهی) نام پروندهای در آن دایرکتوری باشد، رد خواهد شد.
- Note:
- از آنجا که پرونده (یا دایرکتوری) crl با هر بار اتصال یک همتا خوانده میشود، اگر در حال کاهش دسترسیهای root با استفاده از --user هستید، مطمئن شوید که این کاربر دسترسیهای کافی برای خواندن پرونده را دارد.
- --dh file
- پرونده
حاوی
پارامترهای
میدان
متناهی Diffie Hellman
در قالب .pem
(فقط توسط
--tls-server
استفاده
میشود).
مقدار file را روی none قرار دهید تا تبادل کلید میدان متناهی Diffie Hellman غیرفعال شود (و در عوض تنها از ECDH یا الگوریتمهای توافق کلید ترکیبی جدیدتر مانند X25519MLKEM768 استفاده گردد). توجه داشته باشید که این کار مستلزم آن است که همتایان از یک کتابخانه SSL که از مجموعههای رمزنگاری TLS مبتنی بر ECDH پشتیبانی میکند (مانند OpenSSL 1.0.1+ یا mbed TLS 2.0+) استفاده کنند. از نگارش 2.7.0 به بعد، این کار معادل عدم تعیین --dh است.
پارامترهای Diffie Hellman را میتوان با استفاده از openssl dhparam -out dh2048.pem 2048 تولید کرد، اما توصیه میشود از none استفاده کنید زیرا میدان متناهی Diffie Hellman با انواع مدرنتر مانند ECDH جایگزین شده است.
پارامترهای Diffie Hellman را میتوان عمومی در نظر گرفت.
- --ecdh-curve name
- منحنی مورد
استفاده
برای منحنی
بیضوی Diffie Hellman را
مشخص کنید.
منحنیهای
موجود را
میتوان با
--show-curves فهرست
کرد. منحنی
مشخصشده
فقط برای
رمزهای TLS از
نوع ECDH
استفاده
خواهد شد.
این گزینه در ساختهای mbed TLS نرمافزار OpenVPN پشتیبانی نمیشود.
- --extra-certs file
- یک file حاوی
یک یا چند
گواهی PEM
(پیوسته به
یکدیگر)
مشخص کنید
که زنجیره
گواهی محلی
را کامل
میکند.
این گزینه برای مراجع صدور گواهی (CA) "تفکیکشده" مفید است؛ جایی که CA برای گواهیهای سرور با CA برای گواهیهای کلاینت متفاوت است. قرار دادن گواهیها در این پرونده به آنها اجازه میدهد تا برای تکمیل زنجیره گواهی محلی استفاده شوند بدون اینکه برای اعتبارسنجی گواهی ارائهشده توسط همتا به آنها اعتماد شود؛ برخلاف حالتی که گواهیها در پرونده ca قرار میگیرند.
- --hand-window n
- پنجره
دستتکانی
(Handshake Window) -- تبادل
کلید مبتنی
بر TLS باید
ظرف n ثانیه
پس از آغاز
دستتکانی
توسط هر یک
از همتایان
نهایی شود
(پیشفرض 60
ثانیه). در
صورت شکست
دستتکانی،
تلاش
میشود تا
اتصال با
همتا
بازنشانی
شده و
دوباره
تلاش شود.
حتی در صورت
شکست
دستتکانی،
کلید در حال
انقضا تا
سقف --tran-window
ثانیه برای
حفظ
پیوستگی
انتقال
دادههای
تونل
استفاده
خواهد شد.
پارامتر --hand-window همچنین مدت زمانی را کنترل میکند که کلاینت OpenVPN درخواست pull را تا زمان اتمام مهلت تکرار میکند.
- --key file|uri
- کلید خصوصی همتای محلی در قالب .pem یا یک URI. از کلید خصوصی تولیدشده هنگام ایجاد گواهی همتای خود استفاده کنید (به --cert file در بالا مراجعه کنید). URI فقط زمانی پشتیبانی میشود که با OpenSSL 3.0 یا جدیدتر ساخته شده باشد و ارائهدهندگان (providers) مورد نیاز بارگذاری شده باشند. (برای جزئیات بیشتر به --cert مراجعه کنید).
- --ns-cert-type type
- منسوخ شده
باید از
گزینه --remote-cert-tls
در عوض
استفاده
شود. این
گزینه
همچنان در
دسترس است
زیرا
نمیتوان
آن را
بیصدا
نادیده
گرفت و
نیازمند
بهروزرسانی
گواهیها و
پیکربندیها
در هر دو
سمت اتصال
است. با این
حال نباید
برای
کلاینتها
یا سرورهای
جدید
استفاده
شود. این
گزینه به
فیلد گواهی
منسوخشده
nsCertType وابسته
است.
بسته به کتابخانه TLS مورد استفاده ممکن است کار نکند.
در انتشارهای آینده حذف خواهد شد.
- --pkcs12 file
- یک پرونده PKCS #12 حاوی کلید خصوصی محلی، گواهی محلی و گواهی ریشه CA را مشخص کنید. این گزینه میتواند بهجای --ca، --cert و --key استفاده شود. در mbed TLS در دسترس نیست.
- --remote-cert-eku oid
- مستلزم این
است که
گواهی همتا
با یک extended key usage
(کاربرد
کلید
گسترشیافته)
صریح امضا
شده باشد.
این یک گزینه امنیتی مفید برای کلاینتها است تا اطمینان حاصل شود میزبانی که به آن متصل میشوند یک سرور تعیینشده است.
کاربرد کلید گسترشیافته باید به صورت oid notation یا OpenSSL symbolic representation کدگذاری شود.
- --remote-cert-ku key-usage
- مستلزم این
است که
گواهی همتا
با یک key-usage
(کاربرد
کلید) صریح
امضا شده
باشد.
در صورت وجود در گواهی، مقدار keyUsage توسط کتابخانه TLS در طول دستتکانی TLS اعتبارسنجی میشود. مشخص کردن این گزینه بدون آرگومان، مستلزم وجود داشتن این افزونه است (تا کتابخانه TLS آن را اعتبارسنجی کند).
اگر key-usage فهرستی از بیتهای کاربرد باشد، فیلد keyUsage باید حداقل بیتهایی مشابه بیتهای تنظیمشده در یکی از مقادیر ارائهشده در فهرست key-usage را داشته باشد.
مقادیر key-usage در فهرست باید به صورت هگزادسیمال کدگذاری شوند، به عنوان مثال:
remote-cert-ku a0
- --remote-cert-tls type
- مستلزم این
است که
گواهی همتا
با یک key usage و extended
key usage صریح بر
اساس قواعد
TLS در RFC3280 امضا
شده باشد.
ساختارهای نحوی معتبر:
remote-cert-tls server remote-cert-tls client
این یک گزینه امنیتی مفید برای کلاینتها است تا اطمینان حاصل شود میزبانی که به آن متصل میشوند یک سرور تعیینشده است. یا برعکس؛ برای اینکه یک سرور تأیید کند که فقط میزبانهای دارای گواهی کلاینت میتوانند متصل شوند.
گزینه --remote-cert-tls client معادل است با:
remote-cert-ku remote-cert-eku "TLS Web Client Authentication"
گزینه --remote-cert-tls server معادل است با:
remote-cert-ku remote-cert-eku "TLS Web Server Authentication"
این یک اقدام احتیاطی امنیتی مهم برای محافظت در برابر حمله مرد میانی (man-in-the-middle) است که در آن یک کلاینت مجاز با جعل هویت سرور تلاش میکند به کلاینت دیگری متصل شود. این حمله بهراحتی با واداشتن کلاینتها به تأیید اعتبار گواهی سرور با استفاده از هر یک از گزینههای --remote-cert-tls، --verify-x509-name، --peer-fingerprint یا --tls-verify قابل پیشگیری است.
- --tls-auth args
- افزودن یک
لایه اضافی
از احراز
هویت HMAC بر
روی کانال
کنترلی TLS
جهت کاهش
حملات DoS و
حملات علیه
پشته TLS.
نحوهای معتبر:
tls-auth file tls-auth file 0 tls-auth file 1
به طور خلاصه، --tls-auth نوعی "دیوار آتش HMAC" را روی درگاه TCP/UDP برنامه OpenVPN فعال میکند، جایی که بستههای کانال کنترلی TLS با امضای HMAC نادرست میتوانند بلافاصله و بدون پاسخ دور انداخته شوند.
file (الزامی) پروندهای با قالب کلید ایستا OpenVPN است که میتواند توسط --genkey ایجاد شود.
نسخههای قدیمیتر (تا OpenVPN 2.3) از یک پرونده عبارت عبور با قالب آزاد پشتیبانی میکردند. این ویژگی دیگر در نسخههای جدیدتر (v2.4+) پشتیبانی نمیشود.
پارامتر اختیاری direction استفاده از ۲ کلید مجزا (HMAC-send، HMAC-receive) را فعال میکند، به طوری که هر جهت جریان داده یک کلید HMAC متفاوت داشته باشد. این امر ویژگیهای امنیتی مطلوبی از جمله از بین بردن انواع خاصی از حملات DoS و حملات تکرار پیام (replay) را به همراه دارد.
هنگامی که پارامتر direction حذف شود، همان کلید به صورت دوطرفه استفاده میشود.
پارامتر direction باید همیشه در دو طرف اتصال مکمل یکدیگر باشد، یعنی یک طرف باید از 0 و طرف دیگر از 1 استفاده کند، یا هر دو طرف آن را کاملاً نادیده بگیرند.
پارامتر direction نیازمند این است که file حاوی یک کلید ۲۰۴۸ بیتی باشد. در حالی که نسخههای قبل از ۱.۵ برنامه OpenVPN پروندههای کلید ۱۰۲۴ بیتی تولید میکنند، هر نسخهای از OpenVPN که از پارامتر direction پشتیبانی میکند، از تولید پرونده کلید ۲۰۴۸ بیتی با استفاده از گزینه --genkey نیز پشتیبانی خواهد کرد.
استفاده از --tls-auth زمانی توصیه میشود که OpenVPN را در حالتی اجرا میکنید که در حال گوش دادن به بستهها از هر آدرس IP است، مانند زمانی که --remote مشخص نشده باشد یا --remote همراه با --float مشخص شده باشد.
منطق این ویژگی به شرح زیر است. TLS قبل از اینکه بتواند یک همتا را احراز هویت کند، به یک تبادل چند بستهای نیاز دارد. در طول این زمان پیش از احراز هویت، OpenVPN منابعی (حافظه و CPU) را به این همتای احتمالی اختصاص میدهد. این همتای احتمالی همچنین بخشهای زیادی از OpenVPN و کتابخانه OpenSSL را در معرض بستههایی که ارسال میکند قرار میدهد. امروزه اکثر حملات شبکهای موفق به دنبال سوءاستفاده از اشکالات برنامهها (مانند حملات سرریز بافر) یا وادار کردن برنامه به مصرف آنچنان منابعی هستند که غیرقابل استفاده شود. مسلماً اولین خط دفاعی همیشه تولید کد تمیز و به خوبی ارزیابیشده است. OpenVPN با اولویت اصلی جلوگیری از حملات سرریز بافر نوشته شده است. اما همانطور که تاریخ نشان داده است، بسیاری از پرکاربردترین برنامههای کاربردی شبکه، گهگاه مغلوب حملات سرریز بافر شدهاند.
بنابراین به عنوان خط دوم دفاعی، OpenVPN این لایه ویژه از احراز هویت را بر روی کانال کنترلی TLS ارائه میدهد تا هر بسته در کانال کنترلی با یک امضای HMAC و یک شناسه یکتا برای محافظت در برابر تکرار (replay) احراز هویت شود. این امضا همچنین به محافظت در برابر حملات DoS (محرومسازی از سرویس) کمک میکند. یک قاعده سرانگشتی مهم در کاهش آسیبپذیری در برابر حملات DoS، به حداقل رساندن مقدار منابعی است که یک کلاینت بالقوه، اما هنوز احراز هویتنشده، میتواند مصرف کند.
--tls-auth این کار را با امضای هر بسته کانال کنترلی TLS با امضای HMAC انجام میدهد، از جمله بستههایی که قبل از اینکه سطح TLS فرصت احراز هویت همتا را پیدا کند ارسال میشوند. نتیجه این است که بستههای بدون امضای صحیح میتوانند بلافاصله پس از دریافت دور انداخته شوند، قبل از اینکه فرصتی برای مصرف منابع اضافی سیستم، مانند شروع یک مصافحه (handshake) TLS داشته باشند. --tls-auth را میتوان با افزودن گزینه --replay-persist تقویت کرد که وضعیت حفاظت از تکرار OpenVPN را در یک پرونده نگه میدارد تا در طول راهاندازیهای مجدد از دست نرود.
باید تاکید شود که این ویژگی اختیاری است و پرونده کلید استفاده شده با --tls-auth چیزی بیش از قدرت شروع یک مصافحه TLS به همتا نمیدهد. این ویژگی برای رمزگذاری یا احراز هویت هیچیک از دادههای تونل استفاده نمیشود.
اگر میخواهید از پرونده کلید نه تنها برای احراز هویت، بلکه برای رمزگذاری کانال کنترلی TLS نیز استفاده کنید، به جای آن از --tls-crypt استفاده نمایید.
- --tls-groups list
- فهرستی از
گروهها/منحنیهای
مجاز به
ترتیب
اولویت.
تنظیم منحنیها/گروههای بیضوی مجاز برای نشست TLS. این گروهها مجاز به استفاده در امضاها و تبادل کلید هستند.
در حال حاضر mbedTLS به طور پیشفرض اجازه استفاده از تمام منحنیهای شناخته شده را میدهد.
کتابخانه OpenSSL 1.1+ این فهرست را به طور پیشفرض به موارد زیر محدود میکند:
"X25519:secp256r1:X448:secp521r1:secp384r1".
اگر از گواهیهایی استفاده میکنید که از منحنیهای غیراستاندارد استفاده میکنند، ممکن است لازم باشد آنها را در اینجا اضافه کنید. اگر منحنی ecdh را با استفاده از --ecdh-curve اجبار نکنید، گروههای مربوط به ecdh نیز از این فهرست انتخاب خواهند شد.
برنامه OpenVPN نام منحنی secp256r1 را به prime256v1 نگاشت میکند تا امکان تعیین گزینه یکسان tls-groups برای mbedTLS و OpenSSL فراهم شود.
هشدار: این گزینه نه تنها گواهیهای منحنی بیضوی بلکه تبادل کلید در TLS 1.3 را نیز تحت تاثیر قرار میدهد و استفاده نادرست از این گزینه باعث غیرفعال شدن TLS 1.3 خواهد شد.
- --tls-cert-profile profile
- تنظیم
الگوریتمهای
رمزنگاری
مجاز برای
گواهیها
با توجه به
profile.
پروفایلهای زیر پشتیبانی میشوند:
- insecure
- برای mbed TLS یکسان با legacy
- legacy (پیشفرض)
- الگوریتم SHA1 و جدیدتر، RSA با ۲۰۴۸ بیت به بالا، هر منحنی بیضوی.
- preferred
- الگوریتم SHA2 و جدیدتر، RSA با ۲۰۴۸ بیت به بالا، هر منحنی بیضوی.
- suiteb
- الگوریتم SHA256/SHA384، الگوریتم ECDSA با P-256 یا P-384.
این گزینه تنها برای ساختهای mbed TLS به طور کامل پشتیبانی میشود. ساختهای OpenSSL از تقریب زیر استفاده میکنند:
- insecure
- مقدار "security level 0" را تنظیم میکند
- legacy (پیشفرض)
- مقدار "security level 1" را تنظیم میکند
- preferred
- مقدار "security level 2" را تنظیم میکند
- suiteb
- مقدار "security level 3" و --tls-cipher "SUITEB128" را تنظیم میکند.
برنامه OpenVPN در آینده به 'preferred' به عنوان پیشفرض مهاجرت خواهد کرد. لطفاً اطمینان حاصل کنید که کلیدهای شما از قبل با آن مطابقت دارند.
- هشدار: --tls-cipher، --tls-ciphersuites و tls-groups
- این گزینهها ویژگیهای پیشرفتهای هستند که - در صورت استفاده صحیح - میتوانند امنیت اتصال VPN شما را بهبود بخشند. اما همچنین بسیار ساده است که ناخواسته با آنها به پای خود شلیک کنید یا صرفاً اتصال خود را قطع نمایید. با احتیاط استفاده کنید!
- --tls-cipher l
- یک فهرست l
از رمزهای
مجاز TLS که با
دونقطه (":")
جدا
شدهاند.
از این تنظیم میتوان برای اطمینان از استفاده (یا عدم استفاده) از مجموعههای رمزنگاری خاص برای اتصال TLS استفاده کرد. OpenVPN از TLS برای ایمنسازی کانال کنترل استفاده میکند؛ کانالی که کلیدهای محافظت از ترافیک واقعی VPN از طریق آن مبادله میشوند.
فهرست ارائهشده از رمزها (پس از تبدیل نام احتمالی توسط OpenSSL/IANA) صرفاً به کتابخانه رمزنگاری ارسال میشود. لطفاً برای جزئیات نحوه تفسیر فهرست رمزها به مستندات OpenSSL یا mbed TLS مراجعه کنید.
برای OpenSSL، گزینه --tls-cipher برای TLS 1.2 و پایینتر استفاده میشود.
برای مشاهده فهرست رمزهای TLS پشتیبانیشده توسط کتابخانه رمزنگاری خود، از --show-tls استفاده کنید.
مقدار پیشفرض برای --tls-cipher، استفاده از فهرست رمزهای پیشفرض mbed TLS در زمان استفاده از mbed TLS یا DEFAULT:!EXP:!LOW:!MEDIUM:!kDH:!kECDH:!DSS:!PSK:!SRP:!kRSA هنگام استفاده از OpenSSL است.
- --tls-ciphersuites l
- مشابه --tls-cipher
اما برای TLS 1.3 و
بالاتر. mbed TLS
هنوز از TLS 1.3
پشتیبانی
نمیکند و
تنها تنظیم
--tls-cipher
استفاده
میشود.
پیشفرض برای --tls-ciphersuites، استفاده از پیشفرض کتابخانه رمزنگاری است.
- --tls-client
- فعالسازی TLS و بر عهده گرفتن نقش کلاینت در طول مصافحه (handshake) TLS.
- --tls-crypt keyfile
- رمزنگاری و
احراز
اصالت تمام
بستههای
کانال
کنترل با
کلید موجود
در keyfile. (برای
پیشزمینه
بیشتر به
--tls-auth مراجعه
کنید.)
رمزنگاری (و احراز اصالت) بستههای کانال کنترل:
- حریم خصوصی بیشتری را با پنهان کردن گواهی استفادهشده برای اتصال TLS فراهم میکند،
- شناسایی ترافیک OpenVPN را سختتر میسازد،
- امنیت پسا-کوانتومی "مقدماتی" در برابر مهاجمانی که هرگز کلید پیشاشتراکی را نخواهند فهمید (فاقد پنهانداری پیشرو)، ارائه میدهد.
برخلاف --tls-auth، گزینه --tls-crypt کاربر را ملزم نمیکند که --key-direction را تنظیم کند.
ملاحظات امنیتی
تمام همتایان از کلید گروهی پیشاشتراکی --tls-crypt یکسانی برای احراز اصالت و رمزنگاری پیامهای کانال کنترل استفاده میکنند. برای اطمینان از اینکه تداخل IV همچنان بعید باقی بماند، این کلید نباید برای رمزنگاری بیش از 2^48 پیام کانال کنترل کلاینتبهسرور یا 2^48 سروربهکلاینت استفاده شود. یک مذاکره اولیه معمول حدود ۱۰ بسته در هر جهت است. با فرض اینکه هر دو مذاکره اولیه و مذاکرات مجدد (برای محافظهکاری) حداکثر 2^16 (65536) بسته باشند و (مذاکرات) مجدد در هر دقیقه برای هر کاربر (۲۴/۷) رخ دهد، این امر طول عمر کلید tls-crypt را به ۸۱۷۱ سال تقسیم بر تعداد کاربران محدود میکند. بنابراین یک پیکربندی با ۱۰۰۰ کاربر باید کلید را حداقل هر هشت سال یکبار بازچرخانی کند. (و یک راهاندازی با ۸۰۰۰ کاربر، هر سال.)
اگر تداخل IV رخ دهد، میتواند منجر به تنزل امنیت --tls-crypt به همان سطح امنیت استفاده از --tls-auth شود. بدین معنا که کانال کنترل همچنان از محافظت اضافی در برابر حملات فعال مرد میانی و حملات DoS بهره میبرد، اما ممکن است دیگر حریم خصوصی اضافی و امنیت پسا-کوانتومی فراتر از آنچه خود TLS ارائه میدهد را فراهم نکند.
برای پیکربندیهای بزرگ یا راهاندازیهایی که در آن کلاینتها مورد اعتماد نیستند، استفاده از --tls-crypt-v2 را مد نظر قرار دهید. آن گزینه از کلیدهای یکتا به ازای هر کلاینت استفاده میکند و بدین ترتیب بازه را به 'بازچرخانی کلید کلاینت حداقل یکبار در هر ۸۰۰۰ سال' بهبود میبخشد.
- --tls-crypt-v2 keyfile
- نحو معتبر:
tls-crypt-v2 keyfile tls-crypt-v2 keyfile force-cookie tls-crypt-v2 keyfile allow-noncookie
استفاده از کلیدهای tls-crypt اختصاصی کلاینت.
برای کلاینتها، keyfile یک کلید tls-crypt اختصاصی کلاینت است. چنین کلیدی را میتوان با استفاده از گزینه --genkey tls-crypt-v2-client ایجاد کرد.
برای سرورها، keyfile جهت بازگشایی (unwrap) کلیدهای اختصاصی کلاینت ارائهشده توسط کلاینت در طول برقراری اتصال استفاده میشود. این کلید باید همان کلیدی باشد که برای تولید کلید اختصاصی کلاینت استفاده شده است (به --genkey tls-crypt-v2-client مراجعه کنید).
روی سرورها، این گزینه میتواند همراه با گزینه --tls-auth یا --tls-crypt استفاده شود. در آن حالت، سرور استفاده کلاینت از کلیدهای اختصاصی کلاینت را تشخیص داده و بهطور خودکار حالت مناسب را انتخاب میکند.
پارامتر اختیاری force-cookie تنها به کلاینتهای tls-crypt-v2 که از مصافحه سهمرحلهای بیوضعیت (stateless) مبتنی بر کوکی پشتیبانی میکنند اجازه فعالیت میدهد؛ این امر مانع از حملات بازپخش (replay attacks) و تخلیه وضعیت (state exhaustion) در سمت سرور میشود (OpenVPN 2.6 و بالاتر). گزینه allow-noncookie صریحاً به کلاینتهای قدیمیتر tls-crypt-v2 اجازه اتصال میدهد. مقدار پیشفرض (در حال حاضر) allow-noncookie است.
- --tls-crypt-v2-verify cmd
- اجرای
دستور cmd
برای
اعتبارسنجی
فراداده
کلید tls-crypt-v2
اختصاصی
کلاینت در
حال اتصال.
این به
مدیران
سرور اجازه
میدهد تا
پیش از قرار
دادن پشته TLS
(شامل
پشتههای
ذاتا
خطرناک X.509 و ASN.1)
در معرض
کلاینت
متصلشونده،
اتصال
کلاینت را
رد کنند.
OpenVPN متغیرهای محیطی زیر را به دستور ارسال میکند (و تنها همین متغیرها؛ متغیرهای محیطی معمول موجود برای سایر اسکریپتها در دسترس نیستند):
- مقدار script_type روی tls-crypt-v2-verify تنظیم شده است.
- مقدار metadata_type در صورتی که فراداده توسط کاربر ارائه شده باشد روی 0، و اگر یک برچسب زمانی ۶۴ بیتی یونیکس نشاندهنده زمان ساخت کلید باشد روی 1 تنظیم شده است.
- مقدار metadata_file شامل نام پرونده یک پرونده موقت است که فراداده کلاینت در آن قرار دارد.
دستور میتواند با خروج با یک کد خروج غیر صفر، اتصال را رد کند.
- --tls-crypt-v2-max-age n
- رد کردن کلیدهای کلاینت tls-crypt-v2 که قدیمیتر از n روز هستند یا فاقد برچسب زمانی میباشند.
- --tls-exit
- خروج در صورت شکست در مذاکره TLS. این گزینه زمانی که فقط میخواهید یک بار برای اتصال تلاش کنید مفید است، مثلا در یک اسکریپت آزمایشی یا پایش. (مجموعه آزمون خود OpenVPN به همین شکل از آن استفاده میکند.)
- --tls-server
- فعال کردن TLS و به عهده گرفتن نقش سرور در طول دستتکانی TLS. توجه داشته باشید که OpenVPN به عنوان یک برنامه همتا به همتا طراحی شده است. تعیین کلاینت یا سرور صرفا به منظور مذاکره در کانال کنترل TLS است.
- --tls-timeout n
- مهلت زمانی ارسال مجدد بسته در کانال کنترل TLS در صورت عدم دریافت تاییدیه از راه دور ظرف n ثانیه (پیشفرض 2). هنگامی که OpenVPN یک بسته کنترلی به همتای خود ارسال میکند، انتظار دارد تاییدیه را ظرف n ثانیه دریافت کند، در غیر این صورت بسته را مجددا تحت الگوریتم عقبنشینی نمایی مشابه TCP ارسال میکند. این پارامتر فقط برای بستههای کانال کنترل اعمال میشود. بستههای کانال داده (که دادههای رمزگذاریشده تونل را حمل میکنند) هرگز توسط OpenVPN تایید، مرتبسازی یا بازفرستی نمیشوند، زیرا پروتکلهای سطح بالاتر شبکه مانند TCP که روی تونل اجرا میشوند انتظار دارند این وظیفه به آنها واگذار شود.
- --tls-version-min args
- حداقل نسخه
TLS قابل قبول
از همتا را
تعیین
میکند
(پیشفرض در
نسخه 2.6.0 و
جدیدتر "1.2"
است).
نحو معتبر:
tls-version-min version ['or-highest']
نمونهها برای version شامل 1.0، 1.1 یا 1.2 است. اگر or-highest مشخص شده باشد و version شناخته نشود، فقط بالاترین نسخه TLS پشتیبانیشده توسط پیادهسازی SSL محلی پذیرفته میشود.
- --tls-version-max version
- حداکثر نسخه TLS مورد استفاده را تعیین میکند (پیشفرض بالاترین نسخه پشتیبانیشده است). نمونهها برای version شامل 1.0، 1.1 یا 1.2 است.
- --verify-hash args
- منسوخشده
اثر انگشت SHA1
یا SHA256 را برای
گواهی سطح ۱
مشخص کنید.
نحو معتبر:
verify-hash hash [algo]
گواهی سطح ۱ همان CA (یا گواهی میانی) است که گواهی برگ (leaf) را امضا میکند و در جهت ریشه، یک سطح با گواهی برگ فاصله دارد. هنگام پذیرش اتصال از یک همتا، اثر انگشت گواهی سطح ۱ باید با hash مطابقت داشته باشد، در غیر این صورت اعتبارسنجی گواهی با شکست مواجه میشود. هش به صورت XX:XX:... مشخص میشود. برای نمونه:
AD:B0:95:D8:09:C8:36:45:12:A9:89:C8:90:09:CB:13:72:A6:AD:16
پرچم algo میتواند SHA1 یا SHA256 باشد. در صورت عدم ارائه، مقدار پیشفرض SHA1 خواهد بود.
این گزینه میتواند به صورت درونخطی نیز تعریف شود
<verify-hash> 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff 11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00 </verify-hash>
اگر گزینه به صورت درونخطی تعریف شود، algo همیشه SHA256 خواهد بود.
نحو معتبر:
peer-fingerprint AD:B0:95:D8:09:...
یا درونخطی:
<peer-fingerprint> 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff 11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00 </peer-fingerprint>
هنگامی که گزینه --peer-fingerprint استفاده میشود، مشخص کردن یک CA با --ca یا --capath اختیاری است. این به --peer-fingerprint اجازه میدهد تا به عنوان جایگزینی برای یک PKI با گواهیهای خودامضا برای راهاندازیهای کوچک استفاده شود. برای چنین راهاندازی بخش مثالها را ببینید.
- --verify-x509-name args
- پذیرش
اتصالات
تنها در
صورتی که
نام X.509
میزبان با
name برابر
باشد.
میزبان راه
دور همچنین
باید تمام
آزمونهای
دیگر
اعتبارسنجی
را پشت سر
بگذارد.
نحو معتبر:
verify-x509 name type
اینکه کدام نام X.509 با name مقایسه شود به تنظیم type بستگی دارد. type میتواند subject برای مطابقت با DN کامل موضوع (پیشفرض)، name برای مطابقت با یک RDN موضوع یا name-prefix برای مطابقت با پیشوند RDN موضوع باشد. اینکه کدام RDN به عنوان name اعتبارسنجی شود به گزینه --x509-username-field بستگی دارد. اما مقدار پیشفرض آن common name (CN) است، برای نمونه گواهیای با subject DN زیر
C=KG, ST=NA, L=Bishkek, CN=Server-1
با موارد زیر مطابقت داده میشود:
verify-x509-name 'C=KG, ST=NA, L=Bishkek, CN=Server-1' verify-x509-name Server-1 name verify-x509-name Server- name-prefix
آخرین مثال زمانی مفید است که میخواهید یک کلاینت تنها اتصالات به Server-1، Server-2 و غیره را بپذیرد.
گزینه --verify-x509-name یک جایگزین مفید برای گزینه --tls-verify جهت اعتبارسنجی میزبان راه دور است، زیرا --verify-x509-name در یک محیط --chroot بدون هیچگونه وابستگی کار میکند.
استفاده از یک پیشوند نام، جایگزینی مفید برای مدیریت CRL (فهرست ابطال گواهی) روی کلاینت است، زیرا به کلاینت اجازه میدهد همه گواهیها را به جز مواردی که با سرورهای تعیینشده مرتبط هستند رد کند.
- نکته:
- بررسی در برابر پیشوند نام را تنها زمانی انجام دهید که از OpenVPN همراه با یک گواهی CA سفارشی که تحت کنترل شماست استفاده میکنید. هرگز از این گزینه با نوع name-prefix زمانی که گواهیهای کلاینت شما توسط شخص ثالث، مانند یک CA تجاری وب امضا شدهاند، استفاده نکنید.
- --x509-track attribute
- ذخیره
مقدار attribute از
X509 همتا در
متغیرهای
محیطی برای
استفاده
توسط
افزونهها
و رابط
مدیریتی.
افزودن یک +
به ابتدای
attribute برای
ذخیره
مقادیر از
کل زنجیره
گواهی. در
غیر این
صورت ویژگی
تنها برای
گواهی برگ
(یعنی عمق 0
از زنجیره
گواهی) صادر
میشود.
مقادیر به
صورت
X509_<depth>_<attribute>=<value>
کدگذاری
خواهند شد.
چندین
گزینه --x509-track
میتوانند
برای
ردیابی
چندین
ویژگی
تعریف شوند.
مورد attribute میتواند هر بخشی از فیلد Subject در X509 یا هر افزونه X509v3 (RFC 3280) باشد. افزونههای X509v3 ممکن است در صورت عدم استفاده از کتابخانه پیشفرض زیرساخت TLS (یعنی OpenSSL) پشتیبانی نشوند. شما همچنین میتوانید اثرانگشتهای SHA1 و SHA256 گواهی را درخواست کنید، اما این مقادیر در هر صورت همیشه به عنوان tls_digest_{n} و tls_digest_sha256_{n} صادر میشوند.
توجه داشته باشید که به طور پیشفرض همه بخشهای فیلد Subject در X509 برای کل زنجیره گواهی در محیط صادر میشوند. اگر از --x509-track حداقل یک بار استفاده کنید، فقط ویژگیهای مشخصشده توسط این گزینهها صادر میشوند.
مثالها:
x509-track CN # exports only X509_0_CN
x509-track +CN # exports X509_{n}_CN for chain
x509-track basicConstraints # exports value of "X509v3 Basic Constraints"
x509-track SHA256 # exports SHA256 fingerprint
- --x509-username-field args
- فیلدهایی
در عنوان (Subject)
گواهی X.509 که
باید به
عنوان نام
کاربری
استفاده
شوند
(پیشفرض CN).
اگر چند
فیلد مشخص
شوند،
مقادیر
آنها با
استفاده از
نماد _ به
عنوان
جداکننده
در یک نام
کاربری
ادغام
خواهند شد.
نحو معتبر:
x509-username-field [ext:]fieldname [[ext:]fieldname...]
به طور معمول، این گزینه با آرگومانهای fieldname به یکی از صورتهای زیر مشخص میشود:
x509-username-field emailAddress x509-username-field 1.2.840.113549.1.9.1 x509-username-field ext:subjectAltName x509-username-field CN serialNumber
دو مثال اول از مقدار مشخصه emailAddress در فیلد Subject گواهی به عنوان نام کاربری استفاده میکنند، که در آن مثال اول از نام و مثال دوم از oid استفاده میکند. مثال سوم از پیشوند ext: برای نشان دادن این موضوع استفاده میکند که افزونه X.509 با نام فیلد fieldname subjectAltName باید برای یک فیلد rfc822Name (ایمیل) جهت استفاده به عنوان نام کاربری جستجو شود. در مواردی که چند آدرس ایمیل در ext:fieldname وجود داشته باشد، آخرین مورد انتخاب میشود. مثال آخر از مقدار مشخصه CN در فیلد Subject، ترکیبشده با جداکننده _ و نمایش هگزادسیمال serialNumber گواهی استفاده میکند.
هنگامی که این گزینه استفاده شود، گزینه --verify-x509-name به جای Common Name با fieldname انتخابشده مطابقت داده خواهد شد.
تنها افزونههای X.509 شامل subjectAltName و issuerAltName و مشخصه X.509 با عنوان serialNumber پشتیبانی میشوند.
نمادهای ناسازگار با نماد _ جایگزین میشوند (مشابه جداکننده فیلدها)، بنابراین ادغام چندین فیلد با چنین نمادهایی یا نمادهای _ میتواند به طور بالقوه منجر به تداخل نام کاربری شود.
گزینههای PKCS#11 / کارت هوشمند (SmartCard)
- --pkcs11-cert-private args
- تنظیم
میکند که
آیا دسترسی
به شیء
گواهی باید
پس از ورود
انجام شود
یا خیر. هر
ارائهدهنده
تنظیمات
مخصوص به
خود را
دارد.
نحوهای معتبر:
pkcs11-cert-private 0 pkcs11-cert-private 1
- --pkcs11-id name
- شناسه (id) سریالیشده گواهی مورد استفاده را مشخص میکند. این شناسه میتواند از طریق گزینه مستقل --show-pkcs11-ids به دست آید. همچنین به توضیحات گزینه --pkcs11-providers مراجعه کنید.
- --pkcs11-id-management
- دریافت شناسه PKCS#11 از رابط مدیریتی (management interface). در این حالت یک پیام آنی NEED-STR 'pkcs11-id-request' فعال میشود، برنامه میتواند از دستور pkcs11-id-count برای بازیابی تعداد گواهیهای موجود و از دستور pkcs11-id-get برای بازیابی شناسه گواهی و بدنه گواهی استفاده کند. همچنین به توضیحات گزینه --pkcs11-providers مراجعه کنید.
- --pkcs11-pin-cache seconds
- مشخص میکند که PIN چند ثانیه میتواند در حافظه نهان ذخیره شود، حالت پیشفرض تا زمان خارج کردن توکن است.
- --pkcs11-private-mode mode
- مشخص
میکند چه
روشی برای
انجام
عملیات
کلید خصوصی
استفاده
شود. برای
هر
ارائهدهنده
میتوان یک
حالت
متفاوت
مشخص کرد.
حالت به
صورت عدد
هگز
رمزگذاری
شده است و
میتواند
ماسکی از
موارد زیر
باشد:
0 (پیشفرض) تلاش برای تشخیص خودکار.
1 استفاده از sign.
2 استفاده از sign recover.
4 استفاده از decrypt.
8 استفاده از unwrap.
- --pkcs11-protected-authentication args
- استفاده از
مسیر احراز
هویت
محافظتشده
PKCS#11، مفید
برای
دستگاههای
بیومتریک و
صفحهکلید
خارجی. هر
ارائهدهنده
تنظیمات
مخصوص به
خود را
دارد.
نحوهای معتبر:
pkcs11-protected-authentication 0 pkcs11-protected-authentication 1
- --pkcs11-providers providers
- ارائهدهندههای
رابط توکن
رمزنگاری RSA
Security Inc. PKCS #11 (Cryptoki) را
برای
بارگذاری
مشخص
میکند.
فهرستی از
یک یا چند
نام
کتابخانه
ارائهدهنده
که با فاصله
از هم جدا
شدهاند
میتواند
مشخص شود.
این گزینه
همراه با
--pkcs11-id یا pkcs11-id-management
میتواند
به جای --cert و
--key یا --pkcs12
استفاده
شود.
اگر p11-kit روی سیستم موجود باشد و در حین ساخت فعال شده باشد، در صورتی که هر یک از گزینههای --pkcs11-id یا --pkcs11-id-management بدون --pkcs11-providers وجود داشته باشند، ماژول p11-kit-proxy.so آن به طور پیشفرض بارگذاری خواهد شد. اگر بارگذاری پیشفرض در ساخت فعال نشده باشد و هیچ ارائهدهندهای مشخص نشود، گزینههای قبلی نادیده گرفته خواهند شد.
- --show-pkcs11-ids args
- (مستقل)
نمایش
فهرست
اشیاء توکن
PKCS#11.
نحو معتبر:
show-pkcs11 [provider] [cert_private]
اگر گواهیها به صورت اشیاء خصوصی ذخیره شدهاند، cert_private را برابر 1 مشخص کنید.
اگر p11-kit روی سیستم موجود باشد، آرگومان provider اختیاری است؛ در صورت حذف، ماژول پیشفرض p11-kit-proxy.so پرسوجو خواهد شد.
گزینه --verb میتواند پیش از این گزینه برای تولید اطلاعات اشکالزدایی استفاده شود.
مذاکره رمز کانال داده
نگارش 2.4 و بالاتر OpenVPN قابلیت مذاکره رمز دادهای را دارند که برای رمزنگاری بستههای داده استفاده میشود. این بخش سازوکار را با جزئیات بیشتر و سازوکارهای مختلف سازگاری عقبروی با کارساز و کارخواههای قدیمیتر شرح میدهد.
رفتار OpenVPN 2.5 و نگارشهای بعدی
هنگامی که هر دو کارخواه و کارساز دستکم OpenVPN 2.5 را اجرا میکنند، ترتیب رمزهای گزینه --data-ciphers کارساز برای انتخاب رمز داده استفاده میشود. این بدان معناست که نخستین رمز موجود در آن فهرست که در فهرست --data-ciphers کارخواه نیز وجود دارد، انتخاب میشود. اگر هیچ رمز مشترکی یافت نشود، کارخواه با یک پیام AUTH_FAILED رد میشود (همانطور که در لاگ کارخواه دیده میشود):
نگارش 2.5 و بالاتر OpenVPN تنها رمزهای مشخصشده در --data-ciphers را مجاز میدانند. اگر --data-ciphers تنظیم نشده باشد، پیشفرض AES-256-GCM:AES-128-GCM است. در نگارش 2.6 و بالاتر، در صورت در دسترس بودن Chacha20-Poly1305، مقدار پیشفرض به AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305 تغییر مییابد.
برای سازگاری عقبروی، نگارش 2.6 و بالاتر OpenVPN به همراه --compat-mode 2.4.x (یا پایینتر) و OpenVPN 2.5 به طور خودکار رمزی را که با گزینه --cipher مشخص شده به این فهرست اضافه میکنند.
کارخواههای OpenVPN 2.4
پشتیبانی از مذاکره در OpenVPN 2.4 اولین تکرار پیادهسازی بود و هنوز اشکالاتی جزئی داشت. هدف اصلی آن "ارتقا به AES-256-GCM در صورت امکان" بود. یک کارخواه OpenVPN 2.4 که در برابر یک کتابخانه رمزنگاری با پشتیبانی از AES در حالت GCM ساخته شده باشد و گزینه --ncp-disable را نداشته باشد، همیشه پشتیبانی از AES-256-GCM و AES-128-GCM را با ارسال IV_NCP=2 به کارساز اعلام میکند.
این مورد تنها زمانی مشکلساز میشود که گزینه --ncp-ciphers از مقدار پیشفرض AES-256-GCM:AES-128-GCM به مقداری تغییر کرده باشد که شامل این دو رمز نباشد. هنگامی که یک کارساز OpenVPN تلاش میکند از AES-256-GCM یا AES-128-GCM استفاده کند، اتصال با شکست مواجه خواهد شد. بنابراین توصیه میشود برای جلوگیری از این رفتار، همیشه رمزهای AES-256-GCM و AES-128-GCM را در گزینه --ncp-ciphers قرار دهید.
کارخواههای OpenVPN 3
کارخواههای مبتنی بر کتابخانه OpenVPN 3.x (https://github.com/openvpn/openvpn3) گزینه --ncp-ciphers یا --data-ciphers قابل پیکربندی ندارند. نگارشهای جدیدتر به صورت پیشفرض رمزهای قدیمی AES-CBC، BF-CBC و DES-CBC را غیرفعال میکنند. این کارخواهها همیشه پشتیبانی از همه رمزهای AEAD مورد پشتیبانی خود (AES-256-GCM، AES-128-GCM و در نگارشهای جدیدتر همچنین Chacha20-Poly1305) را اعلام میکنند.
برای پشتیبانی از کارخواههای مبتنی بر OpenVPN 3.x باید دستکم یکی از این رمزها در گزینه --data-ciphers کارساز گنجانده شود.
کارخواههای OpenVPN 2.3 و قدیمیتر (و کارخواههای دارای --ncp-disable)
هنگامی که یک کارخواه بدون پشتیبانی از مذاکره رمز به یک کارساز متصل میشود، رمزی که با گزینه --cipher در پیکربندی کارخواه مشخص شده است باید در گزینه --data-ciphers کارساز گنجانده شده باشد تا اجازه اتصال به کارخواه داده شود. در غیر این صورت پیام AUTH_FAILED به کارخواه ارسال خواهد شد که نشاندهنده نبود رمز مشترک است.
اگر کارخواه نگارش 2.3 یا قدیمیتر باشد و با آرگومان --enable-small در ./configure پیکربندی شده باشد، استفاده از data-ciphers-fallback cipher در پرونده پیکربندی کارساز همراه با رمز صریحی که کارخواه استفاده میکند، ضروری است.
کارساز OpenVPN 2.4
هنگامی که یک کارخواه پشتیبانی از AES-128-GCM و AES-256-GCM را اعلام میکند (با IV_NCP=2)، یک کارساز OpenVPN 2.4 صرفنظر از این که رمز چیست، اولین رمز موجود در --ncp-ciphers را به کارخواه OpenVPN ارسال میکند. برای شبیهسازی رفتار یک کارخواه OpenVPN 2.4 تا حد ممکن و دستیابی به سازگاری با راهاندازیهایی که به این رفتار وابستهاند، افزودن AES-128-GCM و AES-256-GCM به گزینه --data-ciphers کارخواه الزامی است. OpenVPN 2.5+ تنها در صورتی پرچم IV_NCP=2 را اعلام میکند که این رمزها موجود باشند.
کارسازهای OpenVPN 2.3 و قدیمیتر (و کارسازهای دارای --ncp-disable)
رمزی که توسط کارساز استفاده میشود باید در --data-ciphers گنجانده شود تا به کارخواه اجازه اتصال به یک کارساز بدون پشتیبانی از مذاکره رمز داده شود. (برای سازگاری، OpenVPN 2.5 رمزی را که با --cipher تنظیم شده نیز خواهد پذیرفت)
اگر کارساز نگارش 2.3 یا قدیمیتر باشد و با آرگومان --enable-small در ./configure پیکربندی شده باشد، افزودن --data-ciphers-fallback cipher به پیکربندی کارخواه همراه با رمز صریحی که کارساز استفاده میکند، ضروری است.
منسوخ شدن Blowfish در حالت CBC (BF-CBC)
گزینه --cipher در OpenVPN 2.4 و نگارشهای قدیمیتر به طور پیشفرض روی BF-CBC تنظیم شده بود. این مقدار پیشفرض برای اطمینان از سازگاری عقبروی هرگز تغییر داده نشد. در OpenVPN 2.5 این رفتار اکنون تغییر یافته است به طوری که اگر --cipher به طور صریح تنظیم نشده باشد، دیگر اجازه استفاده از رمز ضعیف BF-CBC را نمیدهد و لازم است به طور صریح به عنوان --cipher BFC-CBC اضافه شود یا به --data-ciphers افزوده گردد.
ما اکیداً توصیه میکنیم که در عوض در اسرع وقت از BF-CBC به یک رمز امنتر مهاجرت کنید.
پیکربندی شبکه (NETWORK CONFIGURATION)
نرمافزار OpenVPN از دو بخش پیکربندی شبکه تشکیل شده است. یک بخش پیوند (link) بین سمت محلی و دوردست است، بخش دیگر آداپتور شبکه مجازی (دستگاه tun/tap) است.
گزینههای پیوند (Link Options)
این بخش از گزینههای پیوند، گزینههای مربوط به اتصال میان میزبان محلی و دوردست را پوشش میدهد.
- --bind keywords
- اتصال (Bind) به
آدرس و
درگاه محلی.
این مقدار
پیشفرض
است مگر
اینکه از
یکی از
گزینههای
--proto tcp-client ، --http-proxy یا
--socks-proxy
استفاده
شود.
اگر کلیدواژه اختیاری ipv6only مشخص شده باشد، OpenVPN هنگام باز شدن یک سوکت IPv6 تنها به IPv6 (برخلاف IPv6 و IPv4) متصل خواهد شد.
- --float
- به همتای
دوردست
اجازه
میدهد تا
آدرس IP و/یا
شماره
درگاه خود
را تغییر
دهد، مانند
تغییرات
ناشی از DHCP یا
نگاشتهای
NAT. گزینه --float
فقط هنگام
استفاده از
انتقال UDP
کار میکند.
گزینه --float هنگامی که همراه با --remote مشخص شود به یک نشست OpenVPN اجازه میدهد ابتدا به همتایی با آدرس مشخص متصل شود، اما اگر بستهها از یک آدرس جدید برسند و تمام آزمونهای احراز هویت را بگذرانند، آدرس جدید کنترل نشست را در دست خواهد گرفت. این ویژگی زمانی مفید است که به همتایی با آدرس پویا مانند یک کاربر dial-in یا کارخواه DHCP متصل میشوید.
در اصل، --float به OpenVPN میگوید که بستههای احراز هویت شده را از هر آدرسی بپذیرد، نه فقط آدرسی که در گزینه --remote مشخص شده است.
- --fragment args
- نحو معتبر:
fragment max fragment max mtu
قطعهبندی داخلی دیتاگرام را فعال میکند تا هیچ دیتاگرام UDP که بزرگتر از max بایت باشد ارسال نشود.
اگر پارامتر mtu وجود داشته باشد، پارامتر max طوری تفسیر میشود که شامل سربار کپسولهسازی IP و UDP باشد. پارامتر mtu در نسخه 2.6.0 نرمافزار OpenVPN معرفی شده است.
اگر پارامتر mtu وجود نداشته باشد، پارامتر max همانند پارامتر --link-mtu تفسیر میشود، یعنی اندازه بسته UDP پس از اضافه شدن سربار کپسولهسازی، بدون احتساب سرآیند خود UDP.
گزینه --fragment تنها زمانی کاربرد دارد که از پروتکل UDP استفاده میکنید (--proto udp).
گزینه --fragment به اندازه ۴ بایت سربار به ازای هر دیتاگرام اضافه میکند.
گزینه --mssfix را در ادامه به عنوان یک گزینه مرتبط و مهم با --fragment ببینید.
همچنین باید توجه داشت که این گزینه برای جایگزینی قطعهبندی UDP در سطح پشته IP در نظر گرفته نشده است. این گزینه تنها به عنوان آخرین راهکار در زمانی که کشف MTU مسیر (path MTU discovery) مختل شده است کاربرد دارد. استفاده از این گزینه نسبت به اصلاح کشف MTU مسیر برای پیوند IP شما و استفاده از قطعهبندی بومی IP به جای آن، کارایی کمتری دارد.
با این حال، شرایطی وجود دارد که استفاده از قابلیت قطعهبندی داخلی OpenVPN' ممکن است تنها گزینه شما باشد، مانند انتقال یک جریان چندپخشی (multicast) بر بستر UDP از طریق تونل که نیازمند قطعهبندی است.
- --keepalive args
- یک
دستورالعمل
کمکی که
برای
سادهسازی
بیان --ping و
--ping-restart طراحی
شده است.
نحو معتبر:
keepalive interval timeout
هر interval ثانیه یک پینگ ارسال میکند، و اگر پینگی به مدت timeout ثانیه دریافت نشد، مجدداً راهاندازی میشود. هر دو مقدار به ۸۶۴۰۰ ثانیه محدود هستند. از آنجا که مهلت زمانی در سمت سرور دو برابر میشود، timeout در حالت سرور به ۴۳۲۰۰ ثانیه محدود است.
این گزینه را میتوان در هر دو سمت کارخواه و سرور استفاده کرد، اما قرار دادن آن در سمت سرور کافی است چرا که گزینههای مناسب --ping و --ping-restart را به کارخواه ارسال (push) میکند. اگر در هر دو سمت سرور و کارخواه استفاده شود، مقادیر ارسالشده از سرور مقادیر محلی کارخواه را بازنویسی خواهند کرد.
آرگومان timeout در سمت سرور دو برابر طولانیتر خواهد بود. این امر تضمین میکند که اتمام مهلت زمانی در سمت کارخواه پیش از قطع اتصال توسط سمت سرور تشخیص داده شود.
برای مثال، --keepalive 10 60 به صورت زیر بسط داده میشود:
if mode server:
ping 10 # Argument: interval
ping-restart 120 # Argument: timeout*2
push "ping 10" # Argument: interval
push "ping-restart 60" # Argument: timeout
else
ping 10 # Argument: interval
ping-restart 60 # Argument: timeout
- --link-mtu n
- منسوخشده
حد بالایی
را برای
اندازه
بستههای UDP
که بین
همتایان OpenVPN
ارسال
میشوند
تعیین
میکند.
بهتر است
این
پارامتر را
تنظیم
نکنید مگر
اینکه
بدانید چه
کار
میکنید.
به دلیل متغیر بودن اندازه سرایند IP (۲۰ بایت برای IPv4 و ۴۰ بایت برای IPv6) و الگوریتم رمزنگاری کانال داده که به صورت پویا مذاکره میشود، این گزینه قابل اعتماد نیست. توصیه میشود به جای آن tun-mtu را با فضای خالی کافی تنظیم کنید.
- --local args
- نحو معتبر:
local host|* [port] [protocol]
نام میزبان محلی یا آدرس IP و درگاه برای bind. در صورت تعیین، OpenVPN به این آدرس متصل (bind) میشود. در صورت عدم تعیین، OpenVPN به تمام رابطها متصل میشود. '*' میتواند به عنوان نام میزبان استفاده شود و به معنی 'هر میزبان' است (OpenVPN روی آنچه توسط سیستمعامل برگردانده میشود شنود خواهد کرد). روی یک کلاینت، یا در حالت نقطه-به-نقطه، این مقدار فقط یک بار میتواند مشخص شود (۱ سوکت).
در راهاندازی OpenVPN در حالت --server، این مقدار میتواند چندین بار مشخص شود تا چندین سوکت شنود روی آدرسها و/یا درگاههای مختلف باز کند. برای تعیین چندین درگاه شنود بدون مشخص کردن آدرس، از '*' برای نشان دادن "استفاده از مقدار پیشفرضی که سیستمعامل ارائه میدهد" استفاده کنید، برای "تمام آدرسهای IPv4" از "0.0.0.0" و برای "تمام آدرسهای IPv6" از '::' استفاده کنید. --local متضمن --bind است.
- --lport port
- شماره درگاه پیشفرض TCP/UDP را تنظیم میکند. نمیتواند همراه با گزینه --nobind استفاده شود. شماره درگاه 0 تنها برای دستیابی به "اتصال bind() به یک شماره درگاه تصادفی تخصیصیافته" در صورتی پذیرفته میشود که یک آدرس IP برای اتصال با --local مشخص شده باشد.
- --mark value
- بستههای رمزگذاریشده ارسالی را با value علامتگذاری میکند. مقدار mark میتواند در قوانین مسیریابی سیاستی (policy routing) و فیلتر بسته (packetfilter) مطابقت داده شود. این گزینه فقط در لینوکس پشتیبانی میشود و در سایر سیستمهای عامل کاری انجام نمیدهد.
- --mode m
- حالت اصلی OpenVPN را تعیین میکند. به صورت پیشفرض، OpenVPN در حالت نقطه-به-نقطه (p2p) اجرا میشود. OpenVPN 2.0 حالت جدیدی (server) معرفی میکند که قابلیت سرور چندکلاینتی را پیادهسازی مینماید.
- --mssfix args
- نحو معتبر:
mssfix max [mtu] mssfix max [fixed] mssfix
به نشستهای TCP در حال اجرا روی تونل اعلام میکند که اندازه بسته ارسالی خود را به گونهای محدود کنند که پس از کپسولهسازی توسط OpenVPN، اندازه بسته UDP حاصل که OpenVPN به همتای خود ارسال میکند از max بایت تجاوز نکند. مقدار پیشفرض 1492 mtu است. برای غیرفعال کردن mssfix از مقدار 0 به عنوان max استفاده کنید.
در صورت تعیین پارامتر mtu، مقدار max به عنوان اندازه نهایی بستههای VPN شامل سرایند IP و UDP تفسیر میشود. پشتیبانی از پارامتر mtu در نسخه 2.6.0 نرمافزار OpenVPN اضافه شد.
اگر پارامتر mtu مشخص نشده باشد، پارامتر max به همان روش پارامتر --link-mtu تفسیر میشود؛ یعنی اندازه بسته UDP پس از اضافه شدن سربار کپسولهسازی، اما بدون در نظر گرفتن سرایند خود UDP. بسته نهایی حداکثر ۲۸ بایت برای IPv4 و ۴۸ بایت برای IPv6 بزرگتر خواهد بود (۲۰/۴۰ بایت برای سرایند IP و ۸ بایت برای سرایند UDP). مقدار پیشفرض 1450 اجازه میدهد بستههای OpenVPN روی پیوندی با MTU برابر با 1478 یا بالاتر بدون قطعهقطعه شدن در سطح IP منتقل شوند (و 1498 برای IPv6).
اگر پارامتر fixed تعیین شود، OpenVPN تلاشی برای محاسبه سربار کپسولهسازی VPN نمیکند، بلکه مقدار MSS را برای محدود کردن اندازه بستههای IP بار داده (payload) به عدد مشخص شده تنظیم میکند. برای بستههای IPv4 مقدار MSS به mssfix - 40 و برای بستههای IPv6 به mssfix - 60 کاهش مییابد.
اگر --mssfix بدون هیچ پارامتری مشخص شود، در صورت تعیین --fragment پارامترهای آن را به ارث میبرد، در غیر این صورت از مقدار پیشفرض برای --mssfix استفاده میکند.
گزینه --mssfix تنها زمانی کاربرد دارد که از پروتکل UDP برای ارتباط همتا-به-همتای OpenVPN استفاده کنید، یعنی --proto udp.
--mssfix و --fragment در حالت ایدهآل میتوانند با هم استفاده شوند؛ به طوری که --mssfix در وهله اول تلاش میکند تا TCP نیازی به قطعهقطعه کردن بستهها نداشته باشد، و اگر بستههای بزرگی به هر حال عبور کنند (از پروتکلهایی غیر از TCP)، --fragment آنها را به صورت داخلی قطعهقطعه میکند.
گزینههای --max-packet-size، --fragment و --mssfix برای دور زدن مواردی طراحی شدهاند که کشف Path MTU در مسیر شبکه بین همتایان OpenVPN دچار اختلال است.
نشانه معمول چنین اختلالی، اتصال OpenVPN است که با موفقیت برقرار میشود، اما در حین استفاده فعال متوقف میگردد.
اگر --fragment و --mssfix با هم استفاده شوند، --mssfix پارامتر پیشفرض max خود را از گزینه --fragment max دریافت میکند.
بنابراین، میتوان حداکثر اندازه بسته UDP را با گزینههای زیر به 1300 کاهش داد (یک راهکار اولیه مناسب برای حل مشکلات اتصال مربوط به MTU):
--tun-mtu 1500 --fragment 1300 --mssfix
اگر گزینه max-packet-size size در پیکربندی استفاده شود، به گونهای عمل میکند که گویی mssfix size mtu در پیکربندی مشخص شده است.
- --mtu-disc type
- آیا کشف MTU
مسیر (Path MTU discovery)
روی کانال TCP/UDP
انجام شود؟
تنها در
سیستمعاملهایی
مانند
لینوکس
پشتیبانی
میشود که
از فراخوان
سیستمی
لازم برای
تنظیم آن
پشتیبانی
میکنند.
نوعهای معتبر:
no هرگز فریمهای DF (Don't Fragment) ارسال نشود
maybe استفاده از راهنماییهای مبتنی بر مسیر
yes همیشه DF (Don't Fragment)
- --mtu-test
- برای اندازهگیری تجربی MTU هنگام راهاندازی اتصال، گزینهٔ --mtu-test را به پیکربندی خود اضافه کنید. برنامهٔ OpenVPN بستههای پینگ در اندازههای مختلف را به همتای راه دور میفرستد و بزرگترین بستههایی را که با موفقیت دریافت شدهاند اندازهگیری میکند. فرایند --mtu-test معمولاً حدود ۳ دقیقه طول میکشد تا کامل شود.
- --nobind
- به آدرس و درگاه محلی متصل (bind) نشود. پشتهٔ IP یک درگاه پویا برای بستههای بازگشتی اختصاص خواهد داد. از آنجا که مقدار درگاه پویا از قبل توسط یک همتا قابل شناسایی نیست، این گزینه تنها برای همتاهایی مناسب است که اتصال را با استفاده از گزینهٔ --remote آغاز میکنند.
- --passtos
- فیلد TOS بستهٔ تونل را برابر با مقدار TOS بار داده (payload) قرار میدهد.
- --ping n
- اگر برای
حداقل n
ثانیه هیچ
بستهای
ارسال نشده
باشد، به
میزبان راه
دور روی
کانال
کنترلی TCP/UDP
پینگ بفرست
(گزینهٔ --ping
را روی هر
دو همتا
مشخص کنید
تا
بستههای
پینگ در هر
دو جهت
ارسال
شوند، زیرا
بستههای
پینگ OpenVPN
مانند
بستههای
پینگ IP
پژواک
نمیشوند).
حداکثر مقدار برای n برابر ۸۶۴۰۰ ثانیه است.
این گزینه دو کاربرد در نظر گرفته شده دارد:
- 1.
- سازگاری با دیوارهای آتش با قابلیت حفظ وضعیت (stateful). پینگ دورهای تضمین میکند که قاعدهٔ دیوار آتش با حفظ وضعیت که اجازهٔ عبور به بستههای UDP برنامهٔ OpenVPN میدهد، منقضی (time out) نشود.
- 2.
- فراهم کردن پایهای برای میزبان راه دور جهت آزمایش وجود همتای خود با استفاده از گزینهٔ --ping-exit.
هنگام استفاده از OpenVPN در حالت سرور، --keepalive را نیز ببینید.
- --ping-exit n
- باعث خروج OpenVPN
پس از گذشت
n ثانیه
بدون
دریافت
پینگ یا
بستهای
دیگر از راه
دور میشود.
این گزینه
میتواند
با --inactive، --ping و
--ping-exit ترکیب
شود تا یک
قطع ارتباط
دو سطحی بر
اثر عدم
فعالیت
ایجاد کند.
حداکثر مقدار برای n برابر ۸۶۴۰۰ ثانیه است.
برای نمونه،
openvpn [options...] --inactive 3600 --ping 10 --ping-exit 60
هنگامی که روی هر دو همتا استفاده شود، باعث میشود اگر همتا قطع ارتباط کرد، OpenVPN ظرف ۶۰ ثانیه خارج شود، اما در صورتی که دادهٔ تونل واقعی رد و بدل نشود، پس از یک ساعت خارج خواهد شد.
- --ping-restart n
- مشابه --ping-exit،
اما پس از
گذشت n
ثانیه بدون
دریافت
پینگ یا
بستهٔ دیگر
از راه دور،
راهاندازی
مجدد با SIGUSR1
را فعال
میکند.
حداکثر مقدار برای n برابر ۸۶۴۰۰ ثانیه است.
این گزینه در مواردی مفید است که همتای راه دور دارای آدرس IP پویا است و از یک نام DNS با TTL پایین برای ردیابی آدرس IP با استفاده از سرویسی مانند https://www.nsupdate.info به همراه یک کلاینت DNS پویا مانند ddclient استفاده میشود.
اگر دسترسی به همتا امکانپذیر نباشد، راهاندازی مجدد فعال شده و باعث بازخوانی مجدد نام میزبان مشخصشده در --remote میشود (در صورتی که --resolv-retry نیز مشخص شده باشد).
در حالت سرور، --ping-restart، --inactive یا هر نوع سیگنال تولیدشدهٔ داخلی دیگر همیشه روی اشیاء نمونهٔ کلاینت بهصورت جداگانه اعمال میشود، نه روی کل سرور. همچنین توجه داشته باشید که در حالت سرور، هر سیگنال تولیدشدهٔ داخلی که معمولاً باعث راهاندازی مجدد میشود، در عوض باعث حذف شیء نمونهٔ کلاینت خواهد شد.
در حالت کلاینت، پارامتر --ping-restart بهطور پیشفرض روی ۱۲۰ ثانیه تنظیم شده است. این پیشفرض تا زمانی که کلاینت مقدار جایگزین را از سرور (بر اساس تنظیم --keepalive در پیکربندی سرور) دریافت کند، برقرار خواهد بود. برای غیرفعال کردن پیشفرض ۱۲۰ ثانیه، مقدار --ping-restart 0 را روی کلاینت تنظیم کنید.
برای اطلاعات بیشتر دربارهٔ SIGUSR1 بخش سیگنالها را در ادامه ببینید.
توجه داشته باشید که رفتار SIGUSR1 میتواند توسط گزینههای --persist-tun، --persist-local-ip و --persist-remote-ip تغییر کند.
همچنین توجه داشته باشید که --ping-exit و --ping-restart مانعةالجمع هستند و نمیتوان آنها را با هم استفاده کرد.
- --ping-timer-rem
- تایمر --ping-exit / --ping-restart را تنها در صورتی اجرا کن که یک آدرس راه دور داشته باشیم. اگر دیمن را در حالت شنود آغاز میکنید (یعنی بدون همتای صریح --remote) و نمیخواهید زمانسنجی مهلت زمانی تا زمان اتصال یک همتای راه دور آغاز شود، از این گزینه استفاده کنید.
- --proto p
- از پروتکل p
برای
ارتباط با
میزبان راه
دور
استفاده کن.
p میتواند
udp، tcp-client یا tcp-server
باشد.
همچنین
میتوانید
با مشخص
کردن p
بهترتیب
بهصورت
udp4، tcp4-client، tcp4-server
یا udp6، tcp6-client،
tcp6-server،
برنامهٔ OpenVPN
را به
استفادهٔ
تنها از IPv4 یا
تنها IPv6
محدود کنید.
پروتکل پیشفرض در صورت مشخص نشدن --proto، udp است.
برای کارکرد UDP، باید --proto udp روی هر دو همتا مشخص شود.
برای کارکرد TCP، یک همتا باید از --proto tcp-server و همتای دیگر از --proto tcp-client استفاده کند. همتایی که با tcp-server آغاز شده باشد برای اتصال ورودی بهطور نامحدود منتظر میماند. همتایی که با tcp-client آغاز شده تلاش به اتصال میکند و در صورت شکست، ۵ ثانیه متوقف شده (قابل تنظیم از طریق گزینهٔ --connect-retry) و مجدداً بهطور نامحدود یا تا N بار تلاش (قابل تنظیم از طریق گزینهٔ --connect-retry-max) تلاش خواهد کرد. هر دو کلاینت و سرور TCP در صورتی که هر یک از طرفین اتصال را بازنشانی کند، سیگنال راهاندازی مجدد SIGUSR1 را شبیهسازی میکنند.
برنامهٔ OpenVPN برای عملکرد بهینه روی UDP طراحی شده است، اما قابلیت TCP برای شرایطی که UDP قابل استفاده نیست فراهم شده است. در مقایسه با UDP، پروتکل TCP هنگام استفاده روی شبکههای غیرقابلاطمینان یا شلوغ معمولاً تا حدی کارایی و پایداری کمتری خواهد داشت.
این مقاله برخی از مشکلات تونلسازی IP روی TCP را تشریح میکند: https://web.archive.org/web/20141025181658/http://sites.inka.de/sites/bigred/devel/tcp-tcp.html
با این حال، موارد خاصی وجود دارد که در آنها استفاده از TCP ممکن است از دیدگاه امنیت و پایداری سودمند باشد، مانند تونلسازی پروتکلهای غیر IP یا پروتکلهای UDP در سطح برنامه، یا تونلسازی پروتکلهایی که لایهٔ قابلیتاطمینان داخلی ندارند.
- --port port
- شماره یا نام درگاه TCP/UDP برای هر دو بخش محلی و دوردست (هر دو گزینه --lport و --rport را روی درگاه دادهشده تنظیم میکند). مقدار پیشفرض فعلی یعنی 1194 نشاندهنده شماره درگاه رسمی اختصاصیافته توسط IANA برای OpenVPN است و از نسخه 2.0-beta17 استفاده میشود. نسخههای پیشین از درگاه 5000 به عنوان پیشفرض استفاده میکردند.
- --rport port
- تنظیم شماره یا نام درگاه TCP/UDP مورد استفاده توسط گزینه --remote. درگاه همچنین میتواند مستقیماً با استفاده از گزینه --remote تنظیم شود.
- --replay-window args
- تغییر
اندازه
پنجره
لغزان و
پنجره
زمانی
محافظت در
برابر
تکرار (replay protection).
ساختارهای معتبر:
replay-window n replay-window n t
استفاده از یک پنجره لغزان محافظت در برابر تکرار با اندازه n و پنجره زمانی t ثانیه.
بهطور پیشفرض n برابر 64 (پیشفرض IPSec) و t برابر 15 ثانیه است.
این گزینه تنها در حالت UDP کاربرد دارد، یعنی زمانی که --proto udp مشخص شده باشد یا هیچ گزینه --proto تعیین نشده باشد.
هنگامی که OpenVPN بستههای IP را از طریق UDP تونل میکند، این احتمال وجود دارد که بستهها دور ریخته شوند یا بدون ترتیب تحویل داده شوند. از آنجا که OpenVPN، همانند IPSec، لایه فیزیکی شبکه را شبیهسازی میکند، دنباله بستههای نامرتب را میپذیرد و چنین بستههایی را با همان ترتیبی که دریافت شدهاند به پشته پروتکل TCP/IP تحویل میدهد، به شرطی که چندین شرط را برآورده کنند.
- a.
- بسته نمیتواند تکراری باشد.
- b.
- اگر بستهای بدون ترتیب برسد، تنها در صورتی پذیرفته میشود که تفاوت بین شماره ترتیب آن و بالاترین شماره ترتیبی که تاکنون دریافت شده کمتر از n باشد.
- c.
- اگر بستهای بدون ترتیب برسد، تنها در صورتی پذیرفته میشود که حداکثر تا t ثانیه پس از هر بستهای با شماره ترتیب بالاتر برسد.
اگر از یک پیوند شبکهای با خط لوله بزرگ استفاده میکنید (به این معنی که حاصلضرب پهنای باند و تأخیر بالا است)، ممکن است بخواهید از مقدار بزرگتری برای n استفاده کنید. پیوندهای ماهوارهای بهویژه اغلب به این موضوع نیاز دارند.
اگر OpenVPN را با --verb 4 اجرا کنید، هر بار که بیشترین عقبگرد شماره ترتیب دیدهشده تا کنون افزایش یابد، پیام "PID_ERR replay-window backtrack occurred [x]" را خواهید دید. از این پیام میتوان برای کالیبره کردن n استفاده کرد.
در مورد روش مناسب برای رسیدگی به بازآرایی بستهها در لایه امنیتی، اختلاف نظرهایی وجود دارد.
بهطور مشخص، لایه امنیتی تا چه میزان باید از پروتکل کپسولهشده در برابر حملاتی که خود را به عنوان اتلاف بسته و بازآرایی عادی رخداده در شبکههای IP جا میزنند، محافظت کند؟
رویکرد IPSec و OpenVPN این است که بازآرایی بستهها را در یک پنجره ثابت مشخص از شمارههای ترتیب مجاز بدانند.
برنامه OpenVPN با محدود کردن اندازه پنجره از نظر زمانی و همچنین فضای ترتیبی، مدل IPSec را ارتقا میدهد.
برنامه OpenVPN همچنین انتقال بر بستر TCP را به عنوان یک گزینه اضافه میکند (چیزی که توسط IPSec ارائه نمیشود)، که در این حالت OpenVPN میتواند موضع بسیار سختگیرانهای در قبال حذف و بازآرایی پیامها اتخاذ کند: اجازه آن را ندهد. از آنجا که TCP قابلیت اطمینان را تضمین میکند، هرگونه رخداد اتلاف بسته یا بازآرایی میتواند یک حمله در نظر گرفته شود.
از این حیث، میتوان گفت هنگامی که پروتکلهای کاربردی غیر IP یا UDP که ممکن است در برابر حمله حذف یا بازآرایی پیام آسیبپذیر باشند تونل میشوند (حملاتی که در محدوده پارامترهای عملیاتی عادی شبکههای IP قرار میگیرند)، انتقال تونل بر بستر TCP ترجیح داده میشود.
بنابراین میتوان گفت که هرگز نباید یک پروتکل غیر IP یا پروتکل کاربردی UDP را روی UDP تونل کرد، اگر آن پروتکل ممکن است در برابر حمله حذف یا بازآرایی پیامی که در محدوده پارامترهای عملیاتی مورد انتظار از لایه فیزیکی IP قرار میگیرد، آسیبپذیر باشد. این مشکل به سادگی با استفاده از TCP به عنوان لایه انتقال VPN برطرف میشود.
- --replay-persist file
- پایدار نگه
داشتن
وضعیت
محافظت در
برابر
تکرار در
طول
نشستها با
استفاده از
file برای
ذخیره و
بارگذاری
مجدد وضعیت.
این گزینه یک نسخه دیسکی از وضعیت فعلی محافظت در برابر تکرار (یعنی جدیدترین برچسب زمانی و شماره ترتیب بسته دریافتشده از همتای دوردست) را نگه میدارد، تا در صورتی که یک نشست OpenVPN متوقف و دوباره راهاندازی شد، هرگونه تکرار بستههایی که از قبل توسط نشست قبلی دریافت شده بودند را رد کند.
این گزینه تنها زمانی معنادار است که محافظت در برابر تکرار فعال باشد (پیشفرض) و شما از حالت TLS به همراه --tls-auth استفاده کنید.
- --session-timeout n
- پس از گذشت
n ثانیه از
آغاز نشست،
سیگنال SIGTERM
را برای
نمونه
کلاینت
ارسال
میکند و OpenVPN
را مجبور به
قطع ارتباط
مینماید.
در حالت
کلاینت، OpenVPN
ارتباط را
قطع کرده و
خارج
میشود، در
حالی که در
حالت سرور
تمام
نشستهای
کلاینت
خاتمه
مییابند.
این گزینه همچنین میتواند در پرونده پیکربندی نمونه کلاینت با استفاده از --client-config-dir تعیین شود یا بهطور پویا با استفاده از یک اسکریپت --client-connect تولید گردد. در این حالتها، تنها نشست کلاینت مربوطه خاتمه مییابد.
- --socket-flags flags
- اعمال
پرچمهای
دادهشده
به سوکت
انتقال OpenVPN. در
حال حاضر
تنها از TCP_NODELAY
پشتیبانی
میشود.
پرچم سوکت TCP_NODELAY در حالت TCP مفید است و باعث میشود هسته، بستههای تونل را بلافاصله از طریق اتصال TCP ارسال کند، بدون اینکه سعی کند چند بسته کوچکتر را در یک بسته بزرگتر دستهبندی نماید. این امر میتواند به بهبود چشمگیری در تأخیر منجر شود.
از نسخه 2.7.6 برنامه OpenVPN، پرچم TCP_NODELAY بهطور پیشفرض روی هر سوکت TCP فعال است، بنابراین مشخص کردن آن در اینجا دیگر ضروری نیست.
- --tcp-nodelay
- TCP_NODELAY به طور
پیشفرض
روی هر سوکت
TCP فعال است.
در --mode server این
گزینه
علاوه بر
این socket-flags TCP_NODELAY را
به
کلاینتهای
در حال
اتصال
ارسال (push)
میکند، تا
کلاینتهای
قدیمیتر
از 2.7.6 نیز آن
را دریافت
کنند. این
گزینه را
میتوان پس
از اینکه
چنین
کلاینتهایی
دیگر در حال
استفاده
نبودند،
حذف کرد.
ماکرو به صورت زیر بسط مییابد:
if mode server:
push "socket-flags TCP_NODELAY"
- --max-packet-size size
- این گزینه
به OpenVPN دستور
میدهد تا
با محدود
کردن
اندازه
بسته کانال
کنترلی و
تنظیم --mssfix،
تلاش کند
بیشینه
اندازه
بسته در
هنگام
نوشتن (on-write) را
محدود
نماید.
OpenVPN تلاش خواهد کرد پیامهای کانال کنترلی خود را زیر این اندازه نگه دارد، اما به دلیل برخی محدودیتها در پروتکل، این امر همیشه امکانپذیر نیست. اگر این گزینه تنظیم نشود، پیشفرض بیشینه اندازه بسته کنترلی 1250 خواهد بود. اندازه بسته کانال کنترلی به مقادیری بین 154 و 2048 محدود خواهد شد. بیشینه اندازه بسته شامل سربار کپسولهسازی مانند UDP و IP است.
از نظر --mssfix به این صورت گسترش مییابد:
mssfix size mtu
اگر نیاز دارید --mssfix را برای کانال داده و بیشینه اندازه بسته کانال کنترلی به صورت مستقل تنظیم کنید، ابتدا از --max-packet-size و سپس از یک --mssfix در پیکربندی استفاده کنید.
به طور کلی اندازه پیشفرض 1250 به جز در موارد خاص تقریباً در همه جا کار میکند، بهویژه از آنجا که IPv6 نیازمند یک MTU به اندازه 1280 یا بزرگتر است.
آداپتور شبکه مجازی (رابط VPN)
گزینههای این بخش مربوط به پیکربندی رابط شبکه مجازی tun/tap، از جمله تنظیم آدرس IP در VPN و مسیریابی شبکه است.
- --bind-dev device
- (فقط لینوکس) device را تنظیم میکند تا سوکت سرور را به یک دستگاه Virtual Routing and Forwarding (VRF) متصل کند
- --block-ipv6
- در کلاینت،
به جای
ارسال
بستههای IPv6
روی تونل VPN،
به تمام
بستههای IPv6
با یک پیام ICMPv6
no route host پاسخ
داده
میشود. در
سرور، به
تمام
بستههای IPv6
از سمت
کلاینتها
با یک پیام ICMPv6
no route to host پاسخ
داده
میشود. این
گزینه برای
مواردی در
نظر گرفته
شده است که IPv6
باید مسدود
شود و
گزینههای
دیگر در
دسترس
نیستند. --block-ipv6
در صورت
تنظیم، از IPv6
راه دور به
عنوان آدرس
مبدا
بستههای ICMPv6
استفاده
میکند، در
غیر این
صورت از fe80::7
به عنوان
آدرس مبدا
استفاده
خواهد کرد.
برای معنادار بودن این گزینه باید حتماً ترافیک را به سمت رابط tun مسیریابی کنید. بلوک پیکربندی نمونه زیر تمام ترافیک IPv6 را به OpenVPN ارسال میکند و به تمام درخواستها با no route to host پاسخ میدهد، که به طور موثری IPv6 را مسدود میکند (جهت جلوگیری از نشت اتصالات IPv6 از کلاینتهای dual-stack در سرویسهای VPN با IPv4 تنها).
--ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1 --redirect-gateway ipv6 --block-ipv6
- Server config
- ارسال یک پیکربندی ipv6 «معتبر» به کلاینت و مسدود کردن آن در سرور
--push "ifconfig-ipv6 fd15:53b6:dead::2/64 fd15:53b6:dead::1" --push "redirect-gateway ipv6" --block-ipv6
نکته: این گزینه بر ترافیک ارسال شده از سمت سرور به طرف کلاینت تاثیری نمیگذارد (نه در سمت سرور و نه در سمت کلاینت). این امر ضروری دانسته نشده است، زیرا با عدم پیکربندی IPv6 روی tun سرور یا تنظیم یک قانون دیوار آتش در سمت سرور، به راحتی میتوان از چنین ترافیکی جلوگیری کرد.
- --dev device
- دستگاه
شبکه مجازی
TUN/TAP که
میتواند
tunX، tapX، null یا
یک رشته نام
دلخواه
باشد (X را
میتوان
برای یک
دستگاه
پویا حذف
کرد.)
اگر نه --dev و نه --dev-type مشخص نشده باشند، OpenVPN به طور پیشفرض روی tun قرار میگیرد، یعنی یک دستگاه tunX با نامگذاری پویا ایجاد میکند و یک تونل لایه ۳ را اجرا میکند.
برای نمونهای از راهاندازی یک دستگاه TUN، بخش مثالهای زیر را ببینید.
شما باید در هر دو سمت اتصال یا از دستگاههای tun استفاده کنید یا در هر دو سمت از دستگاههای tap. نمیتوانید آنها را ترکیب کنید، زیرا لایههای شبکه زیرین متفاوتی را نشان میدهند:
نحوهای معتبر:
dev tun2 dev tap4 dev ovpn
اینکه اگر نام دستگاه tun یا tap نباشد چه اتفاقی رخ میدهد، به پلتفرم وابسته است.
در اکثر پلتفرمها، tunN (مانند tun2، tun30) و tapN (مانند tap3) یک رابط tun/tap شمارهگذاری شده با همان شماره مشخص شده ایجاد میکنند - این مورد زمانی مفید است که چندین نمونه OpenVPN فعال باشند، و نیاز به دانستن نگاشت نمونه به دستگاه باشد. برخی پلتفرمها از "numbered tap" پشتیبانی نمیکنند، بنابراین تلاش برای --dev tap3 ناموفق خواهد بود.
نامهای دلخواه دستگاه (مانند --dev tun-home) فقط روی FreeBSD (با درایور هسته DCO برای دستگاههای tun) و لینوکس (برای هر دو دستگاه tun و tap، درایور DCO و tun/tap) کار خواهند کرد.
اگر چنین نام دستگاهی با tun یا tap آغاز شود (مانند tun-home)، OpenVPN نوع دستگاه مناسب را به طور خودکار انتخاب خواهد کرد. در غیر این صورت نوع دستگاه مورد نظر باید با --dev-type tun یا --dev-type tap مشخص شود.
روی Windows، فقط نامهای tun و tap پشتیبانی میشوند. انتخاب در میان چندین درایور یا نمونه درایور نصب شده با --dev-node انجام میشود.
- --dev-node node
- این یک
گزینه
بهشدت
وابسته به
سیستم برای
اثرگذاری
بر انتخاب
درایور tun/tap
است.
در لینوکس، دستگاههای tun/tap با دسترسی به /dev/net/tun ایجاد میشوند، و نام این دستگاه میتواند با استفاده از --dev-node ... تغییر کند.
در Mac OS X این گزینه میتواند برای تعیین پیادهسازی پیشفرض tun استفاده شود. استفاده از --dev-node utun استفاده از پشتیبانی بومی هسته Darwin tun را اجباری میکند. از --dev-node utunN برای انتخاب یک نمونه utun مشخص استفاده کنید. برای اجبار به استفاده از tun.kext (/dev/tunX) از --dev-node tun استفاده کنید. در صورت عدم تعیین گزینه --dev-node، برنامه openvpn ابتدا تلاش میکند utun را باز کند، و در صورت شکست به tun.kext بازمیگردد.
در سیستمهای ویندوز، آداپتور TAP-Win32 را که در Network Connections Control Panel به نام node است یا GUID خام آداپتور درون آکولاد را انتخاب کنید. گزینه --show-adapters در ویندوز نیز میتواند برای شمارش تمام آداپتورهای TAP-Win32 موجود استفاده شود و هم نام کنترل پنل اتصالات شبکه و هم GUID را برای هر آداپتور TAP-Win32 نمایش میدهد.
در سایر پلتفرمها، در صورت پشتیبانی در آن پلتفرم، --dev-node node بر نامگذاری دستگاه tun/tap ایجاد شده اثر میگذارد. اگر OpenVPN نتواند بر اساس نام تشخیص دهد که node یک دستگاه TUN است یا TAP، باید --dev-type tun یا --dev-type tap را نیز مشخص کنید.
اگر node با رشته unix: آغاز شود، openvpn با باقی آرگومان مانند یک برنامه رفتار خواهد کرد. OpenVPN برنامه را اجرا کرده و یک سوکت موقت دامنه یونیکس (unix domain socket) ایجاد میکند که همراه با پیکربندی tun به عنوان متغیرهای محیطی به برنامه ارسال میشود. سوکت موقت دامنه یونیکس در متغیر محیطی TUNTAP_SOCKET_FD منتقل خواهد شد.
این حالت unix: اساساً برای استفاده با شبیهساز شبکه lwipovpn طراحی شده است (https://github.com/OpenVPN/lwipovpn).
- --dev-type device-type
- از چه نوع دستگاهی استفاده میشود؟ device-type باید tun (لایه ۳ OSI) یا tap (لایه ۲ OSI) باشد. از این گزینه تنها در صورتی استفاده کنید که دستگاه TUN/TAP استفادهشده با --dev با tun یا tap شروع نشود.
- --dhcp-option args
- تنظیم
پارامترهای
شبکه اضافی
در
پلتفرمهای
پشتیبانیشده.
ممکن است
روی کلاینت
مشخص شود یا
از سرور
ارسال (push) شود.
در ویندوز
این
گزینهها
بهطور
پیشفرض
توسط
درایور tap-windows6
یا در صورت
غیرفعال
بودن dhcp
مستقیماً
توسط OpenVPN
مدیریت
میشوند.
کلاینت OpenVPN for
Android نیز
آنها را به
صورت داخلی
پردازش
میکند.
در سایر پلتفرمها این گزینهها پیش از فراخوانی اسکریپت --up، تنها در محیط کلاینت با نام foreign_option_{n} ذخیره میشوند. برای دریافت و تفسیر این موارد در صورت نیاز، باید از یک افزونه یا اسکریپت --up استفاده شود. بسیاری از توزیعهای لینوکس شامل چنین اسکریپتهایی هستند و برخی رابطهای کاربری شخص ثالث مانند tunnelblick نیز همراه با اسکریپتهایی برای پردازش این گزینهها ارائه میشوند.
نحو معتبر:
dhcp-option type [parm]
- DOMAIN name
- تنظیم پسوند DNS ویژه اتصال به name.
- ADAPTER_DOMAIN_SUFFIX name
- نام مستعار برای DOMAIN. این یک گزینه سازگاری است و نباید در استقرارهای جدید استفاده شود.
- DOMAIN-SEARCH name
- افزودن name به فهرست جستجوی دامنه. برای افزودن موارد بیشتر این گزینه را تکرار کنید. تا ۱۰ دامنه پشتیبانی میشود.
- DNS address
- تنظیم آدرس
IPv4 یا IPv6
کارساز نام
دامنه (DNS)
اصلی. برای
تنظیم
آدرسهای
کارساز DNS
ثانویه این
گزینه را
تکرار کنید.
نکته: کارسازهای DNS IPv6 در حال حاضر با استفاده از netsh تنظیم میشوند (کد DHCP فعلی تنها میتواند DHCP نسخه IPv4 را مدیریت کند، و آن پروتکل تنها آدرسهای IPv4 را در همه جا مجاز میداند). این گزینه در محیط قرار خواهد گرفت تا در صورت نیاز، یک اسکریپت --up بتواند بر اساس آن عمل کند.
- WINS address
- تنظیم آدرس کارساز WINS اصلی (کارساز نام NetBIOS روی TCP/IP). برای تنظیم آدرسهای کارساز WINS ثانویه این گزینه را تکرار کنید.
- NBDD address
- تنظیم آدرس کارساز NBDD اصلی (کارساز توزیع دیتاگرام NetBIOS روی TCP/IP). برای تنظیم آدرسهای کارساز NBDD ثانویه این گزینه را تکرار کنید.
- NTP address
- تنظیم آدرس کارساز NTP اصلی (پروتکل زمان شبکه). برای تنظیم آدرسهای کارساز NTP ثانویه این گزینه را تکرار کنید.
- NBT type
- تنظیم نوع گره NetBIOS روی TCP/IP. گزینههای ممکن:
- 1
- b-node (پخش همگانی)
- 2
- p-node (پرسوجوهای نام نقطه به نقطه از یک کارساز WINS)
- 4
- m-node (پخش همگانی و سپس پرسوجو از کارساز نام)
- 8
- h-node (پرسوجو از کارساز نام، سپس پخش همگانی).
- NBS scope-id
- تنظیم دامنه (Scope) پروتکل NetBIOS روی TCP/IP. یک شناسه دامنه NetBIOS یک سرویس نامگذاری گسترشیافته برای ماژول NetBIOS روی TCP/IP (معروف به NBT) فراهم میکند. هدف اصلی شناسه دامنه NetBIOS، جداسازی ترافیک NetBIOS در یک شبکه واحد تنها به گرههایی با شناسه دامنه NetBIOS یکسان است. شناسه دامنه NetBIOS یک رشته متنی است که به نام NetBIOS پیوست میشود. شناسه دامنه NetBIOS در دو میزبان باید مطابقت داشته باشد، در غیر این صورت دو میزبان قادر به برقراری ارتباط نخواهند بود. شناسه دامنه NetBIOS همچنین به رایانهها اجازه میدهد در صورت داشتن شناسههای دامنه متفاوت، از نام رایانه یکسانی استفاده کنند. شناسه دامنه بخشی از نام NetBIOS میشود و نام را یکتا میسازد. (این توصیف دامنههای NetBIOS با قدردانی از <NeonSurge@abyss.com>)
- DISABLE-NBT
- غیرفعال کردن Netbios-over-TCP/IP.
- code
- PROXY_HTTP host port
تنظیم یک
پراکسی HTTP که
هنگام
اتصال به VPN
باید
استفاده
شود.
این گزینه در حال حاضر تنها روی OpenVPN for Android کار میکند و نیازمند اندروید ۱۰ یا بالاتر است.
- --ifconfig args
- تنظیم
پارامترهای
آداپتور TUN/TAP.
این گزینه
به آدرس IP
نقطه
پایانی VPN
محلی نیاز
دارد. برای
دستگاههای
TUN در حالت
نقطه-به-نقطه
(point-to-point)،
آرگومان
بعدی باید
آدرس IP نقطه
پایانی VPN
دوردست
باشد. برای
دستگاههای
TAP یا
دستگاههای
TUN
استفادهشده
با --topology subnet،
آرگومان
دوم ماسک
زیرشبکه
بخش شبکه
مجازی در
حال ساخت یا
متصلشونده
است.
برای دستگاههای TUN که اتصالات مجازی IP نقطه-به-نقطه را ممکن میسازند (هنگام استفاده در حالت --topology net30 یا p2p)، کاربرد مناسب --ifconfig به کار بردن دو آدرس IP خصوصی است که عضو هیچ زیرشبکه در حال استفادهای نباشند. این آدرسهای IP میتوانند متوالی باشند و ترتیب آنها در سمت دوردست باید معکوس شود. پس از برقراری VPN، با پینگ کردن rn، ارتباط از درون بستر VPN پینگ خواهد شد.
برای دستگاههای TAP که امکان ایجاد بخشهای اترنت مجازی را فراهم میکنند، یا دستگاههای TUN در حالت --topology subnet (که "شبکههای چندنقطهای" مجازی ایجاد میکنند)، --ifconfig برای تنظیم یک آدرس IP و ماسک زیرشبکه درست مانند پیکربندی یک آداپتور فیزیکی اترنت استفاده میشود. اگر در تلاش برای اتصال به یک پل اترنت (ethernet bridge) دوردست هستید، آدرس IP و زیرشبکه باید روی مقادیری تنظیم شوند که در بخش اترنت پلشده معتبر باشند (توجه داشته باشید که از DHCP نیز میتوان برای همین منظور استفاده کرد).
این گزینه، با اینکه اساساً به عنوان واسطی برای دستور ifconfig(8) عمل میکند، برای سادهسازی پیکربندی تونل TUN/TAP از طریق ارائه یک رابط استاندارد برای پیادهسازیهای گوناگون ifconfig در پلتفرمهای مختلف طراحی شده است.
پارامترهای --ifconfig که آدرسهای IP هستند را میتوان با نام قابل تحلیل از طریق DNS یا پرونده /etc/hosts نیز مشخص کرد.
برای دستگاههای TAP، در صورتی که رابط TAP اجاره آدرس IP را از یک سرور DHCP دریافت میکند، نباید از --ifconfig استفاده شود.
نمونهها:
# tun device in net30/p2p mode ifconfig 10.8.0.2 10.8.0.1 # tun/tap device in subnet mode ifconfig 10.8.0.2 255.255.255.0
- --ifconfig-ipv6 args
- پیکربندی
یک آدرس IPv6
روی دستگاه
tun.
نحو معتبر:
ifconfig-ipv6 ipv6addr/bits [ipv6remote]
آرگومان ipv6addr/bits آدرس IPv6 مورد استفاده است. پارامتر دوم در صورت مشخص نشدن درگاه (gateway)، به عنوان مقصد مسیر برای --route-ipv6 استفاده میشود.
گزینه --topology هیچ تأثیری بر --ifconfig-ipv6 ندارد.
- --ifconfig-noexec
- دستورهای ifconfig/netsh را واقعاً اجرا نکن، بلکه در عوض پارامترهای --ifconfig را با استفاده از متغیرهای محیطی به اسکریپتها ارسال کن.
- --ifconfig-nowarn
- اگر گزینه
--ifconfig در این
سمت اتصال
با سمت
دوردست
مطابقت
نداشت،
هشدار
بررسی
سازگاری
گزینهها
را صادر
نکن. این
گزینه
زمانی مفید
است که
میخواهید
مزایای کلی
بررسی
سازگاری
گزینهها
را حفظ کنید
(همچنین
گزینه --disable-occ
را ببینید)
و در عین
حال فقط
مؤلفه ifconfig این
بررسی را
غیرفعال
کنید.
برای نمونه، اگر پیکربندیای دارید که در آن میزبان محلی از --ifconfig استفاده میکند اما میزبان دوردست استفاده نمیکند، از --ifconfig-nowarn در میزبان محلی استفاده کنید.
این گزینه همچنین هشدارهای مربوط به تداخل بالقوه آدرسها را بیصدا میکند، که گاهی با ایجاد هشدارهای "مثبت کاذب" کاربران باتجربهتر را آزار میدهد.
- --lladdr address
- آدرس لایه پیوند (link layer address) را که بیشتر به عنوان آدرس MAC شناخته میشود مشخص کنید. فقط برای دستگاههای TAP اعمال میشود.
- --persist-tun
- هنگام
راهاندازیهای
مجدد ناشی
از SIGUSR1 یا
--ping-restart،
دستگاه TUN/TAP را
نبندید و
دوباره باز
نکنید یا
اسکریپتهای
up/down را اجرا
نکنید.
سیگنال SIGUSR1 یک سیگنال راهاندازی مجدد مشابه SIGHUP است، اما کنترل دقیقتری روی گزینههای بازنشانی ارائه میدهد.
در لینوکس، این گزینه زمانی میتواند مفید باشد که OpenVPN به عنوان ریشه (root) اجرا نمیشود و دسترسی CAP_NET_ADMIN به آن داده نشده است، چرا که در غیر این صورت به فرایند اجازه غیرفعال و فعال کردن مجدد رابط داده نخواهد شد.
در کنار موارد فوق، استفاده از --persist-tun به رابط تونل اجازه میدهد تمام تنظیمات IP/مسیر را حفظ کند، بنابراین به کاربر امکان میدهد هرگونه محافظت پیشرفته در برابر نشت ترافیک را پیادهسازی کند (لطفاً توجه داشته باشید که برای محافظت کامل، باید قوانین مسیر/دیوار آتش اضافی برقرار باشند).
- --redirect-gateway flags
- اجرای
خودکار
دستورهای
مسیریابی
برای هدایت
مجدد تمام
ترافیک
خروجی IP از
طریق VPN. این
یک گزینه
سمت کلاینت
است.
این گزینه سه مرحله را انجام میدهد:
- 1.
- ایجاد یک مسیر ایستا برای آدرس --remote که به درگاه پیشفرض از پیش موجود فوروارد میشود. این کار برای این انجام میشود که مرحله (3) یک حلقه مسیریابی ایجاد نکند.
- 2.
- حذف مسیر درگاه پیشفرض.
- 3.
- تنظیم درگاه پیشفرض جدید روی آدرس نقطه پایانی VPN (که از --route-gateway یا پارامتر دوم --ifconfig در صورت مشخص شدن --dev tun به دست میآید).
هنگامی که تونل برچیده میشود، تمام مراحل بالا معکوس میشوند تا مسیر پیشفرض اصلی بازیابی شود.
پرچمهای گزینه:
- local
- اگر هر دو طرف OpenVPN به طور مستقیم از طریق یک زیرشبکه مشترک متصل هستند (مانند ارتباط بیسیم)، پرچم local را اضافه کنید. پرچم local باعث حذف مرحله (1) در بالا میشود.
- autolocal
- تلاش برای تعیین خودکار فعالسازی پرچم local در بالا.
- def1
- استفاده از این پرچم برای بازنویسی درگاه پیشفرض با استفاده از 0.0.0.0/1 و 128.0.0.0/1 به جای 0.0.0.0/0. این کار این مزیت را دارد که درگاه پیشفرض اصلی را بازنویسی میکند اما آن را به طور کامل پاک نمیکند.
- bypass-dhcp
- افزودن یک مسیر مستقیم به سرور DHCP (در صورتی که غیرمحلی باشد) که تونل را دور میزند (در کلاینتهای ویندوز موجود است، ممکن است در کلاینتهای غیرویندوزی در دسترس نباشد).
- bypass-dns
- افزودن یک مسیر مستقیم به سرور(های) DNS (در صورتی که غیرمحلی باشند) که تونل را دور میزند (در کلاینتهای ویندوز موجود است، ممکن است در کلاینتهای غیرویندوزی در دسترس نباشد).
- block-local
- مسدود کردن دسترسی به LAN محلی در هنگام فعال بودن تونل، به جز خود درگاه LAN. این کار با مسیریابی LAN محلی (به جز آدرس درگاه LAN) به داخل تونل انجام میشود. در ویندوز فیلترهای WFP علاوه بر مسیرها اضافه میشوند که دسترسی به منابعی که از طریق آداپتور VPN مسیریابی نمیشوند را مسدود میکنند. این پرچم را برای محافظت در برابر حملات نوع TunnelCrack ارسال کنید (ببینید: https://tunnelcrack.mathyvanhoef.com).
- ipv6
- هدایت مجدد مسیریابی IPv6 به داخل تونل. این مشابه پرچم def1 عمل میکند، به این صورت که مسیرهای خاصتر IPv6 اضافه میشوند (2000::/4، 3000::/4) و کل فضای یونیکست IPv6 را پوشش میدهند.
- !ipv4
- ترافیک IPv4 را هدایت مجدد نکن - معمولاً در جفت پرچم ipv6 !ipv4 برای هدایت مجدد ترافیک فقط IPv6 استفاده میشود.
- --redirect-private flags
- مانند --redirect-gateway، اما تغییر واقعی در درگاه پیشفرض (default gateway) ایجاد نمیکند. هنگام فرستادن (push) زیرشبکههای خصوصی مفید است.
- --route-table id
- مشخص کردن
یک شناسه (id)
جدول
پیشفرض
برای
استفاده با
--route. به صورت
پیشفرض، OpenVPN
مسیرها را
در جدول
مسیریابی
اصلی
سیستمعامل
نصب
میکند،
اما با این
گزینه،
میتوان از
یک جدول
مسیریابی
تعریفشده
توسط کاربر
بهجای آن
استفاده
کرد.
(تنها در لینوکس پشتیبانی میشود، در دیگر پلتفرمها بیاثر است).
- --route args
- افزودن
مسیر به
جدول
مسیریابی
پس از
برقراری
اتصال.
میتوان
چندین مسیر
را مشخص
کرد. مسیرها
پیش از
بستهشدن
دستگاه TUN/TAP به
صورت
خودکار و با
ترتیب
معکوس
برچیده
میشوند.
نحوهای معتبر:
route network/IP route network/IP netmask route network/IP netmask gateway route network/IP netmask gateway metric
این گزینه به عنوان یک جایگزین راحت برای دستور شل route(8) در نظر گرفته شده است، در حالی که همزمان مفاهیم قابل حمل در سراسر پلتفرمهای OpenVPN فراهم میکند.
مقدار پیشفرض را میتوان با خالی گذاشتن یک گزینه یا تنظیم آن روی default مشخص کرد.
پارامترهای network و gateway همچنین میتوانند به عنوان یک نام قابل حل توسط DNS یا پرونده /etc/hosts، یا به عنوان یکی از سه کلیدواژه ویژه مشخص شوند:
- vpn_gateway
- نشانی نقطه پایانی دوردست VPN (مشتقشده از --route-gateway یا پارامتر دوم --ifconfig هنگامی که --dev tun مشخص شده باشد).
- net_gateway
- درگاه پیشفرض IP از قبل موجود، خواندهشده از جدول مسیریابی (در همه سیستمعاملها پشتیبانی نمیشود).
- remote_host
- نشانی --remote در صورتی که OpenVPN در حالت کلاینت اجرا شده باشد، و در حالت سرور تعریفنشده است.
- --route-delay args
- نحوهای معتبر:
route-delay route-delay n route-delay n w
تاخیر به مدت n ثانیه (پیشفرض 0) پس از برقراری اتصال، پیش از افزودن مسیرها. اگر n برابر با 0 باشد، مسیرها بلافاصله پس از برقراری اتصال افزوده میشوند. در صورت حذف --route-delay، مسیرها بلافاصله پس از باز شدن دستگاه TUN/TAP و اجرای اسکریپت --up، پیش از هرگونه کاهش سطح دسترسی --user یا --group (یا اجرای --chroot) افزوده خواهند شد.
این گزینه برای سناریوهایی طراحی شده که در آنها از DHCP برای تنظیم نشانیهای آداپتور tap استفاده میشود. این تاخیر به دستتکانی DHCP زمان کافی برای تکمیل پیش از افزودن مسیرها را میدهد.
در ویندوز، --route-delay با انتظار به مدت w ثانیه (پیشفرض 30) برای بالا آمدن آداپتور TAP-Win32 پیش از افزودن مسیرها، هوشمندانهتر عمل میکند.
- --route-ipv6 args
- راهاندازی
مسیریابی IPv6
در سیستم
برای ارسال
شبکه IPv6
تعیینشده
به داخل tun
مربوط به OpenVPN.
نحوهای معتبر:
route-ipv6 ipv6addr/bits route-ipv6 ipv6addr/bits gateway route-ipv6 ipv6addr/bits gateway metric
- --route-gateway arg
- تعیین یک gateway
پیشفرض
برای
استفاده با
--route.
اگر dhcp به عنوان پارامتر مشخص شود، نشانی درگاه (gateway) از طریق مذاکره DHCP با LAN سمت سرور OpenVPN استخراج خواهد شد.
ساختارهای معتبر:
route-gateway gateway route-gateway dhcp
- --route-ipv6-gateway gw
- تعیین یک درگاه (gateway) پیشفرض gw برای استفاده با --route-ipv6.
- --route-metric m
- تعیین یک متریک پیشفرض m برای استفاده با --route.
- --route-noexec
- مسیرها را بهطور خودکار اضافه یا حذف نکن. در عوض مسیرها را با استفاده از متغیرهای محیطی به اسکریپت --route-up ارسال کن.
- --route-nopull
- هنگام
استفاده با
--client یا --pull،
گزینههای
ارسالشده
توسط سرور
را بپذیر،
به جز
مسیرها، block-outside-dns
و
گزینههای
dhcp مانند
کارگزارهای
DNS.
هنگام استفاده روی کلاینت، این گزینه عملاً سرور را از افزودن مسیرها به جدول مسیریابی کلاینت بازمیدارد، با این حال توجه داشته باشید که این گزینه همچنان به سرور اجازه میدهد ویژگیهای TCP/IP رابط TUN/TAP کلاینت را تنظیم کند.
- --topology mode
- پیکربندی
توپولوژی
آدرسدهی
مجازی
هنگام اجرا
در حالت --dev tun.
این
دستورالعمل
در حالت --dev tap
که همیشه از
توپولوژی
subnet استفاده
میکند،
هیچ معنایی
ندارد.
اگر این دستورالعمل را روی سرور تنظیم کنید، دستورالعملهای --server و --server-bridge بهطور خودکار تنظیمات توپولوژی انتخابی شما را به کلاینتها نیز ارسال میکنند. این دستورالعمل را میتوان بهصورت دستی نیز به کلاینتها ارسال کرد. مانند دستورالعمل --dev، این دستورالعمل نیز باید همیشه بین کلاینت و سرور سازگار باشد.
mode میتواند یکی از موارد زیر باشد:
- subnet
- استفاده از یک زیرشبکه بهجای یک توپولوژی نقطه-به-نقطه با پیکربندی رابط tun با یک نشانی IP محلی و ماسک زیرشبکه (subnet mask)، مشابه توپولوژی استفادهشده در حالت --dev tap و پلزنی اترنت (ethernet bridging). این حالت به ازای هر کلاینت متصل یک نشانی IP اختصاص میدهد و روی ویندوز نیز کار میکند. این حالت پیشفرض است.
- net30
- استفاده از یک توپولوژی نقطه-به-نقطه، با اختصاص یک زیرشبکه 30/ به ازای هر کلاینت. این حالت به گونهای طراحی شده است که وقتی برخی یا همه کلاینتهای متصل سیستمهای ویندوزی هستند، رفتارهای نقطه-به-نقطه را امکانپذیر سازد.
- p2p
- استفاده از یک توپولوژی نقطه-به-نقطه که در آن نقطه پایانی دوردست رابط tun کلاینت همیشه به نقطه پایانی محلی رابط tun سرور اشاره میکند. این حالت به ازای هر کلاینت متصل یک نشانی IP اختصاص میدهد. فقط زمانی استفاده شود که هیچیک از کلاینتهای متصل سیستمهای ویندوزی نباشند.
نکته: استفاده از --topology subnet تفسیر آرگومانهای --ifconfig را به معنای "address netmask" تغییر میدهد، و نه "local remote".
- --tun-mtu args
- ساختارهای معتبر:
tun-mtu tun-mtu tun-mtu tun-mtu occ-mtu
مقدار MTU دستگاه TUN را tun-mtu در نظر میگیرد و MTU پیوند را از آن مشتق میکند. در بیشتر موارد، احتمالاً میخواهید این پارامتر را روی مقدار پیشفرض خود باقی بگذارید.
مقدار پیشفرض برای tun-mtu برابر 1500 است.
مقدار OCC MTU میتواند برای جلوگیری از هشدارهای عدم تطابق MTU از سوی کلاینتها استفاده شود. اگر occ-mtu مشخص نشود، پیشفرض آن برابر با tun-mtu خواهد بود.
مقدار MTU (Maximum Transmission Units) حداکثر اندازه دیتاگرام بر حسب بایت است که میتواند بدون تکهتکه شدن (unfragmented) از طریق یک مسیر شبکه خاص ارسال شود. OpenVPN نیازمند آن است که بستهها روی کانالهای داده و کنترل بهصورت تکهتکهنشده ارسال شوند.
مشکلات MTU اغلب خود را به صورت اتصالات معلقشده در دورههای استفاده فعال نشان میدهند.
بهتر است از گزینههای --fragment و/یا --mssfix برای مقابله با مشکلات اندازه MTU استفاده شود.
نکته: بسته به پلتفرم، سیستمعامل اجازه دریافت بستههای بزرگتر از tun-mtu را میدهد (مانند Linux و FreeBSD) اما پلتفرمهای دیگر (مانند macOS) بستههای دریافتی را به همان اندازه MTU محدود میکنند.
- --tun-mtu-max maxmtu
- حداکثر اندازه MTU را که یک سرور میتواند اعمال کند روی maxmtu پیکربندی میکند، با پیکربندی بافرهای داخلی برای پشتیبانی از حداقل این اندازه بسته. مقدار پیشفرض برای maxmtu برابر 1600 است. در حال حاضر فقط افزایش به بیش از 1600 امکانپذیر است، و تلاش برای کاهش max-mtu به زیر 1600 نادیده گرفته خواهد شد.
- --tun-mtu-extra n
- فرض میکند که دستگاه TUN/TAP ممکن است در هنگام خواندن، حداکثر تا n بایت بیشتر از اندازه --tun-mtu بازگرداند. این پارامتر بهطور پیشفرض 0 است که برای اکثر دستگاههای TUN کافی است. دستگاههای TAP ممکن است سربار اضافی بیش از اندازه MTU ایجاد کنند، و هنگام استفاده از دستگاههای TAP مقدار 32 پیشفرض است. این پارامتر فقط اندازه بافر داخلی OpenVPN را کنترل میکند، بنابراین هیچ سربار انتقالی ناشی از استفاده از یک مقدار بزرگتر وجود ندارد.
عملیاتهای مستقل TUN/TAP
این دو عملیات مستقل به --dev و بهطور اختیاری به --user و/یا --group نیاز خواهند داشت.
- --mktun
- (مستقل)
ایجاد یک
تونل
ماندگار در
پلتفرمهایی
که از آن
پشتیبانی
میکنند
مانند
لینوکس.
بهطور
معمول
تونلهای TUN/TAP
تنها در
بازه
زمانیای
که یک
برنامه
آنها را
باز نگه
داشته است
وجود دارند.
این گزینه
از قابلیت
درایور TUN/TAP
برای ساخت
تونلهای
ماندگاری
بهره
میبرد که
در میان
چندین بار
اجرای OpenVPN
باقی
میمانند و
تنها زمانی
از بین
میروند که
حذف شوند یا
دستگاه
بازراهاندازی
شود.
یکی از مزایای تونلهای ماندگار این است که نیاز به اسکریپتهای مجزای --up و --down را برای اجرای دستورات مناسب ifconfig(8) و route(8) از بین میبرند. این دستورات را میتوان در همان اسکریپت شل که نشست OpenVPN را آغاز یا متوقف میکند قرار داد.
مزیت دیگر این است که اتصالات باز روی تونل مبتنی بر TUN/TAP با راهاندازی مجدد همتای OpenVPN بازنشانی نخواهند شد. این مورد میتواند برای برقراری اتصال بدون وقفه از طریق تونل در صورت بازنشانی DHCP آدرس IP عمومی همتا مفید باشد (گزینه --ipchange در بالا را ببینید).
یکی از معایب تونلهای ماندگار این است که پیکربندی خودکار مقدار MTU آنها دشوارتر است (گزینههای --link-mtu و --tun-mtu در بالا را ببینید).
در برخی پلتفرمها مانند ویندوز، تونلهای TAP-Win32 بهطور پیشفرض ماندگار هستند.
- --rmtun
- (مستقل) حذف یک تونل ماندگار.
مسیریابی و فورواردینگ مجازی (VRF)
گزینههای این بخش مربوط به پیکربندی مسیریابی و فورواردینگ مجازی در ترکیب با سیستمعامل پایه است.
در حال حاضر این امکان تنها در لینوکس پشتیبانی میشود و هسته >= 4.9 پیشنهاد میشود.
این قابلیت برای نمونه زمانی میتواند کاربردی باشد که شبکه خارجی فقط باید به عنوان وسیلهای برای اتصال به برخی نقاط پایانی VPN استفاده شود و تمامی ترافیک عادی صرفاً از طریق تونل(ها) هدایت گردد. این کار را میتوان با راهاندازی یک VRF و پیکربندی رابط متصل به شبکه خارجی به عنوان بخشی از VRF انجام داد. نمونههای زیر این پیکربندی را پوشش میدهند.
گزینه دیگر قرار دادن رابط tun/tap در یک VRF است. این کار میتواند با یک up-script انجام شود که از دستور ip link set نشاندادهشده در زیر استفاده میکند.
راهاندازی VRF با iproute2
ایجاد VRF با نام vrf_external و نگاشت آن به جدول مسیریابی 1023
ip link add vrf_external type vrf table 1023
انتقال eth0 به داخل vrf_external
ip link set master vrf_external dev eth0
هرگونه پیشوند پیکربندیشده روی eth0 از جدول مسیریابی :code`main` به جدول مسیریابی 1023 منتقل خواهد شد
راهاندازی VRF با ifupdown
برای توزیعهای بر پایه دبیان، بسته ifupdown2 تقریباً یک جایگزین مستقیم برای ifupdown به همراه VRFها و قابلیتهای دیگر ارائه میدهد. پیکربندی برای رابط eth0 که بخشی از VRF با نام code:vrf_external باشد میتواند به این صورت باشد:
auto eth0
iface eth0
address 192.0.2.42/24
address 2001:db8:08:15::42/64
gateway 192.0.2.1
gateway 2001:db8:08:15::1
vrf vrf_external
auto vrf_external
iface vrf_external
vrf-table 1023
پیکربندی OpenVPN
پیکربندی OpenVPN باید شامل این خط باشد:
bind-dev vrf_external
مطالعه بیشتر
ویکیپدیا صفحه مناسبی درباره VRFها دارد: https://en.wikipedia.org/wiki/Virtual_routing_and_forwarding
این ارائه از بخش شبکه FrOSCon 2018 نمایی کلی از قابلیتهای پیشرفته لایه ۲ و لایه ۳ لینوکس ارائه میدهد
یکپارچهسازی اسکریپت (SCRIPTING INTEGRATION)
برنامه OpenVPN میتواند اسکریپتهای خارجی را در مراحل مختلف چرخه حیات فرایند OpenVPN اجرا کند.
ترتیب اجرای اسکریپتها (Script Order of Execution)
- 1.
- --dns-updown
پس از مقیدسازی سوکت TCP/UDP و باز شدن TUN/TAP، پیش از --up اجرا میشود.
- 2.
- --up
پس از مقیدسازی سوکت TCP/UDP و باز شدن TUN/TAP، پس از --dns-updown اجرا میشود.
- 3.
- --tls-verify
زمانی اجرا میشود که هنوز همتای دوردست غیرقابلاعتماد است.
- 4.
- --ipchange
پس از احراز هویت اتصال، یا تغییر آدرس IP دوردست اجرا میشود.
- 5.
- --client-connect
در حالت --mode server بلافاصله پس از احراز هویت کلاینت اجرا میشود.
- 6.
- --route-up
پس از احراز هویت اتصال، بلافاصله یا پس از چند ثانیه مشخصشده توسط گزینه --route-delay اجرا میشود.
- 7.
- --route-pre-down
درست پیش از حذف مسیرها اجرا میشود.
- 8.
- --client-disconnect
در حالت --mode server هنگام خاموش شدن یا قطع کلاینت اجرا میشود.
- 9.
- --dns-updown
پیش از بسته شدن TCP/UDP و TUN/TAP، پیش از --down اجرا میشود.
- 10.
- --down
پس از بسته شدن TCP/UDP و TUN/TAP، پس از --dns-updown اجرا میشود.
- 11.
- --learn-address
در حالت --mode server هر زمان که یک آدرس/مسیر IP یا آدرس MAC به جدول مسیریابی داخلی OpenVPN اضافه شود اجرا میگردد.
- 12.
- --auth-user-pass-verify
در حالت --mode server در اتصالهای جدید کلاینت، زمانی که کلاینت هنوز غیرقابلاعتماد است اجرا میشود.
- 13.
- --client-crresponse
قلابهای اسکریپت (SCRIPT HOOKS)
- --auth-user-pass-verify args
- کلاینت را
ملزم به
ارائه
نامکاربری/گذرواژه
(احتمالاً
علاوه بر
گواهی
کلاینت)
برای احراز
هویت
میکند.
نحو معتبر:
auth-user-pass-verify cmd method
برنامه OpenVPN دستور cmd را برای اعتبارسنجی نامکاربری/گذرواژه ارائهشده توسط کلاینت اجرا میکند.
بخش cmd شامل مسیر یک اسکریپت (یا برنامه اجرایی) است که میتواند با آرگومانهای اختیاری همراه باشد. مسیر و آرگومانها میتوانند در نقلقولهای تکی یا دوتایی قرار گیرند و/یا با استفاده از بکاسلش گریز داده شوند، و باید با یک یا چند فاصله از یکدیگر جدا شوند.
اگر method روی via-env تنظیم شود، OpenVPN دستور cmd را با متغیرهای محیطی username و password که روی رشتههای نامکاربری/گذرواژه ارائهشده توسط کلاینت تنظیم شدهاند فراخوانی میکند. توجه داشته باشید که این روش در پلتفرمهایی که محیط فرایند را برای سایر فرایندهای غیرممتاز قابلمشاهده میکنند ناامن است.
اگر method روی via-file تنظیم شود، OpenVPN نامکاربری و گذرواژه را در دو خط نخست یک فایل موقت مینویسد. نام فایل به عنوان یک آرگومان به cmd داده میشود، و فایل پس از بازگشت اسکریپت بهطور خودکار توسط OpenVPN حذف خواهد شد. مکان فایل موقت توسط گزینه --tmp-dir کنترل میشود. برای امنیت، تنظیم آن روی یک رسانه ذخیرهسازی فرار مانند /dev/shm (در صورت وجود) را در نظر بگیرید تا از نوشته شدن فایل نامکاربری/گذرواژه روی دیسک سخت جلوگیری شود.
اسکریپت باید نامکاربری و گذرواژه را بررسی کند، و در صورت پذیرش درخواست احراز هویت کلاینت کد خروج موفقیتآمیز (0)، برای رد کلاینت کد شکست (1)، یا برای به تعویق انداختن احراز هویت کد (2) را بازگرداند. اگر احراز هویت به تعویق بیفتد، اسکریپت باید یک عملیات پسزمینه یا غیرمسدودکننده دیگر را اجرا/فورک کند تا احراز هویت در پسزمینه ادامه یابد. پس از اتمام احراز هویت، مقدار 1 یا 0 باید در فایل مشخصشده توسط auth_control_file نوشته شود.
اگر فایل مشخصشده توسط auth_failed_reason_file وجود داشته باشد و دارای محتوای غیرخالی باشد، محتوای این فایل به عنوان پیام AUTH_FAILED استفاده میشود. برای جلوگیری از شرایط رقابتی، این فایل باید پیش از auth_control_file نوشته شود.
این دلیل شکست احراز هویت میتواند عبارتی ساده مانند "User has been permanently disabled" باشد، اما پیامهای شکست احراز هویت ویژه دیگری نیز وجود دارند.
پیام TEMP نشان میدهد که احراز هویت موقتاً ناموفق بوده و کلاینت باید تلاش مجدد برای اتصال را ادامه دهد. سرور میتواند اختیاری پیامی خوانا برای کاربر ارائه دهد و نحوه اقدام را به کلاینت راهنمایی کند. کلیدواژههای پیام AUTH_FAILED,TEMP مقادیر/کلیدهای جداشده با ویرگول هستند و نحوه اقدام را به کلاینت نشان میدهند. کلیدواژههای تعریفشده فعلی عبارتند از:
- backoff s
- به کلاینت دستور میدهد حداقل s ثانیه پیش از تلاش بعدی برای اتصال صبر کند. اگر کلاینت از قبل تأخیر بیشتری برای اتصال مجدد استفاده میکرد، این تأخیر کوتاهتر نخواهد شد.
- advance addr
- به کلاینت دستور میدهد به آدرس (IP) بعدی سرور فعلی متصل شود.
- advance remote
- به کلاینت دستور میدهد از باقی آدرسهای IP سرور فعلی صرفنظر کرده و به سرور بعدی مشخصشده در فایل پیکربندی متصل شود.
- advance no
- به کلاینت دستور میدهد اتصال مجدد به همان سرور را تکرار کند.
برای مثال، پیام TEMP[backoff 42,advance no]: No free IP addresses نشان میدهد که اتصال VPN در حال حاضر نمیتواند برقرار شود و به کلاینت دستور میدهد ۴۲ ثانیه دیگر مجدداً تلاش کند.
هنگام استفاده از احراز هویت معوق، اسکریپت همچنین میتواند با نوشتن در فایل مشخصشده توسط auth_pending_file درخواست احراز هویت در حال انتظار کند. خط اول باید زمان مهلت (timeout) بر حسب ثانیه باشد، خط دوم روش مورد نیاز (مانند crtext) و خط سوم باید مقادیر EXTRA باشد همانطور که در بخش client-pending-auth از فایل doc/management.txt مستند شده است.
این دستورالعمل برای ایجاد رابطی به سبک افزونه جهت گسترش قابلیتهای احراز هویت OpenVPN طراحی شده است.
برای محافظت در برابر کلاینتی که رشته نامکاربری یا گذرواژه مخرب ارسال میکند، رشته نامکاربری فقط باید شامل این نویسهها باشد: الفبانمایی، زیرخط ('_')، خط تیره ('-')، نقطه ('.') یا اتساین ('@'). رشته گذرواژه میتواند شامل هر نویسه قابلچاپی به جز CR یا LF باشد. هر نویسه غیرمجاز در رشته نامکاربری یا گذرواژه به زیرخط ('_') تبدیل خواهد شد.
تمام اسکریپتهای تعریفشده توسط کاربر باید در نحوه مدیریت این رشتهها دقت کنند تا از بروز آسیبپذیریهای امنیتی جلوگیری شود. هرگز از این رشتهها به گونهای استفاده نکنید که توسط یک مفسر شل ارزیابی یا گریز داده شوند.
برای مشاهده یک اسکریپت نمونه که احراز هویت PAM را انجام میدهد، فایل sample-scripts/auth-pam.pl را در توزیع منبع OpenVPN بررسی کنید.
- --client-crresponse
نحو معتبر:
client-crresponse cmd
برنامه OpenVPN پاسخ کلاینت را در یک پرونده موقت مینویسد. نام پرونده به عنوان یک آرگومان به cmd ارسال میشود، و پرونده پس از بازگشت اسکریپت به صورت خودکار توسط OpenVPN حذف خواهد شد.
پاسخ دقیقاً همانطور که از کلاینت آمده ارسال میشود. اسکریپت باید خودش بررسی کند که آیا ورودی معتبر است یا خیر، برای مثال آیا ورودی دارای کدگذاری base64 معتبر است یا نه.
اسکریپت میتواند نتیجه اعتبارسنجی را مستقیماً در auth_control_file بنویسد یا آن را بیشتر به تعویق بیندازد. برای جزئیات به `--auth-user-pass-verify`` مراجعه کنید.
برای یک اسکریپت نمونه که احراز هویت دو مرحلهای مبتنی بر TOTP (RFC 6238) را پیادهسازی میکند، sample-scripts/totpauth.py را ببینید.
- --client-connect cmd
- اجرای
دستور cmd
هنگام
اتصال
کلاینت.
cmd شامل یک مسیر به یک اسکریپت (یا برنامه اجرایی) است که به صورت اختیاری آرگومانهایی به دنبال آن میآیند. مسیر و آرگومانها میتوانند داخل کوتیشن تکی یا دوتایی قرار گیرند و/یا با استفاده از بکاسلش گریز داده شوند، و باید با یک یا چند فاصله از هم جدا شوند.
نام عمومی (common name) و آدرس IP کلاینتِ تازه احراز هویت شده به عنوان متغیرهای محیطی به دستور ارسال میشوند (بخش متغیرهای محیطی را در زیر ببینید). همچنین مسیر یک پرونده موقت تازه ایجاد شده به عنوان آخرین آرگومان (پس از هر آرگومان مشخص شده در cmd ) به دستور داده میشود، تا توسط دستور جهت ارسال دستورالعملهای پرونده پیکربندی تولید شده به صورت پویا به OpenVPN استفاده شود.
اگر اسکریپت بخواهد یک پرونده پیکربندی پویا برای اعمال روی سرور هنگام اتصال کلاینت تولید کند، باید آن را در پروندهای که نامش در آخرین آرگومان مشخص شده بنویسد.
برای گزینههایی که میتوانند به صورت مجاز در یک پرونده پیکربندی تولید شده به صورت پویا استفاده شوند، گزینه --client-config-dir را در زیر ببینید.
توجه داشته باشید که مقدار بازگشتی script مهم است. اگر script یک وضعیت خطای غیر صفر برگرداند، باعث قطع اتصال کلاینت خواهد شد.
اگر یک --client-connect بخواهد تولید پیکربندی را به تعویق بیندازد، اسکریپت باید از متغیرهای محیطی client_connect_deferred_file و client_connect_config_file استفاده کند و وضعیت را بر این اساس در این پروندهها بنویسد. برای جزئیات بیشتر به بخش متغیرهای محیطی مراجعه کنید.
- --client-disconnect cmd
- مشابه --client-connect
اما هنگام
خاموش شدن
نمونه
کلاینت
فراخوانی
میشود.
فراخوانی
نخواهد شد
مگر اینکه
اسکریپت و
پلاگینهای
--client-connect (در صورت
تعریف شدن)
پیشتر روی
این نمونه
با وضعیت
بازگشتی
موفقیتآمیز
(0) فراخوانی
شده باشند.
استثنای این قاعده زمانی است که دستور یا پلاگینهای --client-disconnect به صورت آبشاری (cascaded) باشند، و حداقل یکی از توابع client-connect موفق شده باشد؛ در این حالت همه توابع client-disconnect برای اسکریپتها و پلاگینها هنگام حذف شیء نمونه کلاینت فراخوانی خواهند شد، حتی در مواردی که برخی از توابع مرتبط client-connect وضعیت خطا برگردانده باشند.
هیچ آرگومان اضافی به دستور --client-disconnect ارسال نمیشود (تنها همان آرگومانهای مشخص شده در cmd، در صورت وجود).
- --dns-updown cmd
- اجرای
دستور cmd،
به جای
دستور
پیشفرض DNS up/down
که همراه با
openvpn ارائه
میشود. اگر
cmd برابر با
disable باشد،
دستور --dns-updown
اجرا
نمیشود.
اگر دستور اختصاصی خود را مینویسید، لطفاً مطمئن شوید که پروفایلهای سرور --dns غیرقابل اعمال نادیده گرفته شوند. تنظیمات درگاه، DNSSEC و انتقال امن باید رعایت شوند. اگر split DNS امکانپذیر نباشد، میتوان از تغییر مسیر کامل (full redirect) به عنوان یک راهکار جایگزین استفاده کرد. اگر پیکربندی همه آدرسهای سرور یا دامنههای جستجو امکانپذیر نباشد، آنها را به همان ترتیبی که فهرست شدهاند اعمال کنید.
توجه داشته باشید که --dns-updown در همه پلتفرمها پشتیبانی نمیشود. در Windows تنظیم DNS همیشه توسط سرویس انجام خواهد شد. در Android تنظیم DNS از طریق رابط مدیریتی منتقل میشود.
توجه داشته باشید که در صورت عدم وجود گزینههای --dns، ممکن است --dhcp-optionهای مربوط به DNS تبدیل شوند تا برای این قلاب در دسترس باشند. اگر هرگونه گزینه --dns server وجود داشته باشد، --dhcp-optionهای مربوط به DNS همیشه نادیده گرفته خواهند شد. اگر یک اسکریپت --up تعریف شده باشد، متغیرهای محیطی foreign_option از گزینههای --dns تولید شده و به اسکریپت ارسال میشوند. در صورت تعریف اسکریپت --up، دستور پیشفرض --dns-updown اجرا نمیشود. هر دوی این کارها برای سازگاری با گذشته انجام شده است. در صورتی که میخواهید حتی با وجود تعریف --up دستور --dns-updown اجرا شود، میتوانید یک دستور سفارشی تعریف کنید یا از force به عنوان cmd برای اجرای دستور پیشفرض استفاده کنید. در این حالت هیچ متغیر محیطی DNS به --up ارسال نخواهد شد.
- --down cmd
- اجرای
دستور cmd پس
از بسته شدن
دستگاه TUN/TAP (پس
از تغییر UID
با --user و/یا --chroot
). cmd شامل
مسیری به یک
اسکریپت (یا
برنامه
اجرایی) است
که به صورت
اختیاری
آرگومانهایی
به دنبال آن
میآیند.
مسیر و
آرگومانها
میتوانند
داخل
کوتیشن تکی
یا دوتایی
قرار گیرند
و/یا با
استفاده از
بکاسلش
گریز داده
شوند، و
باید با یک
یا چند
فاصله از هم
جدا شوند.
با همان پارامترها و متغیرهای محیطی گزینه --up در بالا فراخوانی میشود.
توجه داشته باشید که اگر با استفاده از --user و/یا --group سطح دسترسی را کاهش دهید، اسکریپت --down شما نیز با دسترسی کاهشیافته اجرا خواهد شد.
- --down-pre
- فراخوانی دستور/اسکریپت --down قبل از بسته شدن TUN/TAP، به جای بعد از آن.
- --ipchange cmd
- اجرای
دستور cmd
هنگامی که
نشانی IP راه
دور ما برای
نخستین بار
احراز هویت
شده یا
تغییر
میکند.
cmd شامل مسیری به یک اسکریپت (یا برنامه اجرایی) است که به صورت اختیاری میتواند با آرگومانها همراه شود. مسیر و آرگومانها میتوانند درون نقلقول تکی یا جفتی قرار گرفته و/یا با استفاده از بکاسلش گریز داده شوند، و باید با یک یا چند فاصله از یکدیگر جدا شوند.
هنگام اجرای cmd، دو آرگومان پس از هر آرگومان مشخصشده در cmd به صورت زیر افزوده میشوند:
cmd ip address port number
از --ipchange در حالت --mode server استفاده نکنید. به جای آن از یک اسکریپت --client-connect استفاده کنید.
برای پارامترهای اضافی ارسالی به عنوان متغیرهای محیطی، بخش متغیرهای محیطی در زیر را ببینید.
اگر در محیطی با نشانیهای IP پویا کار میکنید که نشانی IP هر یک از طرفین میتواند بدون اطلاع قبلی تغییر کند، میتوانید برای نمونه از این اسکریپت برای ویرایش پرونده /etc/hosts با نشانی فعلی طرف مقابل استفاده کنید. این اسکریپت هر بار که همتای راه دور نشانی IP خود را تغییر دهد اجرا خواهد شد.
به همین ترتیب اگر نشانی IP ما به دلیل DHCP تغییر کند، باید اسکریپت تغییر نشانی IP خود را (صفحه راهنمای dhcpcd(8) را ببینید) به گونهای پیکربندی کنیم تا یک سیگنال SIGHUP یا SIGUSR1 به OpenVPN ارسال کند. سپس OpenVPN اتصال را با آخرین همتای احراز هویتشده روی نشانی IP جدیدش دوباره برقرار خواهد کرد.
- --learn-address cmd
- اجرای
دستور cmd
برای
اعتبارسنجی
نشانیهای
مجازی یا
مسیرهای
کلاینت.
cmd شامل مسیری به یک اسکریپت (یا برنامه اجرایی) است که به صورت اختیاری میتواند با آرگومانها همراه شود. مسیر و آرگومانها میتوانند درون نقلقول تکی یا جفتی قرار گرفته و/یا با استفاده از بکاسلش گریز داده شوند، و باید با یک یا چند فاصله از هم جدا شوند.
سه آرگومان به هر آرگومان مشخص در cmd به صورت زیر پیوست خواهد شد:
- $1 - [عملیات]
- "add"، "update" یا "delete" بر اساس اینکه نشانی به جدول مسیریابی درونی OpenVPN افزوده، ویرایش یا از آن حذف شده است یا خیر.
- $2 - [نشانی]
- نشانیای که در حال یادگیری یا فراموششدن است. این مقدار میتواند شامل موارد زیر باشد:
- یک نشانی IPv4 مانند "198.162.10.14"،
- یک زیرشبکه IPv4 مانند "198.162.10.0/24"،
- یک نشانی IPv6 مانند "2001:db8:1:2:3:4:5:6"،
- یک زیرشبکه IPv6 مانند "2001:db8:1:2:3:4:5::/112"، یا
- یک نشانی اترنت MAC (هنگامی که --dev tap استفاده میشود) مانند "00:FF:01:02:03:04".
- $3 - [نام عمومی]
- نام عمومی (Common Name) روی گواهی مرتبط با کلاینت متصل به این نشانی. تنها برای عملیاتهای "add" یا "update" وجود دارد، نه "delete".
در متدهای "add" یا "update"، اگر اسکریپت کد خطایی (غیرصفر) بازگرداند، OpenVPN نشانی را رد کرده و جدول مسیریابی درونی خود را تغییر نخواهد داد.
به طور معمول، اسکریپت cmd از اطلاعات ارائهشده در بالا برای تنظیم ورودیهای مناسب دیواره آتش روی رابط TUN/TAP مربوط به VPN استفاده میکند. از آنجا که OpenVPN ارتباط بین نشانی مجازی IP یا MAC و نام عمومی احراز هویتشده کلاینت را فراهم میکند، به اسکریپت تعریفشده توسط کاربر امکان میدهد تا سیاستهای دسترسی دیواره آتش را بر اساس نام عمومی سطحبالای کلاینت، به جای نشانیهای مجازی سطحپایین کلاینت پیکربندی کند.
اتصال یک کلاینت دارای پشته دوگانه (dual-stack) به سرور دوپشتهای باعث دو بار فراخوانی پشت سر هم اسکریپت cmd خواهد شد، زیرا سرور هر یک از نشانیهای IPv4 و IPv6 کلاینت را یاد میگیرد.
- --route-up cmd
- اجرای
دستور cmd پس
از افزودن
مسیرها،
منوط به --route-delay.
cmd شامل مسیری به یک اسکریپت (یا برنامه اجرایی) است که به صورت اختیاری میتواند با آرگومانها همراه شود. مسیر و آرگومانها میتوانند درون نقلقول تکی یا جفتی قرار گرفته و/یا با استفاده از بکاسلش گریز داده شوند، و باید با یک یا چند فاصله از هم جدا شوند.
برای پارامترهای اضافی ارسالی به عنوان متغیرهای محیطی، بخش متغیرهای محیطی در زیر را ببینید.
- --route-pre-down cmd
- اجرای
دستور cmd
پیش از حذف
مسیرها
هنگام قطع
اتصال.
cmd شامل مسیری به یک اسکریپت (یا برنامه اجرایی) است که به صورت اختیاری میتواند با آرگومانها همراه شود. مسیر و آرگومانها میتوانند درون نقلقول تکی یا جفتی قرار گرفته و/یا با استفاده از بکاسلش گریز داده شوند، و باید با یک یا چند فاصله از هم جدا شوند.
برای پارامترهای اضافی ارسالی به عنوان متغیرهای محیطی، بخش متغیرهای محیطی در زیر را ببینید.
- --setenv args
- تنظیم یک
متغیر
محیطی
سفارشی name=value
برای ارسال
به اسکریپت.
نحوهای معتبر:
setenv name value setenv FORWARD_COMPATIBLE 1 setenv opt config_option
با تنظیم FORWARD_COMPATIBLE روی 1، بررسی نحو پرونده پیکربندی سادهتر میشود به طوری که دستورالعملهای ناشناخته به جای خطای مهلک، هشدار صادر میکنند، بر این فرض که دستورالعمل ناشناخته مفروض ممکن است در نسخههای آینده OpenVPN معتبر باشد.
این گزینه باید با احتیاط استفاده شود، زیرا دلایل امنیتی موجهی برای متوقف شدن OpenVPN در صورت شناسایی مشکلات در یک پرونده پیکربندی وجود دارد. با این حال، دلایل معتبری نیز برای کاهش ملایم کارایی ویژگیهای جدید نرمافزار هنگام مواجهه با نسخههای قدیمیتر نرمافزار وجود دارد.
همچنین امکان برچسبگذاری یک دستورالعمل مشخص وجود دارد تا در صورت عدم شناسایی آن، خطای مهلکی رخ ندهد. برای انجام این کار، عبارت زیر را پیش از دستورالعمل قرار دهید: setenv opt
نسخههای پیش از OpenVPN 2.3.3 همیشه گزینههای تنظیمشده با دستورالعمل setenv opt را نادیده میگیرند.
همچنین --ignore-unknown-option را ببینید.
- --setenv-safe args
- تنظیم یک
متغیر
محیطی
سفارشی OPENVPN_name
با مقدار value
برای ارسال
به
اسکریپتها.
نحو معتبر:
setenv-safe name value
این دستورالعمل برای ارسال (push) از سمت سرور به کلاینتها طراحی شده است، و افزودن پیشوند OPENVPN_ به متغیر محیطی یک اقدام احتیاطی برای جلوگیری از حملاتی از نوع LD_PRELOAD توسط یک سرور مخرب یا آسیبدیده است.
- --tls-verify cmd
- اجرای
دستور cmd
برای
اعتبارسنجی
نام X509 یک
اتصال TLS در
حال انتظار
که سایر
آزمونهای
گواهی را
پشت سر
گذاشته است
(بهجز
ابطال از
طریق
دستورالعمل
--crl-verify؛ آزمون
ابطال پس از
آزمون --tls-verify
رخ میدهد).
دستور cmd باید برای مجاز کردن ادامه دستتکانی TLS مقدار 0 و برای شکست مقدار 1 را برگرداند.
دستور cmd شامل مسیری به یک اسکریپت (یا برنامه اجرایی) است که میتواند با آرگومانهایی دنبال شود. مسیر و آرگومانها ممکن است در نقلقول تکی یا دوتایی قرار گیرند و/یا با بکاسلش گریز داده شوند، و باید با یک یا چند فاصله از هم جدا شوند.
هنگامی که cmd اجرا میشود، دو آرگومان پس از هر آرگومانی که در cmd مشخص شده باشد، به صورت زیر اضافه میشود:
cmd certificate_depth subject
این آرگومانها به ترتیب عبارتند از عمق فعلی گواهی و نام متمایز موضوع (subject dn) گواهی X509 طرف مقابل.
این قابلیت زمانی مفید است که طرف مقابل که میخواهید به آن اعتماد کنید گواهیای دارد که توسط مرجع صدور گواهی امضا شده است که گواهیهای بسیار دیگری را نیز امضا کرده است، در حالی که لزوماً نمیخواهید به همه آنها اعتماد کنید، بلکه ترجیح میدهید در پذیرش گواهی طرف مقابل گزینشی عمل کنید. این قابلیت به شما امکان میدهد اسکریپتی بنویسید که نام X509 را در یک گواهی آزمایش کرده و تصمیم بگیرد که آیا باید پذیرفته شود یا خیر. برای یک اسکریپت ساده perl که فیلد نام عمومی (common name) را روی گواهی آزمایش میکند، فایل verify-cn را در توزیع OpenVPN ببینید.
برای پارامترهای بیشتر که به عنوان متغیرهای محیطی ارسال میشوند، بخش Environmental Variables را در زیر ببینید.
- --tls-export-cert dir
- افزودن
متغیر
محیطی peer_cert
هنگام
فراخوانی
اسکریپت
--tls-verify یا
اجرای قلاب
افزونه OPENVPN_PLUGIN_TLS_VERIFY
برای
اعتبارسنجی
گواهی.
این متغیر محیطی شامل مسیر یک گواهی با کدبندی PEM از گواهی طرف مقابل فعلی در پوشه dir است.
- --up cmd
- اجرای
دستور cmd پس
از باز شدن
موفقیتآمیز
دستگاه TUN/TAP
(پیش از
تغییر UID
گزینه --user).
دستور cmd شامل مسیری به یک اسکریپت (یا برنامه اجرایی) است که میتواند با آرگومانهایی دنبال شود. مسیر و آرگومانها ممکن است در نقلقول تکی یا دوتایی قرار گیرند و/یا با بکاسلش گریز داده شوند، و باید با یک یا چند فاصله از هم جدا شوند.
دستور up برای مشخص کردن دستورات مسیریابی که ترافیک IP به مقصد زیرشبکههای خصوصی واقع در سمت دیگر اتصال VPN را به درون تونل هدایت میکنند، کاربرد دارد.
برای --dev tun به این صورت اجرا میشود:
cmd tun_dev tun_mtu 0 ifconfig_local_ip ifconfig_remote_ip [init | restart]
برای --dev tap به این صورت اجرا میشود:
cmd tap_dev tap_mtu 0 ifconfig_local_ip ifconfig_netmask [init | restart]
برای پارامترهای بیشتر که به عنوان متغیرهای محیطی ارسال میشوند، بخش Environmental Variables را در زیر ببینید. آرگومان 0 قبلاً link_mtu بوده است که دیگر به اسکریپتها ارسال نمیشود - برای حفظ ترتیب آرگومانها، با 0 جایگزین شده است.
توجه داشته باشید که اگر cmd شامل آرگومانهایی باشد، تمام آرگومانهای تولیدشده توسط OpenVPN به آنها الحاق میشوند تا فهرست آرگومانی ساخته شود که برنامه اجرایی با آن فراخوانی خواهد شد.
معمولاً cmd اسکریپتی را برای افزودن مسیرها به تونل اجرا میکند.
بهطور معمول اسکریپت up پس از باز شدن دستگاه TUN/TAP فراخوانی میشود. در این زمینه، آخرین پارامتر خط فرمان ارسالی به اسکریپت init. خواهد بود. اگر از گزینه --up-restart نیز استفاده شود، اسکریپت up برای راهاندازیهای مجدد نیز فراخوانی خواهد شد. راهاندازی مجدد به عنوان مقداردهی اولیه جزئی مجدد OpenVPN در نظر گرفته میشود که در آن نمونه TUN/TAP حفظ میگردد (گزینه --persist-tun این حفظ را فعال میکند). راهاندازی مجدد میتواند توسط سیگنال SIGUSR1، اتمام مهلت زمان --ping-restart، یا بازنشانی اتصال هنگامی که پروتکل TCP با گزینه --proto فعال است رخ دهد. اگر راهاندازی مجدد رخ دهد، و --up-restart مشخص شده باشد، اسکریپت up با restart به عنوان آخرین پارامتر فراخوانی خواهد شد.
- NOTE:
- هنگام راهاندازی مجدد، OpenVPN مجموعه کامل متغیرهای محیطی را به اسکریپت ارسال نمیکند. بهویژه، هیچچیز مربوط به مسیریابی و درگاهها ارسال نخواهد شد، زیرا در هر صورت نیازی به انجام کاری نیست - تمام پیکربندیهای مسیریابی از قبل برقرار هستند. علاوه بر این، اسکریپت up-restart با تنظیمات تقلیلیافته UID/GID اجرا خواهد شد (در صورت پیکربندی).
مثال مستقل زیر نحوه فراخوانی اسکریپت --up را هم در زمینه مقداردهی اولیه و هم راهاندازی مجدد نشان میدهد. (NOTE: به دلایل امنیتی، مثال زیر را اجرا نکنید مگر اینکه درگاه UDP 9999 توسط دیوار آتش شما مسدود شده باشد. همچنین، مثال به طور نامحدود اجرا خواهد شد، بنابراین باید با control-c آن را متوقف کنید).
openvpn --dev tun --port 9999 --verb 4 --ping-restart 10 \
--up 'echo up' --down 'echo down' --persist-tun \
--up-restart
توجه داشته باشید که OpenVPN همچنین گزینه --ifconfig را برای اعمال خودکار ifconfig روی دستگاه TUN فراهم میکند، که نیاز به تعریف اسکریپت --up را برطرف میسازد، مگر اینکه بخواهید مسیرها را نیز در اسکریپت --up پیکربندی کنید.
اگر --ifconfig نیز مشخص شده باشد، OpenVPN نقاط انتهایی محلی و دوردست ifconfig را در خط فرمان به اسکریپت --up ارسال میکند تا بتوان از آنها برای پیکربندی مسیرهایی مانند زیر استفاده کرد:
route add -net 10.0.0.0 netmask 255.255.255.0 gw $5
- --up-delay
- به تاخیر
انداختن
باز شدن TUN/TAP و
اجرای
احتمالی
اسکریپت --up
تا پس از
برقراری
اتصال TCP/UDP با
همتا (peer).
در حالت --proto udp، این گزینه معمولاً نیازمند استفاده از --ping است تا شروع اتصال در غیاب دادههای تونل شناسایی شود، چرا که UDP یک پروتکل "بدون اتصال (connectionless)" است.
در ویندوز، این گزینه تغییر وضعیت رسانه TAP-Win32 به "connected" را تا زمان برقراری اتصال، یعنی دریافت اولین بسته احراز هویت شده از همتا به تاخیر میاندازد.
- --up-restart
- فعال کردن فراخوانی اسکریپتهای --up و --down برای راهاندازیهای مجدد و همچنین شروع اولیه برنامه. این گزینه به طور کاملتر در بالا در مستندات گزینه --up توضیح داده شده است.
انواع رشته و نگاشت مجدد
در موارد خاص، OpenVPN نویسهها را در رشتهها بازنگاشت (remapping) میکند. در اصل، هر نویسهای خارج از مجموعه نویسههای مجاز برای هر نوع رشته، به خط زیر ('_') تبدیل خواهد شد.
- پرسش: چرا نگاشت مجدد رشته ضروری است؟
- این یک ویژگی امنیتی مهم برای جلوگیری از کدگذاری مخرب رشتهها از منابع غیرقابل اعتماد است تا به عنوان آرگومان به اسکریپتها ارسال نشوند، در متغیرهای محیطی ذخیره نشوند، به عنوان نام مشترک استفاده نشوند، به نام پرونده ترجمه نشوند، و غیره.
- پرسش: آیا نگاشت مجدد رشته میتواند غیرفعال شود؟
- خیر. گزینههای --no-name-remapping و --compat-names در نگارش 2.5 حذف شدهاند زیرا بیش از حد ناامن در نظر گرفته میشدند.
در اینجا مرور کوتاهی از انواع رشتههای کنونی OpenVPN و دسته نویسههای مجاز برای هر رشته آورده شده است:
- نامهای X509
- حروف و ارقام، خط زیر ('_')، خط تیره ('-')، نقطه ('.')، اتساین ('@')، دونقطه (':')، اسلش ('/')، و مساوی ('='). نویسه حرفی-عددی (Alphanumeric) به عنوان نویسهای تعریف میشود که باعث بازگرداندن مقدار true توسط تابع isalnum() در کتابخانه C شود.
- نامهای مشترک (Common Names)
- حروف و ارقام، خط زیر ('_')، خط تیره ('-')، نقطه ('.')، و اتساین ('@').
- نام کاربری --auth-user-pass
- مشابه نام مشترک، با یک استثنا: نام کاربری به صورت خام و بدون نگاشت مجدد رشته به افزونه OPENVPN_PLUGIN_AUTH_USER_PASS_VERIFY ارسال میشود.
- گذرواژه --auth-user-pass
- هر نویسه "قابل چاپ" به جز CR یا LF. نویسه قابل چاپ به عنوان نویسهای تعریف میشود که باعث بازگرداندن مقدار true توسط تابع isprint() در کتابخانه C شود.
- نام پرونده --client-config-dir مشتقشده از common name یا username
- حروف و ارقام، خط زیر ('_')، خط تیره ('-')، اتساین ('@')، و نقطه ('.') به جز "." یا ".." به عنوان رشتههای مستقل.
- نامهای متغیرهای محیطی
- حروف و ارقام یا خط زیر ('_').
- مقادیر متغیرهای محیطی
- هر نویسه قابل چاپ.
برای تمام موارد، نویسههای موجود در یک رشته که عضو دسته نویسههای مجاز برای آن نوع رشته نیستند، به خط زیر ('_') بازنگاشت خواهند شد.
متغیرهای محیطی
پس از تنظیم، یک متغیر به طور نامحدود باقی میماند تا زمانی که با یک مقدار جدید یا راهاندازی مجدد بازنشانی شود،
در حالت سرور، دامنه متغیرهای محیطی تنظیمشده توسط OpenVPN بر اساس اشیاء کلاینت مرتبط با آنها مشخص میشود، بنابراین نباید هیچ مشکلی در دسترسی اسکریپتها به متغیرهای قدیمی و از پیش تنظیمشده که به نمونههای مختلف کلاینت ارجاع دارند وجود داشته باشد.
- bytes_received
- تعداد کل بایتهای دریافت شده از کلاینت در طول نشست VPN. پیش از اجرای اسکریپت --client-disconnect مقداردهی میشود.
- bytes_sent
- تعداد کل بایتهای ارسال شده به کلاینت در طول نشست VPN. پیش از اجرای اسکریپت --client-disconnect مقداردهی میشود.
- client_connect_config_file
- مسیر پرونده پیکربندی که باید توسط اسکریپت --client-connect در آن نوشته شود (اختیاری، در صورتی که پیکربندی مجزا برای هر نشست مد نظر باشد). این همان نام پروندهای است که از طریق آرگومان خط فرمان در هنگام فراخوانی اسکریپت --client-connect ارسال میشود.
- client_connect_deferred_file
- این پرونده
میتواند
به صورت
اختیاری
برای اعلام
کد وضعیت
اسکریپت یا
افزونه --client-connect
نوشته شود.
فقط اولین
نویسه در
پرونده
اهمیت دارد.
این نویسه
باید یا 1
برای نشان
دادن اجرای
عادی
اسکریپت
باشد، 0
نشاندهنده
خطا است
(همانند
وضعیت خروج
غیر صفر) یا
2 برای نشان
دادن این که
اسکریپت
بازگرداندن
پرونده
پیکربندی
را به تعویق
انداخته
است.
برای رسیدگی معوق (پسزمینه)، اسکریپت یا افزونه حتماً باید 2 را در پرونده بنویسد تا تعویق را اعلام کند و سپس با کد خروج 0 بازگردد تا پیام deferred handler started OK را مخابره کند.
سپس یک فرایند پسزمینه یا مشابه آن باید وظیفه نوشتن پیکربندی در پرونده مشخصشده توسط متغیر محیطی client_connect_config_file را به عهده بگیرد و پس از اتمام، مقدار 1 (یا در صورت بروز خطا 0) را در این پرونده بنویسد.
نبود هرگونه نویسه در پرونده هنگام پایان اجرای اسکریپت، همانند 1 تفسیر میشود. این به اسکریپتهایی که برای پشتیبانی از سازوکار تعویق نوشته نشدهاند اجازه میدهد تا بدون تغییر مورد استفاده قرار گیرند.
- common_name
- نام عمومی (common name) مربوط به X509 یک کلاینت احراز هویت شده. پیش از اجرای اسکریپتهای --client-connect، --client-disconnect و --auth-user-pass-verify تنظیم میشود.
- config
- نام نخستین پروندهٔ --config. هنگام راهاندازی برنامه تنظیم شده و با SIGHUP بازنشانی میشود.
- daemon
- اگر دستورالعمل --daemon مشخص شده باشد روی "1" و در غیر این صورت روی "0" تنظیم میشود. هنگام راهاندازی برنامه تنظیم شده و با SIGHUP بازنشانی میشود.
- daemon_log_redirect
- اگر دستورالعملهای --log یا --log-append مشخص شده باشند روی "1" و در غیر این صورت روی "0" تنظیم میشود. هنگام راهاندازی برنامه تنظیم شده و با SIGHUP بازنشانی میشود.
- dev
- نام واقعی دستگاه TUN/TAP، شامل شمارهٔ واحد در صورت وجود. پیش از اجرای اسکریپتهای --up یا --down تنظیم میشود.
- dev_idx
- در ویندوز، نمایهٔ (index) دستگاه مربوط به آداپتور TUN/TAP (جهت استفاده در فراخوانیهای netsh.exe که گاهی با نامهای رابط به درستی کار نمیکنند). پیش از اجرای اسکریپتهای --up یا --down تنظیم میشود.
- dns_*
- گزینههای پیکربندی --dns از طریق این مجموعه از متغیرهای محیطی در دسترس اجرای --dns-updown قرار خواهند گرفت. متغیرها تنها در صورتی پدیدار میشوند که به گزینهٔ مربوطه مقداری تخصیص داده شده باشد. برای آگاهی از مفهوم دقیق هر متغیر، لطفاً به مستندات --dns مراجعه کنید.
dns_search_domain_{n}
dns_server_{n}_address_{m}
dns_server_{n}_port_{m}
dns_server_{n}_resolve_domain_{m}
dns_server_{n}_dnssec
dns_server_{n}_transport
dns_server_{n}_sni
- foreign_option_{n}
- گزینهای که از طریق --push به کلاینتی ارسال (push) شده که به طور بومی از آن پشتیبانی نمیکند، مانند --dhcp-option در یک سیستم غیرویندوزی، پیش از اجرای اسکریپت --up در این دنباله از متغیرهای محیطی ذخیره خواهد شد.
- ifconfig_ipv6_local
- نشانی IPv6 محلی نقطهٔ پایانی VPN مشخصشده در گزینهٔ --ifconfig-ipv6 (پارامتر اول). پیش از فراخوانی دستورهای ifconfig یا code:netsh (نسخهٔ ویندوزی ifconfig) توسط OpenVPN تنظیم میشود که معمولاً قبل از اجرای اسکریپت --up رخ میدهد.
- ifconfig_ipv6_netbits
- طول پیشوند (prefix length) شبکهٔ IPv6 در رابط VPN. مشتقشده از پارامتر nnn/ در نشانی IPv6 در گزینهٔ --ifconfig-ipv6 (پارامتر اول). پیش از فراخوانی دستورهای ifconfig یا netsh (نسخهٔ ویندوزی ifconfig) توسط OpenVPN تنظیم میشود که معمولاً قبل از اجرای اسکریپت --up رخ میدهد.
- ifconfig_ipv6_remote
- نشانی IPv6 دوردست (remote) نقطهٔ پایانی VPN مشخصشده در گزینهٔ --ifconfig-ipv6 (پارامتر دوم). پیش از فراخوانی دستورهای ifconfig یا netsh (نسخهٔ ویندوزی ifconfig) توسط OpenVPN تنظیم میشود که معمولاً قبل از اجرای اسکریپت --up رخ میدهد.
- ifconfig_local
- نشانی IP محلی نقطهٔ پایانی VPN مشخصشده در گزینهٔ --ifconfig (پارامتر اول). پیش از فراخوانی دستورهای ifconfig یا netsh (نسخهٔ ویندوزی ifconfig) توسط OpenVPN تنظیم میشود که معمولاً قبل از اجرای اسکریپت --up رخ میدهد.
- ifconfig_remote
- نشانی IP دوردست (remote) نقطهٔ پایانی VPN مشخصشده در گزینهٔ --ifconfig (پارامتر دوم) هنگامی که --dev tun استفاده شده باشد. پیش از فراخوانی دستورهای ifconfig یا netsh (نسخهٔ ویندوزی ifconfig) توسط OpenVPN تنظیم میشود که معمولاً قبل از اجرای اسکریپت --up رخ میدهد.
- ifconfig_netmask
- ماسک زیرشبکهٔ (subnet mask) بخش اترنت مجازی که به عنوان پارامتر دوم در --ifconfig هنگام استفاده از --dev tap مشخص شده است. پیش از فراخوانی دستورهای ifconfig یا netsh (نسخهٔ ویندوزی ifconfig) توسط OpenVPN تنظیم میشود که معمولاً قبل از اجرای اسکریپت --up رخ میدهد.
- ifconfig_pool_local_ip
- نشانی IPv4 مجازی محلی برای تونل TUN/TAP برگرفته از دستورالعمل --ifconfig-push در صورت تعیین، یا در غیر این صورت از استخر ifconfig (کنترلشده با دستورالعمل پروندهٔ پیکربندی --ifconfig-pool). تنها برای تونلهای --dev tun تنظیم میشود. این گزینه در کارساز پیش از اجرای اسکریپتهای --client-connect و --client-disconnect تنظیم میشود.
- ifconfig_pool_local_ip6
- نشانی IPv6 مجازی محلی برای تونل TUN/TAP برگرفته از دستورالعمل --ifconfig-ipv6-push در صورت تعیین، یا در غیر این صورت از استخر ifconfig (کنترلشده با دستورالعمل پروندهٔ پیکربندی --ifconfig-ipv6-pool). تنها برای تونلهای --dev tun تنظیم میشود. این گزینه در کارساز پیش از اجرای اسکریپتهای --client-connect و --client-disconnect تنظیم میشود.
- ifconfig_pool_netmask
- نتماسک (netmask) مجازی IPv4 برای تونل TUN/TAP برگرفته از دستورالعمل --ifconfig-push در صورت تعیین، یا در غیر این صورت از استخر ifconfig (کنترلشده با دستورالعمل پروندهٔ پیکربندی --ifconfig-pool). تنها برای تونلهای --dev tap تنظیم میشود. این گزینه در کارساز پیش از اجرای اسکریپتهای --client-connect و --client-disconnect تنظیم میشود.
- ifconfig_pool_ip6_netbits
- طول پیشوند (prefix length) مجازی IPv6 برای تونل TUN/TAP برگرفته از دستورالعمل --ifconfig-ipv6-push در صورت تعیین، یا در غیر این صورت از استخر ifconfig (کنترلشده با دستورالعمل پروندهٔ پیکربندی --ifconfig-ipv6-pool). تنها برای تونلهای --dev tap تنظیم میشود. این گزینه در کارساز پیش از اجرای اسکریپتهای --client-connect و --client-disconnect تنظیم میشود.
- ifconfig_pool_remote_ip
- نشانی IPv4 مجازی دوردست برای تونل TUN/TAP که در صورت تعیین، از دستورالعمل --ifconfig-push گرفته میشود، وگرنه از استخر ifconfig (کنترلشده توسط دستورالعمل پرونده پیکربندی --ifconfig-pool). این گزینه پیش از اجرای اسکریپتهای --client-connect و --client-disconnect روی کارگزار تنظیم میشود.
- ifconfig_pool_remote_ip6
- نشانی IPv6 مجازی دوردست برای تونل TUN/TAP که در صورت تعیین، از دستورالعمل --ifconfig-ipv6-push گرفته میشود، وگرنه از استخر ifconfig (کنترلشده توسط دستورالعمل پرونده پیکربندی --ifconfig-ipv6-pool). این گزینه پیش از اجرای اسکریپتهای --client-connect و --client-disconnect روی کارگزار تنظیم میشود.
- link_mtu
- REMOVED از OpenVPN 2.6.0 به بعد دیگر به اسکریپتها ارسال نمیشود. پیشتر حداکثر اندازه بسته (بدون احتساب سربرگ IP) دادههای تونل در حالت انتقال تونل UDP بود.
- local
- پارامتر --local. هنگام آغاز برنامه تنظیم شده و با SIGHUP بازنشانی میشود.
- local_port
- شماره یا نام درگاه محلی، مشخصشده توسط --port یا --lport. هنگام آغاز برنامه تنظیم شده و با SIGHUP بازنشانی میشود.
- password
- گذرواژه ارائهشده توسط کارخواه متصلشونده. تنها زمانی که تغییردهنده via-env مشخص شده باشد، پیش از اجرای اسکریپت --auth-user-pass-verify تنظیم شده و پس از بازگشت اسکریپت از محیط حذف میشود.
- peer_cert
- اگر گزینه --tls-export-cert فعال باشد، این گزینه شامل مسیر گواهی همتای فعلی برای اعتبارسنجی در قالب PEM است. همچنین آرگومان certificate_depth را در دستور --tls-verify ببینید.
- proto
- پارامتر --proto. هنگام آغاز برنامه تنظیم شده و با SIGHUP بازنشانی میشود.
- remote_{n}
- پارامتر --remote. هنگام آغاز برنامه تنظیم شده و با SIGHUP بازنشانی میشود.
- remote_port_{n}
- شماره درگاه دوردست، مشخصشده توسط --port یا --rport. هنگام آغاز برنامه تنظیم شده و با SIGHUP بازنشانی میشود.
- route_net_gateway
- درگاه پیشفرض IP موجود از قبل در جدول مسیریابی سیستم. پیش از اجرای اسکریپت --up تنظیم میشود.
- route_vpn_gateway
- درگاه پیشفرض مورد استفاده گزینههای --route، همانطور که در گزینه --route-gateway یا پارامتر دوم --ifconfig هنگام تعیین --dev tun مشخص شده است. پیش از اجرای اسکریپت --up تنظیم میشود.
- route_{parm}_{n}
- مجموعهای
از متغیرها
که هر مسیر
برای
اضافهشدن
را تعریف
کرده و پیش
از اجرای
اسکریپت --up
تنظیم
میشوند.
مقدار parm یکی از موارد network، netmask"، gateway یا metric خواهد بود.
مقدار n شماره مسیر OpenVPN است که از 1 شروع میشود.
اگر شبکه یا درگاه نامهای DNS قابلحل باشند، ترجمه نشانی IP آنها به جای نامهایشان همانطور که در خط فرمان یا پرونده پیکربندی آمده ثبت خواهد شد.
- route_ipv6_{parm}_{n}
- مجموعهای
از متغیرها
که هر مسیر IPv6
برای
اضافهشدن
را تعریف
کرده و پیش
از اجرای
اسکریپت --up
تنظیم
میشوند.
مقدار parm یکی از موارد network، gateway یا metric خواهد بود. برخلاف IPv4 که در یک متغیر محیطی جداگانه ارسال میشود، route_ipv6_network_{n} شامل netmask به صورت /nnn است.
مقدار n شماره مسیر OpenVPN است که از 1 شروع میشود.
اگر شبکه یا درگاه نامهای DNS قابلحل باشند، ترجمه نشانی IP آنها به جای نامهایشان همانطور که در خط فرمان یا پرونده پیکربندی آمده ثبت خواهد شد.
route_redirect_gateway_ipv4
- route_redirect_gateway_ipv6
- اگر درگاه پیشفرض مربوطه باید به داخل تونل هدایت شود روی 1، و اگر قطعه LAN محلی نیز باید مسدود شود (block-local) روی 2 تنظیم میشود. در غیر این صورت تنظیم نمیشود. پیش از اجرای اسکریپت --up تنظیم میشود.
- script_context
- پیش از اجرای اسکریپت up/down روی "init" یا "restart" تنظیم میشود. برای اطلاعات بیشتر، مستندات --up را ببینید.
- script_type
- پیش از اجرای هر اسکریپت، این متغیر روی نوع اسکریپت در حال اجرا تنظیم میشود. میتواند یکی از موارد زیر باشد: up، down، ipchange، route-up، tls-verify، auth-user-pass-verify، client-connect، client-disconnect یا learn-address. پیش از اجرای هر اسکریپت تنظیم میشود.
- signal
- دلیل خروج یا راهاندازی مجدد. میتواند یکی از موارد sigusr1، sighup، sigterm، sigint، inactive (کنترلشده توسط گزینه --inactive)، ping-exit (کنترلشده توسط گزینه --ping-exit)، ping-restart (کنترلشده توسط گزینه --ping-restart)، connection-reset (تحریکشده در بازنشانی اتصال TCP)، error یا unknown (سیگنال نامشخص) باشد. این متغیر دقیقاً پیش از اجرای اسکریپت down تنظیم میشود.
- time_ascii
- برچسب زمانی اتصال کلاینت، قالببندیشده بهصورت یک رشته زمانی خوانا برای انسان. پیش از اجرای اسکریپت --client-connect تنظیم میشود.
- time_duration
- مدت زمان (به ثانیه) نشست کلاینت که اکنون در حال قطع اتصال است. پیش از اجرای اسکریپت --client-disconnect تنظیم میشود.
- time_unix
- برچسب زمانی اتصال کلاینت، قالببندیشده بهصورت مقدار صحیح تاریخ/زمان یونیکس. پیش از اجرای اسکریپت --client-connect تنظیم میشود.
- tls_digest_{n} / tls_digest_sha256_{n}
- شامل اثر انگشت SHA1 / SHA256 گواهی، که در آن n سطح اعتبارسنجی است. فقط برای اتصالهای TLS تنظیم میشود. پیش از اجرای اسکریپت --tls-verify تنظیم میشود.
- tls_id_{n}
- مجموعهای از فیلدهای گواهی از همتای دوردست، که در آن n سطح اعتبارسنجی است. فقط برای اتصالهای TLS تنظیم میشود. پیش از اجرای اسکریپت --tls-verify تنظیم میشود.
- tls_serial_{n}
- شماره سریال گواهی همتای دوردست، که در آن n سطح اعتبارسنجی است. فقط برای اتصالهای TLS تنظیم میشود. پیش از اجرای اسکریپت --tls-verify تنظیم میشود. این مقدار بهصورت یک رشته دهدهی مانند "933971680" است، که برای انجام پرسوجوهای OCSP مبتنی بر سریال مناسب است (در OpenSSL، عبارت "0x" را به ابتدای رشته اضافه نکنید). اگر هنگام خواندن مقدار از گواهی مشکلی پیش بیاید، رشتهای خالی خواهد بود، بنابراین کد شما باید آن را بررسی کند. اسکریپت contrib/OCSP_check/OCSP_check.sh را برای نمونه ببینید.
- tls_serial_hex_{n}
- مانند tls_serial_{n}، اما در قالب هگزادسیمال (مانند 12:34:56:78:9A).
- tun_mtu
- میزان MTU برای دستگاه TUN/TAP. پیش از اجرای اسکریپت --up یا --down تنظیم میشود.
- trusted_ip / trusted_ip6)
- آدرس IP واقعی کلاینت یا همتای متصلشونده که احراز هویت شده است. پیش از اجرای اسکریپتهای --ipchange، --client-connect و --client-disconnect تنظیم میشود. در صورت استفاده از نقاط انتهایی ipv6 (مانند udp6، tcp6)، متغیر trusted_ip6 بهجای آن تنظیم میشود.
- trusted_port
- شماره پورت واقعی کلاینت یا همتای متصلشونده که احراز هویت شده است. پیش از اجرای اسکریپتهای --ipchange، --client-connect و --client-disconnect تنظیم میشود.
- untrusted_ip / untrusted_ip6
- آدرس IP واقعی کلاینت یا همتای متصلشونده که هنوز احراز هویت نشده است. گاهی اوقات برای اجرای nmap روی میزبان متصلشونده در یک اسکریپت --tls-verify استفاده میشود تا از درستی عملکرد فایروال اطمینان حاصل شود. پیش از اجرای اسکریپتهای --tls-verify و --auth-user-pass-verify تنظیم میشود. در صورت استفاده از نقاط انتهایی ipv6 (مانند udp6، tcp6)، متغیر untrusted_ip6 بهجای آن تنظیم میشود.
- untrusted_port
- شماره پورت واقعی کلاینت یا همتای متصلشونده که هنوز احراز هویت نشده است. پیش از اجرای اسکریپتهای --tls-verify و --auth-user-pass-verify تنظیم میشود.
- username
- نام کاربری ارائهشده توسط کلاینت متصلشونده. تنها زمانی پیش از اجرای اسکریپت --auth-user-pass-verify تنظیم میشود که اصلاحکننده via-env مشخص شده باشد.
- X509_{n}_{subject_field}
- یک فیلد
موضوع (subject)
گواهی X509 از
همتای
دوردست، که
در آن n سطح
اعتبارسنجی
است. فقط
برای
اتصالهای
TLS تنظیم
میشود. پیش
از اجرای
اسکریپت
--tls-verify تنظیم
میشود. این
متغیر
مشابه tls_id_{n}
است بهجز
اینکه
فیلدهای
سازنده
موضوع X509
تفکیک
شدهاند، و
هیچ نگاشت
مجددی روی
رشتههای
این فیلدها
اعمال
نمیشود
(بهجز
نگاشت مجدد
نویسههای
کنترلی به
"_"). برای
نمونه،
متغیرهای
زیر روی
سرور OpenVPN با
استفاده از
گواهی
نمونه
کلاینت در
sample-keys (پرونده client.crt)
تنظیم
خواهند شد.
توجه داشته
باشید که
سطح
اعتبارسنجی
برای گواهی
کلاینت 0 و
برای گواهی
CA برابر با 1
است.
میتوانید از گزینه --x509-track برای برونریزی اطلاعات بیشتر یا کمتر از گواهیها استفاده کنید.
X509_0_emailAddress=me@myhost.mydomain X509_0_CN=Test-Client X509_0_O=OpenVPN-TEST X509_0_ST=NA X509_0_C=KG X509_1_emailAddress=me@myhost.mydomain X509_1_O=OpenVPN-TEST X509_1_L=BISHKEK X509_1_ST=NA X509_1_C=KG
گزینههای واسط مدیریت (Management Interface Options)
برنامه OpenVPN یک واسط مدیریتی مبتنی بر سوکت غنی از ویژگی را برای هر دو حالت عملیاتی سرور و کلاینت فراهم میکند.
- --management args
- فعالسازی
سرور
مدیریتی
روی سوکت
یونیکس socket-name
در
پلتفرمهای
پشتیبانیکننده،
یا روی یک
درگاه TCP
مشخصشده.
ساختارهای نحوی معتبر:
management socket-name unix # management socket-name unix pw-file # (recommended) management IP port # (INSECURE) management IP port pw-file #
پارامتر pw-file، در صورت مشخص شدن، پرونده گذرواژهای است که گذرواژه در آن باید در سطر اول باشد. بهجای نام پرونده میتوان از کلیدواژه stdin استفاده کرد که هنگام شروع OpenVPN، گذرواژه مورد نیاز را از کاربر درخواست میکند.
برای سوکتهای یونیکس، رفتار پیشفرض ایجاد یک سوکت دامنه یونیکس است که هر پردازشی میتواند به آن متصل شود. از دستورالعملهای --management-client-user و --management-client-group برای محدود کردن دسترسی استفاده کنید.
واسط مدیریت یک حالت ویژه فراهم میکند که در آن پیوند مدیریتی TCP میتواند روی خود تونل کار کند. برای فعالسازی این حالت، مقدار IP را روی tunnel تنظیم کنید. حالت تونل باعث میشود واسط مدیریت روی آدرس محلی VPN از واسط TUN/TAP به اتصالات TCP گوش فرا دهد.
هنگام فعالسازی واسط مدیریت روی TCP *مراقب باشید*. در این موارد باید همیشه از pw-file جهت محافظت واسط مدیریت با گذرواژه استفاده کنید. هر کاربری که بتواند به این IP:port متصل شود، قادر خواهد بود فرآیند OpenVPN را مدیریت، کنترل (و در آن اختلال ایجاد) کند. همچنین اکیداً توصیه میشود که IP روی 127.0.0.1 (localhost) تنظیم شود تا دسترسی به سرور مدیریت فقط به کلاینتهای محلی محدود گردد.
اگرچه درگاه مدیریت برای کنترل برنامهریزیشده OpenVPN توسط سایر برنامهها طراحی شده است، اما امکان برقراری ارتباط telnet به این درگاه با استفاده از کلاینت telnet در حالت "raw" وجود دارد. پس از اتصال، عبارت help را برای مشاهده فهرست دستورها تایپ کنید.
برای مستندات دقیق درباره واسط مدیریت، پرونده management-notes.txt را در پوشه management از توزیع سورس OpenVPN مشاهده کنید.
- --management-client
- رابط
مدیریت
بهجای گوش
دادن
بهعنوان
یک سرور TCP یا
روی یک سوکت
یونیکسدامین،
بهعنوان
کلاینت TCP/unix domain
به IP:port
مشخصشده
توسط --management
متصل خواهد
شد.
اگر اتصال کلاینت برقرار نشود یا قطع گردد، یک سیگنال SIGTERM تولید شده و باعث خروج OpenVPN میشود.
- --management-client-auth
- مسئولیت احراز هویت کلاینتها پس از تأیید گواهی کلاینت آنها را به کلاینت رابط مدیریت محول میکند. برای یادداشتهای دقیق، management-notes.txt را در بسته توزیع OpenVPN ببینید.
- --management-client-group g
- هنگامی که رابط مدیریت روی یک سوکت یونیکسدامین گوش میدهد، فقط اتصالها از گروه g مجاز خواهند بود.
- --management-client-user u
- هنگامی که رابط مدیریت روی یک سوکت یونیکسدامین گوش میدهد، فقط اتصالها از کاربر u مجاز خواهند بود.
- --management-external-cert certificate-hint
- اجازه استفاده از گواهی خارجی را بهجای گزینه --cert میدهد (فقط کلاینت). آرگومان certificate-hint یک رشته دلخواه است که بهعنوان یک آرگومان از اعلان NEED-CERTIFICATE به کلاینت رابط مدیریت ارسال میشود. به --management-external-key نیاز دارد.
- --management-external-key args
- اجازه
استفاده از
پرونده
کلید خصوصی
خارجی را
بهجای
گزینه --key
میدهد (فقط
کلاینت).
ساختار دستوری مجاز:
management-external-key management-external-key nopadding management-external-key pkcs1 management-external-key pss
یا هر ترکیبی مانند:
management-external-key nopadding pkcs1 management-external-key pkcs1 pss
پارامترهای اختیاری nopadding، pkcs1 و pss پشتیبانی از الگوریتمهای فاصلهگذاری (padding) مختلف را اعلام میکنند. برای توضیحات کامل این ویژگی، doc/mangement-notes.txt را ببینید.
- --management-forget-disconnect
- باعث
میشود
هنگام قطع
نشست
مدیریت، OpenVPN
گذرواژهها
را فراموش
کند.
این دستور روی نامکاربری/گذرواژه --http-proxy تأثیری ندارد. آن همواره ذخیره (cache) میشود.
- --management-hold
- اجرای OpenVPN را در وضعیت تعلیق آغاز میکند، تا زمانی که یک کلاینت رابط مدیریت صراحتاً آن را با دستور hold release فعال کند.
- --management-log-cache n
- تعداد n خط اخیر از تاریخچه پرونده لاگ را برای استفاده توسط کانال مدیریت در حافظه موقت (cache) نگه میدارد.
- --management-query-passwords
- گذرواژه کلید خصوصی و نامکاربری/گذرواژه --auth-user-pass را از کانال مدیریت استعلام میکند. تنها ورودیهایی از کانال مدیریت استعلام میشوند که در حالت عادی از کنسول درخواست میشدند.
- --management-query-proxy
- اطلاعات سرور پروکسی را برای یک --remote مشخص از کانال مدیریت استعلام میکند (فقط کلاینت).
- --management-query-remote
- به رابط مدیریت اجازه بازنویسی (override) دستورهای --remote را میدهد (فقط کلاینت).
- --management-signal
- در صورت قطع نشست مدیریت، سیگنال SIGUSR1 را به OpenVPN ارسال میکند. این مورد زمانی کاربرد دارد که بخواهید هنگام خروج کاربر، نشست OpenVPN قطع شود. برای --management-client نیازی به این گزینه نیست چرا که قطع اتصال همواره یک سیگنال SIGTERM تولید میکند.
- --management-up-down
- رویدادهای بالا/پایین آمدن تونل (up/down) را به رابط مدیریت گزارش میدهد.
گزینههای رابط افزونه (Plug-in)
OpenVPN میتواند با بارگذاری ماژولهای افزونه خارجی در زمان اجرا گسترش یابد. این افزونهها باید از پیش ساخته شده باشند و از OpenVPN Plug-In API پیروی کنند.
- --plugin args
- یک ماژول
افزونه OpenVPN را
بارگذاری
میکند.
ساختار دستوری مجاز:
plugin module-name plugin module-name "arguments"
آرگومان اول باید module-name باشد که افزونه مورد نظر برای بارگذاری را مشخص میکند. آرگومان دوم یک رشته مقداردهی اولیه (init) اختیاری است که مستقیماً به افزونه ارسال میشود. اگر مقداردهی اولیه شامل چندین آرگومان باشد، باید در علامت نقلقول دوتایی (") قرار گیرد. چندین ماژول افزونه میتوانند در یک فرآیند OpenVPN بارگذاری شوند.
آرگومان module-name میتواند صرفاً یک نام پرونده یا نام پرونده همراه با یک مسیر نسبی یا مطلق باشد. قالب نام پرونده و مسیر تعیین میکند که آیا افزونه از پوشه پیشفرض افزونه بارگذاری شود یا خارج از این پوشه.
--plugin path Effective directory used ===================== ============================= myplug.so DEFAULT_DIR/myplug.so subdir/myplug.so DEFAULT_DIR/subdir/myplug.so ./subdir/myplug.so CWD/subdir/myplug.so /usr/lib/my/plug.so /usr/lib/my/plug.so
مقدار DEFAULT_DIR با پوشه پیشفرض افزونه که در زمان ساخت OpenVPN پیکربندی شده، جایگزین میشود. CWD پوشه جاری است که OpenVPN در آن راهاندازی شده یا پوشهای است که OpenVPN از طریق گزینه --cd پیش از گزینه --plugin به آن جابجا شده است.
برای اطلاعات بیشتر و نمونههایی از نحوه ساخت ماژولهای افزونه OpenVPN، پرونده README موجود در پوشه plugin توزیع سورس OpenVPN را ببینید.
اگر از بسته نصبی RPM برای OpenVPN استفاده میکنید، /usr/share/openvpn/plugin را ببینید. مستندات در doc و ماژولهای افزونه اصلی در lib قرار دارند.
چندین ماژول افزونه را میتوان بهصورت آبشاری بهکار برد و ماژولها را میتوان همراه با اسکریپتها استفاده کرد. ماژولها به ترتیبی که در پرونده پیکربندی اعلان شدهاند توسط OpenVPN فراخوانی میشوند. اگر هم یک افزونه و هم یک اسکریپت برای فراخوانی بازگشتی (callback) یکسانی تنظیم شده باشند، اسکریپت در آخر فراخوانی میشود. چنانچه کد بازگشتی ماژول/اسکریپت یک تابع احراز هویت را کنترل کند (مانند tls-verify، auth-user-pass-verify، یا client-connect)، در این صورت تکتک ماژولها و اسکریپتها باید وضعیت موفقیتآمیز (0) را برگردانند تا اتصال احراز هویت شود.
- هشدار:
- افزونهها ممکن است اجرای تعویقی (deferred execution) انجام دهند؛ بدین معنی که افزونه کنترل را به فرآیند اصلی OpenVPN برمیگرداند و نتیجه افزونه را بعداً از طریق یک نخ (thread) یا فرآیند دیگر ارائه میدهد. OpenVPN از چند افزونه احراز هویت در شرایطی که بیش از یک افزونه بخواهد احراز هویت تعویقی انجام دهد، پشتیبانی نمیکند. در صورت شناسایی چنین رفتاری، OpenVPN در اولین احراز هویت متوقف خواهد شد.
گزینههای مختص Windows
این گزینهها در پلتفرمهای غیر Windows ناشناخته در نظر گرفته شده و منجر به خطای مهلک میشوند (به جز --route-method). ممکن است بخواهید از --setenv opt یا --ignore-unknown-option برای نادیده گرفتن این خطا استفاده کنید. توجه داشته باشید که ارسال گزینههای ناشناخته از سمت سرور خطای مهلک ایجاد نمیکند.
- --allow-nonadmin TAP-adapter
- (Standalone) تنظیم TAP-adapter برای مجاز کردن دسترسی از حسابهای غیر مدیر (non-administrative). اگر TAP-adapter حذف شود، تمام آداپتورهای TAP روی سیستم برای اجازه دسترسی غیر مدیر پیکربندی خواهند شد. تنظیم دسترسی غیر مدیر تنها به مدت زمانی که شیء دستگاه و درایور TAP-Win32 بارگذاری شده باقی بمانند پایدار خواهد بود، و پس از راهاندازی مجدد، یا در صورت تخلیه و بارگذاری مجدد درایور، نیاز به فعالسازی مجدد خواهد داشت. این دستورالعمل تنها توسط یک مدیر (administrator) قابل استفاده است.
- --block-outside-dns
- مسدود کردن سرورهای DNS در سایر آداپتورهای شبکه جهت جلوگیری از نشت DNS. این گزینه از دسترسی هر برنامهای به درگاههای TCP یا UDP شماره 53 به جز درگاه داخل تونل جلوگیری میکند. این گزینه از Windows Filtering Platform (WFP) استفاده کرده و در Windows Vista یا جدیدتر کار میکند.
- --cryptoapicert select-string
- (فقط Windows/OpenSSL)
بارگذاری
گواهی و
کلید خصوصی
از Windows Certificate System Store.
از این گزینه به جای --cert و --key استفاده کنید.
این قابلیت استفاده از هر کارت هوشمندی که توسط Windows پشتیبانی میشود، و همچنین هر نوع گواهی موجود در Cert Store که در آن به کلید خصوصی دسترسی دارید را ممکن میسازد. این گزینه با چند کارت هوشمند مختلف (GemSAFE، Cryptoflex، و Swedish Post Office eID) در سمت کلاینت، و همچنین یک گواهی نرمافزاری وارد شده PKCS12 در سمت سرور آزمایش شده است.
برای انتخاب یک گواهی بر اساس جستجوی زیررشته در موضوع (subject) گواهی:
cryptoapicert "SUBJ:Peter Runestig"
برای انتخاب یک گواهی بر اساس اثر انگشت (هش SHA1) گواهی:
cryptoapicert "THUMB:f6 49 24 41 01 b4 ..."
رشته هگزادسیمال اثر انگشت را میتوان به راحتی از رابط گرافیکی Windows Certificate Store رونوشت و جایگذاری کرد. فاصلههای موجود در رشته هگز اختیاری هستند.
برای انتخاب یک گواهی بر اساس زیررشته در نام صادرکننده (issuer) گواهی:
cryptoapicert "ISSUER:Sample CA"
برای انتخاب یک گواهی بر اساس نام الگوی گواهی یا OID الگو:
cryptoapicert "TMPL:Name of Template" cryptoapicert "TMPL:1.3.6.1.4..."
نخستین گواهی منقضینشده یافتشده در مخزن کاربر یا مخزن ماشین که با select-string مطابقت داشته باشد استفاده میشود.
- --dhcp-release
- درخواست از Windows برای آزادسازی اجاره (lease) آداپتور TAP هنگام خاموش شدن. این گزینه اکنون هیچ اثری ندارد، زیرا از OpenVPN 2.4.1 به بعد به طور پیشفرض فعال است.
- --dhcp-renew
- درخواست از Windows برای تمدید اجاره (lease) آداپتور TAP هنگام راهاندازی. این گزینه معمولاً غیرضروری است، زیرا Windows هنگام بالا آمدن آداپتور TAP به طور خودکار مذاکره مجدد DHCP را آغاز میکند، با این حال اگر ویژگی Media Status آداپتور TAP-Win32 را روی "Always Connected" تنظیم کرده باشید، ممکن است به این پرچم نیاز پیدا کنید.
- --ip-win32 method
- هنگام استفاده از --ifconfig در Windows، آدرس IP و ماسک شبکه آداپتور TAP-Win32 را با استفاده از method تنظیم کنید. از این گزینه استفاده نکنید مگر اینکه از --ifconfig نیز استفاده کنید.
- manual
- آدرس IP یا ماسک شبکه را به صورت خودکار تنظیم نکنید. در عوض پیامی را به کنسول ارسال کرده و به کاربر اعلام کنید که آداپتور را به صورت دستی پیکربندی کند و IP/netmask مورد انتظار OpenVPN برای آداپتور را مشخص نمایید.
- dynamic [offset] [lease-time]
- تنظیم خودکار آدرس IP و ماسک شبکه از طریق پاسخ به پیامهای پرسوجوی DHCP تولید شده توسط هسته. این حالت احتمالاً "تمیزترین" راهحل برای تنظیم ویژگیهای TCP/IP است زیرا از پروتکل شناختهشده DHCP استفاده میکند. با این حال، دو پیشنیاز برای استفاده از این حالت وجود دارد:
- 1.
- ویژگیهای TCP/IP برای آداپتور TAP-Win32 باید روی "Obtain an IP address automatically" تنظیم شده باشند، و
- 2.
- برنامه OpenVPN باید یک آدرس IP را در زیرشبکه تصاحب کند تا از آن به عنوان آدرس سرور DHCP مجازی استفاده نماید.
به طور پیشفرض در حالت --dev tap، برنامه OpenVPN نخستین آدرس معمولاً استفادهنشده در زیرشبکه را میگیرد. برای نمونه، اگر زیرشبکه شما 192.168.4.0 netmask 255.255.255.0 باشد، OpenVPN آدرس IP مقدار 192.168.4.0 را به عنوان آدرس سرور DHCP مجازی استفاده خواهد کرد. در حالت --dev tun، برنامه OpenVPN باعث میشود سرور DHCP به گونهای نقابگذاری (masquerade) کند که گویی از نقطه پایانی راه دور میآید.
پارامتر اختیاری offset یک عدد صحیح است که > -256 و < 256 بوده و پیشفرض آن 0 است. اگر offset مثبت باشد، سرور DHCP به عنوان آدرس IP در آدرس شبکه + offset نقابگذاری خواهد کرد. اگر offset منفی باشد، سرور DHCP به عنوان آدرس IP در آدرس پخش همگانی (broadcast) + offset نقابگذاری میکند.
دستور ipconfig /all در Windows میتواند برای نمایش آدرسی که Windows به عنوان سرور DHCP در نظر میگیرد استفاده شود. برنامه OpenVPN این آدرس را "تصاحب" خواهد کرد، بنابراین اطمینان حاصل کنید که از یک آدرس آزاد استفاده میکنید. با این وجود، نمونههای مختلف OpenVPN، از جمله سرانجامهای مختلف یک اتصال یکسان، میتوانند یک آدرس سرور DHCP مجازی مشترک داشته باشند.
پارامتر lease-time مدت زمان اجاره انتساب DHCP دادهشده به آداپتور TAP-Win32 را کنترل میکند و بر حسب ثانیه مشخص میشود. معمولاً یک زمان اجاره بسیار طولانی ترجیح داده میشود زیرا از بین رفتن مسیرهای مرتبط با آداپتور TAP-Win32 هنگام به خواب رفتن سیستم (sleep) جلوگیری میکند. مدت زمان پیشفرض اجاره یک سال است.
- netsh
- تنظیم خودکار آدرس IP و ماسک شبکه با استفاده از دستور خط فرمان "netsh" در Windows. به نظر میرسد این روش در Windows XP به درستی کار میکند اما در Windows 2000 خیر.
- ipapi
- تنظیم خودکار آدرس IP و ماسک شبکه با استفاده از Windows IP Helper API. این رویکرد معناشناسی (semantics) ایدهآلی ندارد، اگرچه آزمایشها نشان داده است که در عمل به خوبی کار میکند. اگر از این گزینه استفاده میکنید، بهتر است ویژگیهای TCP/IP آداپتور TAP-Win32 را در حالت پیشفرض خود، یعنی "Obtain an IP address automatically." رها کنید.
- adaptive (پیشفرض)
- در ابتدا
روش dynamic را
امتحان
کنید و در
صورتی که
مذاکره DHCP با
آداپتور TAP-Win32
در مدت 20
ثانیه
موفقیتآمیز
نبود، به netsh
جابهجا
شوید (fail over).
اینگونه
خرابیها
زمانی رخ
میدهند که
برخی
بستههای
فایروال
شخص ثالث
نصب شده روی
دستگاه
کلاینت،
مذاکره DHCP
مورد
استفاده
آداپتور TAP-Win32
را مسدود
کنند. توجه
داشته
باشید که در
صورت وقوع
جابهجایی
اضطراری (failover)
به netsh،
ویژگیهای
TCP/IP آداپتور TAP-Win32
از DHCP به
ایستا (static)
بازنشانی
خواهند شد،
و این امر
باعث
میشود که
راهاندازیهای
بعدی OpenVPN با
استفاده از
حالت adaptive
فوراً از netsh
استفاده
کنند، به
جای اینکه
ابتدا dynamic را
امتحان
نمایند.
برای "رها کردن" حالت adaptive از استفاده از netsh، برنامه OpenVPN را حداقل یک بار با استفاده از حالت dynamic اجرا کنید تا ویژگیهای TCP/IP آداپتور TAP-Win32 به پیکربندی DHCP بازگردانده شود.
- --pause-exit
- نمایش پیام "press any key to continue" روی کنسول پیش از خروج برنامه OpenVPN. این گزینه هنگام اجرای OpenVPN روی یک پرونده پیکربندی از طریق منوی راستکلیک، بهطور خودکار توسط Windows Explorer استفاده میشود.
- --register-dns
- اجرای ipconfig /flushdns و ipconfig /registerdns هنگام آغاز اتصال. این کار برای واداشتن ویندوز به شناسایی سرورهای DNS ارسالشده شناخته شده است.
- --route-method m
- کدام روش m برای افزودن مسیرها در ویندوز استفاده شود؟
- adaptive (پیشفرض)
- ابتدا IP helper API را امتحان کن. در صورت شکست، به دستور شل route.exe بازگرد.
- ipapi
- استفاده از IP helper API.
- exe
- فراخوانی دستور شل route.exe.
- --service args
- باید زمانی
استفاده
شود که OpenVPN
بهطور
خودکار
توسط
برنامه
دیگری در
شرایطی
اجرا
میشود که
هیچ تعاملی
با کاربر از
طریق
نمایشگر یا
صفحهکلید
امکانپذیر
نیست.
نحو معتبر:
service exit-event [0|1]
بهطور کلی، کاربران نهایی هرگز نباید نیاز به استفاده صریح از این گزینه داشته باشند، زیرا هنگام اجرای یک پیکربندی مشخص OpenVPN به عنوان یک سرویس، این گزینه بهطور خودکار توسط راهانداز سرویس OpenVPN افزوده میشود.
exit-event نام یک شیء رویداد سراسری ویندوز است، و OpenVPN بهطور مداوم وضعیت این شیء رویداد را نظارت کرده و هنگامی که سیگنالدهی شود، خارج میشود.
پارامتر دوم وضعیت اولیه exit-event را مشخص میکند و بهطور معمول پیشفرض آن 0 است.
چندین فرایند OpenVPN میتوانند بهطور همزمان با همان پارامتر exit-event اجرا شوند. در هر صورت، فرایند کنترلکننده میتواند به exit-event سیگنال دهد و باعث خروج تمام آن فرایندهای OpenVPN شود.
هنگام اجرای یک فرایند OpenVPN با استفاده از دستورالعمل --service، احتمالاً OpenVPN پنجره کنسولی برای خروجی دادن پیامهای وضعیت/خطا نخواهد داشت، بنابراین استفاده از --log یا --log-append برای نوشتن این پیامها در یک پرونده مفید است.
- --show-adapters
- (مستقل) نمایش آداپتورهای TAP-Win32 موجود که میتوان با استفاده از گزینه --dev-node انتخاب کرد. در سیستمهای غیرویندوزی، دستور ifconfig(8) قابلیت مشابهی ارائه میدهد.
- --show-net
- (مستقل) نمایش دیدگاه OpenVPN از جدول مسیریابی سیستم و فهرست آداپتورهای شبکه.
- --show-net-up
- خروجی دادن دیدگاه OpenVPN از جدول مسیریابی سیستم و فهرست آداپتورهای شبکه به syslog یا پرونده گزارش، پس از بالا آمدن آداپتور TUN/TAP و اضافه شدن هرگونه مسیر.
- --show-valid-subnets
- (مستقل)
نمایش
زیرشبکههای
معتبر برای
شبیهسازی
--dev tun. از آنجا
که درایور
TAP-Win32 یک رابط
اترنت را به
ویندوز
صادر
میکند، و
از آنجا که
دستگاههای
TUN ماهیت
نقطهبهنقطه
دارند،
لازم است
درایور TAP-Win32
محدودیتهای
خاصی را بر
انتخاب
آدرس نقطه
پایانی TUN
اعمال کند.
به این صورت که، نقاط پایانی نقطهبهنقطه استفادهشده در شبیهسازی دستگاه TUN باید دو آدرس میانی یک زیرشبکه /30 (با netmask 255.255.255.252) باشند.
- --tap-sleep n
- باعث
میشود OpenVPN
بلافاصله
پس از تنظیم
وضعیت
آداپتور TAP-Win32
روی "connected" به
مدت n ثانیه
بخوابد.
این گزینه برای عیبیابی مشکلات گزینههای --ifconfig و --ip-win32 در نظر گرفته شده است، و برای دادن زمان به آداپتور TAP-Win32 جهت آمادهسازی پیش از اعمال عملیاتهای Windows IP Helper API روی آن استفاده میشود.
- --win-sys path
- تنظیم مسیر
دایرکتوری
سیستم
ویندوز جهت
استفاده
برای یافتن
برنامههای
اجرایی
سیستم
مانند route.exe و
netsh.exe. بهطور
پیشفرض،
اگر این
دستورالعمل
مشخص نشود،
OpenVPN از متغیر
محیطی SystemRoot
استفاده
خواهد کرد.
رفتار این گزینه از OpenVPN 2.3 تغییر کرده است. پیشتر باید --win-sys env را برای استفاده از متغیر محیطی SystemRoot تعریف میکردید، در غیر این صورت پیشفرض آن C:\\WINDOWS بود. دیگر نیازی به استفاده از کلیدواژه env نیست و نادیده گرفته خواهد شد. در صورت یافتن آن در پرونده پیکربندی، هشداری ثبت میشود.
گزینههای اشکالزدایی مستقل
- --show-gateway args
- (مستقل)
نمایش
دروازه
پیشفرض
فعلی IPv4 و IPv6 و
رابط متصل
به دروازه
(در صورتی
که پروتکل
مربوطه
فعال باشد).
نحو معتبر:
--show-gateway --show-gateway IPv4-target --show-gateway IPv6-target
برای IPv4 به دنبال مسیر 0.0.0.0/0، یا آدرس مشخصشده IPv4 در صورت تجزیهپذیر بودن مقصد به عنوان آدرس IPv4 میگردد. برای IPv6 مسیر متصل به ::/128، یا آدرس مقصد مشخصشده IPv6 در صورت بودن آرگومان به عنوان یک آدرس IPv6 را بررسی میکند.
افزودن یک مقصد برای عیبیابی مفید است تا مشخص شود در صورت وجود مسیرهای خاصتر IPv4/IPv6 به یک سرور VPN، آیا OpenVPN عملکرد صحیحی دارد یا خیر.
گزینههای پیشرفته تخصصی
اینها گزینههایی هستند که تنها در صورت نیاز به تنظیمات خاص الزامی میشوند، و اغلب هنگام اشکالزدایی یا آزمایش سناریوهای کاربردی خاص استفاده میشوند.
- --hash-size args
- اندازه
جدول
درهمسازی
نشانی
واقعی را
روی r و
جدول نشانی
مجازی را
روی v تنظیم
میکند.
نحو معتبر:
hash-size r v
بهطور پیشفرض، اندازه هر دو جدول ۴ برابر باکتهای --max-clients است. با مقدار پیشفرض ۱۰۲۴ برای --max-clients، این مقدار ۴۰۹۶ باکت میشود.
- --bcast-buffers n
- تخصیص n بافر برای دیتاگرامهای همگانی (پیشفرض 256).
- --persist-local-ip
- حفظ نشانی IP محلی و شماره درگاه حلشده اولیه در بازراهاندازیهای SIGUSR1 یا --ping-restart.
- --persist-remote-ip
- حفظ آخرین نشانی IP دوردست و شماره درگاه احراز هویت شده در بازراهاندازیهای SIGUSR1 یا --ping-restart.
- --rcvbuf size
- تنظیم اندازه بافر دریافت سوکت TCP/UDP. مقدار پیشفرض آن به پیشفرض سیستمعامل برمیگردد.
- --shaper n
- محدود کردن
پهنای باند
دادههای
خروجی تونل
به n بایت
در ثانیه
روی درگاه TCP/UDP.
توجه داشته
باشید که
این گزینه
فقط در
صورتی کار
میکند که
حالت روی p2p
تنظیم شده
باشد. اگر
میخواهید
پهنای باند
را در هر دو
جهت محدود
کنید، از
این گزینه
در هر دو
همتا
استفاده
کنید.
برنامه OpenVPN برای پیادهسازی شکلدهی ترافیک از الگوریتم زیر استفاده میکند: با در نظر گرفتن نرخ شکلدهنده به اندازه n بایت در ثانیه، پس از صفبندی یک نوشتن دیتاگرام به اندازه b بایت روی درگاه TCP/UDP، حداقل (b / n) ثانیه قبل از صفبندی نوشتن بعدی صبر کنید.
باید توجه داشت که OpenVPN از چندین تونل بین دو همتای یکسان پشتیبانی میکند و به شما امکان میدهد تونلهای سرعت کامل و پهنای باند کاهشیافته را همزمان بسازید و دادههای با اولویت پایین مانند پشتیبانگیریهای خارج از محل را از طریق تونل با پهنای باند کاهشیافته و سایر دادهها را از طریق تونل سرعت کامل مسیریابی کنید.
همچنین توجه داشته باشید که برای تونلهای با پهنای باند کم (زیر ۱۰۰۰ بایت در ثانیه)، احتمالاً باید از مقادیر کمتر MTU نیز استفاده کنید (به بالا مراجعه کنید)، در غیر این صورت تاخیر بستهها آنقدر زیاد میشود که باعث اتمام مهلت زمانی در لایه TLS و اتصالات TCP در حال اجرا بر روی تونل خواهد شد.
برنامه OpenVPN اجازه میدهد n بین ۱۰۰ بایت/ثانیه و ۱۰۰ مگابایت/ثانیه باشد.
- --sndbuf size
- تنظیم اندازه بافر ارسال سوکت TCP/UDP. مقدار پیشفرض آن به پیشفرض سیستمعامل برمیگردد.
- --tcp-queue-limit n
- حداکثر
تعداد
بستههای
خروجی
صفبندیشده
قبل از TCP
(پیشفرض 64).
هنگامی که OpenVPN در حال تونلزنی دادهها از یک دستگاه TUN/TAP به یک کلاینت دوردست از طریق اتصال TCP است، ممکن است دستگاه TUN/TAP دادهها را با سرعتی بیشتر از آنچه اتصال TCP میتواند پشتیبانی کند تولید کند. هنگامی که تعداد بستههای خروجی صفبندیشده قبل از ارسال به سوکت TCP برای یک اتصال کلاینت مشخص به این حد برسد، OpenVPN شروع به دور انداختن بستههای خروجی هدایتشده به این کلاینت میکند.
- --txqueuelen n
- (فقط لینوکس) تنظیم طول صف TX روی رابط TUN/TAP. در حال حاضر مقدار پیشفرض آن به پیشفرض سیستمعامل برمیگردد.
- --disable-dco
- استفاده
فرصتطلبانه
از
برونسپاری
کانال داده
(DCO) را در صورت
در دسترس
بودن
غیرفعال
میکند.
بدون این
گزینه، اگر
گزینههای
پیکربندی و
هسته در حال
اجرا از DCO
پشتیبانی
کنند، OpenVPN
بهطور
فرصتطلبانه
از حالت DCO
استفاده
خواهد کرد.
برونسپاری کانال داده در حال حاضر نیازمند این است که data-ciphers فقط شامل رمزهای AEAD (یعنی AES-GCM و Chacha20-Poly1305) باشد و لینوکس همراه با ماژول ovpn اجرا شود. ماژول ovpn از نسخه ۶.۱۶ در هسته لینوکس ادغام شده است یا بهصورت backport از https://github.com/OpenVPN/ovpn-backports در دسترس است.
توجه داشته باشید که هنگام فعال بودن حالت DCO، برخی گزینهها بیاثر هستند یا قابل استفاده نیستند.
روی پلتفرمهایی که از DCO پشتیبانی نمیکنند، disable-dco اثری ندارد.
گزینههای پشتیبانینشده (UNSUPPORTED OPTIONS)
گزینههای فهرستشده در این بخش از OpenVPN حذف شدهاند و دیگر پشتیبانی نمیشوند
- --client-cert-not-required
- در OpenVPN 2.5 حذف شده است. این گزینه باید با --verify-client-cert none جایگزین شود.
- --fast-io
- از OpenVPN 2.7 نادیده گرفته میشود. این گزینه به دلیل تغییرات در حلقه رویداد از کار افتاد.
- --http-proxy-retry
- در OpenVPN 2.4 حذف شده است. تمام تلاشهای مجدد توسط --max-connect-retry کنترل میشوند.
- --http-proxy-timeout
- در OpenVPN 2.4 حذف شده است. مهلت زمانی اتصال توسط --connect-timeout کنترل میشود.
- --ifconfig-pool-linear
- در OpenVPN 2.5 حذف شده است. این گزینه باید با --topology p2p جایگزین شود.
- --key-method
- در OpenVPN 2.5 حذف شده است. این گزینه نباید استفاده شود، زیرا استفاده از key-method قدیمی، امنیت تونل VPN را تضعیف میکند. همچنین key-method قدیمی تنها زمانی مورد نیاز بود که طرف دوردست قدیمیتر از OpenVPN 2.0 بود.
- --management-client-pf
- در OpenVPN 2.6 حذف شد. قابلیت درونساخت فیلترسازی بستهها (pf) حذف شده است.
- --max-routes
- در OpenVPN 2.4 حذف شد. این محدودیت برداشته شد.
- --ncp-disable
- در OpenVPN 2.6 حذف شد. این گزینه بیشتر نقش یک گزینه اشکالزدایی را در زمان معرفی اولیه NCP ایفا میکرد. دیگر نباید نیازی به آن باشد.
- --no-iv
- در OpenVPN 2.5 حذف شد. این گزینه نباید استفاده شود زیرا امنیت تونل VPN را تضعیف میکند. این گزینه از OpenVPN 2.4 به عنوان NOOP (بیاثر) بوده است.
- --no-replay
- در OpenVPN 2.7 حذف شد. این گزینه نباید استفاده شود زیرا امنیت تونل VPN را تضعیف میکند. پیشتر ادعا شده بود که این گزینه در OpenVPN 2.5 حذف شده است، اما در عمل چنین نبود.
- --prng
- در OpenVPN 2.6 حذف شد. اکنون همیشه از PRNG کتابخانه SSL استفاده میشود.
- --persist-key
- از OpenVPN 2.7 نادیده گرفته میشود. کلیدها اکنون همیشه پس از راهاندازیهای مجدد حفظ میشوند.
- --opt-verify
- در OpenVPN 2.7 حذف شد. این گزینه دیگر کاربردی ندارد زیرا ممکن است رشتههای گزینهها به دلیل معرفی مذاکره پارامترها مطابقت نداشته باشند.
- --socks-proxy-retry
- در OpenVPN 2.4 حذف شد. تمام تلاشهای مجدد توسط --max-connect-retry کنترل میشوند.
- --windows-driver
- در OpenVPN 2.7 حذف شد. OpenVPN همیشه از ovpn-dco به عنوان درایور پیشفرض در Windows استفاده خواهد کرد. در صورت استفاده از گزینههای ناسازگار با ovpn-dco، به tap-windows6 بازمیگردد.
پروفایلهای اتصال (CONNECTION PROFILES)
پروندههای پیکربندی کلاینت ممکن است شامل چندین سرور راه دور باشند که برای اتصال به آنها تلاش خواهد شد. اما برخی گزینههای پیکربندی وجود دارند که به گزینههای --remote خاصی مرتبط هستند. برای این موارد استفاده، پروفایلهای اتصال راهکار هستند.
با کپسولهسازی گزینه --remote و گزینههای مرتبط درون <connection> و </connection>، این گزینهها به صورت یک گروه مدیریت میشوند.
یک کلاینت OpenVPN هر پروفایل اتصال را به ترتیب امتحان میکند تا به یک اتصال موفق دست یابد.
از --remote-random میتوان برای "درهمریزی" اولیه فهرست اتصالات استفاده کرد.
در اینجا نمونهای از کاربرد پروفایل اتصال آمده است:
client dev tun <connection> remote 198.19.34.56 1194 udp </connection> <connection> remote 198.19.34.56 443 tcp </connection> <connection> remote 198.19.34.56 443 tcp http-proxy 192.168.0.8 8080 </connection> <connection> remote 198.19.36.99 443 tcp http-proxy 192.168.0.8 8080 </connection> persist-tun pkcs12 client.p12 remote-cert-tls server verb 3
ابتدا تلاش میکنیم با استفاده از UDP به سروری در 198.19.34.56:1194 متصل شویم. اگر ناموفق بود، سپس سعی میکنیم با TCP به 198.19.34.56:443 متصل شویم. اگر آن هم ناموفق بود، اتصال از طریق یک پراکسی HTTP در 192.168.0.8:8080 به 198.19.34.56:443 با استفاده از TCP امتحان میشود. در نهایت، تلاش برای اتصال از طریق همان پراکسی به سروری در 198.19.36.99:443 با استفاده از TCP انجام میگیرد.
گزینههای زیر از OpenVPN را میتوان درون یک بلوک <connection> استفاده کرد:
bind، connect-retry، connect-retry-max، connect-timeout، explicit-exit-notify، float، fragment، http-proxy، http-proxy-option، key-direction، link-mtu، local، lport، mssfix، mtu-disc، nobind، port، proto، remote، rport، socks-proxy، tls-auth، tls-crypt، tls-crypt-v2، tun-mtu و tun-mtu-extra.
یک سازوکار پیشفرضگذاری برای تعیین گزینههایی که باید روی تمام پروفایلهای <connection> اعمال شوند وجود دارد. اگر هر یک از گزینههای بالا (به استثنای remote) خارج از یک بلوک <connection>، اما در پرونده پیکربندیای قرار گیرند که دارای یک یا چند بلوک <connection> است، تنظیمات آن گزینه به عنوان پیشفرض برای بلوکهای <connection> که پس از آن در پرونده پیکربندی میآیند، استفاده خواهد شد.
برای نمونه، فرض کنید گزینه nobind در پرونده پیکربندی نمونه بالا، نزدیک بالای پرونده، قبل از اولین بلوک <connection> قرار داده شود. نتیجه به این صورت خواهد بود که گویی nobind در تمام بلوکهای <connection> پس از آن اعلان شده است.
پشتیبانی از پروندههای درونخطی (INLINE FILE SUPPORT)
نرمافزار OpenVPN امکان گنجاندن پروندهها را در پیکربندی اصلی برای گزینههای --ca، --cert، --dh، --extra-certs، --key، --pkcs12، --crl-verify، --http-proxy-user-pass، --tls-auth، --auth-gen-token-secret، --peer-fingerprint، --tls-crypt، --tls-crypt-v2، --verify-hash و --auth-user-pass فراهم میکند.
هر پرونده درونخطی با خط <option> شروع شده و با خط </option> پایان مییابد.
در اینجا نمونهای از کاربرد پرونده درونخطی آورده شده است:
<cert> -----BEGIN CERTIFICATE----- [...] -----END CERTIFICATE----- </cert>
هنگام استفاده از قابلیت پرونده درونخطی با گزینه --pkcs12، پرونده درونخطی باید با base64 کدگذاری شده باشد. کدگذاری یک پرونده .p12 به base64 میتواند برای نمونه با OpenSSL از طریق اجرای فرمان openssl base64 -in input.p12 انجام شود.
سیگنالها (SIGNALS)
- SIGHUP
- باعث میشود OpenVPN تمام اتصالات TUN/TAP و شبکه را ببندد، دوباره راهاندازی شود، پرونده پیکربندی (در صورت وجود) را مجدداً بخواند، و اتصالات TUN/TAP و شبکه را دوباره باز کند.
- SIGUSR1
- مانند SIGHUP
عمل
میکند، به
جز اینکه
پرونده
پیکربندی
را دوباره
نمیخواند،
و احتمالاً
بر اساس
گزینههای
--persist-tun، --persist-local-ip و
--persist-remote-ip (به
بالا
مراجعه
کنید)، به
ترتیب
دستگاه TUN/TAP را
نمیبندد و
باز
نمیکند،
پروندههای
کلید را
دوباره
نمیخواند،
نشانی
IP/درگاه
محلی را حفظ
میکند، یا
نشانی
IP/درگاه
دوردستِ
اخیراً
احراز هویت
شده را نگه
میدارد.
این سیگنال همچنین میتواند به صورت داخلی توسط یک وضعیت انقضای زمان (timeout) که توسط گزینه --ping-restart کنترل میشود، ایجاد شود.
این سیگنال هنگام ترکیب با --persist-remote-ip، ممکن است زمانی ارسال شود که پارامترهای زیرین رابط شبکه میزبان تغییر کنند؛ مانند زمانی که میزبان یک کلاینت DHCP است و یک نشانی IP جدید دریافت میکند. برای اطلاعات بیشتر --ipchange را ببینید.
- SIGUSR2
- باعث میشود OpenVPN آمار فعلی خود را نمایش دهد (در صورت استفاده از --daemon در پرونده syslog، و در غیر این صورت در stdout).
- SIGINT, SIGTERM
- باعث خروج تمیز (gracefully) OpenVPN میشود.
پرسشهای متداول (FAQ)
راهنما (HOWTO)
صفحه راهنمای openvpn-examples(5) نمونههایی را بهویژه برای راهاندازیهای کوچک ارائه میدهد.
برای یک راهنمای جامعتر جهت راهاندازی OpenVPN در یک محیط عملیاتی، راهنمای HOWTO اوپنویپیان را در نشانی زیر ببینید: https://openvpn.net/community-resources/how-to
پروتکل (PROTOCOL)
تلاشی مداوم برای مستندسازی پروتکل OpenVPN را میتوان در نشانی زیر یافت: https://github.com/openvpn/openvpn-rfc
وب (WEB)
وبسایت OpenVPN در https://community.openvpn.net قرار دارد.
برای بارگیری آخرین نسخه OpenVPN، عضویت در فهرستهای پستی، خواندن آرشیو فهرستهای پستی، یا مرور مخزن Git به اینجا مراجعه کنید.
اشکالات (BUGS)
همه اشکالات را به تیم OpenVPN گزارش دهید: <info@openvpn.net>
همچنین ببینید (SEE ALSO)
openvpn-examples(5), dhcpcd(8), ifconfig(8), openssl(1), route(8), scp(1) ssh(1)
نکات (NOTES)
این محصول شامل نرمافزاری است که توسط پروژه OpenSSL توسعه یافته است (https://www.openssl.org)
برای اطلاعات بیشتر درباره پروتکل TLS ببینید: https://tools.ietf.org/html/rfc2246
برای اطلاعات بیشتر درباره کتابخانه فشردهسازی بیدرنگ LZO ببینید: https://www.oberhumer.com/opensource/lzo
حق نشر (COPYRIGHT)
حق نشر (C) ۲۰۰۲-۲۰۲۵ OpenVPN Inc. این برنامه یک نرمافزار آزاد است؛ شما میتوانید آن را تحت شرایط مجوز عمومی همگانی گنو (GNU GPL) نسخه ۲ که توسط بنیاد نرمافزارهای آزاد منتشر شده، بازتوزیع کنید و/یا تغییر دهید.
نویسندگان (AUTHORS)
James Yonan <james@openvpn.net>