wgctrl

package module
v1.3.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 16, 2026 License: MIT Imports: 7 Imported by: 0

README

awgctrl-go

Linux Test Static Analysis Go Report Card Go Reference

A Go library for controlling WireGuard and AmneziaWG devices on Linux.

Fork of WireGuard/wgctrl-go extended with complete AmneziaWG v2 support — reading and writing all AWG obfuscation parameters via netlink, parameter validation, auto-generation, and userspace daemon support.

What's new compared to wgctrl-go

Feature wgctrl-go awgctrl-go
Standard WireGuard ✅ ✅
AmneziaWG — write params ❌ ✅
AmneziaWG — read params ❌ ✅
Peer-level AdvancedSecurity ❌ ✅
Auto-generate AWG params ❌ ✅
Validate AWG params ❌ ✅
Userspace AWG daemon ❌ ✅
context.Context API ❌ ✅
Single netlink round-trip ❌ ✅

Platform support

Platform Kernel WG Kernel AWG Userspace WG Userspace AWG
Linux ✅ ✅ ✅ ✅
FreeBSD ✅ ❌ ✅ ❌
OpenBSD ✅ ❌ ✅ ❌
Windows ❌ ❌ ✅ ❌

Requirements

  • Go 1.26 or later
  • Linux kernel with AmneziaWG module (modprobe amneziawg), or amneziawg-go userspace daemon
  • Root privileges or CAP_NET_ADMIN capability

This library works with any AmneziaWG v2 kernel module, including the upstream module. For production use we recommend the patched fork which validates AWG parameters before applying them (upstream can crash on a rejected configuration), serves plain WireGuard, AWG 1.0 and AWG 2.0 clients on one interface, fixes netlink dumps with many peers and builds on Linux up to 7.2 and RHEL 10. Only this module reports the detected peer type (Peer.AWGPeerFlagsKnown, FixedHeaders, NoS4).

AWG kernel and userspace support is Linux-only. Other platforms (FreeBSD, OpenBSD, Windows) support standard WireGuard only.

Installation

go get github.com/advanced-wg/awgctrl-go

Quick start

Read a device
client, err := wgctrl.New()
if err != nil {
    log.Fatal(err)
}
defer client.Close()

device, err := client.Device(context.Background(), "awg0")
if err != nil {
    log.Fatal(err)
}

fmt.Printf("Interface: %s  IsAmnezia: %v\n", device.Name, device.IsAmnezia)
for _, peer := range device.Peers {
    fmt.Printf("Peer: %s  AWG: %v  RX: %d  TX: %d\n",
        peer.PublicKey, peer.AdvancedSecurity,
        peer.ReceiveBytes, peer.TransmitBytes)
}
Enable AWG obfuscation

The simplest approach — all parameters are generated automatically:

cfg := &wgtypes.Config{}
cfg.GenerateAmneziaParams()

if err := cfg.Validate(); err != nil {
    log.Fatal(err)
}

client.ConfigureDevice(context.Background(), "awg0", *cfg)
Add a peer with AWG
pubKey, _ := wgtypes.ParseKey("base64encodedpublickey=")
_, allowedIP, _ := net.ParseCIDR("10.0.0.2/32")

cfg := wgtypes.Config{
    Peers: []wgtypes.PeerConfig{
        {
            PublicKey:        pubKey,
            AllowedIPs:       []net.IPNet{*allowedIP},
            AdvancedSecurity: true,
        },
    },
}

client.ConfigureDevice(context.Background(), "awg0", cfg)

Documentation

License

MIT — Copyright (C) 2018-2022 Matt Layher, 2025 Advanced-WG, V. Bantserov. See LICENSE.md.

Documentation

Overview

Copyright (C) 2018-2022 Matt Layher Copyright (C) 2025 Advanced-WG, V. Bantserov

Package wgctrl enables control of WireGuard and AmneziaWG devices on multiple platforms.

For more information on WireGuard, please see https://www.wireguard.com/. For AmneziaWG, see https://github.com/amnezia-vpn/amneziawg-linux-kernel-module.

This package is a fork of WireGuard/wgctrl-go with full AmneziaWG support:

  • Reading AWG parameters (Jc, Jmin, Jmax, S1-S4, H1-H4, I1-I5) via Device()
  • Writing AWG parameters via ConfigureDevice()
  • Automatic parameter generation via Config.GenerateAmneziaParams()
  • Parameter validation via Config.Validate()
  • Userspace AWG daemon support (amneziawg-go)

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Client

type Client struct {
	// contains filtered or unexported fields
}

A Client provides access to WireGuard device information.

func New

func New() (*Client, error)

New creates a new Client.

func (*Client) Close

func (c *Client) Close() error

Close releases resources used by a Client.

All underlying clients are closed regardless of errors. If multiple clients fail to close, their errors are joined with errors.Join so callers can inspect individual errors via errors.Is / errors.As.

func (*Client) ConfigureDevice

func (c *Client) ConfigureDevice(ctx context.Context, name string, cfg wgtypes.Config) error

ConfigureDevice configures a WireGuard device by its interface name.

Because the zero value of some Go types may be significant to WireGuard for Config fields, only fields which are not nil will be applied when configuring a device.

If the device specified by name does not exist or is not a WireGuard device, an error is returned which can be checked using `errors.Is(err, os.ErrNotExist)`.

The AmneziaWG fields are checked with cfg.Validate first: the netlink encoding is 16-bit, so e.g. Jc 70000 would otherwise reach the kernel as 4464 without an error. When cfg sets only some of Jc/Jmin/Jmax or of H1-H4, the kernel checks them together with the device's current values (Jmin <= Jmax, no overlapping headers); the device is then read once so that such a conflict is reported clearly instead of as EINVAL.

func (*Client) Device

func (c *Client) Device(ctx context.Context, name string) (*wgtypes.Device, error)

Device retrieves a WireGuard device by its interface name.

If the device specified by name does not exist or is not a WireGuard device, an error is returned which can be checked using `errors.Is(err, os.ErrNotExist)`.

func (*Client) Devices

func (c *Client) Devices(ctx context.Context) ([]*wgtypes.Device, error)

Devices retrieves all WireGuard devices on this system.

When multiple backend clients report the same device (identified by interface name), only the first occurrence is kept. This prevents duplicates when, for example, both kernel and userspace clients discover the same interface.

A backend that fails does not hide the devices of the others (LIB-03: one unreadable userspace socket returned no devices at all): Devices returns what the other backends found together with the errors, joined. A caller that only checks err sees the failure as before.

Directories

Path Synopsis
cmd
wgctrl command
Command wgctrl is a testing utility for interacting with WireGuard via package wgctrl.
Command wgctrl is a testing utility for interacting with WireGuard via package wgctrl.
internal
wgfreebsd
Package wgfreebsd provides internal access to FreeBSD's WireGuard ioctl interface.
Package wgfreebsd provides internal access to FreeBSD's WireGuard ioctl interface.
wgfreebsd/internal/nv
Package nv marshals and unmarshals Go maps to/from FreeBSDs nv(9) name/value lists See: https://www.freebsd.org/cgi/man.cgi?query=nv&sektion=9
Package nv marshals and unmarshals Go maps to/from FreeBSDs nv(9) name/value lists See: https://www.freebsd.org/cgi/man.cgi?query=nv&sektion=9
wgfreebsd/internal/wgh
Package wgh is an auto-generated package which contains constants and types used to access WireGuard information using ioctl calls.
Package wgh is an auto-generated package which contains constants and types used to access WireGuard information using ioctl calls.
wginternal
Package wginternal contains shared internal types for wgctrl.
Package wginternal contains shared internal types for wgctrl.
wglinux
Package wglinux provides internal access to Linux's WireGuard generic netlink interface.
Package wglinux provides internal access to Linux's WireGuard generic netlink interface.
wgopenbsd
Package wgopenbsd provides internal access to OpenBSD's WireGuard ioctl interface.
Package wgopenbsd provides internal access to OpenBSD's WireGuard ioctl interface.
wgopenbsd/internal/wgh
Package wgh is an auto-generated package which contains constants and types used to access WireGuard information using ioctl calls.
Package wgh is an auto-generated package which contains constants and types used to access WireGuard information using ioctl calls.
wgtest
Package wgtest contains shared testing utilities for package wgctrl.
Package wgtest contains shared testing utilities for package wgctrl.
wguser
Package wguser provides internal access to the userspace WireGuard configuration protocol interface.
Package wguser provides internal access to the userspace WireGuard configuration protocol interface.
Package wgtypes provides shared types for the wgctrl family of packages.
Package wgtypes provides shared types for the wgctrl family of packages.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL