Install WireGuard on Ubuntu 22.04
WireGuard and Ubuntu
What is WireGuard?
Have you ever worried about your privacy while using the free Wi-Fi at a coffee shop or hotel? A Virtual Private Network (VPN) solves this by creating a secure, secret tunnel for your internet traffic, keeping your data safe from prying eyes no matter where you are. WireGuard is a modern, incredibly fast, and lightweight VPN designed to give you this peace of mind without slowing down your connection.
Unlike older VPN options that are bulky and complicated to set up, WireGuard is built for speed and simplicity. Traditional VPNs rely on hundreds of confusing security formulas and certificates, which can make them sluggish and prone to configuration errors. In contrast, WireGuard uses a streamlined "lock and key" system with public and private keys to connect devices securely, making it faster, less demanding on your battery, and far easier to get right.
In this tutorial, you will learn exactly how to build your own secure VPN step-by-step. We will guide you through setting up a WireGuard server on Ubuntu 22.04 and connecting another device to it using modern IPv4 and IPv6 internet connections. By the end, you will know how to route all of your device's web traffic through your new secure gateway, giving you a completely private internet experience wherever you go.
Prerequisites
- A WireGuard Server: An Ubuntu 22.04 server set up with a basic firewall and a non-root user (a regular user account with admin privileges).
- A WireGuard Peer: The device you want to connect to your new VPN, such as your personal computer or smartphone. (Note: If you use a remote server as your peer instead of your local device, be sure to follow the steps carefully so you don't accidentally lock yourself out!)
- IPv6 Capability (Optional): If you want to use modern IPv6 connections, make sure your server is configured to support it.
Step 1 — Installing WireGuard and Generating a Key Pair
sudo password to give the server permission to make these changes.
sudo apt update sudo apt install wireguard
- Create the Keys: Use the built-in
wg genkeycommand to generate your secret private key, and thewg pubkeycommand to create your matching public key. - Lock it Down: After adding the private key to your configuration file, you must use the
chmodcommand to restrict the file's permissions. This is a crucial security step because it prevents anyone else on the server from reading your secret key.
wg genkey | sudo tee /etc/wireguard/private.key sudo chmod go= /etc/wireguard/private.key
sudo chmod go=... command removes all permissions for group and other users so only root can access the private key file. The command outputs a single line of base64-encoded text representing the private key, while tee also saves a copy to /etc/wireguard/private.key for later use. You should record this key because it will be needed in the WireGuard configuration. The next step is generating the public key derived from this private key.
sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
| (pipe) operator to pass output between commands:
sudo cat /etc/wireguard/private.keyreads the private key file and sends it to standard output.wg pubkeytakes that output as input and generates the corresponding public key.sudo tee /etc/wireguard/public.keysaves the generated public key into/etc/wireguard/public.key.
base64 encoded text, which is the WireGuard server’s public key. This public key should be copied and shared with peers that need to connect to the server.
Step 2 — Choosing IPv4 and IPv6 Addresses
Step 2(a) — Choosing an IPv4 Range
10.0.0.0to10.255.255.255(10/8 prefix)172.16.0.0to172.31.255.255(172.16/12 prefix)192.168.0.0to192.168.255.255(192.168/16 prefix)
10.8.0.0/24 as the private IP range for WireGuard. This range supports up to 255 peer connections and is chosen to avoid conflicts with other private networks. You can choose a different range if it fits your network configuration better.
10.8.0.1/24 is used, but any address between 10.8.0.1 and 10.8.0.255 would work. If you choose a different address, remember it, because you’ll need to include it later in the server configuration file when creating the WireGuard server config in Step 3.
Step 2(b) — Choosing an IPv6 Range
fd00::/8 block, adhering to the algorithm outlined in RFC 4193. This method ensures uniqueness by hashing a system identifier together with the current time. To begin this process, use the date utility to capture a 64-bit timestamp by running the following command.
date +%s%N
date command, %s corresponds to the seconds part, and %N corresponds to the nanoseconds part:
1650301699497770167
machine-id from the /var/lib/dbus/machine-id file on your server. This ID is unique to your system and will remain the same for the lifetime of the server.
cat /var/lib/dbus/machine-id
/var/lib/dbus/machine-id 610cef4946ed46da8f71dba9d66c67fb
machine-id and generate a hash of the combined value using the SHA-1 algorithm. The command should follow this format:
printf <timestamp><machine-id> | sha1sum
printf 1650301699497770167610cef4946ed46da8f71dba9d66c67fb | sha1sum
442adea1488d96388dae9ab816045b24609a6c18 -
sha1sum command is hexadecimal, meaning each byte of data is represented by two characters. For instance, 4f and 26 in the example correspond to the first two bytes of the hash.
cut command to extract the last 5 hexadecimal bytes from the hashed output:
printf 442adea1488d96388dae9ab816045b24609a6c18 | cut -c 31-
-c option in the cut command specifies that only certain characters should be selected. Using 31- instructs cut to display all characters starting from position 31 through to the end of the line.
24609a6c18
24 60 9a 6c 18.
fd prefix. For better readability, separate every two bytes with a colon :. Since each subnet within your unique prefix can accommodate 18,446,744,073,709,551,616 IPv6 addresses, it’s common to limit the subnet to a /64 size for simplicity.
/64 subnet, your resulting prefix will be:
Unique Local IPv6 Address Prefix fd24:609a:6c18::/64
fd24:609a:6c18::/64 range to assign IP addresses to the WireGuard tunnel interfaces on both the server and its peers. To assign an IP to the server, append 1 after the final ::, giving you fd24:609a:6c18::1/64. For peers, you can pick any address within this range, usually incrementing by one for each new peer—for example, fd24:609a:6c18::2/64. Be sure to note these IPs before moving on to set up the WireGuard server in the next part of the tutorial.
Step 3 — Creating a WireGuard Server Configuration
- Ensure you have the private key generated in Step 1 — Installing WireGuard and Generating a Key Pair.
- If using WireGuard with IPv4, have the server IP you selected in Step 2(a) — Choosing an IPv4 Range. In this example, it’s
10.8.0.1/24. - If using WireGuard with IPv6, have the server IP from Step 2(b) — Choosing an IPv6 Range. In this example, it’s
fd24:609a:6c18::1/64.
nano) and running the following command:
sudo nano /etc/wireguard/wg0.conf
base64_encoded_private_key_goes_here with your actual private key, and updating the Address line with your IP address(es). You can also modify the ListenPort line if you want WireGuard to use a different port:
/etc/wireguard/wg0.conf [Interface] PrivateKey =base64_encoded_private_key_goes_hereAddress =10.8.0.1/24,fd24:609a:6c18::1/64ListenPort = 51820 SaveConfig = true
SaveConfig line makes sure that any changes made to the WireGuard interface are saved back to the configuration file when the interface is stopped.
/etc/wireguard/wg0.conf file. If you’re using nano, press CTRL+X, then Y, and hit ENTER to confirm. You now have a basic server configuration that can be expanded based on how you intend to use your WireGuard VPN server.
Step 4 — Adjusting the WireGuard Server’s Network Configuration
/etc/sysctl.conf file using nano or your preferred text editor:
sudo nano /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
sudo sysctl -p
net.ipv6.conf.all.forwarding = 1 net.ipv4.ip_forward = 1
Step 5 — Configuring the WireGuard Server’s Firewall
ip route command:
ip route list default
eth0, which is highlighted below:
default via 203.0.113.1 dev eth0 proto static
/etc/wireguard/wg0.conf file using nano or your preferred text editor.
sudo nano /etc/wireguard/wg0.conf
SaveConfig = true line, paste the following lines:
/etc/wireguard/wg0.conf . . . PostUp = ufw route allow in on wg0 out on eth0 PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE PreDown = ufw route delete allow in on wg0 out on eth0 PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PostUp lines execute when the WireGuard server starts the VPN tunnel. In this example, they add three UFW and iptables rules:
ufw route allow in on wg0 out on eth0– This allows IPv4 and IPv6 traffic coming into thewg0VPN interface to be forwarded to the server’seth0network interface. It works together with thenet.ipv4.ip_forwardandnet.ipv6.conf.all.forwardingsysctl settings you configured earlier.iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE– Enables masquerading for IPv4 traffic, rewriting packets fromwg0so they appear to originate from the server’s public IPv4 address.ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE– Enables masquerading for IPv6 traffic, rewriting packets fromwg0so they appear to originate from the server’s public IPv6 address.
PreDown lines run when the VPN tunnel is stopped. They reverse the PostUp rules, removing forwarding and masquerading settings for the VPN interface.
ip6tables lines. If using only IPv6, keep only the ip6tables lines. The UFW lines should remain regardless of whether you use IPv4, IPv6, or both. Save and close the file when done.
/etc/wireguard/wg0.conf, this will be 51820. If you chose a different port, use that instead in the UFW command.
sudo ufw allow 51820/udp sudo ufw allow OpenSSH
Note: If you’re using a different firewall or have a customized UFW setup, you might need to add extra rules. For instance, if you route all network traffic through the VPN, you must allow port 53 for DNS queries, and ports 80 and 443 for HTTP and HTTPS traffic. Any additional protocols used over the VPN will also require corresponding firewall rules.
sudo ufw disable sudo ufw enable
ufw status command. When you run it, you should see output similar to this:
sudo ufw status
Status: active To Action From -- ------ ---- 51280/udp ALLOW Anywhere 22/tcp ALLOW Anywhere 51280/udp (v6) ALLOW Anywhere (v6) 22/tcp (v6) ALLOW Anywhere (v6)
Step 6 — Starting the WireGuard Server
systemd service using its built-in wg-quick script. While you could manually use the wg command to create the tunnel every time you want to use the VPN, doing so is a manual process that becomes repetitive and error prone. Instead, you can use systemctl to manage the tunnel with the help of the wg-quick script.
systemd service means that you can configure WireGuard to start up at boot so that you can connect to your VPN at any time as long as the server is running. To do this, enable the wg-quick service for the wg0 tunnel that you’ve defined by adding it to systemctl:
sudo systemctl enable wg-quick@wg0.service
Notice that the command specifies the name of the tunnel wg0 device name as a part of the service name. This name maps to the /etc/wireguard/wg0.conf configuration file. This approach to naming means that you can create as many separate VPN tunnels as you would like using your server.
For example, you could have a tunnel device and name of prod and its configuration file would be /etc/wireguard/prod.conf. Each tunnel configuration can contain different IPv4, IPv6, and client firewall settings. In this way you can support multiple different peer connections, each with their own unique IP addresses and routing rules.
sudo systemctl start wg-quick@wg0.service
active (running) in the output:
sudo systemctl status wg-quick@wg0.service
wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled)
Active: active (exited) since Mon 2022-04-18 17:22:13 UTC; 2s ago
Docs: man:wg-quick(8)
man:wg(8)
https://www.wireguard.com/
https://www.wireguard.com/quickstart/
https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
Process: 98834 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
Main PID: 98834 (code=exited, status=0/SUCCESS)
CPU: 193ms
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] wg setconf wg0 /dev/fd/63
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -4 address add 10.8.0.1/24 dev wg0
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -6 address add fd24:609a:6c18::1/64 dev wg0
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip link set mtu 1420 up dev wg0
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ufw route allow in on wg0 out on ens3
Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added
Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added (v6)
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip6tables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
Apr 18 17:22:13 thats-my-jam systemd[1]: Finished WireGuard via wg-quick(8) for wg0.
ip commands used to create the virtual wg0 device and assign it the IPv4 and IPv6 addresses specified in your configuration file. You can use these commands to troubleshoot the tunnel or manually configure the VPN interface using the wg command.
Step 7 — Configuring a WireGuard Peer
wg-quick script.
apt commands on the peer machine:
sudo apt update sudo apt install wireguard
Creating the WireGuard Peer’s Key Pair
wg genkey | sudo tee /etc/wireguard/private.key sudo chmod go= /etc/wireguard/private.key
base64 encoded output, which is the private key. A copy is also saved at /etc/wireguard/private.key. Be sure to record this private key, as you’ll need it later when setting up the WireGuard configuration file.
sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
base64 encoded output again this time it’s the public key for your WireGuard peer. Save a copy of it, as you’ll need to provide this public key to the WireGuard server to set up the encrypted connection.
Creating the WireGuard Peer’s Configuration File
- The
base64encoded private key generated on the peer. - The IPv4 and IPv6 address ranges configured on the WireGuard server.
- The WireGuard server’s
base64encoded public key. - The public IP address and port used by the WireGuard server. This is typically the server’s IPv4 address, but if the server has an IPv6 address and the client also has IPv6 internet connectivity, you can use that instead.
/etc/wireguard/wg0.conf file on the peer machine using nano or any text editor you prefer:
sudo nano /etc/wireguard/wg0.conf
/etc/wireguard/wg0.conf [Interface] PrivateKey =base64_encoded_peer_private_key_goes_hereAddress =10.8.0.2/24Address =fd24:609a:6c18::2/64[Peer] PublicKey =U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=AllowedIPs =10.8.0.0/24,fd24:609a:6c18::/64Endpoint =203.0.113.1:51820
Address line contains an IPv4 address from the 10.8.0.0/24 subnet you selected earlier. This address can be any unused IP within that subnet, as long as it doesn’t match the server’s IP. A simple approach is to increase the address by one each time you add a new peer.
Address line uses an IPv6 address from the subnet you generated previously, typically by incrementing the server’s IPv6 address by one. Any unused IP within that range can be assigned if you prefer a different value.
AllowedIPs line. The IPv4 and IPv6 ranges specified there tell the peer to route traffic through the VPN only when the destination IP falls within those ranges. With the AllowedIPs setting, you can limit the VPN to communication between peers and internal services, or configure it to route all traffic through the VPN so that the WireGuard server acts as a gateway.
fd24:609a:6c18::/64 portion (including the comma). On the other hand, if you are using only IPv6, keep the fd24:609a:6c18::/64 prefix and remove the 10.8.0.0/24 IPv4 range.
0.0.0.0/0 for the entire IPv4 address space and ::/0 for the entire IPv6 address space.
(Optional) Configuring a Peer to Route All Traffic Over the Tunnel
0.0.0.0/0 or ::/0 routes and the peer is a remote system, you should follow the steps in this section. However, if the peer is a local machine, it’s better to skip this part.
wg0.conf file. These rules make sure that you can still reach the system from outside the VPN while the tunnel is active. Without them, once the tunnel is established, traffic that normally uses the public network interface may not be routed correctly and could be forced through the wg0 tunnel interface, potentially making the remote system unreachable.
ip route command:
ip route list table main default
default via203.0.113.1deveth0proto static
203.0.113.1, as well as the network interface eth0, since you’ll need them later. Your interface name may be different, so replace eth0 with the appropriate device name in the upcoming commands if necessary.
ip address show command:
ip -brief address show eth0
eth0 UP 203.0.113.5/20 10.20.30.40/16 2604:a880:400:d1::3d3:6001/64 fe80::68d5:beff:feff:974c/64
203.0.113.5 (excluding the /20 suffix) is the public IP assigned to the eth0 interface. You’ll need to include this address in the WireGuard configuration.
/etc/wireguard/wg0.conf file using nano or any text editor you prefer.
sudo nano /etc/wireguard/wg0.conf
[Peer] line, add the following 4 lines:
PostUp = ip rule add table 200 from203.0.113.5PostUp = ip route add table 200 default via203.0.113.1PreDown = ip rule delete table 200 from203.0.113.5PreDown = ip route delete table 200 default via203.0.113.1[Peer] . . .
PostUp = ip rule add table 200 from 203.0.113.5– This command creates a rule that checks routing entries in table 200 whenever the source IP matches the system’s public address203.0.113.5.PostUp = ip route add table 200 default via 203.0.113.1– This command sets the default route for table 200, directing traffic through the gateway203.0.113.1rather than the WireGuard interface.
PreDown lines remove this custom rule and route when the VPN tunnel is stopped.
200 used in these rules is simply an example and can be changed. You may choose any value between 2 and 252, or define a custom name by adding a label in the /etc/iproute2/rt_tables file and referencing that name instead of a numeric table ID.
sysctl and iptables rules on the WireGuard Server in Step 4 — Adjusting the WireGuard Server’s Network Configuration and Step 5 — Configuring the WireGuard Server’s Firewall.
(Optional) Configuring the WireGuard Peer’s DNS Resolvers
[Interface] section of the configuration. Without this setting, DNS queries might not pass through the VPN and could instead be visible to your Internet Service Provider or other third parties.
eth0 with your network interface name if it differs in your setup):
resolvectl dns eth0
Link 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888
/etc/wireguard/wg0.conf file using nano or your preferred text editor:
sudo nano /etc/wireguard/wg0.conf
[Peer] line, add the following:
DNS = 67.207.67.2 2001:4860:4860::8844 [Peer] . . .
After connecting to the VPN in the next step, you can verify that your DNS requests are being routed through the VPN by using a website.
You can also confirm that the peer is using the configured DNS servers by running the resolvectl dns command, just as you did on the server. The output should display the DNS resolvers you specified for the VPN tunnel.
Output Global: 67.207.67.2 67.207.67.3 . . .
Step 8 — Adding the Peer’s Public Key to the WireGuard Server
base64 encoded public key by running:
sudo cat /etc/wireguard/public.key
PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd24:609a:6c18::2
allowed-ips part of the command accepts a comma-separated list of IPv4 and IPv6 addresses. You can specify individual IPs to restrict which address a peer can use, or provide a range if peers are allowed to choose any IP within the VPN subnet. Each peer must have a unique allowed-ips setting no duplicates are allowed.
allowed-ips for an existing peer, you can rerun the command with the new IP addresses. Multiple IPs are supported. For example, to add 10.8.0.100 to a peer that already has 10.8.0.2 and fd24:609a:6c18::2 assigned, you would run the following:
sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd24:609a:6c18::2
wg command:
sudo wg
interface: wg0 public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= private key: (hidden) listening port: 51820 peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed ips: 10.8.0.2/32, fd24:609a:6c18::/128
peer entry displays the WireGuard peer’s public key along with the IP address or range it is permitted to use.
Step 9 — Connecting the WireGuard Peer to the Tunnel
wg-quick command. If you prefer the tunnel to start automatically like on the server, follow the instructions in Step 6 — Starting the WireGuard Server instead of using wg-quick.
resolvconf utility on the WireGuard peer before starting the tunnel. Use the following command to do this:
sudo apt install resolvconf
sudo wg-quick up wg0
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.8.0.2/24 dev wg0 [#] ip -6 address add fd24:609a:6c18::2/64 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] resolvconf -a tun.wg0 -m 0 -x
AllowedIPs to 0.0.0.0/0 and ::/0 (or to ranges different from the ones defined for the VPN), the output will look similar to the following:
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.8.0.2/24 dev wg0 [#] ip -6 address add fd24:609a:6c18::2/64 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] resolvconf -a tun.wg0 -m 0 -x [#] wg set wg0 fwmark 51820 [#] ip -6 route add ::/0 dev wg0 table 51820 [#] ip -6 rule add not fwmark 51820 table 51820 [#] ip -6 rule add table main suppress_prefixlength 0 [#] ip6tables-restore -n [#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820 [#] ip -4 rule add not fwmark 51820 table 51820 [#] ip -4 rule add table main suppress_prefixlength 0 [#] sysctl -q net.ipv4.conf.all.src_valid_mark=1 [#] iptables-restore -n
AllowedIPs specified in the peer’s configuration.
wg command:
sudo wg
interface: wg0 public key: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= private key: (hidden) listening port: 49338 fwmark: 0xca6c peer: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= endpoint: 203.0.113.1:51820 allowed ips: 10.8.0.0/24, fd24:609a:6c18::/64 latest handshake: 1 second ago transfer: 6.50 KiB received, 15.41 KiB sent
ip route and ip -6 route commands. If the VPN is configured as a gateway for all Internet traffic, verify which interface is being used for traffic to Cloudflare’s DNS servers at 1.1.1.1 and 2606:4700:4700::1111.
10.8.0.1 or fd24:609a:6c18::1.
ip route get 1.1.1.1
1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000 cache
wg0 interface is being used along with the IPv4 address 10.8.0.2 assigned to the peer. Similarly, if you are using IPv6, run the following command:
ip -6 route get 2606:4700:4700::1111
2606:4700:4700::1111 from :: dev wg0 table 51820 src fd24:609a:6c18::2 metric 1024 pref medium
wg0 interface and the IPv6 address fd24:609a:6c18::2 assigned to the peer.
wg-quick command:
sudo wg-quick down wg0
[#] ip link delete dev wg0 [#] resolvconf -d tun.wg0 -f
AllowedIPs are configured as 0.0.0.0/0 and ::/0 (or if you use ranges different from the ones defined for the VPN), the output will look similar to the following:
[#] ip rule delete table 200 from 203.0.113.5 [#] ip route delete table 200 default via 203.0.113.1 [#] ip -4 rule delete table 51820 [#] ip -4 rule delete table main suppress_prefixlength 0 [#] ip -6 rule delete table 51820 [#] ip -6 rule delete table main suppress_prefixlength 0 [#] ip link delete dev wg0 [#] resolvconf -d tun.wg0 -f [#] iptables-restore -n [#] ip6tables-restore -n
wg-quick up wg0 again. If you want to fully remove a peer’s configuration from the WireGuard server, use the following command, making sure to replace it with the correct public key of the peer you wish to delete:
sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove
allowed-ips every time.
CTCservers Recommended Tutorials
Web, Network
Step-by-Step Guide: Install AMD ROCm on Ubuntu with RX 6600 GPU
Learn how to quickly and easily set up AMD ROCm on Ubuntu for your RX 6600 GPU, enabling powerful machine learning, AI workloads, and GPU-accelerated computing right on your system.
Web, Network, Linux, Mysql, Ubuntu
LAMP Setup Guide 2026: Ubuntu & Debian | CTCservers
Install a secure LAMP stack on Debian or Ubuntu. Follow our step-by-step guide to configure Linux, Apache, MySQL, and PHP for your web server.
Web, Network, Ubuntu
Deploy Phi-3 with Ollama on Ubuntu GPU | CTCservers
Learn how to easily deploy the Phi-3 LLM on an Ubuntu 24.04 GPU server using Ollama and WebUI. Follow our step-by-step tutorial for seamless AI hosting.
Discover CTCservers Dedicated Server Locations
CTCservers servers are available around the world, providing diverse options for hosting websites. Each region offers unique advantages, making it easier to choose a location that best suits your specific hosting needs.