概述

NAT(Network Address Translation)的作用:

  1. 共享公网端口,解决IPV4地址不足的问题

  2. 避免来自网络外部的攻击,隐藏网络内部的计算机


NAT分为三大类:

  1. 静态NAT

    通过静态配置NAT地址转换表将内网IP一对一转换为公网IP(也就是路由器的外网接口),只能对一个IP地址进行转换。如果内网需要做web服务器,可以对其配置静态PAT(也称为端口映射),从外向内转换。

  2. 动态NAT

    使用内部地址池和外部地支持动态转换IP地址,但公网接口只有一个,同一时间只能转换一个IP。

  3. PAT(Port address Translation)

    也称为端口复用技术,路由器在NAT地址转换表记录源端口号并随机生成一个新的端口号,将其替换,回包时通过端口号区分IP

    内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。

    由于端口号有数量限制(216-1),此时可以使用第二个公网IP,将其放入地址池。


当配置PAT后路由器的工作流程:

  1. 路由器按照原先的流程工作,首先解封装数据帧

  2. 检查目标IP,如果目标IP不在本网段则依据路由表转发

  3. 当数据报在路由器内部路由至外网端口时,检查NAT地址转换表。(即使没有NAT条目也会继续路由,但接受数据包时无法根据NAT条目转发至内网,所以使用ICMP协议探测时会显示超时而不是目标不可达)

  4. 如有NAT条目则依据条目对源IP和端口进行转换

命令

定义内网端口:

1
2
3
int f0/0
ip nat inside
exit

定义外网端口:

1
2
3
int f0/1
ip nat outside
exit

PAT配置

使用ACL定义内部地址池:

1
acc 1 permit 192.168.0.0 0.0.255.255

此ACL只作为容器使用,不做流量过滤

PAT动态映射:

1
2
conf t
ip nat inside source list 1 int f0/1 overload

将源IP对ID为1的acl表进行匹配,转换为f0/1接口上的IP地址,并开启复用,如果按照以上进行配置只有192.168开头的(和网段无关,按照通配符掩码进行匹配)才能访问互联网。

配置静态端口转换:

1
2
conf t
ip nat inside source static tcp 192.168.1.3 80 10.1.1.2 80

实验

拓扑图

在现实环境中,公网上的路由器会直接干掉内网IP,所以为了模拟公网就不对内网IP进行路由。

步骤

公网路由器只对公网接口做路由

R1命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Router>en
Router#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#int f0/0
Router(config-if)#ip add 192.168.1.254 255.255.255.0
Router(config-if)#no sh

Router(config-if)#
%LINK-5-CHANGED: Interface FastEthernet0/0, changed state to up

%LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/0, changed state to up

Router(config-if)#exit
Router(config)#int f0/1
Router(config-if)#ip add 100.1.1.1 255.255.255.0
Router(config-if)#no sh

Router(config-if)#
%LINK-5-CHANGED: Interface FastEthernet0/1, changed state to up

Router(config-if)#
%LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/1, changed state to up

Router(config-if)#exit
Router(config)#ip route 0.0.0.0 0.0.0.0 100.1.1.2
Router(config)#int f0/0
Router(config-if)#ip nat inside
Router(config-if)#exit
Router(config)#int f0/1
Router(config-if)#ip nat outside
Router(config-if)#exit
Router(config)#acc 1 permit any;也可以写成0.0.0.0 255.255.255.255
Router(config)#ip nat inside source list 1 int f0/1 overload
Router(config)#do sh ip route

静态端口转换(内网映射):

1
2
3
4
Router>en
Router#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#ip nat inside source static tcp 192.168.1.222 80 100.1.1.1 80

如果不指定端口号的话其他服务器就无法再使用这个公网IP做地址转换。