NAT Traversal – Giải pháp cho IPsec Tunnel đi qua các thiết bị NAT (modem, firewall)

Để thiết lập 1 VPN tunnel thì cần trải qua 2 phase:

Phase 1: Sử dụng giao thức ISAKMP (nằm trên L4, luôn sử dụng giao thức truyền tải bên dưới là UDP port 500)

Phase 2: Sử dụng giao thức IPsec có 2 phiên bản là ESP và AH. Trong đó AH không sử dụng được nếu có NAT/PAT device ở giữa vì nó check integrity dựa vào IP header mà các trường như địa chỉ sẽ chắn chắn bị thay đổi khi có NAT/PAT.

ESP sẽ đóng gói toàn bộ TCP/UDP bên trong.  Tuy nhiên, trong ESP header lại không có port giống như TCP/UDP. Đây là điểm khác biệt của ESP với ISAKMP và gây ra vấn đề khi thiết lập IPsec tunnel đi qua thiết bị thực hiện NAT overload (PAT), do không có port để map trong bảng NAT.

Giải quyết với NAT-T.

1. Hai đầu thiết bị kiểm tra xem có hỗ trợ NAT-T không thông qua 2 bản tin số 1 và 2  trong ISAKMP Main Mode.

2. Nếu cả 2 đều hỗ trợ NAT-T, 2 thiết bị kiểm tra trên đường truyền có tồn tại thiết bị NAT không. Quá trình này được gọi là NAT-D (NAT Discovery), cụ thể có 2 bản tin NAT-D được gửi, nội dung là giá trị hash của ip và port (bản tin đầu chưa thông tin src.ip + src.port, bản tin sau chứa dst.ip + dst.port). Thiết bị phía nhận kiểm tra hash xem có tồn tại thiết bị NAT ở giữa không.

3. Nếu có thiết bị PAT ở giữa, NAT-T thông qua các bản tin ISAKMP Main Mode  số 5 và 6, mục đích để ISAKMP chuyển từ dùng UDP port 500 sang dùng UDP port 4500, đồng thời cũng đóng gói Quick Mode (Phase 2 Ipsec) vào trong UDP port 4500 (cả src.port và dst.port đều là 4500).

4. Khi đi qua thiết bị PAT, src.port 4500 được đổi thành random high port, dst.port giữ nguyên.

Điểm khác biệt của NAT-T so với IPsec over UDP:

– NAT-T: chỉ đóng gói bản tin ESP vào UDP 4500 khi gặp phải PAT. NAT-T luôn luôn dùng port 4500, không cấu hình thay đổi được.

– IPsec over UDP: luôn đóng gói vào UDP 10000, giá trị port 10000 có thể thay đổi được.

Tham khảo:

https://supportforums.cisco.com/document/64281/how-does-nat-t-work-ipsec

https://supportforums.cisco.com/discussion/11028366/how-nat-t-works-ipsec

Sử dụng NAT/IPsec để kết nối 2 mạng trùng dải địa chỉ IP (Overlapping Networks)

1

Tình huống: Công ty quyết định kết nối mạng tại 2 site với nhau, tuy nhiên do không có quy hoạch trước nên cả 2 site đều đang dùng dải IP là 192.168.1.0/24. Phương án thay đổi IP không được chấp nhận vì phải thay đổi lại rất nhiều và gây gián đoạn dịch vụ.

 Giải pháp: Cấu hình NAT trên các Router biên R3 và R4, đổi R3 LAN thành 10.0.0.0/24 và đổi R4 LAN thành 20.0.0.24. Khi 2 site gửi dữ liệu cho nhau thì dst.ip sẽ là địa chỉ sau NAT đại diện cho mỗi LAN. Ví dụ khi PC R1 cần gửi dữ liệu cho PCR5 thì sẽ gửi với dst.ip = 20.0.0.10, ngược lại PC R5 gửi dữ liệu cho PC R1 sẽ lấy dst.ip = 10.0.0.10

Cấu hình:

R3:

ena
conf t

int f0/0
no sh
ip add 192.168.1.1 255.255.255.0
ip nat inside
int f0/1
no sh
ip add 200.200.200.1 255.255.255.0
ip nat outside

!Map toàn bộ dải 192.168.1.0/24 sang dải 10.0.0.0/24
ip nat inside source static network 192.168.1.0 10.0.0.0 /24 no-alias

ip route 20.0.0.0 255.255.255.0 f0/1 200.200.200.2

R4:

ena
conf t

int f0/0
no sh
ip add 192.168.1.1 255.255.255.0
ip nat inside
int f0/1
no sh
ip add 200.200.200.2 255.255.255.0
ip nat outside

!Map toàn bộ dải 192.168.1.0/24 sang dải 20.0.0.0/24
ip nat inside source static network 192.168.1.0 20.0.0.0 /24 no-alias

ip route 10.0.0.0 255.255.255.0 f0/1 200.200.200.1

Kết quả: PC R1 có thể kết nối tới PC R5 bằng ip đại diện.

R1#ping 20.0.0.10

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 20.0.0.10, timeout is 2 seconds:
!!!!!

R3#debug ip nat
*Mar  1 01:12:18.399: NAT*: s=192.168.1.10->10.0.0.10, d=20.0.0.1 [35]
*Mar  1 01:12:18.443: NAT*: s=20.0.0.1, d=10.0.0.10->192.168.1.10 [35]

R3#show ip nat translations
Pro Inside global      Inside local       Outside local      Outside global
— 10.0.0.10          192.168.1.10       —                —
— 10.0.0.0           192.168.1.0        —                —

R4#debug ip nat
*Mar 1 01:12:17.119: NAT*: s=10.0.0.10, d=20.0.0.1->192.168.1.1 [35]
*Mar 1 01:12:17.123: NAT: s=192.168.1.1->20.0.0.1, d=10.0.0.10 [35]

R4#show ip nat translations
Pro Inside global      Inside local       Outside local      Outside global
— 20.0.0.1           192.168.1.1        —                —
— 20.0.0.0           192.168.1.0        —                —

Mở rộng: Có thể cấu hình IPsec tunnel cho 2 site bị trùng IP như trên, trong đó chú ý access-list sẽ permit traffic giữa 10.0.0.0/24 và 20.0.0.0/24 vì NAT được xử lý trước khi encryption. Tham khảo cấu hình như  sau:

R3 (R4 tương tự)

crypto isakmp policy 1
encr aes
authentication pre-share
group 2
crypto isakmp key cisco address 200.200.200.2
!
!
crypto ipsec transform-set MYSET esp-aes esp-md5-hmac
!
crypto map MYMAP 10 ipsec-isakmp
set peer 200.200.200.2
set transform-set MYSET
match address 100

int f0/1

crypto map MYMAP
!
ip route 20.0.0.0 255.255.255.0 200.200.200.2
!

access-list 100 permit ip 10.0.0.0 0.0.0.255 20.0.0.0 0.0.0.255

Tham khảo:

http://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/14143-same-ip.html

http://nyquist.eu/nat-for-overlapping-networks/

https://cciereview.wordpress.com/2012/03/03/nat-overlapping-subnets/

Phân biệt các kiểu NAT – Cách nhìn khác

View1:

IP nat inside source: đổi src.ip với traffic từ in -> out, hoặc đổi dst.ip với traffic từ out ->in

Ip nat inside destination: đổi dst.ip với traffic từ out -> in

ip nat outside source: đổi dst.ip với traffic từ in -> out hoặc đổi src.ip với traffic từ out –> in

ip nat outside destination: không có

So sánh IP nat inside source và Ip nat inside destination

Giống nhau: đều đổi dst.ip với traffic từ out –> in.

Khác nhau:

– ip nat inside source: thường cấu hình static NAT hoặc Port forwarding để forward traffic từ bên ngoài vào 1 host bên trong mạng. Còn Dynamic NAT hoặc Port forwarding cũng có thể forward traffic từ bên ngoài vào với điều kiện phải có traffic khởi tạo từ bên trong trước do kiểu này là source list, các nat entry chỉ được tạo ra khi có traffic từ trong ra và có thời gian time out. Trong khoảng thời gian trước khi các nat entry bị time out thì traffic từ bên ngoài mới có thể vào được host bên trong

– ip nat inside destination: thường để cân bẳng tải cho các server chung Virtual IP (Ví dụ: https://routedinterface.com/2014/09/basic-tcp-load-distribution-nat/)

 

View 2:

ip nat inside: When transiting in->out, modify source address. When transiting out->in, modify destination address.
ip nat outside: When transiting out->in, modify source address. When transiting in->out, modify destination address.

View 3:

ip nat inside: dùng để public mạng bên trong như đang bên ngoài ( bên ngoài từ thấy là đang gửi/nhận traffic từ 1 vùng global khác giống như mình, chứ không phải 1 vùng bên trong nào đó)

ip nat outside: dùng để thể hiện mạng bên trong giống như đang ở cùng mạng local vậy.

Phân biệt IP nat inside vs IP nat outside

Các câu lệnh NAT có thể phân chia như sau, trong đó ip  nat inside thường được dùng hơn vì nếu dùng ip nat outside thì trong 1 số trường hợp cần phải cấu hình thêm static route (do traffic từ inside ra outside được xử lý routing trước rồi mới NAT).

1. ip nat inside thường dùng để pulic mạng bên trong cho bên ngoài thấy và truy cập, trong đó

– ip nat inside source –> đổi địa chỉ nguồn để khi dữ liệu đi từ trong ra ngoài để mạng bên ngoài thấy và trả dữ liệu về được. Nếu là source static, thì NAT có tính chất 2 chiều, nếu là source list thì NAT 1 chiều, chỉ NAT khi dữ liệu từ trong ra ngoài.

– ip nat inside destination –> đổi địa chỉ đích để bên ngoài có thể truy xuất các server bên trong đại diện bởi 1 Virtual IP (VIP), sau đó VIP này sẽ được NAT thành địa chỉ của các server thực sự bên trong (TCP NAT Load Balancing)

2. ip nat outside –> thường dùng để các host bên trong thấy mạng bên ngoài như đang ở local, cùng mạng vậy, trong đó:

–  ip nat outside source: đổi địa chỉ nguồn của gói tin khi từ outside vào inside. Nếu là source static thì NAT có tính chất 2 chiều, còn nếu là source list thì là NAT 1 chiều, tức là chỉ NAT khi dữ liệu từ outside vào inside.

– ip nat outside destination –> không có

Ý nghĩa các từ khóa:

inside: Router thực hiện NAT khi chuyển traffic xuất phát từ inside –> outside interface và ngược lại (tính 2 chiều chỉ áp dụng với source là static, nếu source là list thì là dynamic thì các nat entry sẽ có time-out, traffic bắt buộc phải từ trong ra)

outside: Router thực hiện NAT khi chuyển traffic xuất phát từ outside –> inside interface và ngược lại (giống trên, tính 2 chiều chỉ áp dụng nếu source là static,  nếu source là list thì là dynamic thì các nat entry sẽ có time-out, traffic bắt buộc traffic phải từ ngoài vào)

source: Đổi địa chỉ nguồn

destination: Đổi địa chỉ đích

1

Trong ví dụ sau đây, chúng ta cấu hình NAT trên R2 với mục đích: R1 được đại diện bởi địa chỉ 192.168.23.100 giống như cùng mạng với R3, R3 đại diện bởi 192.168.12.100 giống như đang cùng mạng với R1. Lệnh cấu hình như sau:

ip nat inside source static 192.168.12.1 192.168.23.100 –> Từ khóa inside –> thực hiện NAT trên interface inside (và ngược lại), từ khóa source –> đổi địa chỉ nguồn. Cụ thể, tác dụng của lệnh này như sau:

– R2 soi trên interface inside (f0/0), nếu thấy có gói tin có src.ip = 192.168.12.1 –> đổi thành src.ip = 192.168.23.100

– Điểm key quan trọng cần nhớ ở đây là NAT inside hay outside đều có tính chất 2 chiều –> tức là theo chiều ngược lại, nếu R2 nhận được gói tín có dst.ip 192.168.23.100 –> đổi thành dst.ip = 192.168.12.1.

ip nat outside source static 192.168.23.3 192.168.12.100

– R2 soi trên interface outside (f0/1), nếu thấy có gói tin có src.ip = 192.168.23.3–> đổi thành src.ip = 192.168.12.100

– Đồng thời chiều ngược lại: nếu trên interface inside nhận được gói tin có dst.ip = 192.168.12.100 –> đổi thành dst.ip = 192.168.23.3

Kết quả:

R1#ping 192.168.12.100      

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.12.100, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 20/27/32 ms

R2#debug ip nat
*Mar  1 01:08:57.811: NAT: s=192.168.12.1->192.168.23.100, d=192.168.12.100 [26]
*Mar  1 01:08:57.815: NAT: s=192.168.23.100, d=192.168.12.100->192.168.23.3 [26]
*Mar  1 01:08:57.847: NAT*: s=192.168.23.3->192.168.12.100, d=192.168.23.100 [26]
*Mar  1 01:08:57.847: NAT*: s=192.168.12.100, d=192.168.23.100->192.168.12.1 [26]

R3#ping 192.168.23.100

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.23.100, timeout is 2 seconds:
…..
Success rate is 0 percent (0/5)

R2#
*Mar 1 01:11:21.595: NAT*: s=192.168.23.3->192.168.12.100, d=192.168.23.100 [35]
*Mar 1 01:11:21.595: NAT*: s=192.168.12.100, d=192.168.23.100->192.168.12.1 [35]

Ping đã tới R1 với src.ip = 192.168.12.100 nên bản tin ping reply sẽ được gửi lại với dst.ip 192.168.12.100 tới R2, mà đây lại mạng kết nối trực tiếp với R2 nên R2 sẽ không đẩy dữ liệu sang R3 nên R3 ko nhận được ping trả về. Câu hỏi đặt ra là ở trên mình đã cấu hình ip nat outside source static 192.168.23.3 192.168.12.100 >> đáng nhẽ 192.168.12.100 được NAT thành 192.168.23.3 chứ ==>  nguyên nhân là do đặc điểm của NAT khi traffic từ inside –> outside là được xử lý routing trước rồi mới đến NAT, nên router sẽ tìm route cho 192.168.12.100 trước khi tiến hành NAT.

Để ping được trên R2 cần cấu hình thêm static route: R2(config)#ip route 192.168.12.100 255.255.255.255  192.168.23.3

hoặc thêm từ khóa add-route vào câu lệnh NAT:

ip nat outside source static 192.168.23.3 192.168.12.100 add-route

R3#ping 192.168.23.100

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.23.100, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 28/60/80 ms

R2(config)#
*Mar 1 01:18:58.163: NAT*: s=192.168.23.3->192.168.12.100, d=192.168.23.100 [45]
*Mar 1 01:18:58.163: NAT*: s=192.168.12.100, d=192.168.23.100->192.168.12.1 [45]
*Mar 1 01:18:58.203: NAT: s=192.168.12.1->192.168.23.100, d=192.168.12.100 [45]
*Mar 1 01:18:58.203: NAT: s=192.168.23.100, d=192.168.12.100->192.168.23.3 [45]

 

Một giải pháp khác thay thế không cần phải add-route là cấu hình với NAT Virtual Interface.

R2(config)#int f0/0

R2(config-if)#ip nat enable

R2(config)#int f0/1

R2(config-if)#ip nat enable

R2(config)#ip nat source static 192.168.12.1 192.168.23.100

R2(config)#ip nat source static 192.168.23.3 192.168.12.100

 

Tham khảo: http://astorinonetworks.com/2011/08/16/the-inside-outside-of-nat-for-overlapping-networks/

http://www.groupstudy.com/archives/ccielab/200702/msg01284.html

http://gns3vault.com/forums/topic/ip-nat-outside/

NAT cơ bản

Định nghĩa chuẩn về các loại địa chỉ NAT:

  • Inside global: The address of the inside host as seen from the outside
  • Inside local: The address of the inside host as seen from the inside
  • Outside local: The address of the outside host as seen from the inside
  • Outside global: The address of the outside host as seen from the outside

1. NAT

Static NAT

  • Tỉ lệ NAT là 1:1
  • Thông tin về các địa chỉ translation luôn được để trong NAT Table (trừ khi xóa câu lệnh static NAT)
  • NAT có tính chất 2 chiều

Dynamic NAT

  • Tỉ lệ NAT là 1:1
  • Thông tin về các địa chỉ translation chỉ có khi xuất hiện traffic, các entry này không tồn tại mãi mà có một giá trị time-out (???)
  • NAT 1 chiều mà thôi

2. PAT

Static PAT: dùng để cấu hình Portwarding.

Tham khảo:

NAT and PAT: a complete explanation

NAT virtual interface

NAT Virtual Interface aka NVI, what is that?!

The Inside and Outside of NAT

http://blog.ine.com/2008/02/15/the-inside-and-outside-of-nat/

NAT: OVERLAPPING SUBNETS

http://nyquist.eu/nat-for-overlapping-networks/

https://cciereview.wordpress.com/2012/03/03/nat-overlapping-subnets/

 

IOS NAT Load-Balancing for Two ISP Connections

http://www.cisco.com/c/en/us/support/docs/ip/network-address-translation-nat/100658-ios-nat-load-balancing-2isp.html

NAT failover with DUAL ISP on a router Configuration Example

Introduction

This is an generic example of how to configure NAT when there are multiple ISP’s for internet connectivity and we want proper Failover i.e when Primary ISP goes down then Secondary takes over with correct NAT happening using the secondary ISP’s public ip address

Design

              ------------- ISP1 -------------
             |                                |
             |                                |
LAN -- WAN router                          Internet
             |                                |
             |                                |
              ------------- ISP2 -------------

Configuration

interface FastEthernet0/0

Description Primary link ISP1

ip address 12.x.x.x 255.255.255.240

ip nat outside
interface FastEthernet1/0

Description Secondary link ISP2

ip address 76.x.x.x. 255.255.255.0

ip nat outside
interface FastEthernet1/1

Description Inside LAN segment

ip address 172.168.60.1 255.255.255.0

ip nat inside
access-list 100 permit ip 172.168.60.0 0.0.0.255 any
route-map isp1 permit 10

match ip address 100

match interface FastEthernet0/0
route-map isp2 permit 10

match ip address 100

match interface FastEthernet1/0
ip nat inside source route-map isp1 interface FastEthernet0/0 overload

ip nat inside source route-map isp2 interface FastEthernet1/0 overload
ip route 0.0.0.0 0.0.0.0 12.y.y.y —–> Primary Default route pointing towards Next hop ip of ISP1

ip route 0.0.0.0 0.0.0.0 76.y.y.y 10 —–> Backup Default route with higher AD (10) pointing towards Next hop ip of ISP2

    • the above example shows how we can perform Failover for PAT (Port Address Translation) for the traffic going out to Internet. By using route-maps and “match interface” option, we can achieve failover for Static NAT translation as well which is generally configured when services are hosted out to the internet like webserver or exchange server hosted inside accessible from Internet

route-map isp1static permit 10

match interface FastEthernet0/0
route-map isp2static permit 10

match interface FastEthernet1/0
ip nat inside source static 172.168.60.2 12.x.x.x route-map isp1static

ip nat inside source static 172.168.60.2 76.x.x.x route-map isp2static