2022-01-06 06:40:23 -05:00
|
|
|
package env
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"errors"
|
|
|
|
|
"fmt"
|
2023-04-27 13:41:05 +00:00
|
|
|
"net/netip"
|
2022-01-06 06:40:23 -05:00
|
|
|
"strconv"
|
|
|
|
|
|
|
|
|
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
2023-05-30 13:02:10 +00:00
|
|
|
"github.com/qdm12/gosettings/sources/env"
|
2022-01-06 06:40:23 -05:00
|
|
|
)
|
|
|
|
|
|
2022-08-26 15:16:51 +00:00
|
|
|
func (s *Source) readFirewall() (firewall settings.Firewall, err error) {
|
2023-05-30 13:02:10 +00:00
|
|
|
vpnInputPortStrings := env.CSV("FIREWALL_VPN_INPUT_PORTS")
|
2022-01-06 06:40:23 -05:00
|
|
|
firewall.VPNInputPorts, err = stringsToPorts(vpnInputPortStrings)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return firewall, fmt.Errorf("environment variable FIREWALL_VPN_INPUT_PORTS: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-30 13:02:10 +00:00
|
|
|
inputPortStrings := env.CSV("FIREWALL_INPUT_PORTS")
|
2022-01-06 06:40:23 -05:00
|
|
|
firewall.InputPorts, err = stringsToPorts(inputPortStrings)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return firewall, fmt.Errorf("environment variable FIREWALL_INPUT_PORTS: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-30 12:46:10 +00:00
|
|
|
outboundSubnetsKey, _ := s.getEnvWithRetro("FIREWALL_OUTBOUND_SUBNETS", []string{"EXTRA_SUBNETS"})
|
2023-05-30 13:02:10 +00:00
|
|
|
outboundSubnetStrings := env.CSV(outboundSubnetsKey)
|
2023-04-27 13:41:05 +00:00
|
|
|
firewall.OutboundSubnets, err = stringsToNetipPrefixes(outboundSubnetStrings)
|
2022-01-06 06:40:23 -05:00
|
|
|
if err != nil {
|
|
|
|
|
return firewall, fmt.Errorf("environment variable %s: %w", outboundSubnetsKey, err)
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-30 13:02:10 +00:00
|
|
|
firewall.Enabled, err = env.BoolPtr("FIREWALL")
|
2022-01-06 06:40:23 -05:00
|
|
|
if err != nil {
|
2023-05-30 15:21:09 +00:00
|
|
|
return firewall, err
|
2022-01-06 06:40:23 -05:00
|
|
|
}
|
|
|
|
|
|
2023-05-30 13:02:10 +00:00
|
|
|
firewall.Debug, err = env.BoolPtr("FIREWALL_DEBUG")
|
2022-01-06 06:40:23 -05:00
|
|
|
if err != nil {
|
2023-05-30 15:21:09 +00:00
|
|
|
return firewall, err
|
2022-01-06 06:40:23 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return firewall, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
ErrPortParsing = errors.New("cannot parse port")
|
|
|
|
|
ErrPortValue = errors.New("port value is not valid")
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func stringsToPorts(ss []string) (ports []uint16, err error) {
|
|
|
|
|
if len(ss) == 0 {
|
|
|
|
|
return nil, nil
|
|
|
|
|
}
|
|
|
|
|
ports = make([]uint16, len(ss))
|
|
|
|
|
for i, s := range ss {
|
|
|
|
|
port, err := strconv.Atoi(s)
|
|
|
|
|
if err != nil {
|
2022-02-20 02:58:16 +00:00
|
|
|
return nil, fmt.Errorf("%w: %s: %s", ErrPortParsing, s, err)
|
2022-01-06 17:42:10 +00:00
|
|
|
} else if port < 1 || port > 65535 {
|
2022-01-06 06:40:23 -05:00
|
|
|
return nil, fmt.Errorf("%w: must be between 1 and 65535: %d",
|
|
|
|
|
ErrPortValue, port)
|
|
|
|
|
}
|
|
|
|
|
ports[i] = uint16(port)
|
|
|
|
|
}
|
|
|
|
|
return ports, nil
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-27 13:41:05 +00:00
|
|
|
func stringsToNetipPrefixes(ss []string) (ipPrefixes []netip.Prefix, err error) {
|
2022-01-06 06:40:23 -05:00
|
|
|
if len(ss) == 0 {
|
|
|
|
|
return nil, nil
|
|
|
|
|
}
|
2023-04-27 13:41:05 +00:00
|
|
|
ipPrefixes = make([]netip.Prefix, len(ss))
|
2022-01-06 06:40:23 -05:00
|
|
|
for i, s := range ss {
|
2023-04-27 13:41:05 +00:00
|
|
|
ipPrefixes[i], err = netip.ParsePrefix(s)
|
2022-01-06 06:40:23 -05:00
|
|
|
if err != nil {
|
2023-04-01 16:53:04 +00:00
|
|
|
return nil, fmt.Errorf("parsing IP network %q: %w", s, err)
|
2022-01-06 06:40:23 -05:00
|
|
|
}
|
|
|
|
|
}
|
2023-04-27 13:41:05 +00:00
|
|
|
return ipPrefixes, nil
|
2022-01-06 06:40:23 -05:00
|
|
|
}
|