WireGuard is a high-performance VPN solution that runs in the Linux kernel. It uses modern cryptography and is easier to configure than many other VPN solutions. Additionally, WireGuard’s small codebase reduces the surface for attacks and, therefore, improves security. For authentication and encryption, WireGuard uses keys similar to SSH.
Important
WireGuard is provided as a Technology Preview only. Technology Preview features are not supported with Red Hat production Service Level Agreements (SLAs), might not be functionally complete, and Red Hat does not recommend using them for production. These previews provide early access to upcoming product features, enabling customers to test functionality and provide feedback during the development process.
See Technology Preview Features Support Scope on the Red Hat Customer Portal for information about the support scope for Technology Preview features.
To set up a WireGuard VPN, you must complete the following steps. You can perform most steps by using different options:
- Create public and private keys for every host in the VPN.
- Configure the WireGuard server by using nmcli, nmtui, nm-connection-editor, or the wg-quick service.
- Configure firewalld on the WireGuard server by using the command line or graphical interface.
- Configure the WireGuard client by using nmcli, nm-connection-editor, or the wg-quick service.
WireGuard operates on the network layer (layer 3). Therefore, you cannot use DHCP and must assign static IP addresses or IPv6 link-local addresses to the tunnel devices on both the server and clients.
Important
You can use WireGuard only if the Federal Information Processing Standard (FIPS) mode in RHEL is disabled.
Note that all hosts that participate in a WireGuard VPN are peers. This documentation uses the terms client
to describe hosts that establish a connection and server
to describe the host with the fixed hostname or IP address that the clients connect to and optionally route all traffic through this server.
8.1.Protocols and primitives used by WireGuard
WireGuard uses the following protocols and primitives:
- ChaCha20 for symmetric encryption, authenticated with Poly1305, using Authenticated Encryption with Associated Data (AEAD) construction as described in RFC7539
- Curve25519 for Elliptic-curve Diffie–Hellman (ECDH) key exchange
- BLAKE2s for hashing and keyed hashing, as described in RFC7693
- SipHash24 for hash table keys
- HKDF for key derivation, as described in RFC5869
8.2.How WireGuard uses tunnel IP addresses, public keys, and remote endpoints
When WireGuard sends a network packet to a peer:
- WireGuard reads the destination IP from the packet and compares it to the list of allowed IP addresses in the local configuration. If the peer is not found, WireGuard drops the packet.
- If the peer is valid, WireGuard encrypts the packet using the peer’s public key.
- The sending host looks up the most recent Internet IP address of the host and sends the encrypted packet to it.
When WireGuard receives a packet:
- WireGuard decrypts the packet using private key of the remote host.
- WireGuard reads the internal source address from the packet and looks up whether the IP is configured in the list of allowed IP addresses in the settings for the peer on the local host. If the source IP is on the allowlist, WireGuard accepts the packet. If the IP address is not on the list, WireGuard drops the packet.
The association of public keys and allowed IP addresses is called Cryptokey Routing Table
. This means that the list of IP addresses behaves similar to a routing table when sending packets, and as a kind of access control list when receiving packets.
8.3.Using a WireGuard client behind NAT and firewalls
WireGuard uses the UDP protocol and transmits data only when a peer sends packets. Stateful firewalls and network address translation (NAT) on routers track connections to enable a peer behind NAT or a firewall to receive packets.
To keep the connection active, WireGuard supports persistent keepalives
. This means you can set an interval at which WireGuard sends keepalive packets. By default, the persistent keep-alive feature is disabled to reduce network traffic. Enable this feature on the client if you use the client in a network with NAT or if a firewall closes the connection after some time of inactivity.
8.4.Creating private and public keys to be used in WireGuard connections
WireGuard uses base64-encoded private and public keys to authenticate hosts to each other. Therefore, you must create the keys on each host that participates in the WireGuard VPN.
Important
For secure connections, create different keys for each host, and ensure that you only share the public key with the remote WireGuard host. Do not use the example keys used in this documentation.
Procedure
Install the
wireguard-tools
package:# dnf install wireguard-tools
Create a private key and a corresponding public key for the host:
# wg genkey | tee /etc/wireguard/$HOSTNAME.private.key | wg pubkey > /etc/wireguard/$HOSTNAME.public.key
You will need the content of the key files, but not the files themselves. However, Red Hat recommends keeping the files in case that you need to remember the keys in future.
Set secure permissions on the key files:
# chmod 600 /etc/wireguard/$HOSTNAME.private.key /etc/wireguard/$HOSTNAME.public.key
Display the private key:
# cat /etc/wireguard/$HOSTNAME.private.keyYFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
You will need the private key to configure the WireGuard connection on the local host. Do not share the private key.
Display the public key:
# cat /etc/wireguard/$HOSTNAME.public.keyUtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
You will need the public key to configure the WireGuard connection on the remote host.
Additional resources
- The
wg(8)
man page
8.5.Configuring a WireGuard server by using nmcli
You can configure the WireGuard server by creating a connection profile in NetworkManager. Use this method to let NetworkManager manage the WireGuard connection.
This procedure assumes the following settings:
Server:
- Private key:
YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
- Tunnel IPv4 address:
192.0.2.1/24
- Tunnel IPv6 address:
2001:db8:1::1/32
- Private key:
Client:
- Public key:
bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
- Tunnel IPv4 address:
192.0.2.2/24
- Tunnel IPv6 address:
2001:db8:1::2/32
- Public key:
Prerequisites
- You have generated the public and private key for both the server and client.
You know the following information:
- The private key of the server
- The static tunnel IP addresses and subnet masks of the client
- The public key of the client
- The static tunnel IP addresses and subnet masks of the server
Procedure
Add a NetworkManager WireGuard connection profile:
# nmcli connection add type wireguard con-name server-wg0 ifname wg0 autoconnect no
This command creates a profile named
server-wg0
and assigns the virtual interfacewg0
to it. To prevent the connection from starting automatically after you add it without finalizing the configuration, disable theautoconnect
parameter.Set the tunnel IPv4 address and subnet mask of the server:
# nmcli connection modify server-wg0 ipv4.method manual ipv4.addresses 192.0.2.1/24
Set the tunnel IPv6 address and subnet mask of the server:
# nmcli connection modify server-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::1/32
Add the server’s private key to the connection profile:
# nmcli connection modify server-wg0 wireguard.private-key "YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg="
Set the port for incoming WireGuard connections:
# nmcli connection modify server-wg0 wireguard.listen-port 51820
Always set a fixed port number on hosts that receive incoming WireGuard connections. If you do not set a port, WireGuard uses a random free port each time you activate the
wg0
interface.Add peer configurations for each client that you want to allow to communicate with this server. You must add these settings manually, because the
nmcli
utility does not support setting the corresponding connection properties.Edit the
/etc/NetworkManager/system-connections/server-wg0.nmconnection
file, and append:[wireguard-peer.bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=]allowed-ips=192.0.2.2;2001:db8:1::2;
- The
[wireguard-peer.<public_key_of_the_client>]
entry defines the peer section of the client, and the section name contains the public key of the client. The
allowed-ips
parameter sets the tunnel IP addresses of the client that are allowed to send data to this server.Add a section for each client.
- The
Reload the
server-wg0
connection profile:# nmcli connection load /etc/NetworkManager/system-connections/server-wg0.nmconnection
Optional: Configure the connection to start automatically, enter:
# nmcli connection modify server-wg0 autoconnect yes
Reactivate the
server-wg0
connection:# nmcli connection up server-wg0
Next steps
- Configure the firewalld service on the WireGuard server.
Verification
Display the interface configuration of the
wg0
device:# wg show wg0interface: wg0 public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE= private key: (hidden) listening port: 51820peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM= allowed ips: 192.0.2.2/32, 2001:db8:1::2/128
To display the private key in the output, use the
WG_HIDE_KEYS=never wg show wg0
command.Display the IP configuration of the
wg0
device:# ip address show wg020: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute wg0 valid_lft forever preferred_lft forever inet6 2001:db8:1::1/32 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::3ef:8863:1ce2:844/64 scope link noprefixroute valid_lft forever preferred_lft forever
Additional resources
- The
wg(8)
man page - The
WireGuard setting
section in thenm-settings(5)
man page
8.6.Configuring a WireGuard server by using nmtui
You can configure the WireGuard server by creating a connection profile in NetworkManager. Use this method to let NetworkManager manage the WireGuard connection.
This procedure assumes the following settings:
Server:
- Private key:
YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
- Tunnel IPv4 address:
192.0.2.1/24
- Tunnel IPv6 address:
2001:db8:1::1/32
- Private key:
Client:
- Public key:
bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
- Tunnel IPv4 address:
192.0.2.2/24
- Tunnel IPv6 address:
2001:db8:1::2/32
- Public key:
Prerequisites
- You have generated the public and private key for both the server and client.
You know the following information:
- The private key of the server
- The static tunnel IP addresses and subnet masks of the client
- The public key of the client
- The static tunnel IP addresses and subnet masks of the server
- You installed the
NetworkManager-tui
package.
Procedure
Start the
nmtui
application:# nmtui
- Select
Edit a connection
, and press Enter. - Select Add, and press Enter.
- Select the
WireGuard
connection type in the list, and press Enter. In the
Edit connection
window:- Enter the name of the connection and the virtual interface, such as
wg0
, that NetworkManager should assign to the connection. - Enter the private key of the server.
Set the listen port number, such as
51820
, for incoming WireGuard connections.Always set a fixed port number on hosts that receive incoming WireGuard connections. If you do not set a port, WireGuard uses a random free port each time you activate the interface.
Click Add next to the
Peers
pane:- Enter the public key of the client.
- Set the
Allowed IPs
field to the tunnel IP addresses of the client that are allowed to send data to this server. Select OK, and press Enter.
Select Show next to
IPv4 Configuration
, and press Enter.- Select the IPv4 configuration method
Manual
. - Enter the tunnel IPv4 address and the subnet mask. Leave the
Gateway
field empty.
- Select the IPv4 configuration method
Select Show next to
IPv6 Configuration
, and press Enter.- Select the IPv6 configuration method
Manual
. - Enter the tunnel IPv6 address and the subnet mask. Leave the
Gateway
field empty.
- Select the IPv6 configuration method
Select OK, and press Enter
- Enter the name of the connection and the virtual interface, such as
- In the window with the list of connections, select Back, and press Enter.
- In the
NetworkManager TUI
main window, select Quit, and press Enter.
Next steps
- Configure the firewalld service on the WireGuard server.
Verification
Display the interface configuration of the
wg0
device:# wg show wg0interface: wg0 public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE= private key: (hidden) listening port: 51820peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM= allowed ips: 192.0.2.2/32, 2001:db8:1::2/128
To display the private key in the output, use the
WG_HIDE_KEYS=never wg show wg0
command.Display the IP configuration of the
wg0
device:# ip address show wg020: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute wg0 valid_lft forever preferred_lft forever inet6 2001:db8:1::1/32 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::3ef:8863:1ce2:844/64 scope link noprefixroute valid_lft forever preferred_lft forever
Additional resources
- The
wg(8)
man page
8.7.Configuring a WireGuard server by using nm-connection-editor
You can configure the WireGuard server by creating a connection profile in NetworkManager. Use this method to let NetworkManager manage the WireGuard connection.
Prerequisites
- You have generated the public and private key for both the server and client.
You know the following information:
- The private key of the server
- The static tunnel IP addresses and subnet masks of the client
- The public key of the client
- The static tunnel IP addresses and subnet masks of the server
Procedure
Open a terminal, and enter:
# nm-connection-editor
- Add a new connection by clicking the + button.
- Select the
WireGuard
connection type, and click Create. - Optional: Update the connection name.
- On the
General
tab, selectConnect automatically with priority
. Optionally, set a priority value. On the
WireGuard
tab:- Enter the name of the virtual interface, such as
wg0
, that NetworkManager should assign to the connection. - Enter the private key of the server.
Set the listen port number, such as
51820
, for incoming WireGuard connections.Always set a fixed port number on hosts that receive incoming WireGuard connections. If you do not set a port, WireGuard uses a random free port each time you activate the interface.
Click Add to add peers:
- Enter the public key of the client.
- Set the
Allowed IPs
field to the tunnel IP addresses of the client that are allowed to send data to this server. - Click Apply.
- Enter the name of the virtual interface, such as
On the
IPv4 Settings
tab:- Select
Manual
in theMethod
list. - Click Add to enter the tunnel IPv4 address and the subnet mask. Leave the
Gateway
field empty.
- Select
On the
IPv6 Settings
tab:- Select
Manual
in theMethod
list. - Click Add to enter the tunnel IPv6 address and the subnet mask. Leave the
Gateway
field empty.
- Select
- Click Save to store the connection profile.
Next steps
- Configure the firewalld service on the WireGuard server.
Verification
Display the interface configuration of the
wg0
device:# wg show wg0interface: wg0 public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE= private key: (hidden) listening port: 51820peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM= allowed ips: 192.0.2.2/32, 2001:db8:1::2/128
To display the private key in the output, use the
WG_HIDE_KEYS=never wg show wg0
command.Display the IP configuration of the
wg0
device:# ip address show wg020: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute wg0 valid_lft forever preferred_lft forever inet6 2001:db8:1::1/32 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::3ef:8863:1ce2:844/64 scope link noprefixroute valid_lft forever preferred_lft forever
Additional resources
- The
wg(8)
man page
8.8.Configuring a WireGuard server by using the wg-quick service
You can configure the WireGuard server by creating a configuration file in the /etc/wireguard/
directory. Use this method to configure the service independently from NetworkManager.
This procedure assumes the following settings:
Server:
- Private key:
YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
- Tunnel IPv4 address:
192.0.2.1/24
- Tunnel IPv6 address:
2001:db8:1::1/32
- Private key:
Client:
- Public key:
bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
- Tunnel IPv4 address:
192.0.2.2/24
- Tunnel IPv6 address:
2001:db8:1::2/32
- Public key:
Prerequisites
- You have generated the public and private key for both the server and client.
You know the following information:
- The private key of the server
- The static tunnel IP addresses and subnet masks of the client
- The public key of the client
- The static tunnel IP addresses and subnet masks of the server
Procedure
Install the
wireguard-tools
package:# dnf install wireguard-tools
Create the
/etc/wireguard/wg0.conf
file with the following content:[Interface]Address = 192.0.2.1/24, 2001:db8:1::1/32ListenPort = 51820PrivateKey = YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=[Peer]PublicKey = bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=AllowedIPs = 192.0.2.2, 2001:db8:1::2
The
[Interface]
section describes the WireGuard settings of the interface on the server:Address
: A comma-separated list of the server’s tunnel IP addresses.PrivateKey
: The private key of the server.ListenPort
: The port on which WireGuard listens for incoming UDP connections.Always set a fixed port number on hosts that receive incoming WireGuard connections. If you do not set a port, WireGuard uses a random free port each time you activate the
wg0
interface.
Each
[Peer]
section describes the settings of one client:PublicKey
: The public key of the client.AllowedIPs
: The tunnel IP addresses of the client that are allowed to send data to this server.
Enable and start the WireGuard connection:
# systemctl enable --now wg-quick@wg0
The systemd instance name must match the name of the configuration file in the
/etc/wireguard/
directory without the.conf
suffix. The service also uses this name for the virtual network interface.
Next steps
- Configure the firewalld service on the WireGuard server.
Verification
Display the interface configuration of the
wg0
device:# wg show wg0interface: wg0 public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE= private key: (hidden) listening port: 51820peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM= allowed ips: 192.0.2.2/32, 2001:db8:1::2/128
To display the private key in the output, use the
WG_HIDE_KEYS=never wg show wg0
command.Display the IP configuration of the
wg0
device:# ip address show wg020: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.0.2.1/24 scope global wg0 valid_lft forever preferred_lft forever inet6 2001:db8:1::1/32 scope global valid_lft forever preferred_lft forever
Additional resources
- The
wg(8)
man page - The
wg-quick(8)
man page
8.9.Configuring firewalld on a WireGuard server by using the command line
You must configure the firewalld
service on the WireGuard server to allow incoming connections from clients. Additionally, if clients should be able to use the WireGuard server as the default gateway and route all traffic through the tunnel, you must enable masquerading.
Procedure
Open the WireGuard port for incoming connections in the
firewalld
service:# firewall-cmd --permanent --add-port=51820/udp --zone=public
If clients should route all traffic through the tunnel and use the WireGuard server as the default gateway, enable masquerading for the
public
zone:# firewall-cmd --permanent --zone=public --add-masquerade
Reload the
firewalld
rules.# firewall-cmd --reload
Verification
Display the configuration of the
public
zone:# firewall-cmd --list-allpublic (active) ... ports: 51820/udp masquerade: yes ...
Additional resources
- The
firewall-cmd(1)
man page
8.10.Configuring firewalld on a WireGuard server by using the graphical interface
You must configure the firewalld
service on the WireGuard server to allow incoming connections from clients. Additionally, if clients should be able to use the WireGuard server as the default gateway and route all traffic through the tunnel, you must enable masquerading.
Procedure
- Press the Super key, enter
firewall
, and select theFirewall
application from the results. - Select
Permanent
in theConfiguration
list. - Select the
public
zone. Allow incoming connections to the WireGuard port:
- On the
Ports
tab, click Add. - Enter the port number you set for incoming WireGuard connections:
- Select
udp
from theProtocol
list. - Click OK.
- On the
If clients should route all traffic through the tunnel and use the WireGuard server as the default gateway:
- Navigate to the
Masquerading
tab of thepublic
zone. - Select
Masquerade zone
.
- Navigate to the
- Select Options → Reload Firewalld.
Verification
Display the configuration of the
public
zone:# firewall-cmd --list-allpublic (active) ... ports: 51820/udp masquerade: yes ...
8.11.Configuring a WireGuard client by using nmcli
You can configure a WireGuard client by creating a connection profile in NetworkManager. Use this method to let NetworkManager manage the WireGuard connection.
This procedure assumes the following settings:
Client:
- Private key:
aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A=
- Tunnel IPv4 address:
192.0.2.2/24
- Tunnel IPv6 address:
2001:db8:1::2/32
- Private key:
Server:
- Public key:
UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
- Tunnel IPv4 address:
192.0.2.1/24
- Tunnel IPv6 address:
2001:db8:1::1/32
- Public key:
Prerequisites
- You have generated the public and private key for both the server and client.
You know the following information:
- The private key of the client
- The static tunnel IP addresses and subnet masks of the client
- The public key of the server
- The static tunnel IP addresses and subnet masks of the server
Procedure
Add a NetworkManager WireGuard connection profile:
# nmcli connection add type wireguard con-name client-wg0 ifname wg0 autoconnect no
This command creates a profile named
client-wg0
and assigns the virtual interfacewg0
to it. To prevent the connection from starting automatically after you add it without finalizing the configuration, disable theautoconnect
parameter.Optional: Configure NetworkManager so that it does not automatically start the
client-wg
connection:# nmcli connection modify client-wg0 autoconnect no
Set the tunnel IPv4 address and subnet mask of the client:
# nmcli connection modify client-wg0 ipv4.method manual ipv4.addresses 192.0.2.2/24
Set the tunnel IPv6 address and subnet mask of the client:
# nmcli connection modify client-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::2/32
If you want to route all traffic through the tunnel, set the tunnel IP addresses of the server as the default gateway:
# nmcli connection modify client-wg0 ipv4.gateway 192.0.2.1 ipv6.gateway 2001:db8:1::1
Routing all traffic through the tunnel requires that you set, in a later step, the
allowed-ips
on the this client to0.0.0.0/0;::/0
.Note that routing all traffic through the tunnel can impact the connectivity to other hosts based on the server routing and firewall configuration.
Add the client’s private key to the connection profile:
# nmcli connection modify client-wg0 wireguard.private-key "aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A="
Add peer configurations for each server that you want to allow to communicate with this client. You must add these settings manually, because the
nmcli
utility does not support setting the corresponding connection properties.Edit the
/etc/NetworkManager/system-connections/client-wg0.nmconnection
file, and append:[wireguard-peer.UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=]endpoint=server.example.com:51820allowed-ips=192.0.2.1;2001:db8:1::1;persistent-keepalive=20
- The
[wireguard-peer.<public_key_of_the_server>]
entry defines the peer section of the server, and the section name has the public key of the server. - The
endpoint
parameter sets the hostname or IP address and the port of the server. The client uses this information to establish the connection. The
allowed-ips
parameter sets a list of IP addresses that can send data to this client. For example, set the parameter to:- The tunnel IP addresses of the server to allow only the server to communicate with this client. The value in the example above configures this scenario.
0.0.0.0/0;::/0;
to allow any remote IPv4 and IPv6 address to communicate with this client. Use this setting to route all traffic through the tunnel and use the WireGuard server as default gateway.
- The optional
persistent-keepalive
parameter defines an interval in seconds in which WireGuard sends a keep alive packet to the server. Set this parameter if you use the client in a network with network address translation (NAT) or if a firewall closes the UDP connection after some time of inactivity.
- The
Reload the
client-wg0
connection profile:# nmcli connection load /etc/NetworkManager/system-connections/client-wg0.nmconnection
Reactivate the
client-wg0
connection:# nmcli connection up client-wg0
Verification
Ping the IP addresses of the server:
# ping 192.0.2.1# ping6 2001:db8:1::1
Display the interface configuration of the
wg0
device:# wg show wg0interface: wg0 public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM= private key: (hidden) listening port: 51820peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE= endpoint: server.example.com:51820 allowed ips: 192.0.2.1/32, 2001:db8:1::1/128 latest handshake: 1 minute, 41 seconds ago transfer: 824 B received, 1.01 KiB sent persistent keepalive: every 20 seconds
To display the private key in the output, use the
WG_HIDE_KEYS=never wg show wg0
command.Note that the output has only the
latest handshake
andtransfer
entries if you have already sent traffic through the VPN tunnel.Display the IP configuration of the
wg0
device:# ip address show wg010: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.0.2.2/24 brd 192.0.2.255 scope global noprefixroute wg0 valid_lft forever preferred_lft forever inet6 2001:db8:1::2/32 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::73d9:6f51:ea6f:863e/64 scope link noprefixroute valid_lft forever preferred_lft forever
Additional resources
- The
wg(8)
man page - The
WireGuard setting
section in thenm-settings(5)
man page
8.12.Configuring a WireGuard client by using nmtui
You can configure a WireGuard client by creating a connection profile in NetworkManager. Use this method to let NetworkManager manage the WireGuard connection.
This procedure assumes the following settings:
Client:
- Private key:
aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A=
- Tunnel IPv4 address:
192.0.2.2/24
- Tunnel IPv6 address:
2001:db8:1::2/32
- Private key:
Server:
- Public key:
UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
- Tunnel IPv4 address:
192.0.2.1/24
- Tunnel IPv6 address:
2001:db8:1::1/32
- Public key:
Prerequisites
- You have generated the public and private key for both the server and client.
You know the following information:
- The private key of the client
- The static tunnel IP addresses and subnet masks of the client
- The public key of the server
- The static tunnel IP addresses and subnet masks of the server
- You installed the
NetworkManager-tui
package
Procedure
Start the
nmtui
application:# nmtui
- Select
Edit a connection
, and press Enter. - Select Add, and press Enter.
- Select the
WireGuard
connection type in the list, and press Enter. In the
Edit connection
window:- Enter the name of the connection and the virtual interface, such as
wg0
, that NetworkManager should assign to the connection. Enter the private key of the client.
Click Add next to the
Peers
pane:- Enter the public key of the server.
Set the
Allowed IPs
field. For example, set it to:- The tunnel IP addresses of the server to allow only the server to communicate with this client.
0.0.0.0/0,::/0
to allow any remote IPv4 and IPv6 address to communicate with this client. Use this setting to route all traffic through the tunnel and use the WireGuard server as default gateway.
- Enter the host name or IP address and port of the WireGuard server into the
Endpoint
field. Use the following format:hostname_or_IP:port_number
- Optional: If you use the client in a network with network address translation (NAT) or if a firewall closes the UDP connection after some time of inactivity, set a persistent keep alive interval in seconds. In this interval, the client sends a keepalive packet to the server.
Select OK, and press Enter.
Select Show next to
IPv4 Configuration
, and press Enter.- Select the IPv4 configuration method
Manual
. - Enter the tunnel IPv4 address and the subnet mask. Leave the
Gateway
field empty.
- Select the IPv4 configuration method
Select Show next to
IPv6 Configuration
, and press Enter.- Select the IPv6 configuration method
Manual
. - Enter the tunnel IPv6 address and the subnet mask. Leave the
Gateway
field empty.
- Select the IPv6 configuration method
- Optional: Select
Automatically connect
. Select OK, and press Enter
- Enter the name of the connection and the virtual interface, such as
- In the window with the list of connections, select Back, and press Enter.
- In the
NetworkManager TUI
main window, select Quit, and press Enter.
Verification
Ping the IP addresses of the server:
# ping 192.0.2.1# ping6 2001:db8:1::1
Display the interface configuration of the
wg0
device:# wg show wg0interface: wg0 public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM= private key: (hidden) listening port: 51820peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE= endpoint: server.example.com:51820 allowed ips: 192.0.2.1/32, 2001:db8:1::1/128 latest handshake: 1 minute, 41 seconds ago transfer: 824 B received, 1.01 KiB sent persistent keepalive: every 20 seconds
To display the private key in the output, use the
WG_HIDE_KEYS=never wg show wg0
command.Note that the output contains only the
latest handshake
andtransfer
entries if you have already sent traffic through the VPN tunnel.Display the IP configuration of the
wg0
device:# ip address show wg010: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.0.2.2/24 brd 192.0.2.255 scope global noprefixroute wg0 valid_lft forever preferred_lft forever inet6 2001:db8:1::2/32 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::73d9:6f51:ea6f:863e/64 scope link noprefixroute valid_lft forever preferred_lft forever
Additional resources
- The
wg(8)
man page
8.13.Configuring a WireGuard client by using nm-connection-editor
You can configure a WireGuard client by creating a connection profile in NetworkManager. Use this method to let NetworkManager manage the WireGuard connection.
Prerequisites
- You have generated the public and private key for both the server and client.
You know the following information:
- The private key of the client
- The static tunnel IP addresses and subnet masks of the client
- The public key of the server
- The static tunnel IP addresses and subnet masks of the server
Procedure
Open a terminal, and enter:
# nm-connection-editor
- Add a new connection by clicking the + button.
- Select the
WireGuard
connection type, and click Create. - Optional: Update the connection name.
- Optional: On the
General
tab, selectConnect automatically with priority
. On the
WireGuard
tab:- Enter the name of the virtual interface, such as
wg0
, that NetworkManager should assign to the connection. - Enter client’s private key.
Click Add to add peers:
- Enter the public key of the server.
Set the
Allowed IPs
field. For example, set it to:- The tunnel IP addresses of the server to allow only the server to communicate with this client.
0.0.0.0/0;::/0;
to allow any remote IPv4 and IPv6 address to communicate with this client. Use this setting to route all traffic through the tunnel and use the WireGuard server as default gateway.Note that routing all traffic through the tunnel can impact the connectivity to other hosts based on the server routing and firewall configuration.
- Enter the hostname or IP address and port of the WireGuard server into the
Endpoint
field. Use the following format:hostname_or_IP:port_number
- Optional: If you use the client in a network with network address translation (NAT) or if a firewall closes the UDP connection after some time of inactivity, set a persistent keep alive interval in seconds. In this interval, the client sends a keep alive packet to the server.
- Click Apply.
- Enter the name of the virtual interface, such as
On the
IPv4 Settings
tab:- Select
Manual
in theMethod
list. - Click Add to enter the tunnel IPv4 address and the subnet mask.
If you want to route all traffic through the tunnel, set the tunnel IPv4 address of the server in the
Gateway
field. Otherwise, leave the field empty.Routing all IPv4 traffic through the tunnel requires that you included
0.0.0.0/0
in theAllowed IPs
field on this client.
- Select
On the
IPv6 Settings
tab:- Select
Manual
in theMethod
list. - Click Add to enter the tunnel IPv6 address and the subnet mask.
If you want to route all traffic through the tunnel, set the tunnel IPv6 address of the server in the
Gateway
field. Otherwise, leave the field empty.Routing all IPv4 traffic through the tunnel requires that you included
::/0
in theAllowed IPs
field on this client.
- Select
- Click Save to store the connection profile.
Verification
Ping the IP addresses of the server:
# ping 192.0.2.1# ping6 2001:db8:1::1
Display the interface configuration of the
wg0
device:# wg show wg0interface: wg0 public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM= private key: (hidden) listening port: 51820peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE= endpoint: server.example.com:51820 allowed ips: 192.0.2.1/32, 2001:db8:1::1/128 latest handshake: 1 minute, 41 seconds ago transfer: 824 B received, 1.01 KiB sent persistent keepalive: every 20 seconds
To display the private key in the output, use the
WG_HIDE_KEYS=never wg show wg0
command.Note that the output only has the
latest handshake
andtransfer
entries if you have already sent traffic through the VPN tunnel.Display the IP configuration of the
wg0
device:# ip address show wg010: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.0.2.2/24 brd 192.0.2.255 scope global noprefixroute wg0 valid_lft forever preferred_lft forever inet6 2001:db8:1::2/32 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::73d9:6f51:ea6f:863e/64 scope link noprefixroute valid_lft forever preferred_lft forever
Additional resources
- The
wg(8)
man page
8.14.Configuring a WireGuard client by using the wg-quick service
You can configure a WireGuard client by creating a configuration file in the /etc/wireguard/
directory. Use this method to configure the service independently from NetworkManager.
This procedure assumes the following settings:
Client:
- Private key:
aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A=
- Tunnel IPv4 address:
192.0.2.2/24
- Tunnel IPv6 address:
2001:db8:1::2/32
- Private key:
Server:
- Public key:
UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
- Tunnel IPv4 address:
192.0.2.1/24
- Tunnel IPv6 address:
2001:db8:1::1/32
- Public key:
Prerequisites
- You have generated the public and private key for both the server and client.
You know the following information:
- The private key of the client
- The static tunnel IP addresses and subnet masks of the client
- The public key of the server
- The static tunnel IP addresses and subnet masks of the server
Procedure
Install the
wireguard-tools
package:# dnf install wireguard-tools
Create the
/etc/wireguard/wg0.conf
file with the following content:[Interface]Address = 192.0.2.2/24, 2001:db8:1::2/32PrivateKey = aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A=[Peer]PublicKey = UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=AllowedIPs = 192.0.2.1, 2001:db8:1::1Endpoint = server.example.com:51820PersistentKeepalive = 20
The
[Interface]
section describes the WireGuard settings of the interface on the client:Address
: A comma-separated list of the client’s tunnel IP addresses.PrivateKey
: The private key of the client.
The
[Peer]
section describes the settings of the server:PublicKey
: The public key of the server.AllowedIPs
: The IP addresses that are allowed to send data to this client. For example, set the parameter to:- The tunnel IP addresses of the server to allow only the server to communicate with this client. The value in the example above configures this scenario.
0.0.0.0/0, ::/0
to allow any remote IPv4 and IPv6 address to communicate with this client. Use this setting to route all traffic through the tunnel and use the WireGuard server as default gateway.
Endpoint
: Sets the hostname or IP address and the port of the server. The client uses this information to establish the connection.- The optional
persistent-keepalive
parameter defines an interval in seconds in which WireGuard sends a keepalive packet to the server. Set this parameter if you use the client in a network with network address translation (NAT) or if a firewall closes the UDP connection after some time of inactivity.
Enable and start the WireGuard connection:
# systemctl enable --now wg-quick@wg0
The systemd instance name must match the name of the configuration file in the
/etc/wireguard/
directory without the.conf
suffix. The service also uses this name for the virtual network interface.
Verification
Ping the IP addresses of the server:
# ping 192.0.2.1# ping6 2001:db8:1::1
Display the interface configuration of the
wg0
device:# wg show wg0interface: wg0 public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM= private key: (hidden) listening port: 51820peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE= endpoint: server.example.com:51820 allowed ips: 192.0.2.1/32, 2001:db8:1::1/128 latest handshake: 1 minute, 41 seconds ago transfer: 824 B received, 1.01 KiB sent persistent keepalive: every 20 seconds
To display the private key in the output, use the
WG_HIDE_KEYS=never wg show wg0
command.Note that the output contains only the
latest handshake
andtransfer
entries if you have already sent traffic through the VPN tunnel.Display the IP configuration of the
wg0
device:# ip address show wg010: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.0.2.2/24 scope global wg0 valid_lft forever preferred_lft forever inet6 2001:db8:1::2/32__ scope global valid_lft forever preferred_lft forever
Additional resources
- The
wg(8)
man page - The
wg-quick(8)
man page