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.

Forum Discussion

iRule's avatar
iRule
Icon for Cirrus rankCirrus
Dec 29, 2021
Solved

Block admin URLs for internet users only

Dear Community,

I need to block few admin URLs and its subdirectories from internet only. The URLs should be accessible from internal private IPs of organization.

 

Following needs to be blocked.

 

https://hostname.com/admin/*

https://hostname.com/login/*

https://hostname.com/manage/*

https://hostname.com/account/*

 

 

Please inform how to modify following iRule to accomplish above requirement.

 

https://support.f5.com/csp/article/K74012450

 

when CLIENT_ACCEPTED {

    log local0. "Client IP address is: [clientside {IP::remote_addr}]"

}

 when HTTP_REQUEST {

    log local0. "HTTP Path = [HTTP::path]"

    log local0. "HTTP Host = [HTTP::host]"

if { ([HTTP::host] eq "hostname.example.com") and ([HTTP::path] eq "/test/login") } {

    switch -glob [class match [IP::client_addr] eq private_net] {

        "1" {

            log local0. "The IP is private"

            pool HTTP_Pool

        }

        default {

            log local0. "The IP is public"

            set content "No Access"

            HTTP::respond 403 content $content

            unset content

        }

    }

}

   else {

        log local0. "Access to other URLs, granted to any IP"

        pool HTTP_Pool

   }

}

 

 

Warm Regards

  • Hi,

    Create an address data group and add private IPs to the data group.

    iRule (Change the datagroupname):

    when HTTP_REQUEST {
    	switch -glob [string tolower [HTTP::uri -normalized]] {
    		"/admin/*" -
    		"/login/*" -
    		"/manage/*" -
    		"/account/*" { 
    			if { not [class match [IP::client_addr] equals datagroupname] } {
    				drop
    				return
    			}
    		}
    	}
    }

3 Replies

  • Hi,

    Create an address data group and add private IPs to the data group.

    iRule (Change the datagroupname):

    when HTTP_REQUEST {
    	switch -glob [string tolower [HTTP::uri -normalized]] {
    		"/admin/*" -
    		"/login/*" -
    		"/manage/*" -
    		"/account/*" { 
    			if { not [class match [IP::client_addr] equals datagroupname] } {
    				drop
    				return
    			}
    		}
    	}
    }
    • iRule's avatar
      iRule
      Icon for Cirrus rankCirrus

      Thank You Enes for your response,

       

      I have managed to accomplish the task by using following iRule after reviewing iRule guide at https://clouddocs.f5.com/api/irules/. But this iRule is working in case sensitive manner. If I use hostname.example.com/admin/etc or hostname.example.com/account/money this iRule works fine but if I use hostname.example.com/Admin/etc or hostname.example.com/Account/money the iRule does not work.

      Please inform how I can make this iRule non-case sensitive.

       

      ========================

      when CLIENT_ACCEPTED {

        log local0. "Client IP address is: [clientside {IP::remote_addr}]"

      }

       when HTTP_REQUEST {

        log local0. "HTTP URI = [HTTP::uri]"

        log local0. "HTTP Host = [HTTP::host]"

      if { ([HTTP::host] eq "hostname.example.com") and ([[HTTP::uri]] starts_with "/admin/etc* or [HTTP::uri]] starts_with "/account/money" or [HTTP::uri]] starts_with "/login/test" or [HTTP::uri]] starts_with "/manage/team") } {

        switch -glob [class match [IP::client_addr] eq private_net] {

          "1" {

            log local0. "The IP is private"

            pool My_Pool

          }

          default {

            log local0. "The IP is public"

            set content "No Access"

            HTTP::respond 403 content $content

            unset content

          }

        }

      }

        else {

          log local0. "Access to other URLs, granted to any IP"

          pool My_Pool

        }

      }

      ========================

       

      Warm Regards

      • Hi,

         

        Use [string tolower [HTTP::uri]] instead of [HTTP::uri]

         

        etc* is misspelled. Replace with etc"