Dear mailing list and Arne,

I saw in the IRC meeting notes that 2.7 is about to be branched.

I don't mean to push, but I personally think this bug is important enough
to get looked at and fixed, preferably before 2.7.0 is made.

Is this new patch good enough? Should I put it in Gerrit? Are there any
questions about the functionality?

I realise that I did not explain _why_ b364711486 breaks things. I'm also
curious, but I think the author of that patch, or someone else more
intimate with the codebase, can more easily explain. Regardless there is a
bug in 2.6.x right now, and I'd would like it if a fix is upstreamed; be
it my fix, or someone elses.

Thanks!
Walter


> From: Walter Doekes <walter+git...@wjd.nu>
>
> When you're connected to a VPN which is used as the default gateway, a
> connection to a second VPN will cause a tunnel-in-tunnel traffic. If the
> administrator of the second VPN wants to avoid that, by pushing its IP
> as net_gateway, this means that the client's source IP switches right
> after connect:
>
>   the client source IP switches, from
>   - the first-VPN-exit-IP, to the
>   - regular-ISP-exit-IP
>
> In openvpn 2.5 and below, this worked fine. Since openvpn 2.6,
> specifially b364711486, this triggers the "Disallow float to an address
> taken by another client" code. Since that change, the traffic from the
> second source IP creates a second connection, which now needs special
> handling in the check-floating-IP code.
>
> This change allows one to switch to the new IP, if it is still in an
> unconnected state. That makes the use-case mentioned above work again.
>
> Github: closes OpenVPN/openvpn#704
> Signed-off-by: Walter Doekes <walter+git...@wjd.nu>
> ---
>  src/openvpn/multi.c | 15 ++++++++++++++-
>  1 file changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/src/openvpn/multi.c b/src/openvpn/multi.c
> index a2d3fd10..51a00b71 100644
> --- a/src/openvpn/multi.c
> +++ b/src/openvpn/multi.c
> @@ -3236,8 +3236,21 @@ multi_process_float(struct multi_context *m, struct
> multi_instance *mi,
>          struct tls_multi *m1 = mi->context.c2.tls_multi;
>          struct tls_multi *m2 = ex_mi->context.c2.tls_multi;
>
> +        /* if the new connection is fresh and the old one is already
> connected, this
> +         * might be a legitimate move to a new IP by the original client;
> +         * for example when the server IP is pushed as net_gateway to
> escape from
> +         * a double VPN. */
> +        if (m1->multi_state == CAS_CONNECT_DONE
> +            && m2->multi_state == CAS_NOT_CONNECTED
> +            && m1->locked_cert_hash_set
> +            && !m2->locked_cert_hash_set
> +            && session_id_equal(&m1->session[TM_ACTIVE].session_id,
> +                          &m2->session[TM_ACTIVE].session_id))
> +        {
> +            /* allow this case */
> +        }
>          /* do not float if target address is taken by client with another
> cert */
> -        if (!cert_hash_compare(m1->locked_cert_hash_set,
> m2->locked_cert_hash_set))
> +        else if (!cert_hash_compare(m1->locked_cert_hash_set,
> m2->locked_cert_hash_set))
>          {
>              msg(D_MULTI_LOW, "Disallow float to an address taken by
> another client %s",
>                  multi_instance_string(ex_mi, false, &gc));
> --
> 2.34.1
>
>



_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to