یک دیمن VPN به عملیات شبکه‌ای ممتاز نیاز دارد، حتی وقتی برنامه‌های معمولی سوکت‌های خروجی را بدون هیچ امتیازی باز می‌کنند. همین شکاف جایی است که بیشتر خطاهای قابلیت آغاز می‌شود: کسی خطای مجوز می‌بیند، کل مجموعه را می‌دهد و سرویس به دلایلی کار می‌کند که بعداً هیچ‌کس نمی‌تواند توضیح دهد. مسیر زیر از عملیاتی که شکست خورده شروع می‌شود، آن را به یک اختیار نسبت می‌دهد و سپس زمینه‌ای را که فرآیند واقعاً در آن اجرا می‌شود بررسی می‌کند. اجرا به‌عنوان root نامحدود برای برخی استقرارها پاسخ معتبری است، اما باید یک تصمیم باشد نه یک پیش‌فرض.

از عملیاتی که شکست خورده شروع کنید

پیش از خواندن هر آموزشی، خطا را بخوانید. «عملیات مجاز نیست» هنگام تغییر یک رابط، امتناع از باز کردن گره دستگاه و شکست bind روی یک پورت پایین، سه مسئله متفاوت با سه مجوز متفاوت هستند. اگر فرآیند شروع شود و فقط در نخستین تغییر مسیر شکست بخورد، این هم می‌گوید که ساخت رابط پیش‌تر موفق شده است، که پاسخ را به‌طور چشمگیری باریک می‌کند.

خطا را با سرویس متوقف‌شده بازتولید کنید، سپس اگر پیاده‌سازی اجازه می‌دهد آن را زیر همان کاربر در پیش‌زمینه اجرا کنید. خطایی که می‌بینید بهتر از خطی از گزارش است که باید حدس بزنید، و تفاوت میان مسئله قابلیت و رد شدن توسط SELinux یا AppArmor را آشکار می‌کند.

هر عملیات را به یک اختیار نسبت دهید

جدول یک نقشه آغازین است، نه جایگزین مستندات پیاده‌سازی:

OperationUsual authorityWatch for
Create or configure tun/tapCAP_NET_ADMIN in the relevant namespaceCreating the device and opening it are separate steps
Add routes, rules, firewall entriesCAP_NET_ADMINSame capability, different namespace than you think
Open /dev/net/tunDevice permissions, not a capabilityGroup membership or a udev rule may be enough
Raw socketsCAP_NET_RAWNeeded by some user-space tunnel implementations
Bind a port below 1024CAP_NET_BIND_SERVICEIrrelevant for most modern tunnel ports

دو ردیف آن جدول همان‌هایی هستند که مردم با هم اشتباه می‌گیرند. باز کردن /dev/net/tun پرسشی درباره مجوز فایل است؛ درخواست از هسته برای پیکربندی چیزی که باز کرده‌اید پرسشی درباره قابلیت است. دادن CAP_NET_ADMIN گره دستگاهی را که کاربر سرویس شما نمی‌تواند بخواند درست نمی‌کند، و درست کردن گره به شما اختیار مسیر نمی‌دهد. پیش از تغییر هر یک از این دو، هر دو را بررسی کنید.

WireGuard هسته و برنامه‌های تونل فضای کاربر هم نیازهای یکسانی ندارند. مسیر پیمانه هسته یک رابط موجود را از طریق netlink پیکربندی می‌کند، در حالی که پیاده‌سازی فضای کاربر ممکن است به دستگاه و برای برخی ترابری‌ها به سوکت‌های خام هم نیاز داشته باشد.

زمینه را بخوانید: سرویس، کانتینر یا شل

یک قابلیت در فضای نام شبکه میزبان می‌تواند بسیار بیشتر از همان عملیات در یک پشته عمداً جداافتاده اثر بگذارد. محیط اجرای کانتینر معمولاً با مجموعه مرزی کاهش‌یافته آغاز می‌شود؛ افزودن NET_ADMIN به کانتینری که شبکه میزبان را به اشتراک می‌گذارد مجوزی بسیار بزرگ‌تر از افزودن آن به کانتینری با فضای نام شبکه خودش و بدون سوارکردن‌های میزبان است.

برای واحدهای systemd آنچه واقعاً اعمال می‌شود را بخوانید، نه آنچه فایل واحد به نظر می‌رسد بگوید: systemctl show -p CapabilityBoundingSet -p AmbientCapabilities مقادیر مؤثر را گزارش می‌کند که ممکن است توسط یک drop-in فراموش‌شده تنظیم شده باشند. مقدار مؤثر را بخواهید، هرگز مقدار موردنظر را. قابلیت‌های ambient اهمیت دارند چون سرویس غیر-root بدون آن‌ها در گذر از exec قابلیت‌ها را از دست می‌دهد.

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

ببینید پس از افت امتیازها چه رخ می‌دهد

بسیاری از دیمن‌ها ممتاز آغاز می‌شوند، رابط را پیکربندی می‌کنند، سپس به کاربری بدون امتیاز پایین می‌آیند و تونل را نگه می‌دارند. از آن نقطه فرآیند دیگر نمی‌تواند مسیری بیفزاید، قاعده فایروال را بازنویسی کند یا دستگاه ممتاز تازه‌ای باز کند، که تا زمانی خوب است که اتصال دوباره دقیقاً همین را بخواهد. خواندن فایل‌ها و اجرای hook در ادامه ممکن است به همین دلیل شکست بخورد.

کل چرخه عمر را بیازمایید نه ثانیه نخست را: راه‌اندازی، تمدید یا اتصال دوباره و پاک‌سازی هنگام توقف. نخستین ساخت موفق رابط ثابت نمی‌کند که هر عملیات ممتاز بعدی همچنان کار می‌کند، و شکست معمولاً ساعت‌ها بعد در محیط عملیاتی پدیدار می‌شود.

پیاده‌سازی‌هایی که تونل را در گذر از تغییر کاربر باز نگه می‌دارند، معمولاً آن را با گزینه‌هایی برای پایدار نگه داشتن تونل و کلیدها همراه می‌کنند. در سمت systemd، پرسش هم‌ارز این است که آیا مجموعه قابلیت واحد از تغییر کاربری که پیکربندی کرده‌اید جان سالم به در می‌برد.

مجوز و دلیل آن را ثبت کنید

مجوز دقیق، عملیاتی که ممکن می‌سازد و خطایی که برطرف کرده را بنویسید. یک خط در یادداشت‌های استقرار — «CAP_NET_ADMIN در فضای نام شبکه واحد، لازم برای تغییرات مسیر پس از اتصال دوباره» — کافی است تا نفر بعد مجوز را دوباره گسترش ندهد.

سپس پس از هر ارتقا مجموعه مؤثر را دوباره بخوانید. فروشندگان ویژگی می‌افزایند، تصویرها پیش‌فرض‌ها را تغییر می‌دهند و قابلیتی که سال پیش لازم نبود می‌تواند بی‌آنکه کسی متوجه شود باربر شود.

مقالات مرتبط