> Hi,
>
> our setup needs openvpn UDP/TLS tunnels with dynamic client IP addresses, so
> I implemented a fix for the bug #49 that has been open for over two years.
>
> The patch is for version 2.2.2 as I had trouble compiling the 2.3.x tarball
> from openvpn.net. As the solution is rather simple (just two small utility
> functions in mudp.c) I'd guess it could be comfortambly migrated to 2.3.x.
>
> Basically what the fix does is the following: incoming data channel UDP
> packets from an unknown IP are matched against existing UDP/TLS sessions, and
> if the packet passes the HMAC authentication against an existing TLS context
> we know the client IP has changed and the session state will be instantly
> updated accordingly.
>
> I have tested this fix to some extent, and the IP handover works impressively
> smoothly in my test setup where I randomly switch between two routes from
> client to server.
>
> Dynamic client IP's are enabled/disabled with --float in the server side.
>
> Please feel free to contact me for any questions etc.
This is not a full review of the patch, just a few quick remarks.
This patch seems to do (number of tunnels) HMAC's for any packet received from
an unknown IP. If this is correct, couldn't a server with a couple thousand
tunnels be brought just by sending it a few hundred packets a second?
authenticate_tls_packet() contains a for() loop, but I see no code path that
actually loops - everything seems to return immediately?
memcmp() should be replaced by a constant-time function to prevent timing
attacks (probably only realistic on a server with a single tunnel); even then,
this patch allows determining the (approximate) number of tunnels in use by
looking at processing time.
I haven't looked at how this interacts with other features; it's at least
noteworthy that the floating behavior can't be specified on a per-connection
basis.
Joachim