For more information regarding the security incident at F5, the actions we are taking to address it, and our ongoing efforts to protect our customers, click here.

Use F5 LTM as HTTP Proxy

Problem this snippet solves:

LTM product can be used as a HTTP Proxy for servers and PC.

This code explains minimum requirements to configure proxy feature without SWG module (configurations from Explicit Forward Proxy documentation without documentation ) and without explicit proxy iApp.

How to use this snippet:

All these commands must be run in bash shell.

Create HTTP PROXY VIRTUAL SERVER

Configure variables used in next commands

Variable HTTPBaseName is used to create :

  • Resolver object : RESOLVER_${HTTPBaseName}
  • HTTP profile : http_${HTTPBaseName}
  • virtual server : VS_${HTTPBaseName}

HTTPBaseName="HTTP_FORWARD_PROXY"
VS_IP="192.168.2.80"
VS_PORT="8080"

create DNS resolver with your DNS server (1.1.1.1 is for demo using cloudflare)

tmsh create net dns-resolver RESOLVER_${HTTPBaseName} { forward-zones replace-all-with { . { nameservers replace-all-with { 1.1.1.1:domain { } } } } route-domain 0 }

create HTTP profile type explicit, using DNS resolver.

The parameter default-connect-handling allow enables HTTPS connections without SSL inspection

tmsh create ltm profile http http_${HTTPBaseName} {  defaults-from http-explicit explicit-proxy { default-connect-handling allow dns-resolver RESOLVER_${HTTPBaseName} } proxy-type explicit }

create HTTP proxy Virtual server

tmsh create ltm virtual VS_${HTTPBaseName} { destination ${VS_IP}:${VS_PORT} ip-protocol tcp mask 255.255.255.255 profiles replace-all-with { http_${HTTPBaseName} { } tcp } source 0.0.0.0/0 source-address-translation { type automap } translate-address enabled translate-port enabled}

ENABLE SSL FORWARD PROXY

This section is not required to forward HTTPS requests but only to enable SSL inspection on HTTPS requests.
Note : Following configuration requires SSL, Forward Proxy License.

Configure variables used in next commands

Variable SSLBaseName is used to create :

  • certificate / key pair : ${SSLBaseName}
  • Client SSL profile : clientssl_${SSLBaseName}
  • Server SSL profile : serverssl_${SSLBaseName}
  • virtual server : VS_${SSLBaseName}

SSLBaseName="SSL_FORWARD_PROXY"
dirname="/var/tmp"
CASubject="/C=FR/O=DEMO\ COMPANY/CN=SSL\ FORWARD\ PROXY\ CA"

Create self-signed certificate for CA purpose (not available in WebUI)

Self-signed certificates created in WebUI doesn't have CA capability required for SSL FORWARD PROXY.

openssl genrsa -out ${dirname}/${SSLBaseName}.key 4094
openssl req -sha512 -new -x509 -days 3650 -key ${dirname}/${SSLBaseName}.key -out ${dirname}/${SSLBaseName}.crt -subj "${CASubject}"

Import certificates in TMOS

tmsh install sys crypto key ${SSLBaseName}.key from-local-file ${dirname}/${SSLBaseName}.key; 
tmsh install sys crypto cert ${SSLBaseName}.crt from-local-file ${dirname}/${SSLBaseName}.crt; 

After CA Certificate is imported, browse in WebUI, retrieve it and import it in client browsers trusted CA

Create SSL profiles for SSL FORWARD PROXY

tmsh create ltm profile client-ssl clientssl_${SSLBaseName} { cert-lookup-by-ipaddr-port disabled defaults-from clientssl mode enabled proxy-ca-cert ${SSLBaseName}.crt proxy-ca-key ${SSLBaseName}.key ssl-forward-proxy enabled }
tmsh create ltm profile server-ssl serverssl_${SSLBaseName} { defaults-from serverssl ssl-forward-proxy enabled }

create SSL FORWARD PROXY Virtual server

tmsh create ltm virtual VS_${SSLBaseName} { destination 0.0.0.0:https ip-protocol tcp profiles replace-all-with { clientssl_${SSLBaseName} { context clientside } serverssl_${SSLBaseName} { context serverside } http { } tcp { } } source 0.0.0.0/0 translate-address disabled translate-port disabled vlans replace-all-with  { http-tunnel } vlans-enabled }

Change HTTP EXPLICIT PROXY Default Connect Handling to Deny

tmsh modify ltm profile http http_${HTTPBaseName} explicit-proxy { default-connect-handling deny }

Note : These commands were tested in both 12.1 and 13.1 versions.

Code :

No Code
Updated Jun 06, 2023
Version 2.0

24 Comments

  • Hello,

    Yeah I did find a solution.

     

    Please do not forget to enable the Advanced view in the Virtual Server configuration mode !

     

    First, create a new Tunnel interface ( this is in the VLAN menu of the BIG-IP ) :

    Name : MyTunnelInterface ( choose whatever you want )

    Profile : tcp-forward

     

    Then, you have to configure 2 virtual servers :

    • One VS (type Standard) is listening on TCP/8080 and ENABLED ON THE INTERFACE WHERE CLIENTS ARE COMING FROM

    Important settings on this VS :

    SNAT : Automap

    HTTP Profile : http-explicit

     

    • Another VS is of type "Forwarding IP" and has the following config :

    Source : 0.0.0.0/0

    Destination : 0.0.0.0/0

    Service port : All ports

    Enabled on : MyTunnelInterface ( This is very important, use the name you have chosen earlier in this guide )

    Protocol : TCP ( This prevents any kind of performance penalty )

    Profile : FastL4 with loose initiation and loose close enabled ( I created a new profile from the existing default FastL4 profile )

    SNAT : Automap mode

     

    And voila, you should be good to go.

     

    This is working on the following cluster :

    2x BIG IP w/ BEST bundle in HA Active / Passive mode

     

    I hope this guide will somewhat help you.

     

    Regards.

     

  • Hi Nicol4s

    Thanks for information sharing

    Well, still, also this solution is not working

    I think there is some other configuration should be done when working with partitions ...

     

  • Hi Nicol4s

    I think I managed to solve the issue

    I put everything in the same partition and the same route domain

    then internet works

    but the thing is that I need to change the next hop for this kind of traffic

    when I add pool to both VS , nothing works ..

    Do you have any idea on how to change the next hop for those both VS's ?

  • Hi

    I know this is an old thread, but I followed the implementation as suggested and it works fine for HTTP traffic but if i try ICMP or SMTP it fails. Any suggestions?