feat(container): update image ghcr.io/qdm12/gluetun to v3.41.0
This PR contains the following updates:
| Package | Update | Change |
|---|---|---|
| ghcr.io/qdm12/gluetun | minor | v3.35.0 β v3.41.0 |
Release Notes
qdm12/gluetun (ghcr.io/qdm12/gluetun)
v3.41.0
Video of me reading out this release
Thank you all for your patience for this release which took its sweet time πβ²οΈ
I have been rather absent in a good part of 2025 due to work and life getting in the way, and I would like to thank many of you for helping out around in issues and discussions, and for the few code contributors whilst I was away.
On this release, many of the features you see are the result of behind-the-scene work of the last few years (notably on dns) and I'm super glad they are finally in Gluetun! A lot more to come in v3.42.0, there is already a pile of pull requests waiting π
Final note, introducing the RANTING SECTION at the bottom of this changelog. This section might also be in the future releases (unfortunately)!
Happy holidays! π π βοΈ β
Features
- DNS
- (K8s users read this) Local network names resolution using private DNS resolvers found at container start (#β2970)
-
DNS over HTTPS support (see
DNS_UPSTREAM_RESOLVER_TYPEbelow) -
DNS_UPSTREAM_RESOLVER_TYPEoption which can bedot(DNS over TLS),doh(DNS over HTTPS) orplain(plaintext over UDP) - DNS over TLS re-uses TCP connections which should put less stress on TCP-connections-rate-limiting by the VPN server
- DNS requests blocked are logged with a reason
- DNS rebinding protection is always enabled, but hostnames can be excluded with
DNS_REBINDING_PROTECTION_EXEMPT_HOSTNAMES -
i/o timeouterrors are now logged at the debug level instead of warn level
-
healthcheck system reworked: more robust and less impact on other applications (#β2923)
- Three checks are performed:
-
startup full check: when the VPN connection is first established, perform a TCP+TLS dial to
HEALTH_TARGET_ADDRESSESwith a timeout of 6 seconds -
periodic full check: every 5 minutes, perform a TCP+TLS dial to
HEALTH_TARGET_ADDRESSES, with up to 3 tries of 10s, 15s, and 30s timeouts -
periodic small check: every minute, perform ICMP pings to
HEALTH_ICMP_TARGET_IPS, with a fallback to plain DNS (UDP) lookups ofgithub.comto cloudflare+google, with up to 10 tries of 5s, 5s, 5s, 10s, 10s, 10s, 15s, 15s, 15s, and 30s timeouts
-
startup full check: when the VPN connection is first established, perform a TCP+TLS dial to
- If any of these checks fail, the VPN connection is restarted
- Reduced impact on TCP to allow for higher bandwidth in TCP torrenting
- New option
HEALTH_TARGET_ADDRESSES=cloudflare.com:443,github.com:443to have a fallback address - New option
HEALTH_ICMP_TARGET_IPS=1.1.1.1,8.8.8.8to have8.8.8.8as a fallback address - New option
HEALTH_SMALL_CHECK_TYPEwhich can bednsoricmp. By default it uses icmp and falls back to dns if icmp isn't permitted. - New option
HEALTH_RESTART_VPN: you should really leave it toon, unless you have trust issues with the healthcheck.
- Three checks are performed:
- built-in servers data updates:
- Cyberghost
- ExpressVPN
- Mullvad
- Privado
- Private Internet Access
- SlickVPN (mere 29 hardcoded servers π€·)
- ProtonVPN
- Surfshark
- Torguard
- control server:
-
HTTP_CONTROL_SERVER_AUTH_DEFAULT_ROLEoption (JSON encoded). For example:{"auth":"basic","username":"me","password":"pass"}or{"auth":"apiKey","apikey":"xyz"}or{"auth":"none"}. - log number of roles read from auth file
-
- VPN server side port forwarding:
- support
{{PORT}}template variable on top of{{PORTS}} - support
{{VPN_INTERFACE}}template variable which is by defaulttun0
- support
- Public IP data fetcher queries all data sources in parallel and picks the most popular result
- bump Alpine from 3.20 to 3.22
- wireguard: on error parsing
WIREGUARD_ENDPOINT_IP, mention it must be an IP address for the time being - new ascii logo logged out at program exit... did any of you spot it? π
Fixes
- Wireguard:
- specify IP family for new route (#β2629)
-
WIREGUARD_ENDPOINT_IPregression (v3.39.0) fixed to override the IP address of a picked connection
- Providers specific:
- Cyberghost: log warnings from updater resolver but not for "no such host" which happen quite a lot
- ExpressVPN: update hardcoded servers data (#β2888)
- ProtonVPN: authenticated servers data updating
- If updating servers data periodically, use
UPDATER_PROTONVPN_EMAILandUPDATER_PROTONVPN_PASSWORD - If using the CLI, use
-proton-emailand-proton-passwordflags
- If updating servers data periodically, use
- PureVPN:
- update OpenVPN configuration settings (from #β2991 credits to @βmlapaj)
- updater parses country and city from hostname and merges with ip address information (#β2991)
- VPN Unlimited: update certificates value (#β2835) and remove no longer valid hardcoded hosts
- VPN Secure updater fixed by allowing their website servers list to have "N / A" region/city
- WeVPN: removed since it decomissioned
- Servers storage: do not crash the container but log a warning if flushing merged servers to file fails
- VPN server side port forwarding:
- clear port file instead of removing it (see why)
- remove double log when clearing port forward file
- Control server:
- log out full URL path not just bottom request URI
- change route with retrocompatibility from
/v1/openvpn/portforwardedto/v1/portforward: this route has nothing to do with openvpn specifically, removed theedinportforwardedto accomodate future routes such as changing the state of port forwarding
-
PUBLICIP_ENABLEDis now respected - publicip/api/cloudflare: add now required
Refererheader (#β3058) - cli
openvpnconfigcommand no longer panics due to missingSetDefaultscall - DNS:
- retry on next period if a blocklists update failed previously
- fix
DNS_KEEP_NAMESERVERbehavior (by the way, you should no longer need to use this option!)- no longer hangs the code when establishing the VPN connection
- no longer makes Gluetun panic when exiting
- Healthcheck:
- fix grammar issue in log (#β2773)
Documentation
- Readme
- remove no longer valid LoC badge
- update Alpine version and image size
- warning on "official" websites which are scams
- add star history graph because it's fun
- Dockerfile: specify default PUID and PGID to avoid confusion, since both are already defaulted to 1000 in the Go code
- add pull request template (#β2918)
- update provider issue template
Maintenance
- Code
- Change DNS option names with retro-compatibility:
-
DOTtoDNS_SERVER -
DOT_PROVIDERStoDNS_UPSTREAM_RESOLVERS -
DOT_PRIVATE_ADDRESStoDNS_PRIVATE_ADDRESSES -
DOT_CACHINGtoDNS_CACHING -
DOT_IPV6toDNS_UPSTREAM_IPV6 -
DOT_PRIVATE_ADDRESSsplit intoDNS_BLOCK_IPSandDNS_BLOCK_IP_PREFIXES -
UNBLOCKwithDNS_UNBLOCK_HOSTNAMES
-
- clear
DNS_BLOCK_IP_PREFIXESvalues since DNS rebinding protection is built-in the filter middleware - internal/vpn: rename
openvpn*tovpn*variables - internal/configuration/settings:
- merge DoT settings with DNS settings
- remove unneeded Health struct fields
-
internal/storage:- do not read/write to user file when updating in maintainer mode
- ignore persisted servers data with a timestamp in the future
-
internal/publicip/api/ip2location: rename countries to match standard country names from the mappingconstants.CountryCodes()`
- Change DNS option names with retro-compatibility:
- dependencies
- bump Go from 1.23 to 1.25
- bump github.com/breml/rootcerts from 0.2.19 to 0.3.3 (#β2683, #β2964)
- bump github.com/klauspost/compress from 1.17.11 to 1.18.1 (#β2957)
- bump github.com/pelletier/go-toml/v2 from 2.2.3 to 2.2.4 (#β2958)
- bump github.com/qdm12/dns from v2.0.0-rc8 to v2.0.0-rc10
- bump github.com/stretchr/testify from 1.10.0 to 1.11.1 (#β2959)
- bump github.com/ulikunitz/xz from 0.5.11 to 0.5.15 (#β2955)
- bump github.com/vishvananda/netlink from 1.2.1 to 1.3.1 (#β2932)
- bump golang.org/x/crypto from 0.29.0 to 0.45.0 (#β2619, #β2999)
- bump golang.org/x/net from 0.31.0 to 0.47.0 (#β2648, #β2937, #β2976)
- bump golang.org/x/sys from 0.29.0 to 0.38.0 (#β2939, #β2973)
- bump golang.org/x/text from 0.21.0 to 0.31.0 (#β2938, #β2975)
- upgrade linter to v2.4.0
- migrate configuration file
- fix existing code issues
- add exclusion rules
- update linter names
- CI
- run container and wait for it to connect for both Mullvad and ProtonVPN (#β2956)
- bump github actions and use go.mod Go version (#β2880)
- pull container images at build time from ghcr.io when possible
- reduce silly image pull rate limiting from docker hub registry
- still rely on docker hub registry to pull golang and alpine images since these are not on ghcr.io
- ignore .github/pull_request_template.md with markdown linter
- consider 429 as valid status code for markdown links
- bump actions/setup-go from 5 to 6 (#β2929)
- bump actions/checkout from 5 to 6 (#β3001)
- bump DavidAnson/markdownlint-cli2-action from 18 to 21 (#β2632, #β2984)
- bump github/codeql-action from 3 to 4 (#β2935)
- bump peter-evans/create-or-update-comment from 4 to 5 (#β2931)
- dev setup
- upgrade dev container to v0.21
- convert .vscode/launch.json to tasks.json
- add vscode
git remote addtask
The ranting section
π₯ this is a new section in which I'll share my rant among various Gluetun-related things π» π expect a lot of uppercasing, heavy punctuation and no structure whatsoever. Enjoy the read β
ALPINE!!! STOP BREAKING IPTABLES ON EVERY TWO RELEASES! When I enter iptables -nL, -n means NUMERIC! Then why the hell did 0 become all on Alpine 3.22??!!!?!
Gluetun was configured like clockwork to parse these numeric values, and all hell broke lose on some systems where it would return TEXTUAL values!
π 2e2e5f9 and 6712adf for more information
PUREVPN did change everything for OpenVPN: certificates, keys, CAs. Like, can't you keep the previous ones working instead of breaking everyone? No-one was really warned on this as far as I know, so obviously Gluetun started failing more and more with PureVPN. Thanks to @βmlapaj for patching this and notifying me.
SlickVPN: Ok fine you're going bankrupt or something, but I spent hours programming code to scrape your locations webpage for you to just add some ugly-ass text directly to list your mere 11 servers left? Couldn't you update the table on your website, which, by the way, is still there below, but empty!!? What the heck!? I ended up throwing all my code and just hardcoding their silly ~~11~~ 29 servers in Gluetun, because I'm not spending more hours fixing this scrapper, this is ridiculous.
https://www.slickvpn.com/locations/
Ok I'm not going to write the url here but it's h**ps://gluetun.com. It's an AI generated bullshlt website from some Pakistani idiot in the UK, trying to advertise for themselves to sell "website development" (=AI prompts). I did reach out to them telling them to please shut it down, no answer obviously. I suppose I should trademark gluetun... At least, since it's fully AI-generated, it's almost decent information and there is a bit of honesty in there, like "Not affiliated with Gluetun" at the bottom, although it also says "We at Gluetun" π
And keeping the best for last: PROTON!... Ah Proton... Proton Proton Proton...
First of all, let's start with Proton blocking their VPN servers data behind a login wall. There is no reason for this. None. Zip. Zero. Nada. You can literally connect to a VPN server with a free account. And anyone with a paid account, including me, could just get that list and share it. Absolute non-sense of a choice.
But, fine, let's see what's next...
I exchange with other Gluetun users trying to debug how to access this list, how to login programmatically to get that stupid list. We all throw our keyboards at our monitor out of frustration because Proton's login system is an overly complex thing. I decide to contact Proton support.
Ah, Proton "support"... It's like subconsciously they want their users to run away.
I opened a support ticket explaining the situation, very politely of course, and simply asking for a tiny bit of guidance on helping out with the curl commands necessary to login and obtain a valid token.
Their answer? Polite "go away leave us alone" message:
Public access to the https://api.protonvpn.ch/vpn/logicals endpoint is no longer available due to internal changes and security reasons.
WHAT SECURITY REASONS!??? You are making a fool of yourselves Proton!
Additionally, the setup in question is not officially supported on our end; therefore, I will be unable to provide any steps on how to achieve it, nor guarantee that it will work.
DO YOU THINK I AM STUPID PROTON!??? AND THANKS FOR BEING SO HELPFUL YOU BUNCH OF 10-NEURONS SUPPORT!
We strongly recommend using the native Proton VPN apps on your devices or utilizing one of the downloaded configuration files if you wish to set up a manual connection https://account.protonvpn.com/downloads.
You sweet sweet summer child... Really, are you pretending to be a child now? PROTONNNNNN you are just an embarassment to the tech scene.
Have a nice weekend!
Yeah thanks for nothing and not even budging a tiny bit on anything.
I even then told them I would tell my users to avoid Proton like the plague because of this ridiculous behavior. The answer? Basically same thing, reworded.
Guess what?
Well we figured out your authentication (#β2878), you unhelpful spineless wonders, so have fun blocking your own users from using your own VPN servers data...
But wait.... this is not even over; A few days later, a Gluetun user notices paid servers are not part of the Gluetun servers data.
Because Proton decided to hide away paid servers data from free users. Mind blown π€― This is absolutely stupid to its finest extent.
Anyway, I signed in with a paid account, re-updated the servers data. Done. Now your list is public. Congratulations Proton for your security measures, completely useless.
In conclusion... Proton is unhelpful and takes security decisions that make absolutely no sense.
Please migrate away from Proton whenever you can.
v3.40.4
Fixes
- DNS:
- prevent restart crash if
DOT=offandDNS_KEEP_NAMESERVER=off - retry on next period the blocklists update after a failed update
- prevent restart crash if
-
WIREGUARD_ENDPOINT_IPoverrides the IP address correctly (regression introduced in v3.39.0) - ExpressVPN hardcoded servers data updated (#β2888 - huge thanks to the manual work of @βLobstrosity)
- PureVPN OpenVPN configuration updated (from #β2991, credits to @βmlapaj)
- SlickVPN updater: only keep 11 servers hardcoded and drop website scraping code
- VPNSecure updater fixed, with region and city data allowed to be set to
N / A - VPN Unlimited updater: no longer valid hardcoded hosts removed
v3.40.3
Fixes
- Fixed previous fix on ProtonVPN: credentials are not required to be set.
v3.40.2
Fixes
- DNS: fix
DNS_KEEP_NAMESERVERbehavior- no longer hangs the code when establishing the VPN connection
- no longer makes Gluetun panic when exiting
- ProtonVPN:
- updater authentication fixed for some accounts
- If updating servers data periodically, use
UPDATER_PROTONVPN_EMAILinstead ofUPDATER_PROTONVPN_USERNAME(retrocompatibility maintained) - If using the CLI, use
-proton-emailinstead of-proton-username(retrocompatibility maintained)
- If updating servers data periodically, use
- ProtonVPN servers data updated to include paid servers
- updater authentication fixed for some accounts
- Servers storage: do not crash the container but log a warning if flushing merged servers to file fails
v3.40.1
Bug-fix-only release on top of v3.40.0.
v3.41.0 coming soon π If you have any issues with v3.40.0 please report it rather soon please π !
Fixes
- Wireguard: specify IP family for new route (#β2629)
-
PUBLICIP_ENABLEDis now respected - Port forwarding: clear port file instead of removing it (see why)
- Control server: log out full URL path not just bottom request URI
- cli
openvpnconfigcommand no longer panics due to missingSetDefaultscall - Providers specific:
- Cyberghost: log warnings from updater resolver
- ~~ExpressVPN: update hardcoded servers data (#β2888)~~ My mistake, the commit was forgotten. It will be part of v3.40.4. For now use the latest image.
- ProtonVPN: authenticated servers data updating (#β2878)
- VPN Unlimited: update certificates value (#β2835)
PS: sorry for the double notification, CI failed on the first release try
v3.40.0
Happy holidays release time π π π
π If anything doesn't work compared to previous release, please create an issue and revert to using v3.39.1 π
βΉοΈ Life is pretty busy all around currently (moving soon, new job, ill parent) so I might be even slower than usual until summer 2025, I'll do my best!
Features
- VPN: run
WaitForDNSbefore querying the public ip address (partly address #β2325) - DNS: replace unbound with qdm12/dns@βv2.0.0-rc8 (#β1742 & later commits)
- Faster start up
- Clearer error messages
- Allow for more Gluetun-specific customization
- Port forwarding:
-
VPN_PORT_FORWARDING_UP_COMMANDoption (#β2399) -
VPN_PORT_FORWARDING_DOWN_COMMANDoption
-
- Config allow irrelevant server filters to be set (see #β2337)
- Disallow setting a server filter when there is no choice available
- Allow setting an invalid server filter when there is at least one choice available
- Log at warn level when an invalid server filter is set
- Firewall: support custom ICMP rules
- Healthcheck:
- log out last error when auto healing VPN
- run TLS handshake after TCP dial if address has 443 port
- Public IP:
- retry fetching information when
connection refusederror is encountered (partly address #β2325) - support custom API url
echoip#https://...(#β2529) - resilient public ip fetcher with backup sources (#β2518)
- add
ifconfigcooption andcloudflareoption (#β2502) -
PUBLICIP_ENABLEDreplacesPUBLICIP_PERIOD-
PUBLICIP_ENABLED(on, off) can be set to enable or not public ip data fetching on VPN connection -
PUBLICIP_PERIOD=0still works to indicate to disable public ip fetching -
PUBLICIP_PERIOD!= 0 means to enable public ip fetching - Warnings logged when using
PUBLICIP_PERIOD
-
- retry fetching information when
-
STORAGE_FILEPATHoption (#β2416)-
STORAGE_FILEPATH=disables storing to and reading from a local servers.json file -
STORAGE_FILEPATHdefaults to/gluetun/servers.json
-
- Netlink: debug rule logs contain the ip family
-
internal/tun: mention in 'operation not permitted' error the user should specify--device /dev/net/tun(resolves #β2606) - Control server role based authentication system (#β2434) (part of v3.39.1 as a bugfix)
- Parse toml configuration file, see https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md#authentication
- Retro-compatible with existing AND documented routes, until after this release
- Log a warning if an unprotected-by-default route is accessed unprotected
- Authentication methods: none, apikey, basic
-
genkeycommand to generate API keys
- FastestVPN: add
aes-256-gcmto OpenVPN ciphers list - Private Internet Access updater: use v6 API to get servers data
- IPVanish: update servers data
- PrivateVPN: native port forwarding support (#β2285)
- Privado: update servers data
-
format-serverscommand supports the json format option
Fixes
- Wireguard: change default
WIREGUARD_MTUfrom1400to1320(partially address #β2533) - OpenVPN: set default mssfix to 1320 for all providers with no default already set (partially address #β2533)
- Control server: fix logged wiki authentication section link
- Firewall:
- iptables list uses
-nflag for testing iptables path (#β2574) - deduplicate VPN address accept rule for multiple default routes with the same network interface
- deduplicate ipv6 multicast output accept rules
- ipv6 multicast output address value fixed
- log warning if ipv6 nat filter is not supported instead of returning an error (allow to port forward redirect for IPv4 and not IPv6 if IPv6 NAT is not supported and fixed #β2503)
- iptables list uses
- Wireguard:
- Point to Kubernetes wiki page when encountering IP rule add file exists error (#β2526)
- IPVanish:
- fix openvpn configuration by updating CA value and add
comp-lzooption - update openvpn zip file url for updater
- fix openvpn configuration by updating CA value and add
- Perfect Privacy: update openvpn expired certificates (#β2542)
- Public IP: lock settings during entire update to prevent race conditions
Documentation
- Dockerfile
- add missing
OPENVPN_MSSFIXenvironment variable - add missing option definitions
-
STREAM_ONLY -
FREE_ONLY
-
- Document
PORT_FORWARD_ONLYis for both PIA and ProtonVPN
- add missing
Maintenance
Code quality
- Remove github.com/qdm12/golibs dependency
- Implement friendly duration formatting locally
- implement
github.com/qdm12/golibs/commandlocally (#β2418)
-
internal/natpmp: fix determinism for testTest_Client_ExternalAddress - let system handle OS signals after first one to request a program stop
-
internal/routing: remove redundantrule ip rulein error messages -
internal/netlinkdebug log ip rule commands in netlink instead of routing package -
internal/server: move log middleware tointernal/server/middlewares/log - use
gofumptfor code formatting - Fix gopls govet errors
- Upgrade linter from v1.56.2 to v1.61.0
- Remove no longer needed exclude rules
- Add new exclude rules for printf govet errors
- Remove deprecated linters
execinqueryandexportloopref - Rename linter
goerr113toerr113andgomndtomnd - Add new linters and update codebase:
canonicalheader,copyloopvar,fatcontext,intrange
Dependencies
- Upgrade Go from 1.22 to 1.23
- Bump vishvananda/netlink from v1.2.1-beta.2 to v1.2.1
- Bump github.com/qdm12/gosettings from v0.4.3 to v0.4.4
- Better support for quote expressions especially for commands such as
VPN_PORT_FORWARDING_UP_COMMAND
- Better support for quote expressions especially for commands such as
- Bump github.com/breml/rootcerts from 0.2.18 to 0.2.19 (#β2601)
- Bump golang.org/x/net from 0.25.0 to 0.31.0 (#β2401, #β2578)
- Bump golang.org/x/sys from 0.260.0 to 0.27.0 (#β2404, #β2573)
- Bump golang.org/x/text from 0.15.0 to 0.17.0 (#β2400)
- Bump github.com/klauspost/compress from 1.17.8 to 1.17.11 (#β2319, #β2550)
- Bump github.com/pelletier/go-toml/v2 from 2.2.2 to 2.2.3 (#β2549)
- Bump google.golang.org/protobuf from 1.30.0 to 1.33.0 (#β2428)
- Bump github.com/stretchr/testify from 1.9.0 to 1.10.0 (#β2600)
CI
- Linting: remove
canonicalheadersince it's not reliable - Use
--device /dev/net/tunfor test container - Bump DavidAnson/markdownlint-cli2-action from 16 to 18 (#β2588)
- Bump docker/build-push-action from 5 to 6 (#β2324)
Development setup
- dev container
- pin godevcontainer image to tag
:v0.20-alpine - drop requirement for docker-compose and use
devcontainer.jsonsettings directly - readme update
- remove Windows without WSL step
- update 'remote containers extension' to 'dev containers extension'
- remove invalid warning on directories creation
- simplify customizations section
- remove "publish a port" since it can be done at runtime now
- remove "run other services" since it's rather unneeded in this case
- expand documentation on custom welcome script and where to specify the bind mount
- use bullet points instead of subsections headings
- pin godevcontainer image to tag
- Github labels
- change "config problem" to "user error"
- add "performance", "investigation", "servers storage" and "nearly resolved" categories
v3.39.1
π₯ https://youtu.be/O09rP1DlcFU?si=qPdzWUWnzciNxAc7
Fixes
- Firewall: delete chain rules by line number (#β2411)
- Control server: require authentication for vulnerable routes (#β2434)
- NordVPN: remove commas from region values
- IVPN: split city into city and region
- Fix bad city values containing a comma
- update ivpn servers data
- Private Internet Access: support port forwarding using custom Wireguard (#β2420)
- ProtonVPN: prevent using FREE_ONLY and PORT_FORWARD_ONLY together (see #β2470)
-
internal/storage: add missing selection fields to buildnoServerFoundError(see #β2470)
v3.39.0
π₯ Youtube video explaining all this
Features
- OpenVPN: default version changed from 2.5 to 2.6
- Alpine upgraded from 3.18 to 3.20 (3.19 got skipped due to buggy
iptables) - Healthcheck: change timeout mechanism
- Healthcheck timeout is no longer fixed to 3 seconds
- Healthcheck timeout increases from 2s to 4s, 6s, 8s, 10s
- No 1 second wait time between check retries after failure
- VPN internal restart may be delayed by a maximum of 10 seconds
- Firewall:
- Query iptables binary variants to find which one to use depending on the kernel
- Prefer using
iptables-nftoveriptables-legacy(Alpine new default is nft backend iptables)
- Wireguard:
-
WIREGUARD_PERSISTENT_KEEPALIVE_INTERVALoption - read configuration file without case sensitivity
-
- VPN Port forwarding: only use port forwarding enabled servers if
VPN_PORT_FORWARDING=on(applies only to PIA and ProtonVPN for now) - FastestVPN:
- Wireguard support (#β2383 - Credits to @βZerauskire for the initial investigation and @βjvanderzande for an initial implementation as well as reviewing the pull request)
- use API instead of openvpn zip file to fetch servers data
- add city filter
SERVER_CITY - update built-in servers data
- Perfect Privacy: port forwarding support with
VPN_PORT_FORWARDING=on(#β2378) - Private Internet Access: port forwarding options
VPN_PORT_FORWARDING_USERNAMEandVPN_PORT_FORWARDING_PASSWORD(retro-compatible withOPENVPN_USERandOPENVPN_PASSWORD) - ProtonVPN:
- Surfshark: servers data update
- VPNSecure: servers data update
-
VPN_ENDPOINT_IPsplit intoOPENVPN_ENDPOINT_IPandWIREGUARD_ENDPOINT_IP -
VPN_ENDPOINT_PORTsplit intoOPENVPN_ENDPOINT_PORTandWIREGUARD_ENDPOINT_PORT
Fixes
-
VPN_PORT_FORWARDING_LISTENING_PORTfixed - IPv6 support detection ignores loopback route destinations
- Custom provider:
- handle
portoption line for OpenVPN - ignore comments in an OpenVPN configuration file
- assume port forwarding is always supported by a custom server
- handle
- VPN Unlimited:
- change default UDP port from 1194 to 1197
- allow OpenVPN TCP on port 1197
- Private Internet Access Wireguard and port forwarding
- Set server name if names filter is set with the custom provider (see #β2147)
- PrivateVPN: updater now sets openvpn vpn type for the no-hostname server
- Torguard: update OpenVPN configuration
- add aes-128-gcm and aes-128-cbc ciphers
- remove mssfix, sndbuf, rcvbuf, ping and reneg options
- VPNSecure: associate
N / Awith no data for servers - AirVPN: set default mssfix to 1320-28=1292
- Surfshark: remove outdated hardcoded retro servers
- Public IP echo:
- ip2location parsing for latitude and longitude fixed
- abort ip data fetch if vpn context is canceled (prevents requesting the public IP address N times after N VPN failures)
-
internal/server:/openvpnroute status get and put- get status return stopped if running Wireguard
- put status changes vpn type if running Wireguard
- Log out if
PORT_FORWARD_ONLYis enabled in the server filtering tree of settings - Log last Gluetun release by tag name alphabetically instead of by release date
-
format-serversfixed missing VPN type header for providers supporting Wireguard: NordVPN and Surfshark -
internal/tun: only create tun device if it does not exist, do not create if it exists and does not work
Documentation
- readme:
- clarify shadowsocks proxy is a server, not a client
- update list of providers supporting Wireguard with the custom provider
- add protonvpn as custom port forwarding implementation
- disable Github blank issues
- Bump github.com/qdm12/gosplash to v0.2.0
- Add
/choosesuffix to github links in logs
- Add
- add Github labels: "Custom provider", "Category: logs" and "Before next release"
- rename
FIREWALL_ENABLEDtoFIREWALL_ENABLED_DISABLING_IT_SHOOTS_YOU_IN_YOUR_FOOTdue to the sheer amount of users misusing it.FIREWALL_ENABLEDwon't do anything anymore. At least you've been warned not to use it...
Maintenance
- Code health
- PIA port forwarding:
- remove dependency on storage package
- return an error to port forwarding loop if server cannot port forward
-
internal/config:- upgrade to
github.com/qdm12/gosettingsv0.4.2- drop
github.com/qdm12/govaliddependency - upgrade
github.com/qdm12/ss-serverto v0.6.0 - do not un-set sensitive config settings anymore
- drop
- removed bad/invalid retro-compatible keys
CONTROL_SERVER_ADDRESSandCONTROL_SERVER_PORT - OpenVPN protocol field is now a string instead of a TCP boolean
- Split server filter validation for features and subscription-tier
- provider name field as string instead of string pointer
- upgrade to
-
internal/portforward: support multiple ports forwarded - Fix typos in code comments (#β2216)
-
internal/tun: fix unit test for unprivileged user
- PIA port forwarding:
- Development environment
- fix
source.organizeImportsvscode setting value - linter: remove now invalid skip-dirs configuration block
- fix
- Dependencies
- Bump Wireguard Go dependencies
- Bump Go from 1.21 to 1.22
- Bump golang.org/x/net from 0.19.0 to 0.25.0 (#β2138, #β2208, #β2269)
- Bump golang.org/x/sys from 0.15.0 to 0.18.0 (#β2139)
- Bump github.com/klauspost/compress from 1.17.4 to 1.17.8 (#β2178, #β2218)
- Bump github.com/fatih/color from 1.16.0 to 1.17.0 (#β2279)
- Bump github.com/stretchr/testify to v1.9.0
- Do not upgrade busybox since vulnerabilities are fixed now with Alpine 3.19+
- CI
- Github
- remove empty label description fields
- add
/choosesuffix to issue and discussion links - review all issue labels: add closed labels, add category labels, rename labels, add label category prefix, add emojis for each label
- Add issue labels: Popularity extreme and high, Closed cannot be done, Categories kernel and public IP service
v3.38.1
βΉοΈ This is a bugfix release for v3.38.0. If you can, please instead use release v3.39.0
Fixes
-
VPN_PORT_FORWARDING_LISTENING_PORTfixed - IPv6 support detection ignores loopback route destinations
- Custom provider:
- handle
portoption line for OpenVPN - ignore comments in an OpenVPN configuration file
- assume port forwarding is always supported by a custom server
- handle
- VPN Unlimited:
- change default UDP port from 1194 to 1197
- allow OpenVPN TCP on port 1197
- Private Internet Access Wireguard and port forwarding
- Set server name if names filter is set with the custom provider (see #β2147)
- PrivateVPN: updater now sets openvpn vpn type for the no-hostname server
- Torguard: update OpenVPN configuration
- add aes-128-gcm and aes-128-cbc ciphers
- remove mssfix, sndbuf, rcvbuf, ping and reneg options
- VPNSecure: associate
N / Awith no data for servers - AirVPN: set default mssfix to 1320-28=1292
- Surfshark: remove outdated hardcoded retro servers
- Public IP echo:
- ip2location parsing for latitude and longitude fixed
- abort ip data fetch if vpn context is canceled (prevents requesting the public IP address N times after N VPN failures)
-
internal/server:/openvpnroute status get and put- get status return stopped if running Wireguard
- put status changes vpn type if running Wireguard
- Log out if
PORT_FORWARD_ONLYis enabled in the server filtering tree of settings - Log last Gluetun release by tag name alphabetically instead of by release date
-
format-serversfixed missing VPN type header for providers supporting Wireguard: NordVPN and Surfshark -
internal/tun: only create tun device if it does not exist, do not create if it exists and does not work
v3.38.0
Features
- Public IP fetching:
- Add
PUBLICIP_API_TOKENvariable -
PUBLICIP_APIvariable supportingipinfoandip2location
- Add
- Private Internet Access:
PORT_FORWARD_ONLYvariable (#β2070) - NordVPN:
- update mechanism uses v2 NordVPN web API
- Filter servers with
SERVER_CATEGORIES(#β1806)
- Wireguard:
- Read config from secret file, defaults to
/run/secrets/wg0.confwhich can be changed with variableWIREGUARD_CONF_SECRETFILE - Read private key, preshared key and addresses from individual secret files (#β1348)
- Read config from secret file, defaults to
- Firewall: disallow the unspecified address (
0.0.0.0/0or::/0) for outbound subnets - Built-in servers data updated:
- NordVPN
- Privado
- Private Internet Access
- VPN Unlimited
- VyprVPN
- Healthcheck: change unhealthy log from info to debug level
Fixes
- Privado: update OpenVPN zip file URL
-
STREAM_ONLYbehavior fixed (#β2126) - Torguard: set user agent to be allowed to download zip files
- Surfshark:
- Remove no longer valid multi hop regions
- Fail validation for empty string region
- Clearer error message for surfshark regions: only log possible 'new' server regions, do not log old retro-compatible server regions
Maintenance
- Healthcheck: more explicit log to go read the Wiki health guide
- NAT-PMP: RPC error contain all failed attempt messages
- Github:
- add closed issue workflow stating comments are not monitored
- add opened issue workflow
- Dependencies
- Bump github.com/breml/rootcerts from 0.2.14 to 0.2.16 (#β2094)
- CI
- Pin docker/build-push-action to v5 (without minor version)
- Upgrade linter to v1.56.2
v3.37.1
βΉοΈ This is a bugfix release for v3.37.0. If you can, please instead use the newer v3.39.0 release.
Fixes
-
VPN_PORT_FORWARDING_LISTENING_PORTfixed - IPv6 support detection ignores loopback route destinations
-
STREAM_ONLYbehavior fixed (#β2126) - Custom provider:
- handle
portoption line for OpenVPN - ignore comments in an OpenVPN configuration file
- assume port forwarding is always supported by a custom server
- handle
- VPN Unlimited:
- change default UDP port from 1194 to 1197
- allow OpenVPN TCP on port 1197
- Private Internet Access Wireguard and port forwarding
- Set server name if names filter is set with the custom provider (see #β2147)
- PrivateVPN: updater now sets openvpn vpn type for the no-hostname server
- Torguard: update OpenVPN configuration
- add aes-128-gcm and aes-128-cbc to the ciphers option
- remove mssfix, sndbuf, rcvbuf, ping and reneg options
- set HTTP user agent to be allowed to download zip files
- VPNSecure: associate
N / Awith no data for servers - AirVPN: set default mssfix to 1320-28=1292
- Surfshark:
- remove outdated hardcoded retro servers
- Remove no longer valid multi hop regions
- Fail validation for empty string region
- Clearer error message for surfshark regions: only log possible 'new' server regions, do not log old retro-compatible server regions
- Privado: update OpenVPN zip file URL
-
internal/server:/openvpnroute status get and put- get status return stopped if running Wireguard
- put status changes vpn type if running Wireguard
- Log out last Gluetun release by semver tag name instead of by date
-
format-serversfixed missing VPN type header for providers supporting Wireguard: NordVPN and Surfshark -
internal/tun: only create tun device if it does not exist, do not create if it exists and does not work - Bump github.com/breml/rootcerts from 0.2.14 to 0.2.17
PS: sorry for re-releasing this one 3 times, CI has been capricious with passing
v3.37.0
π π Happy new year 2024 π π Personal note at the bottom π
Features
- Port forwarding: port redirection with
VPN_PORT_FORWARDING_LISTENING_PORT - Custom provider: support tcp-client proto for OpenVPN
- NordVPN: add access token warning if used as wireguard private key
- Windscribe: update servers data
Fixes
- Shadowsocks: bump from v0.5.0-rc1 to v0.5.0
- treat udp read error as non critical
- log out crash error for tcpudp combined server
- Wireguard:
- Load preshared key from toml file correctly and from peer selection
- Custom provider OpenVPN:
- Default TCP port for any tcp protocol
- Firewall:
- Handle OpenVPN
tcp-clientprotocol astcp
- Handle OpenVPN
- PureVPN: fix update url and update servers (#β1992)
- VPN Unlimited OpenVPN:
- Update CA certificate and add new second certificate
- Remove
DEFAULT:@​SECLEVEL=0 - Specify cipher as AES-256-CBC and auth as SHA512
- Format-servers command:
- Fix for providers with dashes
- Add missing
server nameheader for PIA
Maintenance
- Bump github.com/breml/rootcerts from 0.2.11 to 0.2.14 (#β1800, #β1981)
- Bump github.com/fatih/color from 1.15.0 to 1.16.0 (#β1950)
- Bump github.com/klauspost/compress from 1.16.7 to 1.17.4 (#β1922, #β1993)
- Bump golang.org/x/crypto from 0.16.0 to 0.17.0 (#β2012)
- Bump golang.org/x/net from 0.12.0 to 0.19.0 (#β1907, #β1953, #β1985)
- Bump golang.org/x/sys from 0.11.0 to 0.13.0 (#β1897)
- Bump golang.org/x/text from 0.11.0 to 0.14.0 (#β1845, #β1946)
- CI:
- Bump actions/checkout from 3 to 4 (#β1847)
- Bump crazy-max/ghaction-github-labeler from 4 to 5 (#β1858)
- Bump DavidAnson/markdownlint-cli2-action from 11 to 14 (#β1871, #β1982)
- Bump docker/build-push-action from 4.1.1 to 5.1.0 (#β1860, #β1969)
- Bump docker/login-action from 2 to 3 (#β1936)
- Bump docker/metadata-action from 4 to 5 (#β1937)
- Bump docker/setup-buildx-action from 2 to 3 (#β1938)
- Bump docker/setup-qemu-action from 2 to 3 (#β1861)
- Bump github/codeql-action from 2 to 3 (#β2002)
Personal note on the state of Gluetun
I have been focusing my effort since mid November on a DNSSEC validator to finalize a Go library on par with the usage we have of Unbound, in order to replace Unbound in Gluetun and add DNS special features for Gluetun. For example:
- automatically diverting local hostnames questions to the local Docker DNS server (a long overdued problem) - already implemented
- allow resolution of VPN endpoint hostname to ips in a very restricted DNS server + firewall to only allow a specific hostname to resolve (not implemented yet)
This is a tough problem not so well documented with few complete and valid implementations, so it's taking some time. There is likely 2 more weeks of work left before finalization.
v3.36.0
π Happy Halloween π Hopefully it is not a spooky release! πΈ
Features
- Wireguard
- VPN server port forwarding
- Servers data
- Surfshark servers data API endpoint updated (#β1560)
- Built-in servers data updated for Cyberghost, Mullvad, Torguard, Surfshark
- Clarify "Wireguard is up" message logged
- Updater log warning about using
-minratioif not enough servers are found - Configuration: add
/32if not present for Wireguard addresses
Fixes
-
Minor breaking change:
DNS_KEEP_NAMESERVERleaves DNS fully untouched -
Minor breaking change:
updatecommand uses dashes instead of spaces for provider names (i.e.-vpn\ unlimited->-vpn-unlimited) - Port forwarding run loop reworked and fixed (#β1874)
- Public IP fetching run loop reworked and fixed
- ProtonVPN: add
aes-256-gcmcipher for OpenVPN - Custom provider: allow custom endpoint port setting
- IPv6 support for ipinfo (#β1853)
- Routing:
VPNLocalGatewayIPWireguard support - Routing: add outbound subnets routes only for matching ip families
- Routing: change firewall only for matching ip families
- Netlink: try loading Wireguard module if not found (#β1741)
- Public IP: do not retry when doing too many requests
Documentation
- Readme
- remove
UPDATER_VPN_SERVICE_PROVIDERSin docker-compose config - remove Slack channel link (don't have time to check it)
- update Wireguard native integrations support list
- remove
- Update to use newer wiki repository
- update URLs logged by program
- update README.md links
- update contributing guide link
- update issue templates links
- replace Wiki issue template by link to Gluetun Wiki repository issue creation
- set program announcement about Github wiki new location
- Issue templates
- add Unraid as option in bug issue template
- provide minimum requirements for an issue: title must be filled, at least 10 lines of log provided, Gluetun version must be provided
Maintenance
- Dockerfile: add missing environment variables
-
OPENVPN_PROCESS_USERvalue defaults toroot - Add
HTTPPROXY_STEALTH=off - Add
HTTP_CONTROL_SERVER_LOG=on
-
- Code
-
internal/settings: change source precedence order: Secret files then files then environment variables -
internal/routing: WrapsetupIPv6rule error correctly - Move vpn gateway obtention within port forwarding service
-
internal/vpn: fix typoportForwader->portForwarder -
internal/provider: use type assertion for port forwarders
-
- CI
- rename workflow to
Markdown - Markdown workflow triggers on
*.mdfiles only - Markdown workflow triggers for pull requests as well
- Markdown job runs misspell, linting and dead link actions
- Markdown publishing step to Docker Hub is only for pushes to the master branch
- Add markdown-skip workflow
- rename workflow to
- Dependencies
Configuration
π Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
π¦ Automerge: Disabled by config. Please merge this manually once you are satisfied.
β» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
π Ignore: Close this PR and you won't be reminded about these updates again.
- [ ] If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
Path: cluster/apps/sabnzbd/helmrelease.yaml
@@ -173,7 +173,7 @@
envFrom:
- secretRef:
name: primary-conf121
- image: ghcr.io/qdm12/gluetun:v3.35.0@sha256:a98d1ec99e09a1b806aff7f0c3d8a133a8ede7d3d7a250b62029a39a61f01525
+ image: ghcr.io/qdm12/gluetun:v3.39.1@sha256:6a8058e626763cbf735ac2f78c774dbb24fec2490bd9d9f7d67e22592cb4a991
name: vpn
ports:
- containerPort: 8888