I am having trouble port-forwarding on an Cisco ASA from a host on the internet to a host on the internal network. The outside interface of the ASA is assigned via DHCP. Is there something else that has to be done in order to make this work correctly?

update to problem

(outside) to (outside) source dynamic VPN_NETWORK interface



(outside) to (outside) after-auto source dynamic VPN_NETWORK interface


# packet-tracer input outside tcp 74.x.x.x 1025 71.x.x.x 555

Phase: 1
Subtype: input
Result: ALLOW
Additional Information:
in   71.x.x.x identity

Phase: 2
Result: DROP
Implicit Rule
Additional Information:

input-interface: outside
input-status: up
input-line-status: up
output-interface: NP Identity Ifc
output-status: up
output-line-status: up
Action: drop
Drop-reason: (acl-drop) Flow is denied by configured rule


ASA Version 8.4(2) 
hostname asa
enable password ***** encrypted
passwd ***** encrypted
interface Ethernet0/0
 switchport access vlan 2
interface Ethernet0/1
interface Ethernet0/2
interface Ethernet0/3
interface Ethernet0/4
interface Ethernet0/5
interface Ethernet0/6
interface Ethernet0/7
interface Vlan1
 nameif inside
 security-level 100
 ip address 
interface Vlan2
 nameif outside
 security-level 0
 ip address dhcp setroute 
boot system disk0:/asa842-k8.bin
ftp mode passive
same-security-traffic permit intra-interface
object network obj_any
object network VPN_NETWORK
object network VM
access-list dynamic-filter_acl extended permit ip any any 
access-list VM-IN extended permit tcp any host eq 555 
pager lines 24
logging enable
logging asdm informational
mtu inside 1500
mtu outside 1500
ip local pool VPN-DHCP-POOL
icmp unreachable rate-limit 1 burst-size 1
asdm image disk0:/asdm-645-206.bin
no asdm history enable
arp timeout 14400
nat (inside,outside) source static any any destination static VPN_NETWORK VPN_NETWORK no-proxy-arp route-lookup
nat (outside,outside) source dynamic VPN_NETWORK interface
object network obj_any
 nat (inside,outside) dynamic interface
object network VM
 nat (inside,outside) static interface service tcp 555 555 
access-group VM-IN in interface outside
timeout xlate 3:00:00
timeout conn 1:00:00 half-closed 0:10:00 udp 0:02:00 icmp 0:00:02
timeout sunrpc 0:10:00 h323 0:05:00 h225 1:00:00 mgcp 0:05:00 mgcp-pat 0:05:00
timeout sip 0:30:00 sip_media 0:02:00 sip-invite 0:03:00 sip-disconnect 0:02:00
timeout sip-provisional-media 0:02:00 uauth 0:05:00 absolute
timeout tcp-proxy-reassembly 0:01:00
timeout floating-conn 0:00:00
dynamic-access-policy-record DfltAccessPolicy
user-identity default-domain LOCAL
aaa authentication http console LOCAL 
aaa authentication ssh console LOCAL 
http server enable
http inside
no snmp-server location
no snmp-server contact
snmp-server enable traps snmp authentication linkup linkdown coldstart
crypto ipsec ikev1 transform-set ESP-AES-256-SHA esp-aes-256 esp-sha-hmac 
crypto ipsec ikev1 transform-set ESP-AES-128-SHA esp-aes esp-sha-hmac 
crypto ipsec ikev1 transform-set ESP-AES-192-SHA esp-aes-192 esp-sha-hmac 
crypto dynamic-map SYSTEM_DEFAULT_CRYPTO_MAP 65535 set pfs group1
crypto dynamic-map SYSTEM_DEFAULT_CRYPTO_MAP 65535 set ikev1 transform-set ESP-AES-256-SHA
crypto map outside_map 65535 ipsec-isakmp dynamic SYSTEM_DEFAULT_CRYPTO_MAP
crypto map outside_map interface outside
crypto map inside_map 65535 ipsec-isakmp dynamic SYSTEM_DEFAULT_CRYPTO_MAP
crypto map inside_map interface inside
crypto ikev1 enable inside
crypto ikev1 enable outside
crypto ikev1 policy 10
 authentication crack
 encryption aes-256
 hash sha
 group 2
 lifetime 86400
crypto ikev1 policy 20
 authentication rsa-sig
 encryption aes-256
 hash sha
 group 2
 lifetime 86400
crypto ikev1 policy 30
 authentication pre-share
 encryption aes-256
 hash sha
 group 2
 lifetime 86400
telnet timeout 5
ssh inside
ssh timeout 5
ssh version 2
console timeout 0

dhcp-client client-id interface outside
dhcpd auto_config outside
dhcpd address inside
dhcpd dns interface inside
dhcpd option 3 ip interface inside
dhcpd enable inside
threat-detection basic-threat
threat-detection statistics access-list
no threat-detection statistics tcp-intercept
dynamic-filter enable interface outside classify-list dynamic-filter_acl
dynamic-filter drop blacklist interface outside 
ssl encryption des-sha1
group-policy EdgeAccess internal
group-policy EdgeAccess attributes
 dns-server value
 vpn-tunnel-protocol ikev1 
username user password ***** encrypted
tunnel-group EdgeAccess type remote-access
tunnel-group EdgeAccess general-attributes
 address-pool VPN-DHCP-POOL
 default-group-policy EdgeAccess
tunnel-group EdgeAccess ipsec-attributes
 ikev1 pre-shared-key *****
class-map inspection_default
 match default-inspection-traffic
policy-map type inspect dns preset_dns_map
  message-length maximum 512
policy-map global_policy
 class inspection_default
  inspect dns preset_dns_map 
  inspect ftp 
  inspect h323 h225 
  inspect h323 ras 
  inspect rsh 
  inspect rtsp 
  inspect esmtp 
  inspect sqlnet 
  inspect skinny  
  inspect sunrpc 
  inspect xdmcp 
  inspect sip  
  inspect netbios 
  inspect tftp 
  inspect ip-options 
service-policy global_policy global
privilege show level 0 mode configure command filter
privilege cmd level 0 mode configure command filter
privilege cmd level 0 mode config-group-webvpn command filter
privilege cmd level 0 mode config-username-webvpn command filter
prompt hostname context 
no call-home reporting anonymous
: end
  • Sorry, my answer made more sense before your edit. Your configuration now has you NAT'ing an IP to itself. This made sense on pre-8.3 systems as a static NAT exemption, but not on 8.4. Can you explain what you're trying to do? – James Sneeringer Jan 10 '12 at 5:37
  • Yes, if a request for TCP port 777 arrives at the outside interface, it is forwarded to host .125 on the internal network. – Astron Jan 10 '12 at 11:53
  • The VM object should be the internal IP, and the IP shown in the nat statement should be the external IP. In the current form form of your question, both are the same. If we talk about your unedited question, with as the real/inside and as the NAT/outside, all you need to do is change your access-list to refer to instead of – James Sneeringer Jan 10 '12 at 14:04
  • That was just a mistake, is there not a way to port forward without specifying an external IP address? The outside interface is DHCP and it would be tedious to change the rules every time the external address changes. Dis-regard the class-B network references. – Astron Jan 10 '12 at 15:11
  • 1
    I duplicated the config I posted below on an otherwise bare 5520 running 8.4(2)8, using port 22 for everything, and it works fine for me (so my previous comment about port 22 and ssh is invalid). Can you post your complete (sanitized) config somewhere for us to see? And please verify the exact version you're using, since it's possible (though unlikely) that you're tripping over a bug. Also, when you run packet-tracer, make sure you specify the NAT/interface IP as the destination; using the real inside IP seem to be what triggers the drop due to rpf-check. – James Sneeringer Jan 12 '12 at 22:31

As of version 8.3, access lists applied with an access-group statement always use the real IP address, even if the incoming packet is directed at a NAT'd IP; see the ASA Version 8.3 Migration Guide for details.

Your access list should instead look like this:

access-list VM_IN extended permit tcp any host eq 777

Or, even better, use the object so you only have to update it in one place in the future:

access-list VM_IN extended permit tcp any object VM eq 777

EDIT (reflecting clarification from Astron):

To do inbound port forwarding to an internal host on an interface that has a dynamically-assigned address (e.g. DHCP):

object network VM
object network VM
 nat (inside,outside) static interface service tcp 777 777
access-list VM_IN extended permit tcp any object VM eq 777
access-group VM_IN in interface outside

The key is the static interface part in the nat statement. It will replace interface with whatever the IP of the outside interface happens to be at the time a packet arrives for translation.

| improve this answer | |
  • How is this any different than what I have in the original question? – Astron Jan 10 '12 at 11:54
  • 1
    Edited so the IP reflects your original question. I copied the wrong one into my answer. – James Sneeringer Jan 10 '12 at 14:00
  • Made the change and provided output from packet-tracer. Would the VPN config have anything to do with the denial? – Astron Jan 11 '12 at 2:53
  • shudder no idea why Cisco went this route with their syntax. – gravyface Jan 11 '12 at 3:10
  • 1
    @JamesSneeringer Problem was the hairpin NAT statement I have for the VPN. This was causing an issue with the correct port-forwarding rules you provided. – Astron Jan 13 '12 at 13:37

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.