本文是上一篇文章的后续部分,主要是用另一种方法来解决一篇所提到的问题,大家可以和上一篇博文做一个比较,看看两种方法的区别。

仍然以上次网友提出的网络拓扑为例:

拓扑和要求描述:

1. 内网服务器的IP地址为192.168.1.2,由于某种原因而不能设置网关

2. 出口设备的内网地址为192.168.1.1,同时这个地址也是内网中PC的网关地址

3. 出口设备仅仅有一个公网地址为2.2.2.1

4. 将内网服务器192.168.1.2:23映射为2.2.2.1:23,公网用户1.1.1.1通过 telnet 2.2.2.1可以连接到内网服务器的telnet端口

看到这个问题及给出的拓扑思路后,用GNS3搭建了一个网络拓扑图如下:

图:GNS3搭建的网络拓扑

GNS3网络拓扑介绍:

1. 路由器R1的公网接口fa0/0地址为:2.2.2.1,内网接口fa1/0地址为192.168.1.1

2. 路由器R2模拟内网服务器,接口IP192.168.1.2,同时no ip routing关闭路由功能即不设置网关,开启telnet功能,密码为cisco

3. 路由器R5模拟为内部普通PC,地址为192.168.1.11,网关为192.168.1.1,要求能正常访问互联网;

4. 路由器R4模拟为公网普通用户,IP1.1.1.1

本文的主要内容为路由器R1的配置,配置思路如下:

1. 配置NAT使内网PC能正常访问Internet

2. 配置Static NAT192.168.1.2:23映射为2.2.2.1:23

3. 配置NAT 使Internet用户在访问内部服务器192.168.1.2时将源IP地址转换为192.168.1.1

R1配置如下:

interface FastEthernet0/0

ip address 2.2.2.1 255.255.255.0

ip nat outside//配置接口为ip nat outside

!

interface FastEthernet1/0

ip address 192.168.1.1 255.255.255.0

ip nat inside//配置接口为ip nat inside

!

ip classless

ip route 0.0.0.0 0.0.0.0 2.2.2.3    //配置默认路由

!

ip nat pool test 192.168.1.1 192.168.1.1 prefix-length 24        //外网访问内网服务器NAT地址池

ip nat inside source list 102 interface FastEthernet0/0 overload    //内网普通用户访问公网NAT转换

ip nat inside source static tcp 192.168.1.2 23 2.2.2.1 23 extendable    //内网服务器端口映射

ip nat outside source list 101 pool test                           //外网访问内网服务器的NAT转换(源地址转换)

!

access-list 101 permit ip any host 2.2.2.1

access-list 102 permit ip 192.168.1.0 0.0.0.255 any

 

 

路由器R2模拟内网服务器的配置如下:

no ip routing                    //取消路由功能,不设置网关

interface FastEthernet1/0

ip address 192.168.1.2 255.255.255.0

duplex auto

speed auto

!

line vty 0 4                     //开启telnet功能,密码设为cisco

password cisco

login

!

End

 

配置完成以后,内网PC访问外网怎么样呢,以ping为例,结果如下:

121006225.png

PC从内网访问外网没有问题,那么我们在公网用户R4telnet 2.2.2.1结果如下:

140026973.png

连接超时,远程主机无响应,外网到内网的映射失败,不能telnet到内网服务器,配置是失败的,问题出在哪个地方呢,用debugdebug ip packet debug ip nat)在R1上查看数据都发生了哪些变化:

121108134.png

图中具体内容如下:

Jul6 17:19:05: NAT*: s=1.1.1.1->192.168.1.1, d=2.2.2.1 [35442]

Jul6 17:19:05: NAT*: s=192.168.1.1, d=2.2.2.1->192.168.1.2 [35442]

Jul6 17:19:05: IP: tableid=0, s=192.168.1.2 (FastEthernet1/0), d=192.168.1.1 (FastEthernet1/0), routed via RIB

Jul6 17:19:05: IP: s=192.168.1.2 (FastEthernet1/0), d=192.168.1.1 (FastEthernet1/0), len 44, rcvd 3

Jul6 17:19:05: IP: tableid=0, s=192.168.1.1 (local), d=192.168.1.2 (FastEthernet1/0), routed via FIB

Jul6 17:19:05: IP: s=192.168.1.1 (local), d=192.168.1.2 (FastEthernet1/0), len 40, sending

 

分析debug信息中的前三行信息,在debug信息显示的第一行:我们可以看出1.1.1.1telnet 2.2.2.1时,数据包先进行了源转换,将源地址由1.1.1.1转换为192.168.1.1,目的地址仍为2.2.2.1

debug信息显示的第二行:数据包进行了目的地址转换,将目的地址由2.2.2.1转换为192.168.1.2,这样数据包在路由器R1内部NAT转换完后,源地址为192.168.1.1,目的地址为192.168.1.2

debug信息显示的第三行:数据包开始被进行路由,然后将数据包从FastEthernet1/0接口转发出去,至此已经完成了数据包由公网到内网的转发过程。

既然数据包已经传送出去了,那么服务器收到了没有,收到后有没有回包呢,我们接着看后面的Debug信息:

debug信息显示的第四行:路由器R1FastEthernet1/0接收到了一个数据包,数据包的源地址为192.168.1.2,目的地址为192.168.1.1,说明内网服务器收到了外网的telnet数据包并返回了数据包

debug信息显示的第五行:路由器R1正在为数据包查看路由表,而这个数据包的源地址为192.168.1.1,目的地址为192.168.1.2

debug信息显示的第六行:路由器从FastEthernet1/0发送了一个数据包,源地址为192.168.1.1,目的地址为192.168.1.2

 

至此debug信息分析完毕,在debug信息的前四行,应该没有什么问题,而对于第五行和第六行恐怕会有人不太明白什么意思,那么我们再简单分析一下数据包从外到内再由内到外的过程,第一数据按照路由器的配置将数据转换源地址和目的地址后转发给了内网的服务器,内网服务器在收到数据包后,查看源地址为192.168.1.1目的数据为自己,将数据包交给上层应用即telnet程序处理,然后反回数据包,返回的数据包源地址为自己,目的地址为192.168.1.1,跟自己在同一子网内,因为不需要网关去处理,而是发出ARP请求来获取192.168.1.1MAC地址在收到ARP应答后,将数据包转发给192.168.1.1即路由器R1R1在收到数据包后拆包得到目的地址为自己本身接口的IP地址,而路由器R1自身(不是转发其他数据)并没有向内网服务器(192.168.1.2),发出过数据连接,于是便向192.168.1.2发出RST报文以终止连接,在发数据包前要先查路由表,然后再将数据包转发给192.168.1.2,于是就有了上面debug信息的第五行和第六行内容,

由于上面的debug信息是使用的debug ip packe命令只显示了简单的数据包过程,下面将用debug IP packet detail来显示详细的信息,如下图:

121226757.png

图中具体内容如下:

Jul6 17:37:28: NAT*: s=1.1.1.1->192.168.1.1, d=2.2.2.1 [9354]

Jul6 17:37:28: NAT*: s=192.168.1.1, d=2.2.2.1->192.168.1.2 [9354]

Jul6 17:37:28: IP: tableid=0, s=192.168.1.2 (FastEthernet1/0), d=192.168.1.1 (FastEthernet1/0), routed via RIB

Jul6 17:37:28: IP: s=192.168.1.2 (FastEthernet1/0), d=192.168.1.1 (FastEthernet1/0), len 44, rcvd 3

Jul6 17:37:28:TCP src=23, dst=54224, seq=1214388577, ack=4009276415, win=4128 ACK SYN

Jul6 17:37:28: IP: tableid=0, s=192.168.1.1 (local), d=192.168.1.2 (FastEthernet1/0), routed via FIB

Jul6 17:37:28: IP: s=192.168.1.1 (local), d=192.168.1.2 (FastEthernet1/0), len 40, sending

Jul6 17:37:28:TCP src=54224, dst=23, seq=4009276415, ack=0, win=0 RST

从以上debug信息的最后一行可以看出路由器确实向192.168.1.2发出了RST报文来中断连接。

由以上信息我们可知:数据包由外到内可以顺利完成转换和转发,而由内到外改善数据时,路由器R1会认为数据包是回给自己的从而拒绝掉,那么如果我们将外网向内网服务器转发的源地址转换为同一子网的其他IP地址例如192.168.1.3会怎么样呢,在路由器R1上的配置变更如下:

ip nat pool test 192.168.1.1 192.168.1.1 prefix-length 24更改为

ip nat pool test 192.168.1.3 192.168.1.3 prefix-length 24

测试结果仍然连接失败,如下图:

140130484.png

那么失败的原因和上面的是否一致呢,debug看一下,结果如下:

140148665.png

从图中可以看到路由器R1仍然发向192.168.1.2发送了RST报文来中断连接,至此实验好像已经有了结果,就是用ip nat inside source ip nat outside source 无法通过实验,接下来回想一下数据包转发的过程,数据包由outside接口向inside接口发送时,数据包是先进行了NAT转换再进行了路由,而数据由inside接口向outside接口改发送时,数据包是先进行了路由再进行了Nat转换,而数据包查寻路由时发现目的地址为自己就会拒绝掉,那么我们在写一条路由将目的地址为192.168.1.3的数据包由R1的公网口发送出去会怎么样呢?

下面在R1上加入一条静态路由:

ip route 192.168.1.3 255.255.255.255 2.2.2.3

下面再测试一下,在外网用R4(IP1.1.1.1)telnet 2.2.2.1,结果如下:

140303957.png

实验通过,那么debug看一数据包的转发过程:

140323324.png

图中的debug信息如下:

Aug7 11:52:27: NAT*: s=1.1.1.1->192.168.1.3, d=2.2.2.1 [56086]

Aug7 11:52:27: NAT*: s=192.168.1.3, d=2.2.2.1->192.168.1.2 [56086]

Aug7 11:52:27: IP: tableid=0, s=192.168.1.2 (FastEthernet1/0), d=192.168.1.3 (FastEthernet0/0), routed via RIB

Aug7 11:52:27: NAT: s=192.168.1.2->2.2.2.1, d=192.168.1.3 [54584]

Aug7 11:52:27: NAT: s=2.2.2.1, d=192.168.1.3->1.1.1.1 [54584]

Aug7 11:52:27: IP: s=2.2.2.1 (FastEthernet1/0), d=1.1.1.1 (FastEthernet0/0), g=2.2.2.3, len 44, forward

Debug信息显示数据从外到内和从内到外都能正常转发,同时可以在上篇文章的配置中用debug命令看一下两种配置方法数据包的转发过程,本人在实验过程中曾尝试用策略路由代替静态路由失败,如果有用策略路由成功的可以告知本人一下,下面将R1的完整配置贴出:

!

!

version 12.4

service timestamps debug datetime msec

service timestamps log datetime msec

no service password-encryption

!

hostname R1

!

boot-start-marker

boot-end-marker

!

!

no aaa new-model

!

resource policy

!

memory-size iomem 5

ip subnet-zero

!

!

ip cef

no ip domain lookup

ip domain name lab.local

 

!

interface FastEthernet0/0

ip address 2.2.2.1 255.255.255.0

ip nat outside

ip virtual-reassembly

duplex auto

speed auto

!

interface FastEthernet1/0

ip address 192.168.1.1 255.255.255.0

ip nat inside

ip virtual-reassembly

duplex auto

speed auto

!

no ip http server

no ip http secure-server

!

ip classless

ip route 0.0.0.0 0.0.0.0 2.2.2.3

ip route 192.168.1.3 255.255.255.255 2.2.2.3

!

ip nat pool test 192.168.1.3 192.168.1.3 prefix-length 24

ip nat inside source list 102 interface FastEthernet0/0 overload

ip nat inside source static tcp 192.168.1.2 23 2.2.2.1 23 extendable

ip nat outside source list 101 pool test

!

access-list 101 permit ip any host 2.2.2.1

access-list 102 permit ip 192.168.1.0 0.0.0.255 any

no cdp run

!

route-map text permit 10

match ip address 102

set ip next-hop 2.2.2.3

!

!

control-plane

 

!

line con 0

exec-timeout 0 0

privilege level 15

logging synchronous

line aux 0

exec-timeout 0 0

privilege level 15

logging synchronous

line vty 0 4

login

!

!

end