diff --git a/cmd/gluetun/main.go b/cmd/gluetun/main.go index 9c927c2b..c68e8d90 100644 --- a/cmd/gluetun/main.go +++ b/cmd/gluetun/main.go @@ -415,7 +415,7 @@ func routeReadyEvents(ctx context.Context, wg *sync.WaitGroup, tunnelReadyCh, dn logger.Info("VPN routing IP address: %s", vpnDestination) } if portForwardingEnabled { - // vpnGateway required only for PIA v4 + // vpnGateway required only for PIA vpnGateway, err := routing.VPNLocalGatewayIP() if err != nil { logger.Error(err) diff --git a/internal/constants/paths.go b/internal/constants/paths.go index 49f6153c..00815a5b 100644 --- a/internal/constants/paths.go +++ b/internal/constants/paths.go @@ -15,7 +15,7 @@ const ( OpenVPNAuthConf models.Filepath = "/etc/openvpn/auth.conf" // OpenVPNConf is the file path to the OpenVPN client configuration file. OpenVPNConf models.Filepath = "/etc/openvpn/target.ovpn" - // PIAPortForward is the file path to the port forwarding JSON information for PIA v4 servers. + // PIAPortForward is the file path to the port forwarding JSON information for PIA servers. PIAPortForward models.Filepath = "/gluetun/piaportforward.json" // TunnelDevice is the file path to tun device. TunnelDevice models.Filepath = "/dev/net/tun" diff --git a/internal/logging/line.go b/internal/logging/line.go index 4820e7e0..68b8f083 100644 --- a/internal/logging/line.go +++ b/internal/logging/line.go @@ -44,7 +44,7 @@ func PostProcessLine(s string) (filtered string, level logging.Level) { case s == "openvpn: Initialization Sequence Completed": return color.HiGreenString(s), logging.InfoLevel case s == "openvpn: AUTH: Received control message: AUTH_FAILED": - filtered = s + "\n\n (IF YOU ARE USING PIA V4 servers, MAYBE CHECK OUT https://github.com/qdm12/gluetun/issues/265)\n" //nolint:lll + filtered = s + "\n\n (IF YOU ARE USING PIA servers, MAYBE CHECK OUT https://github.com/qdm12/gluetun/issues/265)\n" //nolint:lll level = logging.ErrorLevel default: filtered = s diff --git a/internal/logging/line_test.go b/internal/logging/line_test.go index c8001a30..4f697e67 100644 --- a/internal/logging/line_test.go +++ b/internal/logging/line_test.go @@ -62,7 +62,7 @@ func Test_PostProcessLine(t *testing.T) { logging.InfoLevel}, "openvpn auth failed": { "openvpn: AUTH: Received control message: AUTH_FAILED", - "openvpn: AUTH: Received control message: AUTH_FAILED\n\n (IF YOU ARE USING PIA V4 servers, MAYBE CHECK OUT https://github.com/qdm12/gluetun/issues/265)\n", //nolint:lll + "openvpn: AUTH: Received control message: AUTH_FAILED\n\n (IF YOU ARE USING PIA servers, MAYBE CHECK OUT https://github.com/qdm12/gluetun/issues/265)\n", //nolint:lll logging.ErrorLevel}, } for name, tc := range tests { diff --git a/internal/provider/pia.go b/internal/provider/pia.go deleted file mode 100644 index 9f70c473..00000000 --- a/internal/provider/pia.go +++ /dev/null @@ -1,81 +0,0 @@ -package provider - -import ( - "fmt" - "strings" - - "github.com/qdm12/gluetun/internal/constants" - "github.com/qdm12/gluetun/internal/models" -) - -func buildPIAConf(connection models.OpenVPNConnection, verbosity int, root bool, cipher, auth string, - extras models.ExtraConfigOptions) (lines []string) { - var X509CRL, certificate string - var defaultCipher, defaultAuth string - if extras.EncryptionPreset == constants.PIAEncryptionPresetNormal { - defaultCipher = "aes-128-cbc" - defaultAuth = "sha1" - X509CRL = constants.PiaX509CRLNormal - certificate = constants.PIACertificateNormal - } else { // strong encryption - defaultCipher = aes256cbc - defaultAuth = "sha256" - X509CRL = constants.PiaX509CRLStrong - certificate = constants.PIACertificateStrong - } - if len(cipher) == 0 { - cipher = defaultCipher - } - if len(auth) == 0 { - auth = defaultAuth - } - lines = []string{ - "client", - "dev tun", - "nobind", - "persist-key", - "remote-cert-tls server", - - // PIA specific - "ping 300", // Ping every 5 minutes to prevent a timeout error - "reneg-sec 0", - "compress", // allow PIA server to choose the compression to use - - // Added constant values - "auth-nocache", - "mute-replay-warnings", - "pull-filter ignore \"auth-token\"", // prevent auth failed loops - "auth-retry nointeract", - "suppress-timestamps", - - // Modified variables - fmt.Sprintf("verb %d", verbosity), - fmt.Sprintf("auth-user-pass %s", constants.OpenVPNAuthConf), - fmt.Sprintf("proto %s", connection.Protocol), - fmt.Sprintf("remote %s %d", connection.IP, connection.Port), - fmt.Sprintf("cipher %s", cipher), - fmt.Sprintf("auth %s", auth), - } - if strings.HasSuffix(cipher, "-gcm") { - lines = append(lines, "ncp-disable") - } - if !root { - lines = append(lines, "user nonrootuser") - } - lines = append(lines, []string{ - "", - "-----BEGIN X509 CRL-----", - X509CRL, - "-----END X509 CRL-----", - "", - }...) - lines = append(lines, []string{ - "", - "-----BEGIN CERTIFICATE-----", - certificate, - "-----END CERTIFICATE-----", - "", - "", - }...) - return lines -} diff --git a/internal/provider/piav4.go b/internal/provider/piav4.go index 1873e426..0ee6d534 100644 --- a/internal/provider/piav4.go +++ b/internal/provider/piav4.go @@ -23,7 +23,7 @@ import ( "github.com/qdm12/golibs/logging" ) -type piaV4 struct { +type pia struct { servers []models.PIAServer timeNow timeNowFunc randSource rand.Source @@ -31,15 +31,15 @@ type piaV4 struct { activeProtocol models.NetworkProtocol } -func newPrivateInternetAccessV4(servers []models.PIAServer, timeNow timeNowFunc) *piaV4 { - return &piaV4{ +func newPrivateInternetAccess(servers []models.PIAServer, timeNow timeNowFunc) *pia { + return &pia{ servers: servers, timeNow: timeNow, randSource: rand.NewSource(timeNow().UnixNano()), } } -func (p *piaV4) GetOpenVPNConnection(selection models.ServerSelection) ( +func (p *pia) GetOpenVPNConnection(selection models.ServerSelection) ( connection models.OpenVPNConnection, err error) { var port uint16 switch selection.Protocol { @@ -109,13 +109,80 @@ func (p *piaV4) GetOpenVPNConnection(selection models.ServerSelection) ( return connection, nil } -func (p *piaV4) BuildConf(connection models.OpenVPNConnection, verbosity, uid, gid int, root bool, +func (p *pia) BuildConf(connection models.OpenVPNConnection, verbosity, uid, gid int, root bool, cipher, auth string, extras models.ExtraConfigOptions) (lines []string) { - return buildPIAConf(connection, verbosity, root, cipher, auth, extras) + var X509CRL, certificate string + var defaultCipher, defaultAuth string + if extras.EncryptionPreset == constants.PIAEncryptionPresetNormal { + defaultCipher = "aes-128-cbc" + defaultAuth = "sha1" + X509CRL = constants.PiaX509CRLNormal + certificate = constants.PIACertificateNormal + } else { // strong encryption + defaultCipher = aes256cbc + defaultAuth = "sha256" + X509CRL = constants.PiaX509CRLStrong + certificate = constants.PIACertificateStrong + } + if len(cipher) == 0 { + cipher = defaultCipher + } + if len(auth) == 0 { + auth = defaultAuth + } + lines = []string{ + "client", + "dev tun", + "nobind", + "persist-key", + "remote-cert-tls server", + + // PIA specific + "ping 300", // Ping every 5 minutes to prevent a timeout error + "reneg-sec 0", + "compress", // allow PIA server to choose the compression to use + + // Added constant values + "auth-nocache", + "mute-replay-warnings", + "pull-filter ignore \"auth-token\"", // prevent auth failed loops + "auth-retry nointeract", + "suppress-timestamps", + + // Modified variables + fmt.Sprintf("verb %d", verbosity), + fmt.Sprintf("auth-user-pass %s", constants.OpenVPNAuthConf), + fmt.Sprintf("proto %s", connection.Protocol), + fmt.Sprintf("remote %s %d", connection.IP, connection.Port), + fmt.Sprintf("cipher %s", cipher), + fmt.Sprintf("auth %s", auth), + } + if strings.HasSuffix(cipher, "-gcm") { + lines = append(lines, "ncp-disable") + } + if !root { + lines = append(lines, "user nonrootuser") + } + lines = append(lines, []string{ + "", + "-----BEGIN X509 CRL-----", + X509CRL, + "-----END X509 CRL-----", + "", + }...) + lines = append(lines, []string{ + "", + "-----BEGIN CERTIFICATE-----", + certificate, + "-----END CERTIFICATE-----", + "", + "", + }...) + return lines } //nolint:gocognit -func (p *piaV4) PortForward(ctx context.Context, client *http.Client, +func (p *pia) PortForward(ctx context.Context, client *http.Client, fileManager files.FileManager, pfLogger logging.Logger, gateway net.IP, fw firewall.Configurator, syncState func(port uint16) (pfFilepath models.Filepath)) { if !p.activeServer.PortForward { @@ -130,7 +197,7 @@ func (p *piaV4) PortForward(ctx context.Context, client *http.Client, if p.activeProtocol == constants.TCP { commonName = p.activeServer.OpenvpnTCP.CN } - client, err := newPIAv4HTTPClient(commonName) + client, err := newPIAHTTPClient(commonName) if err != nil { pfLogger.Error("aborting because: %s", err) return @@ -260,7 +327,7 @@ func filterPIAServers(servers []models.PIAServer, regions []string) (filtered [] return filtered } -func newPIAv4HTTPClient(serverName string) (client *http.Client, err error) { +func newPIAHTTPClient(serverName string) (client *http.Client, err error) { certificateBytes, err := base64.StdEncoding.DecodeString(constants.PIACertificateStrong) if err != nil { return nil, fmt.Errorf("cannot decode PIA root certificate: %w", err) diff --git a/internal/provider/provider.go b/internal/provider/provider.go index c231345d..832ce892 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -25,7 +25,7 @@ type Provider interface { func New(provider models.VPNProvider, allServers models.AllServers, timeNow timeNowFunc) Provider { switch provider { case constants.PrivateInternetAccess: - return newPrivateInternetAccessV4(allServers.Pia.Servers, timeNow) + return newPrivateInternetAccess(allServers.Pia.Servers, timeNow) case constants.Mullvad: return newMullvad(allServers.Mullvad.Servers, timeNow) case constants.Windscribe: diff --git a/internal/updater/piav4.go b/internal/updater/pia.go similarity index 100% rename from internal/updater/piav4.go rename to internal/updater/pia.go diff --git a/internal/updater/updater.go b/internal/updater/updater.go index b34bac0f..9f83f4ae 100644 --- a/internal/updater/updater.go +++ b/internal/updater/updater.go @@ -81,7 +81,7 @@ func (u *updater) UpdateServers(ctx context.Context) (allServers models.AllServe } if u.options.PIA { - u.logger.Info("updating Private Internet Access (v4) servers...") + u.logger.Info("updating Private Internet Access servers...") if err := u.updatePIA(ctx); err != nil { u.logger.Error(err) }