Hi,

It has been reported (Trac 718) that --block-outside-dns on multiple
tunnels blocks all DNS traffic. My tests appear to confirm this.

Apparently this is due to each openvpn instance adding filters to
independent sublayers. With two tunnels we get port 53 filters in two
sublayers:

sublayer 1: permit openvpn, permit tap1, block all  (in that order)
sublayer 2: permit openvpn, permit tap2, block all

Filter arbitration works roughly like this: filters in each sublayer are
parsed in order of priority and stops at the first match. Then the result
from all sublayers are considered in order of priority in determining the
final action: a block is final and by default a permit may be overridden by
block in lower priority sublayers. So for traffic through tap1, we get
permit from sublayer 1 and block from sublayer 2 leading to a block etc.

This could partially mitigated by making the permit tap1/tap2 filters hard
(they are soft by default -- i.e may be overridden). I say partially
because only one of the "permit tap" filters can be thus protected.

I see two ways to allow dns traffic through all tunnels for which
--block-outside-dns is set

1. Add all filters to a the default sublayer  --- this is the easiest
option but not ideal: cluttering the default sublayer with custom filters
may not not be considered a good practice.

2. Add all filters to a common custom sublayer. This requires a pre-defined
UUID that could be used to define the sublayer and shared between all
instances of openvpn.

For UUID,
(a) generate a machine-specific UUID at install time, save in the registry
and use it as the sublayer key

OR

(b) hard code a UUID in the executable and use it as the sublayer key

I prefer (b) as its simpler.

Note that each additional instances will add duplicate filters like "permit
openvpn" or a low priority "block all". This is required as these filters
are added in a dynamic session so that they disappear if the process
terminates or crashes without removing the filters. As parsing filters
within a sublayer stops as soon as a match (permit or block)  is found, no
performance penalty is expected. In any case it will have less overhead
than the current situation with multiple sublayers.

Any suggestions?

Selva

Reply via email to