本文是上一篇文章的後續部分,主要是用另外一種方法來解決一篇所提到的問題,你們能夠和上一篇博文作一個比較,看看兩種方法的區別。服務器
仍然以上次網友提出的網絡拓撲爲例:網絡
拓撲和要求描述:less
1. 內網服務器的IP地址爲192.168.1.2,因爲某種緣由而不能設置網關dom
2. 出口設備的內網地址爲192.168.1.1,同時這個地址也是內網中PC的網關地址tcp
3. 出口設備僅僅有一個公網地址爲2.2.2.1ide
4. 將內網服務器192.168.1.2:23映射爲2.2.2.1:23,公網用戶1.1.1.1經過 telnet 2.2.2.1能夠鏈接到內網服務器的telnet端口測試
看到這個問題及給出的拓撲思路後,用GNS3搭建了一個網絡拓撲圖以下:spa
圖:GNS3搭建的網絡拓撲debug
GNS3網絡拓撲介紹:server
1. 路由器R1的公網接口fa0/0地址爲:2.2.2.1,內網接口fa1/0地址爲192.168.1.1;
2. 路由器R2模擬內網服務器,接口IP爲192.168.1.2,同時no ip routing關閉路由功能即不設置網關,開啓telnet功能,密碼爲cisco
3. 路由器R5模擬爲內部普通PC,地址爲192.168.1.11,網關爲192.168.1.1,要求能正常訪問互聯網;
4. 路由器R4模擬爲公網普通用戶,IP爲1.1.1.1
本文的主要內容爲路由器R1的配置,配置思路以下:
1. 配置NAT使內網PC能正常訪問Internet
2. 配置Static NAT將192.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爲例,結果以下:
PC從內網訪問外網沒有問題,那麼咱們在公網用戶R4上telnet 2.2.2.1結果以下:
鏈接超時,遠程主機無響應,外網到內網的映射失敗,不能telnet到內網服務器,配置是失敗的,問題出在哪一個地方呢,用debug(debug ip packet 和debug ip nat)在R1上查看數據都發生了哪些變化:
圖中具體內容以下:
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.1在telnet 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信息顯示的第四行:路由器R1從FastEthernet1/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.1的MAC地址在收到ARP應答後,將數據包轉發給192.168.1.1即路由器R1,R1在收到數據包後拆包獲得目的地址爲本身自己接口的IP地址,而路由器R1自身(不是轉發其餘數據)並無向內網服務器(192.168.1.2),發出過數據鏈接,因而便向192.168.1.2發出RST報文以終止鏈接,在發數據包前要先查路由表,而後再將數據包轉發給192.168.1.2,因而就有了上面debug信息的第五行和第六行內容,
因爲上面的debug信息是使用的debug ip packe命令只顯示了簡單的數據包過程,下面將用debug IP packet detail來顯示詳細的信息,以下圖:
圖中具體內容以下:
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
測試結果仍然鏈接失敗,以下圖:
那麼失敗的緣由和上面的是否一致呢,debug看一下,結果以下:
從圖中能夠看到路由器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(IP爲1.1.1.1)去telnet 2.2.2.1,結果以下:
實驗經過,那麼debug看一數據包的轉發過程:
圖中的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