Force 'def1' method when --redirect-gateway is done through service

The service deletes all added routes when the client process (openvpn)
exits, causing the re-instated default route to disappear.
Fix by rewriting "--redirect-gateway" to "--redirect-gateway def1" when
routes are set using interactive service.

Only the behaviour on Windows with intereactive service is affected.

Trac: #778

Signed-off-by: Selva Nair <selva.nair@gmail.com>
Acked-by: Gert Doering <gert@greenie.muc.de>
Message-Id: <1480466372-2396-1-git-send-email-selva.nair@gmail.com>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg13307.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
This commit is contained in:
Selva Nair 2016-11-29 19:39:32 -05:00 committed by Gert Doering
parent 9977953539
commit 788e5e4a08
2 changed files with 28 additions and 0 deletions

View file

@ -79,6 +79,12 @@ New interactive Windows service
files under %USERPROFILE%\\OpenVPN\\config for use with the
interactive service.
redirect-gateway
if no flags are given, and the interactive service is used, "def1"
is implicitly set (because "delete and later reinstall the existing
default route" does not work well here). If not using the service,
the old behaviour is kept.
redirect-gateway ipv6
OpenVPN has now feature parity between IPv4 and IPv6 for redirect
gateway including the handling of overlapping IPv6 routes with

View file

@ -2526,6 +2526,22 @@ options_postprocess_mutate_ce (struct options *o, struct connection_entry *ce)
}
#ifdef _WIN32
/* If iservice is in use, we need def1 method for redirect-gateway */
static void
remap_redirect_gateway_flags (struct options *opt)
{
if (opt->routes
&& opt->route_method == ROUTE_METHOD_SERVICE
&& opt->routes->flags & RG_REROUTE_GW
&& !(opt->routes->flags & RG_DEF1))
{
msg (M_INFO, "Flag 'def1' added to --redirect-gateway (iservice is in use)");
opt->routes->flags |= RG_DEF1;
}
}
#endif
static void
options_postprocess_mutate_invariant (struct options *options)
{
@ -2555,6 +2571,8 @@ options_postprocess_mutate_invariant (struct options *options)
options->tuntap_options.ip_win32_type = IPW32_SET_MANUAL;
options->ifconfig_noexec = false;
}
remap_redirect_gateway_flags (options);
#endif
#if P2MP_SERVER
@ -5707,6 +5725,10 @@ add_option (struct options *options,
goto err;
}
}
#ifdef _WIN32
/* we need this here to handle pushed --redirect-gateway */
remap_redirect_gateway_flags (options);
#endif
options->routes->flags |= RG_ENABLE;
}
else if (streq (p[0], "remote-random-hostname") && !p[1])