WG-QUICK(8) WireGuard WG-QUICK(8)

wg-quick - راه‌اندازی آسان و سریع رابط شبکه WireGuard

wg-quick [ up | down | save | strip ] [ CONFIG_FILE | INTERFACE ]

این یک اسکریپت بسیار ساده برای بالا آوردن و راه‌اندازی آسان رابط WireGuard است که برای چند مورد استفاده رایج مناسب است.

از up برای افزودن و راه‌اندازی یک رابط، و از down برای خاموش کردن و حذف رابط استفاده کنید. اجرای up یک رابط WireGuard اضافه می‌کند، آن را با آدرس‌های IP ارائه‌شده بالا می‌آورد، مقدار MTU و مسیرها را تنظیم می‌کند و در صورت تمایل اسکریپت‌های pre/post up را اجرا می‌نماید. اجرای down به‌طور اختیاری پیکربندی جاری را ذخیره کرده، رابط WireGuard را حذف می‌کند و در صورت تمایل اسکریپت‌های pre/post down را اجرا می‌نماید. اجرای save پیکربندی رابط موجود را بدون پایین آوردن آن ذخیره می‌کند. از strip برای تولید یک فایل پیکربندی استفاده کنید که تمام گزینه‌های مختص wg-quick(8) از آن حذف شده و برای استفاده با wg(8) مناسب است.

مقدار CONFIG_FILE یک فایل پیکربندی است که نام فایل آن همان نام رابط به همراه پسوند .conf است. در غیر این صورت، INTERFACE نام رابط شبکه است که فایل پیکربندی آن ابتدا در مسیر /etc/wireguard/INTERFACE.conf و سپس در مسیرهای جستجوی مخصوص توزیع جستجو می‌شود.

به‌طور کلی، این ابزار تنها یک اسکریپت ساده است که فراخوانی‌های wg(8) و ip(8) را برای راه‌اندازی رابط WireGuard کپسوله می‌کند. این ابزار برای کاربرانی با نیازهای ساده طراحی شده است و به کاربرانی با نیازهای پیشرفته‌تر اکیداً توصیه می‌شود از ابزارهای تخصصی‌تر، یک مدیر شبکه کامل‌تر، یا طبق معمول مستقیماً از wg(8) و ip(8) استفاده کنند.

فایل پیکربندی چند مقدار تنظیمی اضافه را به ساختاری که توسط wg(8) پشتیبانی می‌شود می‌افزاید تا ویژگی‌های بیشتری برای رابط پیکربندی شوند. این ابزار مقادیری را که می‌شناسد مدیریت کرده و مقادیر باقی‌مانده را برای پردازش بیشتر مستقیماً به wg(8) ارسال می‌کند.

این اسکریپت تمام مسیرها را از فهرست IPهای مجاز همتایان (Allowed IPs) استنباط کرده و به‌طور خودکار آن‌ها را به جدول مسیریابی سیستم می‌افزاید. اگر یکی از آن مسیرها، مسیر پیش‌فرض (0.0.0.0/0 یا ::/0) باشد، از ip-rule(8) برای بازنویسی و جایگزینی دروازه پیش‌فرض (Default Gateway) استفاده می‌کند.

فایل پیکربندی به‌طور مستقیم به زیردستور setconf در wg(8) ارسال خواهد شد، به استثنای موارد افزوده زیر در بخش Interface که توسط این ابزار مدیریت می‌شوند:

  • Address — فهرستی جداشده با کاما از آدرس‌های IP (نسخه ۴ یا ۶، اختیاری همراه با ماسک‌های CIDR) که باید به رابط اختصاص داده شوند. می‌تواند چندین بار مشخص شود.
  • DNS — فهرستی جداشده با کاما از آدرس‌های IP (نسخه ۴ یا ۶) برای تنظیم به‌عنوان کارگزارهای DNS رابط، یا نام‌های میزبان غیر IP برای تنظیم به‌عنوان دامنه‌های جستجوی DNS رابط. می‌تواند چندین بار مشخص شود. هنگام بالا آوردن رابط، دستور resolvconf -a tun.INTERFACE -m 0 -x و هنگام پایین آوردن آن، دستور resolvconf -d tun.INTERFACE اجرا می‌شود. اگر اجرای این فراخوانی‌های خاص resolvconf(8) مطلوب نیست، می‌توان به‌جای آن‌ها از کلیدهای PostUp و PostDown در ادامه استفاده کرد.
  • MTU — در صورت عدم تعیین، MTU به‌طور خودکار بر اساس آدرس‌های نقطه پایانی (Endpoint) یا مسیر پیش‌فرض سیستم تعیین می‌شود که معمولاً انتخاب مناسبی است. با این حال، برای تعیین دستی MTU و لغو این تشخیص خودکار، می‌توان این مقدار را صریحاً مشخص کرد.
  • Table — جدول مسیریابی را که مسیرها به آن اضافه می‌شوند کنترل می‌کند. دو مقدار ویژه وجود دارد: off ایجاد مسیرها را به‌کلی غیرفعال می‌کند، و auto (پیش‌فرض) مسیرها را به جدول پیش‌فرض افزوده و مدیریت ویژه مسیرهای پیش‌فرض را فعال می‌سازد.
  • PreUp, PostUp, PreDown, PostDown — قطعه‌کدهای اسکریپتی که قبل یا بعد از راه‌اندازی یا خاموش کردن رابط توسط bash(1) اجرا می‌شوند؛ بیشترین کاربرد آن‌ها برای پیکربندی گزینه‌های سفارشی DNS یا قوانین فایروال است. رشته ویژه %i به INTERFACE گسترش می‌یابد. هر کدام از این‌ها می‌توانند چندین بار مشخص شوند که در این صورت دستورات به ترتیب اجرا خواهند شد.
  • SaveConfig — اگر روی true تنظیم شود، هنگام خاموش شدن رابط، پیکربندی از وضعیت جاری آن در فایل ذخیره می‌شود. بنابراین هرگونه تغییری که قبل از حذف رابط در فایل پیکربندی داده شده باشد، رونویسی خواهد شد.

نام‌های پیشنهادی برای INTERFACE شامل wg0، wgvpn0 یا حتی wgmgmtlan0 هستند. با این حال، عدد در انتهای نام اختیاری است و هر رشته با ساختار آزاد [a-zA-Z0-9_=+.-]{1,15} کار خواهد کرد. بنابراین حتی نام‌های رابط متناظر با موقعیت‌های جغرافیایی مانند cincinnati، nyc یا paris نیز در صورت تمایل کفایت می‌کنند.

این مثال‌ها بر اساس همان ساختار نحوی موجود در wg(8) بیان شده‌اند و توضیحات کامل‌تر را می‌توان در آنجا یافت. خطوط پررنگ در ادامه مربوط به گزینه‌هایی هستند که قابلیت‌های wg(8) را گسترش می‌دهند.

پیکربندی زیر می‌تواند برای اتصال به‌عنوان کلاینت به یک دروازه VPN جهت تونل کردن تمام ترافیک استفاده شود:

[Interface]
Address = 10.200.100.8/24
DNS = 10.200.100.1
PrivateKey = oK56DE9Ue9zK76rAc8pBl6opph+1v36lm7cXXsQKrQM=
[Peer]
PublicKey = GtL7fZc/bLnqZldpVofMCD6hDjrK28SsdLxevJ+qtKU=
PresharedKey = /UwcSPg38hW/D9Y3tcS1FOV0K1wuURMbS0sesJEP5ak=
AllowedIPs = 0.0.0.0/0
Endpoint = demo.wireguard.com:51820

فیلد Address در اینجا برای تنظیم آدرس رابط اضافه شده است. فیلد DNS نشان می‌دهد که کارگزار DNS رابط باید از طریق resolvconf(8) پیکربندی شود. ورودی AllowedIPs همتا بیانگر این است که این رابط باید به‌عنوان دروازه پیش‌فرض پیکربندی شود، که این اسکریپت این کار را انجام می‌دهد.

با گسترش مثال قبل، می‌توان برای جلوگیری از عبور بسته‌های رمزگذاری‌نشده از رابط‌های غیر WireGuard (قابلیت موسوم به «Kill-switch» یا کلید قطع خودکار)، دو خط PostUp و PreDown زیر را به بخش [Interface] اضافه کرد:

PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT

فیلدهای PostUp و PreDown برای تعیین دستور iptables(8) اضافه شده‌اند که در صورت استفاده با رابط‌هایی که همتای آن‌ها 0.0.0.0/0 را به‌عنوان بخشی از AllowedIPs مشخص کرده است، با سازوکار fwmark در wg-quick همکاری می‌کند تا تمام بسته‌هایی را که یا رمزگذاری‌شده از تونل خارج نمی‌شوند و یا از درون خود تونل عبور نمی‌کنند دور بیندازد. (توجه داشته باشید که این کار همچنان اجازه عبور به بیشتر ترافیک DHCP را می‌دهد، زیرا اغلب کلاینت‌های DHCP از سوکت‌های PF_PACKET استفاده می‌کنند که Netfilter را دور می‌زند.) هنگام استفاده از IPv6، می‌توان خطوط مشابه دیگری را با استفاده از ip6tables(8) اضافه کرد.

یا شاید ذخیره کلیدهای خصوصی به‌صورت رمزگذاری‌شده مطلوب باشد، مانند استفاده از pass(1):

PreUp = wg set %i private-key <(pass WireGuard/private-keys/%i)

برای استفاده روی سرور، مثال زیر نمونه‌ای پیچیده‌تر شامل چندین همتا است:

[Interface]
Address = 10.192.122.1/24
Address = 10.10.0.1/16
SaveConfig = true
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
ListenPort = 51820
[Peer]
PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
AllowedIPs = 10.192.122.3/32, 10.192.124.1/24
[Peer]
PublicKey = TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0=
AllowedIPs = 10.192.122.4/32, 192.168.0.0/16
[Peer]
PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=
AllowedIPs = 10.10.10.230/32

به دو خط Address در بالا توجه کنید، و این‌که SaveConfig روی true تنظیم شده است که نشان می‌دهد فایل پیکربندی هنگام خاموش شدن با استفاده از وضعیت جاری رابط ذخیره می‌شود.

ترکیبی از فیلدهای Table، PostUp و PreDown می‌تواند برای مسیریابی مبتنی بر سیاست (Policy Routing) نیز استفاده شود. برای مثال، پیکربندی زیر می‌تواند برای عبور ترافیک SSH (درگاه TCP شماره ۲۲) از درون تونل به کار رود:

[Interface]
Address = 10.192.122.1/24
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
ListenPort = 51820
Table = 1234
PostUp = ip rule add ipproto tcp dport 22 table 1234
PreDown = ip rule delete ipproto tcp dport 22 table 1234
[Peer]
PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
AllowedIPs = 0.0.0.0/0

این فایل‌های پیکربندی را می‌توان در هر پوشه‌ای قرار داد و نام رابط مورد نظر را در نام فایل آورد:

    # wg-quick up /path/to/wgnet0.conf

جهت راحتی، اگر فقط نام یک رابط مشخص شود، این ابزار به‌طور خودکار مسیری را در /etc/wireguard/ انتخاب می‌کند:

    # wg-quick up wgnet0

این دستور فایل پیکربندی /etc/wireguard/wgnet0.conf را بارگذاری می‌کند.

دستور strip برای بارگذاری مجدد فایل‌های پیکربندی بدون ایجاد اختلال در نشست‌های فعال کاربرد دارد:

    # wg syncconf wgnet0 <(wg-quick strip wgnet0)

wg(8), ip(8), ip-link(8), ip-address(8), ip-route(8), ip-rule(8), resolvconf(8).

wg-quick توسط Jason A. Donenfeld نوشته شده است. برای دریافت به‌روزرسانی‌ها و اطلاعات بیشتر، به وب‌گاه پروژه مراجعه کنید: پروژه WireGuard.

2016 January 1 ZX2C4