Technical Forum
Ask questions. Discover Answers.
Showing results for 
Search instead for 
Did you mean: 

APM SSLVPN with layered virtual


Hi guys,


I'm trying a new (for me), but oftenly recommended by F5 SEs, setup with layered virtuals. In my testing environment, I have only one single IP address. This is used for a standard virtual server, which will be used as some kind of a jump VS (let's call it 'VS_jump'). I've assigned an LTM policy to this VS, which forwards the traffic to different virtuals, based on the requested host header.


Basically this is working finde. But I'm struggling arround with APM and SSLVPN (Network Access). The requests hit the correct VS ('VS_apm-sslvpn') with APM profile assigned and the user is able to authenticate. But after opening the PPP tunnel, it's ending in a timeout for the client. The APM log tells me, that the tunnel was directly closed:


PPP tunnel 0x56009ef6dd00 (ID: 703c0a5b) started. PPP tunnel 0x56009ef6dd00 (ID: 703c0a5b) closed.

This issue only occurs, if the APM profile is bound to the forwarded virtual, 'VS_apm-sslvpn'. For testing purposes I've assigned the APM and connectivity profile to 'VS_jump' and the connection came up directly, without any issue. The message


PPP tunnel 0x56009ef6dd00 (ID: 703c0a5b) closed.

only appears, when the connection is manually disabled.


So my question is: Are there any known limitations to SSLVPN, when used in conjunction with layered virtuals? I'm not sure about settings like HTTP-XFF or SNAT - where shall they be set? On 'VS_jump' or 'VS_apm-sslvpn'.


Unfortunately I wasn't able to find anything related to SSLVPN and layered virtuals.


Any ideas?


Thanks in advance.








The best solution is to create a layered policy based on Client Hello SNI value instead of HTTP Host header..


This solution allow to route based on SNI (default value from browser is the same value as HTTP host). this doesn't require to add SSL / HTTP profiles on front virtual server.


Another improvement is to enable DTLS virtual server (udp/4433) to optimize VPN performance. This virtual server doesn't require to be layered as it is only for VPN.


I'm using SNI routing configured almost exactly like the article, matching at client ssl hello and forwarding to an APM SSLVPN enabled VS.


Same symptoms as OP.


Is there some other magic to making this work, or is it not supported?


Sven, did you ever happen to get this to work?



yes I got this working. Can't remember, why I didn't respond to Stanislas answer.


My LTM Policy looks like the following:

ltm policy SNI-Routing { controls { forwarding } requires { client-ssl } rules { Default { actions { 0 { log ssl-client-hello write facility local0 message "Nothing mathed on hostname" priority info } } ordinal 1 } { actions { 0 { forward ssl-client-hello select virtual /Common/vpn.example.me_ap_vs } } conditions { 0 { ssl-extension ssl-client-hello server-name values { } } } } } status published strategy first-match }


ltm virtual vpn.example.me_ap_vs { destination ip-protocol tcp mask profiles { http { } ppp { } rba { } tcp { } vpn.example.me_ap { } vpn.example.me_ap_cp { context clientside } { context clientside } websso { } } source translate-address enabled translate-port enabled }


ltm virtual vpn.example.me_ap_vs_dtls { destination <External Self IP>:4433 ip-protocol udp mask profiles { ppp { } udp { } vpn.example.me_ap_cp { context clientside } { context clientside } } source translate-address enabled translate-port enabled }

The DTLS VS is not going through the LTM SNI Routing policy. Instead it is, in my case, bound directly to the external Self IP, with only SSL client profile and connectivity assigned.


APM Profile

apm profile access vpn.example.me_ap { accept-languages { en } access-policy vpn.example.me_ap app-service none customization-group vpn.example.me_ap_logout default-language en eps-group vpn.example.me_ap_eps errormap-group vpn.example.me_ap_errormap framework-installation-group vpn.example.me_ap_framework_installation general-ui-group vpn.example.me_ap_general_ui generation 1 generation-action noop log-settings { default-log-setting } modified-since-last-policy-sync true type all user-identity-method http }

Connectivity Profile:

apm profile connectivity vpn.example.me_ap_cp { adaptive-compression enabled app-service none client-policy { vpn.example.me_ap_cp { ios-ec { save-password true } ios-ep { save-password true } } } compress-buffer-size 4096 compress-cpu-saver true compress-cpu-saver-high 90 compress-cpu-saver-low 75 compress-gzip-level 6 compress-gzip-memlevel 8192 compress-gzip-window-size 16384 compress-ingress false compression enabled compression-codecs { deflate lzo bzip2 } customization-group vpn.example.me_ap_cp_secure_access_client_customization defaults-from connectivity deflate-compression-level 1 description none fec-name none location-specific false tunnel-name vpn.example.me_ap_cp }

Hopefully this help.






Thanks. So the SNI-Routing policy is applied to another VS which is bound to the external self IP as well? (the jump-vs equivalent in your original post)?


I'm missing the DTLS portion, but it isn't enabled, so should fall back to TLS/443, but still fails just as your original post describes.


Version 13.2 I think, how about you?

My "jump-vs" is the SNI-Router VS, or in other words the "outer VS". So there is the SNI-Routing LTM policy applied. This VS is only used for service ports, which are used for SSL/TLS connections - otherwise SNI wouldn't work. I didn't check if DTLS does support SNI and therefore didn't use the "jump-vs". So my DTLS VS is just another Standard VS, without any LTM policies applied. On the other hand, the SNI-Routing LTM policy doesn't support the combination of SNI and TCP port conditions (at least not in my environments, tested with 13.1.x, 14.x and 15.0). For me this resulted in TCP resets on the outer VS.


This special environment has only a single private IP address, forwarded from a NAT router in front of the BIG-IP, which has a single public IP address.


My setup is on 15.0.x and will be updated to 15.1.x within the next days.