VPN client in a thin Docker container for multiple VPN providers, written in Go, and using OpenVPN or Wireguard, DNS over TLS, with a few proxy servers built-in. https://github.com/qdm12/gluetun-wiki
  • Go 99.3%
  • Dockerfile 0.7%
Find a file
2026-03-26 22:32:43 +01:00
.devcontainer hotfix(pmtud/tcp): block kernel from racing to send RST packets 2026-02-17 21:46:24 +00:00
.github fix(ci): set hash of PR commit instead of synthetic commit in docker build argument 2026-03-13 15:13:03 +00:00
.vscode chore(dev): add vscode git remote add task 2025-09-24 12:54:16 +00:00
ci chore(ci): bump timeout from 30s to 60s 2026-03-13 17:52:48 +00:00
cmd/gluetun chore!(firewall): iptables logger level is set at FIREWALL_IPTABLES_LOG_LEVEL 2026-03-16 12:46:53 +00:00
doc Documentation: Move sections to Wiki 2021-01-08 02:24:15 +00:00
internal fix(openvpn): bundle provider CA certificates in one block (#3258) 2026-03-26 22:32:43 +01:00
.dockerignore Maintenance: Improve .dockerignore 2021-01-08 02:24:31 +00:00
.gitignore feat(wireguard): amneziawg implementation (#3150) 2026-03-11 14:55:28 +01:00
.golangci.yml chore!(amneziawg): refactor to be separate from wireguard 2026-03-11 17:16:18 +00:00
.markdownlint-cli2.jsonc chore(ci): ignore .github/pull_request_template.md with markdown linter 2025-10-19 23:23:41 +00:00
Dockerfile hotfix(dns): DNS_UPSTREAM_RESOLVERS defaults to empty if DNS_UPSTREAM_PLAIN_ADDRESSES is not empty 2026-03-16 13:48:35 +00:00
go.mod Chore(deps): Bump golang.org/x/text from 0.34.0 to 0.35.0 (#3227) 2026-03-13 15:57:47 +01:00
go.sum Chore(deps): Bump golang.org/x/text from 0.34.0 to 0.35.0 (#3227) 2026-03-13 15:57:47 +01:00
LICENSE Reworked labels, readme and added License 2018-10-29 16:32:11 +01:00
maintenance.md chore(dns): replace UNBLOCK with DNS_UNBLOCK_HOSTNAMES 2025-11-07 14:36:10 +00:00
README.md feat(docker): bump Alpine from 3.22 to 3.23 2026-03-13 15:39:25 +00:00
title.svg Replace pia with gluetun wherever possible 2020-06-03 02:11:35 +00:00

Gluetun VPN client

⚠️ This and gluetun-wiki are the only websites for Gluetun, other websites claiming to be official are scams ⚠️

💁 You can optionally set BORINGPOLL_GLUETUNCOM=on to... poll that scammy AI slop website every few minutes so it costs them too much to keep it up. My gentle email reminders to take it down are being grossly ignored 🤷 This would make me very happy and serve this community.

Lightweight swiss-army-knife-like VPN client to multiple VPN service providers

Title image

Build status

Docker pulls qmcgaw/gluetun Docker pulls qmcgaw/private-internet-access

Docker stars qmcgaw/gluetun Docker stars qmcgaw/private-internet-access

Last release Last Docker tag Last release size GitHub last release date Commits since release

Latest size

GitHub last commit GitHub commit activity GitHub closed PRs GitHub issues GitHub closed issues

Code size GitHub repo size Go version

Visitors count

Features

  • Based on Alpine 3.23 for a small Docker image of 43.1MB
  • Supports: AirVPN, Cyberghost, ExpressVPN, FastestVPN, Giganews, HideMyAss, IPVanish, IVPN, Mullvad (Wireguard only), NordVPN, Perfect Privacy, Privado, Private Internet Access, PrivateVPN, ProtonVPN, PureVPN, SlickVPN, Surfshark, TorGuard, VPNSecure.me, VPNUnlimited, Vyprvpn, Windscribe servers
  • Supports OpenVPN for all providers listed
  • Supports Wireguard both kernelspace and userspace
    • For AirVPN, FastestVPN, Ivpn, Mullvad, NordVPN, Perfect privacy, ProtonVPN, Surfshark and Windscribe
    • For Cyberghost, Private Internet Access, PrivateVPN, PureVPN, Torguard, VPN Unlimited and VyprVPN using the custom provider
    • For custom Wireguard configurations using the custom provider
    • More in progress, see #134
  • Supports AmneziaWG only with the custom provider for now
  • DNS over TLS baked in with service provider(s) of your choice
  • DNS fine blocking of malicious/ads/surveillance hostnames and IP addresses, with live update every 24 hours
  • Choose the vpn network protocol, udp or tcp
  • Built in firewall kill switch to allow traffic only with needed the VPN servers and LAN devices
  • Built in Shadowsocks proxy server (protocol based on SOCKS5 with an encryption layer, tunnels TCP+UDP)
  • Built in HTTP proxy (tunnels HTTP and HTTPS through TCP)
  • Connect other containers to it
  • Connect LAN devices to it
  • Compatible with amd64, i686 (32 bit), ARM 64 bit, ARM 32 bit v6 and v7, and even ppc64le 🎆
  • Custom VPN server side port forwarding for Perfect Privacy, Private Internet Access, PrivateVPN and ProtonVPN
  • Possibility of split horizon DNS by selecting multiple DNS over TLS providers
  • Can work as a Kubernetes sidecar container, thanks @rorph

Setup

🎉 There are now instructions specific to each VPN provider with examples to help you get started as quickly as possible!

Go to the Wiki!

🐛 Found a bug in the Wiki?!

Here's a docker-compose.yml for the laziest:

---
services:
  gluetun:
    image: qmcgaw/gluetun
    # container_name: gluetun
    # line above must be uncommented to allow external containers to connect.
    # See https://github.com/qdm12/gluetun-wiki/blob/main/setup/connect-a-container-to-gluetun.md#external-container-to-gluetun
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun:/dev/net/tun
    ports:
      - 8888:8888/tcp # HTTP proxy
      - 8388:8388/tcp # Shadowsocks
      - 8388:8388/udp # Shadowsocks
    volumes:
      - /yourpath:/gluetun
    environment:
      # See https://github.com/qdm12/gluetun-wiki/tree/main/setup#setup
      - VPN_SERVICE_PROVIDER=ivpn
      - VPN_TYPE=openvpn
      # OpenVPN:
      - OPENVPN_USER=
      - OPENVPN_PASSWORD=
      # Wireguard:
      # - WIREGUARD_PRIVATE_KEY=wOEI9rqqbDwnN8/Bpp22sVz48T71vJ4fYmFWujulwUU=
      # - WIREGUARD_ADDRESSES=10.64.222.21/32
      # Timezone for accurate log times
      - TZ=
      # Server list updater
      # See https://github.com/qdm12/gluetun-wiki/blob/main/setup/servers.md#update-the-vpn-servers-list
      - UPDATER_PERIOD=

🆕 Image also available as ghcr.io/qdm12/gluetun

Fun graphs

Star History Chart

License

MIT