Digamos que si se accede a uno.ejemplo.com siempre debe traer el túnel, ¿cómo se puede expresar esto con OnDemandRules? O si dos.ejemplo.com ¿se debe derribar siempre el túnel?
El Referencia de la clave del perfil de configuración afirma que este último caso podría manejarse de alguna manera utilizando un DomainAction
con valor NeverConnect
que "no activar nunca un intento de conexión a la VPN". Lo que sería, aunque mejor que nada, no es exactamente lo que estoy buscando - excepto que incluso esto no funciona como se espera (si he entendido la documentación correctamente):
<key>OnDemandRules</key>
<array>
<dict>
<key>Action</key>
<string>EvaluateConnection</string>
<key>ActionParameters</key>
<array>
<dict>
<key>DomainAction</key>
<string>NeverConnect</string>
<key>Domains</key>
<array>
<string>two.example.com</string>
</array>
</dict>
</array>
</dict>
<dict>
<key>URLStringProbe</key>
<string>http://a.url.that.returns.a.two.hundred.ok/</string>
<key>Action</key>
<string>Connect</string>
</dict>
</array>
Tengo entendido que como el OnDemandRules
se evalúa en cada intento de conexión, y si el dispositivo está accediendo a dos.ejemplo.com, el primer diccionario coincidiría y el túnel no aparecería. Si el dispositivo accede a otro dominio, por ejemplo one.example.com, el primer diccionario no coincidiría, el segundo diccionario sí, y el túnel aparecería. Sin embargo, esto no funciona y el túnel nunca aparece. Si se cambia el orden y el Connect
está en la parte superior, entonces el túnel siempre aparece (incluso cuando se accede a dos.ejemplo.com ).
¿Estoy entendiendo mal todo el asunto, o es que la documentación o/y la implementación de Apple está rota de alguna manera? ¿Alguien ha creado OnDemandRules que pueda utilizarse para activar o desactivar selectivamente una conexión VPN en función de los sitios a los que accede el dispositivo?
Editar: El túnel puede ser levantado "por dominio" usando las siguientes reglas (esto asume que no hay un resolvedor local presente):
<key>OnDemandRules</key>
<array>
<dict>
<key>Action</key>
<string>EvaluateConnection</string>
<key>ActionParameters</key>
<array>
<dict>
<key>RequiredDNSServers</key>
<array>
<string>127.0.0.1</string>
</array>
<key>DomainAction</key>
<string>ConnectIfNeeded</string>
<key>Domains</key>
<array>
<string>one.example.com</string>
</array>
</dict>
</array>
<key>URLStringProbe</key>
<string>http://a.url.that.returns.a.two.hundred.ok/</string>
</dict>
<dict>
<key>Action</key>
<string>Disconnect</string>
</dict>
</array>
Sin embargo, esto sufre del hecho de que la resolución del nombre de dominio primero falla, causando que la carga inicial de la página falle en Safari. Después de una recarga de la página, ésta se muestra y el túnel aparece. Esto sucede incluso si en lugar de 127.0.0.1 se proporciona una dirección de servidor DNS real, que funciona detrás del túnel. ¿Hay alguna manera de que no falle la búsqueda inicial?
Además, este último diccionario ( Disconnect
) nunca se alcanza, y el túnel se mantiene durante algún tiempo. ¿Cómo puedo hacer lo "contrario" de lo anterior y derribar el túnel para algunos nombres de dominio? El DomainAction
de NeverConnect
no lo hace.