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

معماری‌های سنتی در کانال ارتباطی میان فضای کاربری (userspace) و فضای هسته (kernel) دچار گلوگاه‌های کارایی شدیدی می‌شدند. در گذشته، درایورهای شبکه به فراخوان‌های سیستمی سفارشی ioctl یا فایل‌سیستم‌های مجازی نظیر sysfs و procfs اتکا داشتند. این سازوکارها ضعف‌های بنیادینی داشتند: فراخوان ioctl وابسته به ساختارهای ثابت زبان C بود که در معرض خطای سرریز بافر قرار داشتند؛ از سوی دیگر sysfs پردازنده را درگیر تبدیل مکرر رشته‌های متنی می‌کرد و با ایجاد قفل‌های سراسری در هسته، مسیر انتقال بسته‌ها را با تاخیر مواجه می‌ساخت.

وایرگارد با ادغام عمیق در زیرسیستم جنریک نت‌لینک (genetlink) هسته لینوکس این موانع را برطرف نموده است. این رابط در پرونده drivers/net/wireguard/netlink.c پیاده‌سازی شده و به برنامه‌های مدیریتی اجازه می‌دهد اطلاعات همتایان را به صورت اتمیک، همزمان و بدون کوچک‌ترین وقفه در جریان عبور داده‌ها استعلام و بازپیکربندی کنند.

معماری IPC: ادغام با زیرسیستم جنریک نت‌لینک

زیرسیستم جنریک نت‌لینک به منزله یک گذرگاه چندمنظوره بر بستر سوکت‌های استاندارد BSD به شمار می‌رود (AF_NETLINK). در زمان بارگذاری ماژول در هسته، وایرگارد خانواده پروتکلی اختصاصی خود را ثبت می‌کند:

static struct genl_family genl_family __ro_after_init = {
    .name = WG_GENL_NAME,          /* "wireguard" */
    .version = WG_GENL_VERSION,    /* 1 */
    .maxattr = WGDEVICE_A_MAX,
    .module = THIS_MODULE,
    .ops = genl_ops,
    .n_ops = ARRAY_SIZE(genl_ops),
    .resv_start_op = WG_CMD_SET_DEVICE + 1
};

ابزارهای مدیریتی فضای کاربری (مانند ابزار خط فرمان wg یا سامانه‌های خودکار) از طریق سوکت‌های دیتاگرام و به وسیله ویژگی‌های مشخص نت‌لینک (nlattr) با کارت شبکه مجازی وایرگارد ارتباط برقرار می‌کنند.

این معماری سه مزیت کلیدی به همراه دارد: ۱. ارسال دسته‌ای ناهمگام: تنظیمات صدها همتا و دامنه‌های آی‌پی مجاز می‌توانند در قالب یک پیام ساختاریافته قرار گرفته و با یک فراخوان سیستمی از مرز هسته عبور کنند. ۲. کنترل سطح دسترسی: فرآیندهای مدیریتی با بررسی دقیق دسترسی‌ها در مرز ورود به هسته (GENL_ADMIN_PERM)، داشتن اختیارات CAP_NET_ADMIN را پیش از پردازش بایت‌ها الزامی می‌دانند. ۳. استقلال از بستر سخت‌افزاری: ساختار داده‌ای نوع-طول-مقدار (TLV) تفاوت‌های چیدمان حافظه میان پردازنده‌های ۳۲ بیتی و ۶۴ بیتی را مهار کرده و مشکلات چینش بایت‌ها (Endianness) را مرتفع می‌سازد.

+-------------------------------------------------------------+
|             برنامه مدیریت / ابزار خط فرمان `wg`             |
+-------------------------------------------------------------+
                               │  سوکت‌های نت‌لینک (AF_NETLINK)
                               ▼
+-------------------------------------------------------------+
|              زیرسیستم جنریک نت‌لینک (genetlink)             |
+-------------------------------------------------------------+
                               │  اعتبارسنجی ویژگی‌ها (nla_policy)
                               ▼
+-------------------------------------------------------------+
|               drivers/net/wireguard/netlink.c               |
|      ┌─────────────────────────┬─────────────────────────┐  |
|      │    wg_set_device()      │    wg_get_device()      │  |
|      └─────────────────────────┴─────────────────────────┘  |
+-------------------------------------------------------------+
                               │  همگام‌سازی RCU بدون قفل
                               ▼
+-------------------------------------------------------------+
|           وضعیت دستگاه و جدول هش همتایان در هسته            |
+-------------------------------------------------------------+

اعتبارسنجی سیاست‌های تو در تو: امنیت حافظه در مرز هسته

پذیرش داده‌های باینری از فضای کاربری چنانچه با بررسی دقیق همراه نباشد، می‌تواند هسته را با خطرات امنیتی روبه‌رو کند. در ماژول netlink.c، وایرگارد با تعریف جدول سیاست‌های دقیق در ساختار struct nla_policy تک‌تک ویژگی‌های ورودی را پیش از ارجاع به نشانگرها اعتبارسنجی می‌کند:

static const struct nla_policy device_policy[WGDEVICE_A_MAX + 1] = {
    [WGDEVICE_A_IFINDEX]      = { .type = NLA_U32 },
    [WGDEVICE_A_IFNAME]       = { .type = NLA_NUL_STRING, .len = IFNAMSIZ - 1 },
    [WGDEVICE_A_PRIVATE_KEY]  = NLA_POLICY_EXACT_LEN(NOISE_PUBLIC_KEY_LEN),
    [WGDEVICE_A_PUBLIC_KEY]   = NLA_POLICY_EXACT_LEN(NOISE_PUBLIC_KEY_LEN),
    [WGDEVICE_A_LISTEN_PORT]  = { .type = NLA_U16 },
    [WGDEVICE_A_FWMARK]       = { .type = NLA_U32 },
    [WGDEVICE_A_PEERS]         = { .type = NLA_NESTED }
};

هنگام به‌روزرسانی پیکربندی همتایان (WGDEVICE_A_PEERS)، بخش پردازشگر ویژگی‌های تو در تو را گام به گام می‌سنجد:

  • ویژگی‌های همتا (WGPEER_A_*): کلیدهای عمومی، کلیدهای پیش‌تر به اشتراک گذاشته شده (PSK)، بازه‌های ارسال بسته زنده ماندن (keepalive) و آدرس سوکت UDP نقطه پایانی (با پشتیبانی از sockaddr_in و sockaddr_in6) ارزیابی می‌شوند.
  • ویژگی‌های دامنه‌های مجاز (WGALLOWEDIP_A_*): ماسک‌های CIDR پیش از ارسال به درخت پیشوندی مسیریابی (allowedips.c) اعتبارسنجی می‌گردند (<= 32 برای IPv4 و <= 128 برای IPv6).

به دلیل اینکه طول داده‌ها با اندازه‌های رمزنگاری ثابت (نظیر کلیدهای ۳۲ بایتی Curve25519) مقایسه می‌گردد، بسته‌های ناقص بلافاصله کنار گذاشته شده و امکان خواندن حافظه خارج از محدوده در هسته ناممکن می‌شود.

برون‌ریزی چندبخشی اتمیک: پایش هزاران همتا بدون افت سرعت

در درگاه‌های شلوغ با میزبانی همزمان هزاران اتصال، دریافت وضعیت زنده (شمارنده‌های ترافیک، زمان آخرین دست‌تکانی و آی‌پی همتایان) به روش سنتی می‌تواند نوسان تاخیر ناگهانی ایجاد کند. یک بافر سوکت معمولی (sk_buff) گنجایش حجم بالای داده‌های همزمان را ندارد.

وایرگارد این چالش را با برون‌ریزی چندبخشی اتمیک در تابع wg_get_device_dump() حل کرده است. این فرآیند به جای استفاده از قفل‌های سراسری مسدودکننده، از نشانگر وضعیت در نت‌لینک بهره می‌برد:

static int wg_get_device_dump(struct sk_buff *skb, struct netlink_callback *cb)
{
    struct wg_device *wg = (struct wg_device *)cb->args[0];
    struct wg_peer *peer_cursor = (struct wg_peer *)cb->args[1];
    /* پیمایش ایمن فهرست همتایان با بهره‌گیری از RCU */
    ...
}

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

پیمایش فهرست همتایان در پوشش مکانیسم Read-Copy Update انجام می‌پذیرد (rcu_read_lock()):

rcu_read_lock();
list_for_each_entry_rcu(peer, &wg->peer_list, peer_list) {
    if (dump_peer(skb, peer) < 0)
        break;
}
rcu_read_unlock();

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

بازپیکربندی بدون قفل با RCU و چرخش بی‌وقفه کلیدها

مهم‌ترین مزیت ماژول netlink.c در توانایی افزودن، دگرگونی یا حذف همتایان در حین فعالیت بدون نیاز به بازنشانی رابط شبکه نهفته است.

هنگامی که دستوری از طریق wg_set_device() صادر می‌شود: ۱. قفل محلی هدفمند: درایور صرفا قفل به‌روزرسانی تنظیمات (wg->device_update_lock) را به کار می‌گیرد و بدین ترتیب درخواست‌های کاربران به صورت متوالی پردازش شده و در صف‌های انتقال ترافیک اختلالی ایجاد نمی‌شود. ۲. اعمال آنی تغییرات: اگر همتایی با همان کلید عمومی در جدول هش یافت شود، فیلدهای متغیر (مانند آدرس نقطه پایانی، بازه keepalive یا PSK) بلافاصله جایگزین می‌گردند. ۳. حذف ایمن با RCU: در صورت حذف همتا، ساختارهای قدیمی مسیریابی از جدول فعال جدا شده و آزادسازی حافظه به کمک synchronize_rcu() یا call_rcu() پس از اتمام استفاده سایر پردازنده‌ها صورت می‌گیرد.

جریان ارسال داده:   اشاره‌گر همتا را می‌خواند [تحت حفاظت RCU] ──► بسته را رمزگذاری می‌کند
                                                                         ▲
جریان پیکربندی:     همتای قدیمی را جدا می‌سازد ──► synchronize_rcu() ─────┘
                    (شکیبایی تا پایان کار تمامی پردازنده‌های در حال خواندن)
                           │
                           ▼
                    حافظه ساختار قدیمی را با اطمینان آزاد می‌کند

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

مدیریت ابری یکپارچه و زیرساخت RiceGuard

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

در سرویس VPNRice، سامانه شبکه RiceGuard از قابلیت‌های جنریک نت‌لینک در وایرگارد برای ارائه مدیریت بدون وقفه بهره می‌گیرد:

  • چرخش خودکار کلیدها: کلیدهای نشست موقت و کلیدهای از پیش تعیین‌شده هر چند ساعت یک‌بار از طریق Netlink IPC به صورت خودکار نوسازی شده و پایداری لایه امنیتی ارتقا می‌یابد.
  • همگام‌سازی بلادرنگ جابه‌جایی: در زمان جابه‌جایی دستگاه میان شبکه‌های سلولی 5G و اینترنت بی‌سیم، سرورهای لبه سوکت‌های نقطه پایانی را از طریق نت‌لینک در کسر ناچیزی از میلی‌ثانیه به‌روز می‌کنند.
  • توزیع سریع سیاست‌های شبکه: کارگزارهای RiceGuard قوانین مسیریابی و کنترل دسترسی (ACL) را با ویژگی ارسال دسته‌ای نت‌لینک در کسری از میکروثانیه بر روی سرورهای Anycast اعمال می‌نمایند.

هماهنگی پروتکل بهینه جنریک نت‌لینک با مدل همزمانی بدون قفل RCU، گواهی بر این حقیقت است که انعطاف‌پذیری در مدیریت امنیتی و سرعت بالای انتقال داده‌ها می‌توانند در هماهنگی کامل عمل کنند.