Cisco ASA Hairpin Internal Server

The Cisco ASA firewall doesn’t like traffic that enters and exits the same interface. This kind of traffic pattern is called hairpinning or u-turn traffic. In the first hairpin example I explained how traffic from remote VPN users was dropped when you are not using split horizon, this time we will look at another scenario.

Take a look at the following topology:

Cisco ASA Hairpin Internal Server

Above we have a webserver using IP address 192.168.1.2 on our internal LAN. The ASA is configured so that IP address 192.168.2.220 on the outside is translated to IP address 192.168.1.2. This allows users on the Internet to access our webserver.

The Cisco ASA firewall doesn't like traffic that enters and exits the same interface. This kind of traffic pattern is called hairpinning or u-turn traffic. In the first hairpin example I explained how traffic from remote VPN users was dropped when you are not using split horizon, this time we will l


What if we want our internal hosts to access the webserver using the same outside IP address (192.168.2.220) instead of its internal IP address (192.168.1.2)? We can do this by configuring hairpinning on our ASA. Take a look below:

Cisco ASA hairpin internal host

H1 is on the same subnet as the webserver but is trying to reach the webserver using IP address 192.168.2.220. With the default configuration of our ASA, traffic will be routed to the outside and will never end up at the webserver.

Instead of configuring hairpinning it might be a better idea to setup a local DNS server that resolves the hostname of the webserver to the local IP address.

Startup Configurations

Want to try this yourself? Here you will find the startup configuration of each device.

H1

hostname H1
!
interface GigabitEthernet0/1
 ip address 192.168.1.1 255.255.255.0
!
ip default-gateway 192.168.1.254
!
end

Web

hostname Web
!
interface GigabitEthernet0/1
 ip address 192.168.1.2 255.255.255.0
!
ip default-gateway 192.168.1.254
!
end

H2

hostname H2
!
interface GigabitEthernet0/1
 ip address 192.168.2.3 255.255.255.0
!
ip default-gateway 192.168.2.254
!
end

ASA1

hostname ASA1
!
interface GigabitEthernet0/0
 nameif OUTSIDE
 security-level 0
 ip address 192.168.2.254 255.255.255.0 
!             
interface GigabitEthernet0/1
 nameif INSIDE
 security-level 100
 ip address 192.168.1.254 255.255.255.0 
!
object network WEB_SERVER
 host 192.168.1.2
access-list OUTSIDE_TO_INSIDE extended permit tcp any host 192.168.1.2 
!
object network WEB_SERVER
 nat (INSIDE,OUTSIDE) static 192.168.2.220
access-group OUTSIDE_TO_INSIDE in interface OUTSIDE
!
: end

Let’s see how the ASA is configured at the moment:

ASA1# show xlate 
1 in use, 1 most used
Flags: D - DNS, e - extended, I - identity, i - dynamic, r - portmap,
       s - static, T - twice, N - net-to-net
NAT from INSIDE:192.168.1.2 to OUTSIDE:192.168.2.220
    flags s idle 0:01:37 timeout 0:00:00

Above you can see that the ASA is currently only translating IP address 192.168.1.2 on the inside to IP address 192.168.2.220 on the outside. This allows a host on the outside to reach the webserver:

H2#
H2#telnet 192.168.2.220 80
Trying 192.168.2.220, 80 ... Open

H1 on the inside however is unable to reach the webserver using the outside IP address:

H1#telnet 192.168.2.220 80
Trying 192.168.2.220, 80 ... 
% Connection timed out; remote host not responding

Let’s fix this!

Configuration

The first thing we have to do is to tell our ASA to permit traffic that enters and exits the same interface:

ASA1(config)# same-security-traffic permit intra-interface

Now we can focus on the NAT configuration. First I will create some objects that match:

  • the subnet of the internal hosts (192.168.1.0 /24).
  • the translated outside IP address of the webserver.
  • the inside IP address of the webserver.
  • the TCP port that we use for HTTP traffic.

Here are the objects:

ASA1(config)# object-group network INTERNAL_HOSTS
ASA1(config-network-object-group)# network-object 192.168.1.0 255.255.255.0
ASA1(config)# object network WEB_PUBLIC
ASA1(config-network-object)# host 192.168.2.220
ASA1(config)# object network WEB_LOCAL
ASA1(config-network-object)# host 192.168.1.2
ASA1(config# object service HTTP
ASA1(config-service-object)# service tcp destination eq 80

Now we can configure the NAT translation:

We're Sorry, Full Content Access is for Members Only...

If you like to keep on reading, Become a Member Now! Here is why:

  • Learn any CCNA, CCNP and CCIE R&S Topic. Explained As Simple As Possible.
  • Try for Just $1. The Best Dollar You've Ever Spent on Your Cisco Career!
  • Full Access to our 654 Lessons. More Lessons Added Every Week!
  • Content created by Rene Molenaar (CCIE #41726)

535 Sign Ups in the last 30 days

satisfaction-guaranteed
100% Satisfaction Guaranteed!
You may cancel your monthly membership at any time.
No Questions Asked!

Tags:


Forum Replies

  1. Hi Rene,

    Why need for access to web server using the public ip(192.168.2.200) whereas We can access the server locally (Directly).Which special scenario we will use like this ?
    Could you please explain further ?

    br//
    zaman

  2. Hello Laz

    Its important for me the details of a topic to understand a concept . So thanks for your reply.

    Dionisis

  3. Hi Rene! Great Lesson. Just wanted to point out a typo that may need to be fixed. In the beginning of the lesson I think the webserver IP is supposed to indicate “192.168.1.2” not “192.168.2.2”. Please see below:

    “Above we have a webserver using IP address 192.168.2.2 on our internal LAN. The ASA is configured so that IP address 192.168.2.220 on the outside is translated to IP address 192.168.1.2. This allows users on the Internet to access our webserver.”

  4. Rene, you are doing a great job. A very difficult topic explained in simple way.

    Just to add, one reason why we need hairpining is that there are some applications in the DC which need to create control channels on the public IP in order to communicate hence they need inside to inside NAT.

  5. Hi Rene,
    Seem picture mismatch with config , OUSIDE IP for Webserver is 192.168.2.220 or 192.168.2.200

    object network WEB_SERVER
    nat (INSIDE,OUTSIDE) static 192.168.2.200

18 more replies! Ask a question or join the discussion by visiting our Community Forum