Trong bài viết trước, chúng ta đã cùng nhau tìm hiểu những nét tổng quan nhất về kỹ thuật NAT (Network Address Translation). Như thường lệ, để nắm được vấn đề một cách chắc chắn, chúng ta cùng khảo sát những vấn đề đã trình bày trong phần lý thuyết thông qua các bài lab ví dụ.
Trong bài viết tuần này, chúng ta sẽ cùng nhau khảo sát một bài lab ví dụ về kỹ thuật Static NAT.
Sơ đồ
Hình 1 – Sơ đồ bài lab ví dụ.
Mô tả
Trên hình 1 là mô hình lab mô phỏng một mạng doanh nghiệp có một đường truyền đi Internet. Trong đó:
R1, R2 và Server1 là các router thuộc về mạng nội bộ của doanh nghiệp (mạng Private). R2 đóng vai trò là router biên, thực hiện cung cấp đường ra Internet cho các thiết bị bên trong. Router Server1 được sử dụng để giả lập một server đặt tại VLAN 10, Server này sẽ được public lên môi trường Internet thông qua các IP Public được cấp bởi ISP.
ISP và Server2 là các router giả lập môi trường Internet của bài lab. Trong đó, router ISP đóng vai trò là gateway của ISP đấu nối xuống mạng doanh nghiệp để cung cấp đường đi Internet; router Server2 giả lập một server trên môi trường Internet bên ngoài.
Quy hoạch IP cho sơ đồ được chỉ ra như trên hình 2. Phần mạng Private của doanh nghiệp sử dụng các IP Private để đặt trên các cổng giao tiếp mạng, phần mạng Public sử dụng các IP Public trên các kết nối. Ngoài ra, ISP được cấu hình để rót về cho doanh nghiệp này một dải IP Public thuộc subnet 199.99.9.0/29 để phục vụ cho việc hosting các server nằm trong mạng doanh nghiệp lên Internet.
Trên mô hình lab này, chúng ta sẽ cùng nhau khảo sát việc sử dụng Static NAT để NAT một số địa chỉ bên trong thành các địa chỉ bên ngoài nhằm phục vụ cho các địa chỉ này có thể đi ra được môi trường Public.
Thực hiện
Bước 1: Xây dựng mô hình ban đầu
Cấu hình đặt các địa chỉ IP trên các kết nối giữa các router theo quy hoạch IP đã được chỉ ra.
R1 và R2 thực hiện chạy định tuyến EIGRP 100 đảm bảo mọi địa chỉ trong mạng thấy nhau. R2 cấu hình một default – route đi Internet và quảng bá default route này vào trong.
Cấu hình các router Server1 và Server2 giả lập các server của các subnet 192.168.10.0/24 và 100.0.0.0/24 như đã chỉ ra trên hình 2.
Cấu hình router ISP rót về cho mạng doanh nghiệp range IP 199.99.9.0/29. Cấu hình
Đầu tiên, ta đặt IP cho các link đấu nối giữa các thiết bị:
R1(config)#int f0/0
R1(config-if)#no shutdown
R1(config-if)#ip address 192.168.10.1 255.255.255.0
R1(config-if)#exit
R1(config)#int f0/1
R1(config-if)#no shutdown
R1(config-if)#ip address 192.168.12.1 255.255.255.252
R1(config-if)#exit
R2(config)#int f0/0
R2(config-if)#ip add 192.168.12.2 255.255.255.252
R2(config-if)#exit
R2(config)#int f0/1
R2(config-if)#ip address 200.0.0.1 255.255.255.252
R2(config-if)#exit
ISP(config)#interface f0/1
ISP(config-if)#no shutdown
ISP(config-if)#ip address 200.0.0.2 255.255.255.252
ISP(config-if)#exit
ISP(config)#interface f0/0
ISP(config-if)#no shutdown
ISP(config-if)#ip address 100.0.0.1 255.255.255.0
ISP(config-if)#exit
Tiếp theo, ta thực hiện chạy định tuyến EIGRP 100 trên các router R1 và R2 để đảm bảo các địa chỉ trên các mạng nội bộ thấy nhau:
R1(config)#router eigrp 100
R1(config-router)#no auto-summary
R1(config-router)#network 192.168.12.0
R1(config-router)#network 192.168.10.0
R1(config-router)#exit
R2(config)#ip route 0.0.0.0 0.0.0.0 200.0.0.2
R2(config)#router eigrp 100
R2(config-router)#no auto-summary
R2(config-router)#network 192.168.12.0
R2(config-router)#redistribute static
R2(config-router)#exit
Cấu hình các router giả lập các host trên mạng:
Server1(config)#interface f0/0
Server1(config-if)#no shutdown
Server1(config-if)#ip address 192.168.10.2 255.255.255.0
Server1(config-if)#exit
Server1(config)#ip route 0.0.0.0 0.0.0.0 192.168.10.1
Server2(config)#interface f0/0
Server2(config-if)#no shutdown
Server2(config-if)#ip address 100.0.0.2 255.255.255.0
Server2(config-if)#exit
Server2(config)#ip route 0.0.0.0 0.0.0.0 100.0.0.1
Cấu hình ISP rót subnet 199.99.9.0/29 xuống cho doanh nghiệp:
ISP(config)#ip route 199.99.9.0 255.255.255.248 200.0.0.1
Khi một ISP rót một range IP nào đó cho doanh nghiệp, ISP sẽ đảm bảo về mặt định tuyến rằng mọi gói tin trên Internet đi đến range này sẽ được chuyển tới tay router biên của mạng doanh nghiệp. Trong trường hợp của bài lab này, chúng ta chỉ cần cấu hình một route tĩnh cho subnet 199.99.9.0/29 như ở trên để giả lập tình huống “rót IP public cho doanh nghiệp”. Với route tĩnh đã cấu hình, nếu Server2 – đại diện cho các host trên “Internet” – gửi dữ liệu đến subnet 199.99.9.0/29, dữ liệu sẽ được router ISP forward đến R2. Như vậy, mạng doanh nghiệp giả lập này đã được cấp phát IP public.
Kiểm tra
Chúng ta cùng kiểm tra cấu hình ban đầu đã thực hiện.
Định tuyến nội bộ đã hội tụ:
R1#sh ip route eigrp
D*EX 0.0.0.0/0 [170/307200] via 192.168.12.2, 00:01:09, FastEthernet0/1
R2#show ip route eigrp
D 192.168.10.0/24 [90/307200] via 192.168.12.1, 00:14:58, FastEthernet0/0
R2 đã đi đến được VLAN 10:
R2#ping 192.168.10.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.10.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 64/97/128 ms
Bên ngoài vùng Public, các địa chỉ public đi đến được nhau:
R2#ping 100.0.0.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 100.0.0.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 64/97/124 ms
Server2#ping 200.0.0.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 200.0.0.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 96/104/108 ms
Bước 2: Cấu hình Static NAT
Thực hiện cấu hình Static NAT trên R2 đảm bảo yêu cầu sau:
- Các user trên Internet có thể truy nhập đến Server1 bằng cách đi đến địa chỉ 199.99.9.2.
- Các user bên trong mạng nội bộ sẽ truy nhập đến Server2 bằng cách đi đến địa chỉ 192.168.12.252.
Cấu hình
Ta thực hiện cấu hình NAT trên router R2 để đáp ứng yêu cầu đặt ra:
R2(config)#ip nat inside source static 192.168.10.2 199.99.9.2
R2(config)#ip nat outside source static 100.0.0.2 192.168.12.252
R2(config)#interface f0/0
R2(config-if)#ip nat inside
R2(config-if)#exit
R2(config)#interface f0/1
R2(config-if)#ip nat outside
R2(config-if)#exit
Ta cùng phân tích cấu hình đã thực hiện:
Đầu tiên, để các user trên Internet đi đến được một server nội bộ, ta phải thực hiện hosting server này lên môi trường public. Việc hosting được thực hiện bằng cách cấu hình NAT địa chỉ private của server nội bộ thành một địa chỉ public được cấp phát. Với bài lab này, chúng ta thực hiện NAT tĩnh địa chỉ 192.168.10.2 thành 199.99.9.2.
R2(config)#ip nat inside source static 192.168.10.2 199.99.9.2
Kế tiếp, chúng ta cần phải thực hiện các thao tác cấu hình để đảm bảo server 100.0.0.2 trên Internet được nhìn thấy bởi các user trong nội bộ dưới dạng một địa chỉ private. Các user nội bộ khi muốn đi đến server Internet này sẽ gửi gói tin đến địa chỉ private chứ không phải gửi gói tin đến địa chỉ public của server. Địa chỉ private đại diện cho server public trong môi trường nội bộ được sử dụng trong bài lab này là địa chỉ 192.168.12.252. Để địa chỉ 192.168.12.252 có thể đại diện được cho 100.0.0.2, chúng ta cần cấu hình để NAT 100.0.0.2 bên ngoài thành 192.168.12.252 bên trong. Khác với cấu hình NAT đã thực hiện trước đó, lần này chúng ta thực hiện thao tác NAT outside:
R2(config)#ip nat outside source static 100.0.0.2 192.168.12.252
Và tất nhiên, chúng ta đừng quên chỉ rõ cổng nào là cổng đấu nối vào bên trong (inside) và cổng nào là cổng đấu nối ra bên ngoài (outside):
R2(config)#interface f0/0
R2(config-if)#ip nat inside
R2(config-if)#exit
R2(config)#interface f0/1
R2(config-if)#ip nat outside
R2(config-if)#exit
NAT inside sẽ đổi địa chỉ source IP cho gói tin đi từ trong ra ngoài và đổi địa chỉ destination IP cho gói tin đi từ ngoài vào trong khi các địa chỉ match với entry tương ứng trong bảng NAT. Ngược lại, NAT outside sẽ đổi địa chỉ destination IP cho gói đi từ trong ra ngoài và đổi địa chỉ source IP cho gói đi từ ngoài vào trong khi các địa chỉ match với entry trong bảng NAT. Để đơn giản, ta chỉ cần nhớ rằng để NAT một địa chỉ bên trong thành một địa chỉ nào đó bên ngoài, ta dùng NAT inside, còn để NAT một địa chỉ nào đó bên ngoài thành một địa chỉ nào đó bên trong, ta dùng NAT outside.
Kiểm tra
Sau khi cấu hình xong, chúng ta thực hiện một số thao tác kiểm tra.
Trước hết, chúng ta quan sát bảng NAT của router R2:
Từ kết quả hiển thị, ta thấy các entry NAT đã được cài đặt tĩnh lên bảng NAT:
Địa chỉ Inside local là 192.168.10.2 được NAT thành địa chỉ Inside global 199.99.9.2. Như vậy, địa chỉ 192.168.10.2 đã được đại diện bởi địa chỉ 199.99.9.2 trên Internet.
Địa chỉ Outside global 100.0.0.2 được NAT thành địa chỉ Outside local 192.168.12.252. Đúng như định nghĩa, địa chỉ 192.168.12.252 là một địa chỉ bên trong đại diện cho một host bên ngoài. Với cấu hình này, người quản trị có thể dấu được địa chỉ IP của server public trên Internet.
Để quan sát hoạt động của NAT, chúng ta bật debug trên router R2:
R2#debug ip nat detailed
IP NAT detailed debugging is on
Ta thực hiện ping từ Server1 ra bên ngoài:
Server1#ping 200.0.0.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 200.0.0.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 92/104/120 ms
Ping thành công chứng tỏ NAT đã hoạt động, host bên trong đã đi được Internet. Chúng ta quan sát kết quả debug trên R2:
Kí hiệu “i” dùng để đánh dấu cho chiều đi từ trong ra ngoài. Khi đi từ trong ra ngoài, source IP 192.168.10.2 đã được chuyển đổi thành 199.99.9.2 trong khi destination IP được giữ nguyên (“s=192.168.10.2->199.99.9.2, d=200.0.0.2”).
Kí hiệu “o” dùng để đánh dấu cho chiều đi từ ngoài vào trong. Khi đi từ ngoài vào trong, destination IP 199.99.9.2 đã được chuyển đổi ngược lại thành 192.168.10.2 và source IP được giữ nguyên (“s=200.0.0.2, d=199.99.9.2->192.168.10.2”).
Ta có thể từ một host bên ngoài ping đến được server bên trong thông qua IP đại diện 199.99.9.2:
ISP#ping 199.99.9.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 199.99.9.2, timeout is 2 seconds: !!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 88/102/124 ms
Kết quả debug tương ứng trên R2:
Ta thấy hoạt động NAT đã diễn ra đúng đắn cho cặp địa chỉ 192.168.10.2 – 199.99.9.2.
Tiếp theo, chúng ta thực hiện kiểm tra việc đại diện cho server bên ngoài của địa chỉ 192.168.12.252 ở bên trong.
Đầu tiên, ta thực hiện bật “debug ip icmp” trên router Server2 để kiểm tra xem các gói tin ping có đi đến được server này không:
Server2#debug ip icmp
ICMP packet debugging is on
Ta thực hiện ping kiểm tra từ Server1 bên trong:
Server1#ping 192.168.12.252
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.12.252, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 100/133/168 ms
Ta thấy kết quả ping thành công.
Quan sát kết quả debug trên Server2, ta thấy các gói tin ping đã thực sự đi đến được server này:
Server2#
*Mar 1 00:06:38.903: ICMP: echo reply sent, src 100.0.0.2, dst 199.99.9.2
*Mar 1 00:06:39.043: ICMP: echo reply sent, src 100.0.0.2, dst 199.99.9.2
*Mar 1 00:06:39.143: ICMP: echo reply sent, src 100.0.0.2, dst 199.99.9.2
*Mar 1 00:06:39.311: ICMP: echo reply sent, src 100.0.0.2, dst 199.99.9.2
*Mar 1 00:06:39.463: ICMP: echo reply sent, src 100.0.0.2, dst 199.99.9.2
Kết quả debug NAT trên router biên R2 cũng cho thấy hoạt động NAT đã diễn ra đúng đắn:
*Mar 1 00:16:57.823: NAT*: i: icmp (192.168.10.2, 2) -> (192.168.12.252,2)[10]
*Mar 1 00:16:57.823: NAT*: s=192.168.10.2->199.99.9.2, d=192.168.12.252 [10]
*Mar 1 00:16:57.827: NAT*: s=199.99.9.2, d=192.168.12.252->100.0.0.2 [10]
*Mar 1 00:16:57.883: NAT*: o: icmp (100.0.0.2, 2) -> (199.99.9.2, 2) [10]
*Mar 1 00:16:57.883: NAT*: s=100.0.0.2->192.168.12.252, d=199.99.9.2 [10]
*Mar 1 00:16:57.887: NAT*: s=192.168.12.252, d=199.99.9.2->192.168.10.2 [10]
Ta thấy, trên chiều từ trong ra ngoài, địa chỉ source 192.168.10.2 đã được chuyển đổi thành 199.99.9.2 (s=192.168.10.2 -> 199.99.9.2, d=192.168.12.252) và tiếp đó, địa chỉ destination 192.168.12.252 đã được chuyển đổi thành 100.0.0.2 (s=199.99.9.2, d=192.168.12.252 -> 100.0.0.2). Trên chiều từ ngoài vào trong, các hành động diễn ra ngược lại: địa chỉ source 100.0.0.2 được chuyển đổi lại thành 192.168.12.252 (s=100.0.0.2 -> 192.168.12.252, d=199.99.9.2) và kế đó, địa chỉ destination 199.99.9.2 được chuyển đổi thành 192.168.10.2 (s=192.168.12.252, d=199.99.9.2 -> 192.168.10.2). Các hành động này đảm bảo Server1 đi đến được Server2 bằng địa chỉ đại diện 192.168.12.252 trên mạng nội bộ.
Ta thử kiểm tra với các host khác trên mạng nội bộ:
R1#ping 100.0.0.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 100.0.0.2, timeout is 2 seconds: .....
Success rate is 0 percent (0/5)
R1#ping 192.168.12.252
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.12.252, timeout is 2 seconds: .....
Success rate is 0 percent (0/5)
Ta thấy rằng ngoại trừ host Server1 ra, các host khác trong mạng nội bộ chưa đi được Internet cũng như chưa đi đến được Server2 bằng địa chỉ đại diện outside local của nó. Đó là bởi vì chúng ta chưa thực hiện NAT cho các host còn lại thành các IP public để chúng có thể đi ra ngoài Internet.
Kết quả debug ICMP trên Server2:
*Mar 1 00:24:51.415: ICMP: echo reply sent, src 100.0.0.2, dst 92.168.12.1
*Mar 1 00:24:51.475: ICMP: dst (100.0.0.2) host unreachable rcv from 100.0.0.1
Ta thấy, Server2 nhận được gói tin ICMP ping đến từ địa chỉ nội bộ 192.168.12.1 nhưng không thể gửi gói trả lời về được vì các subnet nội bộ không được định tuyến trên môi trường Internet (trong bài lab này, subnet 192.168.12.0/30 không hiện diện trong bảng định tuyến của router ISP): host unreachable rcv from 100.0.0.1.
Trong một bài lab khác về NAT overload, chúng ta sẽ cùng khảo sát việc cấu hình để mọi host trong mạng nội bộ có thể đi Internet được thông qua một số lượng ít hơn các địa chỉ IP Public. Với bài lab này, ta dừng lại ở việc đáp ứng yêu cầu giao tiếp Internet cho một mình Server1.
Bước 3: Static PAT
- Gỡ bỏ cấu hình NAT inside đã thực hiện ở bước 2 trên router R2.
- Thực hiện cấu hình NAT để chỉ cho phép từ Internet truy nhập web đến Server1 bằng địa chỉ 199.99.9.2. Hơn nữa, việc truy nhập bằng web từ Internet đến Server1 phải sử dụng port 8080 thay vì port 80 như thông thường.
- Bên cạnh đó, thực hiện cấu hình để từ Internet có thể Telnet được đến router R1 thông qua địa chỉ 199.99.9.3. Việc telnet từ Internet phải sử dụng port là 8023 thay vì port 23 như thông thường.
Cấu hình
Gỡ bỏ cấu hình NAT inside đã thực hiện ở bước 2 trên R2:
R2(config)#no ip nat inside source static 192.168.10.2 199.99.9.2
Kỹ thuật Static NAT không chỉ cho phép NAT tĩnh một địa chỉ trong nội bộ thành một địa chỉ public mà còn cho phép chỉ định tường minh các port TCP hoặc UDP sẽ được NAT. Điều này cho phép chúng ta chỉ NAT ra ngoài các port cần thiết cho các ứng dụng chạy trên các server mà không cần phải NAT các port còn lại ra môi trường public.
Để thực hiện yêu cầu về truy nhập web cho Server1, chúng ta thực hiện NAT địa chỉ 192.168.10.2 của Server1 thành địa chỉ 199.99.9.2, tuy nhiên hành động NAT sẽ chỉ áp dụng cho TCP port 80 local và chuyển đổi thành port 8080 public:
R2(config)#ip nat inside source static tcp 192.168.10.2 80 199.99.9.2 8080
Để phục vụ cho nhu cầu telnet, thực hiện NAT địa chỉ 192.168.12.1 của router R1 thành địa chỉ 199.99.9.3 và chỉ chuyển đổi cho TCP port 23 thành TCP port 8023 trên môi trường public:
R2(config)#ip nat inside source static tcp 192.168.12.1 23 199.99.9.3 8023
Kiểm tra
Chúng ta quan sát bảng NAT của router R2:
Ta thấy, các entry NAT đã được điền tĩnh vào trong bảng NAT.
Ta cấu hình telnet cho R1 và bật HTTP server trên Server1:
R1(config)#line vty 0 4
R1(config-line)#password CISCO
R1(config-line)#login
R1(config-line)#exit
Server1(config)#ip http server
Ta thực hiện các truy nhập từ bên ngoài để kiểm tra.
Telnet đến R1 từ router ISP:
ISP#telnet 199.99.9.3 8023
Trying 199.99.9.3, 8023 ... Open
User Access Verification
Password:
R1>
Ta thấy, từ bên ngoài đã telnet vào được R1 với port 8023.
Ta quan sát các thông điệp debug trên R2 để kiểm tra hành động NAT:
*Mar 1 01:36:44.123: NAT*: o: tcp (200.0.0.2, 30259) -> (199.99.9.3, 8023)[40637]
*Mar 1 01:36:44.123: NAT*: TCP s=30259, d=8023->23
*Mar 1 01:36:44.127: NAT*: s=200.0.0.2, d=199.99.9.3->192.168.12.1 [40637]
*Mar 1 01:36:44.167: NAT*: i: tcp (192.168.12.1, 23) -> (200.0.0.2, 30259)[46094]
*Mar 1 01:36:44.167: NAT*: TCP s=23->8023, d=30259
*Mar 1 01:36:44.171: NAT*: s=192.168.12.1->199.99.9.3, d=200.0.0.2 [46094]
Kết quả debug chỉ ra rằng hành động NAT cho cặp port 23 – 8023 đã diễn ra đúng đắn.
Tiếp theo, ta thử truy nhập web đến Server1 từ bên ngoài bằng port 8080:
ISP#telnet 199.99.9.2 8080
Trying 199.99.9.2, 8080 ... Open
exit
HTTP/1.1 400 Bad Request
Date: Fri, 01 Mar 2002 01:45:15 GMT
Server: cisco-IOS
Accept-Ranges: none
400 Bad Request
[Connection to 199.99.9.2 closed by foreign host]
ISP#
Ta thấy, việc truy nhập đến port 8080 đã diễn ra thành công theo như yêu cầu đặt ra.
Ta cũng thực hiện quan sát kết quả debug của hành động NAT port 80 – 8080:
*Mar 1 01:45:37.003: NAT*: o: tcp (200.0.0.2, 27709) -> (199.99.9.2, 8080) [52775]
*Mar 1 01:45:37.007: NAT*: TCP s=27709, d=8080->80
*Mar 1 01:45:37.007: NAT*: s=200.0.0.2, d=199.99.9.2->192.168.10.2 [52775]
*Mar 1 01:45:37.107: NAT*: i: tcp (192.168.10.2, 80) -> (200.0.0.2, 27709)[22688]
*Mar 1 01:45:37.107: NAT*: TCP s=80->8080, d=27709
*Mar 1 01:45:37.111: NAT*: s=192.168.10.2->199.99.9.2, d=200.0.0.2 [22688]
Kết quả debug cũng đã chỉ ra hoạt động NAT đã diễn ra đúng đắn cho cặp port 80 – 8080.
Như vậy, thông qua cấu hình NAT tĩnh cho một số port được chỉ định, chúng ta đã thực hiện triển khai một số dịch vụ tương ứng từ các địa chỉ nội bộ lên môi trường public.
Chúng ta đã cùng nhau khảo sát kỹ thuật Static NAT thông qua phân tích một ví dụ cấu hình. Trong các bài viết tới, chúng ta sẽ cùng nhau tiếp tục khảo sát các kỹ thuật khác để tìm hiểu chi tiết hơn về NAT.
Cảm ơn các bạn!
Hẹn gặp lại các bạn trong các bài viết tiếp theo!