NetWork——描述一次完整的网络请求过程

0.  前言

从我们在浏览器的地址栏输入http://blog.csdn.NET/seu_calvin后回车,到我们看到该博客的主页,这中间经历了什么呢?简单地回答这个问题,大概是经历了域名解析、TCP的三次握手、建立TCP连接后发起HTTP请求、服务器响应HTTP请求、浏览器解析html代码,同时请求html代码中的资源(如jscss、图片等)、最后浏览器对页面进行渲染并呈现给用户。下面分别介绍一下每个过程。

 

1.  域名解析

Chrome浏览器为例,Chrome会解析域名对应的IP地址

1Chrome浏览器会首先搜索浏览器自身的DNS缓存(可以使用 chrome://net-internals/#dns 来进行查看),浏览器自身的DNS缓存有效期比较短,且容纳有限,大概是1000条。如果自身的缓存中存在blog.csdn.Net 对应的IP地址并且没有过期,则解析成功。

2)如果(1)中未找到,那么Chrome会搜索操作系统自身的DNS缓存(可以在命令行下使用 ipconfig /displaydns 查看)。如果找到且没有过期则成功。

3)如果(2)中未找到,那么尝试读取位于C:\Windows\System32\drivers\etc下的hosts文件,如果找到对应的IP地址则解析成功。

4)如果(3)中未找到,浏览器首先会找TCP/IP参数中设置的本地DNS服务器,如果要查询的域名包含在本地配置的区域资源中,则完成域名解析,否则根据本地DNS服务器会请求根DNS服务器

5)本地DNS会把请求发至13台根DNS,根DNS服务器收到请求后会返回负责这个域名(.net)的服务器的一个IP,本地DNS服务器使用该IP信息联系负责.net域的这台服务器。这台负责.net域的服务器收到请求后,如果自己无法解析,会返回.net域的下一级DNS服务器地址(blog.csdn.net)给本地DNS服务器。以此类推,直至找到。

 

2.  TCP的三次握手

这个部分正好之前整理过,可以参考NetWork——关于TCP协议的三次握手和四次挥手

 

3.  建立TCP连接后发起HTTP请求

TCP三次握手建立连接成功后,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个具有标准格式的HTTP响应给客户端。

 

3.1  HTTP请求格式

HTTP请求格式如下所示四部分组成,分别是请求行、请求头、空行、消息体,每部分内容占一行。

  1. <request-line>  
  2. <general-headers>  
  3. <request-headers>  
  4. <entity-headers>  
  5. <empty-line>  
  6. [<message-body>]  
请求行 :由三部分组成:分别是请求方法( GET/POST/DELETE/PUT/HEAD )、 URI 路径、 HTTP 版本号。

请求头:缓存相关信息(Cache-ControlIf-Modified-Since)、客户端身份信息(User-Agent)等等。

消息体:客户端发给服务端的请求数据,这部分数据并不是每个请求必须的。

 

3. 2  服务器响应HTTP请求

服务器接收处理完请求后返回一个HTTP响应消息给客户端。HTTP响应消息的格式包括:状态行、响应头、空行、消息体。每部分内容占一行。

  1. <status-line>  
  2. <general-headers>  
  3. <response-headers>  
  4. <entity-headers>  
  5. <empty-line>  
  6. [<message-body>]  
状态行 :有 HTTP 协议版本号, 状态码 和状态说明三部分构成。

响应头:用于说明服务器的一些信息,以及将来继续访问该资源时的策略。

消息体:服务端返回给客户端的HTML文本内容。或者其他格式的数据,比如:视频流、图片或者音频数据。

 

4  浏览器解析html代码,并请求html代码中的资源

浏览器拿到html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,向服务器端发起一个HTTP请求,如果服务器端返回304状态码(告诉浏览器服务器端没有修改该资源),那么浏览器会直接读取本地的该资源的缓存文件。否则开启新线程向服务器端去请求下载。(这个时候就用上keep-alive特性了,建立一次HTTP连接,可以请求多个资源。)

最后,浏览器利用自己内部的工作机制,把请求到的静态资源和html代码进行渲染,再呈现给用户。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章 概论 .................................................................................................................. 1 1.1 网络的历史................................................................. ...................................... 1 1.2 OSI 模型........................................................................................................... 3 1.3 Internet 体系模型.............................................................................................. 4 1.4 客户/服务器模型............................................................................................... 5 1.4 UNIX 的历史 ................................................................................................... 7 1.4.1 Unix 诞生前的故事 ................................................................................. 7 1.4.2 UNIX 的诞生.......................................................................................... 8 1.4.3 1979 – UNIX 第七版 ............................................................................. 10 1.4.4 UNIX 仅仅是历史吗?............................................................................. 11 1.5 Linux 的发展.................................................................................................. 11 1.5.1 Linux 的发展历史 .................................................................................. 12 1.5.2 什么叫 GNU? ...................................................................................... 12 1.5.3 Linux 的特色 ........................................................................................ 13 1.5.4 硬件需求............................................................................................... 14 1.5.5 Linux 可用的软件 ................................................................................. 14 1.5.6 为什么选择 Linux ? ............................................................................ 15 1.6 Linux 和 Unix 的发展 .................................................................................... 15 第二章 UNIX/Linux 模型...............................................................................................17 2.1 UNIX/Linux 基本结构.......................................................................................17 2.2 输入和输出......................................................................................................19 2.2.1 UNIX/Linux 文件系统简介 ......................................................................19 2.2.2 流和标准 I/O 库......................................................................................20 2.3 进程 ................................................................................................................21 第三章 进程控制 ..........................................................................................................22 3.1 进程的建立与运行 ...........................................................................................22 3.1.1 进程的概念 ............................................................................................22 3.1.2 进程的建立 ............................................................................................22 3.1.3 进程的运行 ............................................................................................24 3.1.4 数据和文件描述符的继承 .......................................................................29 3.2 进程的控制操作...............................................................................................31 3.2.1 进程的终止 ............................................................................................31 3.2.2 进程的同步 ............................................................................................32 3.2.3 进程终止的特殊情况 ..............................................................................33 3.2.4 进程控制的实例 .....................................................................................33 3.3 进程的属性......................................................................................................38 3.3.1 进程标识符 ............................................................................................38 3.3.2 进程的组标识符 .....................................................................................39 3.3.3 进程环境................................................................................................40 3.3.4 进程的当前目录 .....................................................................................42 3.3.5 进程的有效标识符..................................................................................43 3.3.6 进程的资源 ............................................................................................44 3.3.7 进程的优先级.........................................................................................45 3.4 守护进程 .........................................................................................................46 3.4.1 简介.......................................................................................................46 3.4.2 守护进程的启动 ............................................................................................46 3.4.3 守护进程的错误输出 ..............................................................................46 3.4.4 守护进程的建立 .....................................................................................48 3.5 本章小结 .........................................................................................................49 第四章 进程间通信.......................................................................................................50 4.1 进程间通信的一些基本概念 .............................................................................50 4.2 信号 ................................................................................................................50 4.2.1 信号的处理 ............................................................................................52 4.2.2 信号与系统调用的关系...........................................................................54 4.2.3 信号的复位 ............................................................................................55 4.2.4 在进程间发送信号..................................................................................56 4.2.5 系统调用 alarm()和 pause()......................................................................58 4.2.6 系统调用 setjmp()和 longjmp().................................................................62 4.3 管道 ................................................................................................................63 4.3.1 用 C 来建立、使用管道 ..........................................................................65 4.3.2 需要注意的问题 .....................................................................................72 4.4 有名管道 .........................................................................................................72 4.4.1 有名管道的创建 .....................................................................................72 4.4.2 有名管道的 I/O 使用...............................................................................73 4.4.3 未提到的关于有名管道的一些注意 .........................................................75 4.5 文件和记录锁定...............................................................................................75 4.5.1 实例程序及其说明..................................................................................75 4.5.2 锁定中的几个概念..................................................................................78 4.5.3 System V 的咨询锁定..............................................................................78 4.5.4 BSD 的咨询式锁定 .................................................................................79 4.5.5 前面两种锁定方式的比较 .......................................................................81 4.5.6 Linux 的其它上锁技术 ............................................................................81 4.6 System V IPC ...................................................................................................84 4.6.1 ipcs 命令 ................................................................................................85 4.6.2 ipcrm 命令..............................................................................................86 4.7 消息队列(Message Queues)...........................................................................86 4.7.1 有关的数据结构 .....................................................................................86 4.7.2 有关的函数 ............................................................................................89 4.7.3 消息队列实例——msgtool,一个交互式的消息队列使用工具 ..................94 4.8 信号量(Semaphores) .........................................................................................97 4.8.1 有关的数据结构 .....................................................................................98 4.8.2 有关的函数 ............................................................................................99 4.8.3 信号量的实例——semtool,交互式的信号量使用工具........................... 103 4.9 共享内存(Shared Memory) .............................................................................. 109 4.9.1 有关的数据结构 ................................................................................... 109 4.9.2 有关的函数 .......................................................................................... 110 4.9.3 共享内存应用举例——shmtool,交互式的共享内存使用工具................... 112 4.9.4 共享内存与信号量的结合使用 .............................................................. 114 第五章 通信协议简介 ................................................................................................. 120 5.1 引言 .............................................................................................................. 120 5.2 XNS(Xerox Network Systems)概述.............................................................. 120 5.2.1 XNS 分层结构...................................................................................... 120 IPX/SPX 协议概述........................................................................................ 122 5.3 5.3.1 网际包交换(IPX) ............................................................................. 122 5.3.2 排序包交换(SPX)............................................................................. 124 5.4 Net BIOS 概述................................................................................................ 124 5.5 Apple Talk 概述 .............................................................................................. 125 5.6 TCP/IP 概述................................................................................................... 126 5.6.1 TCP/IP 结构模型 .................................................................................. 126 5.6.2 Internet 协议(IP)............................................................................... 127 5.6.3 传输控制协议(TCP) ......................................................................... 132 5.6.4 用户数据报文协议................................................................................ 134 5.7 小结 .............................................................................................................. 135 第六章 Berkeley 套接字 ............................................................................................. 136 6.1 引言 ............................................................................................................. 136 6.2 概述 ............................................................................................................. 136 6.2.1 Socket 的历史...................................................................................... 136 6.2.2 Socket 的功能...................................................................................... 136 6.2.3 套接字的三种类型............................................................................... 138 6.3 Linux 支配的网络协议................................................................................... 141 6.3.1 什么是 TCP/IP? ................................................................................... 141 6.4 套接字地址................................................................................................... 142 6.4.1 什么是 Socket? .................................................................................. 142 6.4.2 Socket 描述符...................................................................................... 142 6.4.3 一个套接字是怎样在网络上传输数据的?............................................ 143 6.5 套接字的一些基本知识 ................................................................................. 144 6.5.1 基本结构............................................................................................. 144 6.5.2 基本转换函数...................................................................................... 145 6.6 基本套接字调用............................................................................................ 147 6.6.1 socket() 函数....................................................................................... 147 6.6.2 bind() 函数 ......................................................................................... 148 6.6.3 connect()函数 ...................................................................................... 150 6.6.4 listen() 函数........................................................................................ 151 6.6.5 accept()函数 ........................................................................................ 152 6.6.6 send()、recv()函数 ............................................................................... 154 6.6.7 sendto() 和 recvfrom() 函数 ................................................................. 155 6.6.8 close()和 shutdown()函数...................................................................... 156 6.6.9 setsockopt() 和 getsockopt() 函数 ......................................................... 157 6.6.10 getpeername()函数.............................................................................. 157 6.6.11 gethostname()函数.............................................................................. 158 6.7 DNS 的操作.................................................................................................. 158 6.7.1 理解 DNS............................................................................................ 158 6.7.2 和 DNS 有关的函数和结构 .................................................................. 158 6.7.3 DNS 例程............................................................................................ 159 6.8 套接字的 Client/Server 结构实现的例子.......................................................... 160 6.8.1 简单的流服务器 .................................................................................. 161 6.8.2 简单的流式套接字客户端程序 ............................................................. 163 6.8.3 数据报套接字例程(DatagramSockets)............................................... 165 6.9 保留端口 ...................................................................................................... 169 6.9.1 简介.................................................................................................... 169 6.9.2 保留端口............................................................................................. 170 6.10 五种 I/O 模式................................................................................................. 179 6.10.1 阻塞 I/O 模式 .................................................................................... 179 6.10.2 非阻塞模式 I/O.................................................................................. 180 6.10.3 I/O 多路复用 ..................................................................................... 181 6.10.4 信号驱动 I/O 模式 ............................................................................. 182 6.10.5 异步 I/O 模式 .................................................................................... 185 6.10.6 几种 I/O 模式的比较.......................................................................... 186 6.10.7 fcntl()函数 ......................................................................................... 186 6.10.8 套接字选择项 select()函数.................................................................. 187 6.11 带外数据..................................................................................................... 190 6.11.1 TCP 的带外数据 ................................................................................ 190 6.11.2 OOB 传输套接字例程(服务器代码 Server.c) ................................... 193 6.11.3 OOB 传输套接字例程(客户端代码 Client.c).................................... 196 6.11.4 编译例子 ........................................................................................... 199 6.12 使用 Inetd(Internet 超级服务器) ............................................................... 199 6.12.1 简介.................................................................................................. 199 6.12.2 一个简单的 inetd 使用的服务器程序 hello inet service.......................... 199 6.12.3 /etc/services 和 /etc/inetd.conf 文件 ..................................................... 200 6.12.4 一个复杂一些的 inetd 服务器程序 ...................................................... 201 6.12.5 一个更加复杂的 inetd 服务器程序 ...................................................... 203 6.12.6 程序必须遵守的安全性准则............................................................... 205 6.12.7 小结.................................................................................................. 205 6.13 本章总结 .................................................................................................... 205 第七章 网络安全性..................................................................................................... 206 7.1 网络安全简介 ................................................................................................ 206 7.1.1 网络安全的重要性................................................................................ 206 7.1.2 信息系统安全的脆弱性......................................................................... 207 7.2 Linux 网络不安全的因素 ................................................................................ 209 7.3 Linux 程序员安全........................................................................................... 211 7.3.1 系统子程序 .......................................................................................... 212 7.3.2 标准 C 函数库....................................................................................... 214 7.3.3 书写安全的 C 程序................................................................................ 216 7.3.4 SUID/SGID 程序指导准则...................................................................... 217 7.3.5 root 程序的设计.................................................................................... 218 7.4 小结 .............................................................................................................. 219 第八章 Ping 例程 ....................................................................................................... 220 8.1 Ping 命令简介 ................................................................................................ 220 8.2 Ping 的基本原理............................................................................................. 220 8.3 小结 .............................................................................................................. 221 第九章 tftp 例程......................................................................................................... 222 9.1 tftp 协议简介.................................................................................................. 222 9.2 tftp 的使用 ..................................................................................................... 222 9.3 tftp 的原理 ..................................................................................................... 223 9.3 tftp 的基本结构 .............................................................................................. 223 9.4 小节 .............................................................................................................. 225 第十章 远程命令执行 ................................................................................................. 226 10.1 引言 ............................................................................................................ 226 10.2 rcmd 函数和 rshd 服务器............................................................................... 227 10.3 rexec 函数和 rexecd 服务器........................................................................... 233 第十一章 远程注册..................................................................................................... 235 11.1 简介............................................................................................................. 235 11.2 终端行律和伪终端........................................................................................ 235 11.3 终端方式字和控制终端................................................................................. 239 11.4 rlogin 概述.................................................................................................... 242 11.5 窗口环境...................................................................................................... 242 11.6 流控制与伪终端方式字................................................................................. 243 11.7 rlogin 客户程序............................................................................................. 245 11.8 rlogin 服务器 ................................................................................................ 246 第十二章 远程过程调用.............................................................................................. 249 12.1 引言 ............................................................................................................ 249 12.2 远程过程调用模型 ....................................................................................... 249 12.3 传统过程调用和远程过程调用的比较 ........................................................... 250 12.4 远程过程调用的定义.................................................................................... 252 12.5 远程过程调用的有关问题............................................................................. 252 12.5.1 远程过程调用传送协议....................................................................... 253 12.5.2 Sun RPC ........................................................................................... 254 12.5.3 Xerox Courier .................................................................................... 254 12.5.4 Apollo RPC........................................................................................ 255 12.6 stub 过程简介............................................................................................... 256 12.7 rpcgen 简介 .................................................................................................. 256 12.8 分布式程序生成的例子 ................................................................................ 257 12.8.1 我们如何能够构造出一个分布式应用程序........................................... 257 12.9 小结 ............................................................................................................ 283 第十三章 远程磁带的访问 .......................................................................................... 284 13.1 简介 ............................................................................................................ 284 13.2 Linux 磁带驱动器的处理 .............................................................................. 285 13.3 rmt 协议....................................................................................................... 285 13.4 rmt 服务器设计分析 ..................................................................................... 286 第十四章 WWW 上 HTTP 协议.................................................................................. 290 14.1 引言............................................................................................................ 290 14.2 HTTP 客户请求........................................................................................... 290 14.2.1 客户端 .............................................................................................. 290 14.2.2 服务器端........................................................................................... 290 14.2.3 Web 请求简介.................................................................................... 291 14.2.4 HTTP – HyperText Transfer Protocol 超文本传输协议 ........................... 295 14.3 Web 编程 .................................................................................................... 297 14.4 小结 ........................................................................................................... 301 附录 A 有关网络通信的服务和网络库函数................................................................... 302 附录 B Vi 使用简介..................................................................................................... 319 B.1 Vi 基本观念................................................................................................... 319 B.1.1 进入与离开.......................................................................................... 319 B.1.2 Vi 输入模式 ......................................................................................... 319 B.2 Vi 基本编辑................................................................................................... 320 B.2.1 删除与修改.......................................................................................... 320 B.3 Vi 进阶应用................................................................................................... 320 B.3.1 移动光标 ............................................................................................. 320 B.3.2 进阶编辑命令 ...................................................................................... 322 B.3.3 文件命令 ............................................................................................. 322 附录 C Linux 下 C 语言使用与调试简介 ...................................................................... 324 C.1 C 语言编程 ................................................................................................... 324 C.2 什么是 C? ..................................................................................................... 324 C.3 GNU C 编译器............................................................................................... 324 C.3.1 使用 GCC ............................................................................................ 324 C.3.2 GCC 选项 ............................................................................................ 325 C.3.3 优化选项 ............................................................................................. 325 C.3.4 调试和剖析选项................................................................................... 325 C.3.5 用 gdb 调试 GCC 程序.......................................................................... 326 C.4 另外的 C 编程工具 ........................................................................................ 330 C.4.1 Xxgdb.................................................................................................. 330 C.4.2 Calls .................................................................................................... 331 C.4.3 cproto .................................................................................................. 332 C.4.4 Indent .................................................................................................. 333 C.4.5 Gprof................................................................................................... 334 C.4.6 f2c 和 p2c ............................................................................................ 335 附录 D Ping 源码 ........................................................................................................ 336 附录 E TFTP 服务器程序源码 ..................................................................................... 362
第一章 概论 ..................................................................................................................1 1.1 网络的历史.......................................................................................................1 1.2 OSI 模型...........................................................................................................3 1.3 Internet 体系模型..............................................................................................4 1.4 客户/服务器模型...............................................................................................5 1.4 UNIX 的历史 ...................................................................................................7 1.4.1 Unix 诞生前的故事 .................................................................................7 1.4.2 UNIX 的诞生..........................................................................................8 1.4.3 1979 – UNIX 第七版 ............................................................................. 10 1.4.4 UNIX 仅仅是历史吗?............................................................................. 11 1.5 Linux 的发展.................................................................................................. 11 1.5.1 Linux 的发展历史 .................................................................................. 12 1.5.2 什么叫 GNU? ...................................................................................... 12 1.5.3 Linux 的特色 ........................................................................................ 13 1.5.4 硬件需求............................................................................................... 14 1.5.5 Linux 可用的软件 ................................................................................. 14 1.5.6 为什么选择 Linux ? ............................................................................ 15 1.6 Linux 和 Unix 的发展 .................................................................................... 15 第二章 UNIX/Linux 模型...............................................................................................17 2.1 UNIX/Linux 基本结构.......................................................................................17 2.2 输入和输出......................................................................................................19 2.2.1 UNIX/Linux 文件系统简介 ......................................................................19 2.2.2 流和标准 I/O 库......................................................................................20 2.3 进程 ................................................................................................................21 第三章 进程控制 ..........................................................................................................22 3.1 进程的建立与运行 ...........................................................................................22 3.1.1 进程的概念 ............................................................................................22 3.1.2 进程的建立 ............................................................................................22 3.1.3 进程的运行 ............................................................................................24 3.1.4 数据和文件描述符的继承 .......................................................................29 3.2 进程的控制操作...............................................................................................31 3.2.1 进程的终止 ............................................................................................31 3.2.2 进程的同步 ............................................................................................32 3.2.3 进程终止的特殊情况 ..............................................................................33 3.2.4 进程控制的实例 .....................................................................................33 3.3 进程的属性......................................................................................................38 3.3.1 进程标识符 ............................................................................................38 3.3.2 进程的组标识符 .....................................................................................39 3.3.3 进程环境................................................................................................40 3.3.4 进程的当前目录 .....................................................................................42 3.3.5 进程的有效标识符..................................................................................43 3.3.6 进程的资源 ............................................................................................44 3.3.7 进程的优先级.........................................................................................45 3.4 守护进程 .........................................................................................................46 3.4.1 简介.......................................................................................................46 3.4.2 守护进程的启动 ............................................................................................46 3.4.3 守护进程的错误输出 ..............................................................................46 3.4.4 守护进程的建立 .....................................................................................48 3.5 本章小结 .........................................................................................................49 第四章 进程间通信.......................................................................................................50 4.1 进程间通信的一些基本概念 .............................................................................50 4.2 信号 ................................................................................................................50 4.2.1 信号的处理 ............................................................................................52 4.2.2 信号与系统调用的关系...........................................................................54 4.2.3 信号的复位 ............................................................................................55 4.2.4 在进程间发送信号..................................................................................56 4.2.5 系统调用 alarm()和 pause()......................................................................58 4.2.6 系统调用 setjmp()和 longjmp().................................................................62 4.3 管道 ................................................................................................................63 4.3.1 用 C 来建立、使用管道 ..........................................................................65 4.3.2 需要注意的问题 .....................................................................................72 4.4 有名管道 .........................................................................................................72 4.4.1 有名管道的创建 .....................................................................................72 4.4.2 有名管道的 I/O 使用...............................................................................73 4.4.3 未提到的关于有名管道的一些注意 .........................................................75 4.5 文件和记录锁定...............................................................................................75 4.5.1 实例程序及其说明..................................................................................75 4.5.2 锁定中的几个概念..................................................................................78 4.5.3 System V 的咨询锁定..............................................................................78 4.5.4 BSD 的咨询式锁定 .................................................................................79 4.5.5 前面两种锁定方式的比较 .......................................................................81 4.5.6 Linux 的其它上锁技术 ............................................................................81 4.6 System V IPC ...................................................................................................84 4.6.1 ipcs 命令 ................................................................................................85 4.6.2 ipcrm 命令..............................................................................................86 4.7 消息队列( Message Queues) ...........................................................................86 4.7.1 有关的数据结构 .....................................................................................86 4.7.2 有关的函数 ............................................................................................89 4.7.3 消息队列实例—— msgtool,一个交互式的消息队列使用工具 ..................94 4.8 信号量(Semaphores) .........................................................................................97 4.8.1 有关的数据结构 .....................................................................................98 4.8.2 有关的函数 ............................................................................................99 4.8.3 信号量的实例—— semtool,交互式的信号量使用工具...........................103 4.9 共享内存(Shared Memory) ..............................................................................109 4.9.1 有关的数据结构 ...................................................................................109 4.9.2 有关的函数 .......................................................................................... 110 4.9.3 共享内存应用举例—— shmtool,交互式的共享内存使用工具................... 112 4.9.4 共享内存与信号量的结合使用 .............................................................. 114 第五章 通信协议简介 .................................................................................................120 5.1 引言 ..............................................................................................................120 5.2 XNS( Xerox Network Systems)概述..............................................................120 5.2.1 XNS 分层结构......................................................................................120 5.3 IPX/SPX 协议概述........................................................................................122 5.3.1 网际包交换( IPX) .............................................................................122 5.3.2 排序包交换( SPX) .............................................................................124 5.4 Net BIOS 概述................................................................................................124 5.5 Apple Talk 概述 ..............................................................................................125 5.6 TCP/IP 概述...................................................................................................126 5.6.1 TCP/IP 结构模型 ..................................................................................126 5.6.2 Internet 协议( IP) ...............................................................................127 5.6.3 传输控制协议( TCP) .........................................................................132 5.6.4 用户数据报文协议................................................................................134 5.7 小结 ..............................................................................................................135 第六章 Berkeley 套接字 ............................................................................................. 136 6.1 引言 ............................................................................................................. 136 6.2 概述 ............................................................................................................. 136 6.2.1 Socket 的历史...................................................................................... 136 6.2.2 Socket 的功能...................................................................................... 136 6.2.3 套接字的三种类型............................................................................... 138 6.3 Linux 支配的网络协议................................................................................... 141 6.3.1 什么是 TCP/IP? ................................................................................... 141 6.4 套接字地址................................................................................................... 142 6.4.1 什么是 Socket? .................................................................................. 142 6.4.2 Socket 描述符...................................................................................... 142 6.4.3 一个套接字是怎样在网络上传输数据的? ............................................ 143 6.5 套接字的一些基本知识 ................................................................................. 144 6.5.1 基本结构............................................................................................. 144 6.5.2 基本转换函数...................................................................................... 145 6.6 基本套接字调用............................................................................................ 147 6.6.1 socket() 函数....................................................................................... 147 6.6.2 bind() 函数 ......................................................................................... 148 6.6.3 connect()函数 ...................................................................................... 150 6.6.4 listen() 函数........................................................................................ 151 6.6.5 accept()函数 ........................................................................................ 152 6.6.6 send()、 recv()函数 ............................................................................... 154 6.6.7 sendto() 和 recvfrom() 函数 ................................................................. 155 6.6.8 close()和 shutdown()函数...................................................................... 156 6.6.9 setsockopt() 和 getsockopt() 函数 ......................................................... 157 6.6.10 getpeername()函数.............................................................................. 157 6.6.11 gethostname()函数.............................................................................. 158 6.7 DNS 的操作.................................................................................................. 158 6.7.1 理解 DNS............................................................................................ 158 6.7.2 和 DNS 有关的函数和结构 .................................................................. 158 6.7.3 DNS 例程............................................................................................ 159 6.8 套接字的 Client/Server 结构实现的例子.......................................................... 160 6.8.1 简单的流服务器 .................................................................................. 161 6.8.2 简单的流式套接字客户端程序 ............................................................. 163 6.8.3 数据报套接字例程( DatagramSockets) ............................................... 165 6.9 保留端口 ...................................................................................................... 169 6.9.1 简介.................................................................................................... 169 6.9.2 保留端口............................................................................................. 170 6.10 五种 I/O 模式................................................................................................. 179 6.10.1 阻塞 I/O 模式 .................................................................................... 179 6.10.2 非阻塞模式 I/O.................................................................................. 180 6.10.3 I/O 多路复用 ..................................................................................... 181 6.10.4 信号驱动 I/O 模式 ............................................................................. 182 6.10.5 异步 I/O 模式 .................................................................................... 185 6.10.6 几种 I/O 模式的比较.......................................................................... 186 6.10.7 fcntl()函数 ......................................................................................... 186 6.10.8 套接字选择项 select()函数.................................................................. 187 6.11 带外数据..................................................................................................... 190 6.11.1 TCP 的带外数据 ................................................................................ 190 6.11.2 OOB 传输套接字例程(服务器代码 Server.c) ................................... 193 6.11.3 OOB 传输套接字例程(客户端代码 Client.c) .................................... 196 6.11.4 编译例子 ........................................................................................... 199 6.12 使用 Inetd( Internet 超级服务器) ............................................................... 199 6.12.1 简介.................................................................................................. 199 6.12.2 一个简单的 inetd 使用的服务器程序 hello inet service.......................... 199 6.12.3 /etc/services 和 /etc/inetd.conf 文件 ..................................................... 200 6.12.4 一个复杂一些的 inetd 服务器程序 ...................................................... 201 6.12.5 一个更加复杂的 inetd 服务器程序 ...................................................... 203 6.12.6 程序必须遵守的安全性准则............................................................... 205 6.12.7 小结.................................................................................................. 205 6.13 本章总结 .................................................................................................... 205 第七章 网络安全性.....................................................................................................206 7.1 网络安全简介 ................................................................................................206 7.1.1 网络安全的重要性................................................................................206 7.1.2 信息系统安全的脆弱性.........................................................................207 7.2 Linux 网络不安全的因素 ................................................................................209 7.3 Linux 程序员安全........................................................................................... 211 7.3.1 系统子程序 ..........................................................................................212 7.3.2 标准 C 函数库.......................................................................................214 7.3.3 书写安全的 C 程序................................................................................216 7.3.4 SUID/SGID 程序指导准则......................................................................217 7.3.5 root 程序的设计....................................................................................218 7.4 小结 ..............................................................................................................219 第八章 Ping 例程 .......................................................................................................220 8.1 Ping 命令简介 ................................................................................................220 8.2 Ping 的基本原理.............................................................................................220 8.3 小结 ..............................................................................................................221 第九章 tftp 例程.........................................................................................................222 9.1 tftp 协议简介..................................................................................................222 9.2 tftp 的使用 .....................................................................................................222 9.3 tftp 的原理 .....................................................................................................223 9.3 tftp 的基本结构 ..............................................................................................223 9.4 小节 ..............................................................................................................225 第十章 远程命令执行 .................................................................................................226 10.1 引言 ............................................................................................................226 10.2 rcmd 函数和 rshd 服务器...............................................................................227 10.3 rexec 函数和 rexecd 服务器...........................................................................233 第十一章 远程注册.....................................................................................................235 11.1 简介.............................................................................................................235 11.2 终端行律和伪终端........................................................................................235 11.3 终端方式字和控制终端.................................................................................239 11.4 rlogin 概述....................................................................................................242 11.5 窗口环境......................................................................................................242 11.6 流控制与伪终端方式字.................................................................................243 11.7 rlogin 客户程序.............................................................................................245 11.8 rlogin 服务器 ................................................................................................246 第十二章 远程过程调用..............................................................................................249 12.1 引言 ............................................................................................................249 12.2 远程过程调用模型 .......................................................................................249 12.3 传统过程调用和远程过程调用的比较 ...........................................................250 12.4 远程过程调用的定义....................................................................................252 12.5 远程过程调用的有关问题.............................................................................252 12.5.1 远程过程调用传送协议.......................................................................253 12.5.2 Sun RPC ...........................................................................................254 12.5.3 Xerox Courier ....................................................................................254 12.5.4 Apollo RPC........................................................................................255 12.6 stub 过程简介...............................................................................................256 12.7 rpcgen 简介 ..................................................................................................256 12.8 分布式程序生成的例子 ................................................................................257 12.8.1 我们如何能够构造出一个分布式应用程序...........................................257 12.9 小结 ............................................................................................................283 第十三章 远程磁带的访问 ..........................................................................................284 13.1 简介 ............................................................................................................284 13.2 Linux 磁带驱动器的处理 ..............................................................................285 13.3 rmt 协议.......................................................................................................285 13.4 rmt 服务器设计分析 .....................................................................................286 第十四章 WWW 上 HTTP 协议.................................................................................. 290 14.1 引言............................................................................................................ 290 14.2 HTTP 客户请求........................................................................................... 290 14.2.1 客户端 .............................................................................................. 290 14.2.2 服务器端........................................................................................... 290 14.2.3 Web 请求简介.................................................................................... 291 14.2.4 HTTP – HyperText Transfer Protocol 超文本传输协议 ........................... 295 14.3 Web 编程 .................................................................................................... 297 14.4 小结 ........................................................................................................... 301 附录 A 有关网络通信的服务和网络库函数...................................................................302 附录 B Vi 使用简介.....................................................................................................319 B.1 Vi 基本观念...................................................................................................319 B.1.1 进入与离开..........................................................................................319 B.1.2 Vi 输入模式 .........................................................................................319 B.2 Vi 基本编辑...................................................................................................320 B.2.1 删除与修改..........................................................................................320 B.3 Vi 进阶应用...................................................................................................320 B.3.1 移动光标 .............................................................................................320 B.3.2 进阶编辑命令 ......................................................................................322 B.3.3 文件命令 .............................................................................................322 附录 C Linux 下 C 语言使用与调试简介 ......................................................................324 C.1 C 语言编程 ...................................................................................................324 C.2 什么是 C? .....................................................................................................324 C.3 GNU C 编译器...............................................................................................324 C.3.1 使用 GCC............................................................................................324 C.3.2 GCC 选项 ............................................................................................325 C.3.3 优化选项 .............................................................................................325 C.3.4 调试和剖析选项...................................................................................325 C.3.5 用 gdb 调试 GCC 程序..........................................................................326 C.4 另外的 C 编程工具 ........................................................................................330 C.4.1 Xxgdb..................................................................................................330 C.4.2 Calls ....................................................................................................331 C.4.3 cproto ..................................................................................................332 C.4.4 Indent ..................................................................................................333 C.4.5 Gprof...................................................................................................334 C.4.6 f2c 和 p2c ............................................................................................335 附录 D Ping 源码 ........................................................................................................336 附录 E TFTP 服务器程序源码 .....................................................................................362
第一章概论 ..............1 1.1 网络的历史...1 1.2 OSI 模型.......3 1.3 Internet 体系模型.............4 1.4 客户/服务器模型..............5 1.4 UNIX 的历史 ..................7 1.4.1 Unix 诞生前的故事...7 1.4.2 UNIX 的诞生.........8 1.4.3 1979 – UNIX 第七版........... 10 1.4.4 UNIX 仅仅是历史吗?........... 11 1.5 Linux 的发展................. 11 1.5.1 Linux 的发展历史.... 12 1.5.2 什么叫GNU? ..... 12 1.5.3 Linux 的特色....... 13 1.5.4 硬件需求.............. 14 1.5.5 Linux 可用的软件... 14 1.5.6 为什么选择 Linux ? .......... 15 1.6 Linux 和 Unix 的发展... 15 第二章 UNIX/Linux 模型..............17 2.1 UNIX/Linux 基本结构......17 2.2 输入和输出.....................19 2.2.1 UNIX/Linux 文件系统简介....19 2.2.2 流和标准I/O 库.....20 2.3 进程............21 第三章进程控制 ......22 3.1 进程的建立与运行..........22 3.1.1 进程的概念...........22 3.1.2 进程的建立...........22 3.1.3 进程的运行...........24 3.1.4 数据和文件描述符的继承.....29 3.2 进程的控制操作..............31 3.2.1 进程的终止...........31 3.2.2 进程的同步...........32 3.2.3 进程终止的特殊情况............33 3.2.4 进程控制的实例....33 3.3 进程的属性.....................38 3.3.1 进程标识符...........38 3.3.2 进程的组标识符....39 3.3.3 进程环境...............40 3.3.4 进程的当前目录....42 3.3.5 进程的有效标识符....43 3.3.6 进程的资源...........44 3.3.7 进程的优先级........45 3.4 守护进程.....46 3.4.1 简介...46 3.4.2 守护进程的启动...........46 3.4.3 守护进程的错误输出............46 3.4.4 守护进程的建立....48 3.5 本章小结.....49 第四章进程间通信...50 4.1 进程间通信的一些基本概念...........50 4.2 信号............50 4.2.1 信号的处理...........52 4.2.2 信号与系统调用的关系.........54 4.2.3 信号的复位...........55 4.2.4 在进程间发送信号....56 4.2.5 系统调用alarm()和pause()....58 4.2.6 系统调用setjmp()和longjmp()...........62 4.3 管道............63 4.3.1 用C 来建立、使用管道........65 4.3.2 需要注意的问题....72 4.4 有名管道.....72 4.4.1 有名管道的创建....72 4.4.2 有名管道的I/O 使用.............73 4.4.3 未提到的关于有名管道的一些注意...75 4.5 文件和记录锁定..............75 4.5.1 实例程序及其说明....75 4.5.2 锁定中的几个概念....78 4.5.3 System V 的咨询锁定............78 4.5.4 BSD 的咨询式锁定...79 4.5.5 前面两种锁定方式的比较.....81 4.5.6 Linux 的其它上锁技术..........81 4.6 System V IPC ..................84 4.6.1 ipcs 命令...............85 4.6.2 ipcrm 命令.............86 4.7 消息队列(Message Queues).........86 4.7.1 有关的数据结构....86 4.7.2 有关的函数.....
TCP拦截和网络地址转换 本书将讨论与访问表相关的技术,而非访问表本身。这些技术提供了控制网络中数据流 量的附加功能。这些功能特性会使读者能够加强进出网络报文的附加功能。通过智能地对数 据本身进行操作,例如,可以操纵 I P报文中的源和目的地址,或者给某种通信报文分配较多 的带宽,读者就能够进一步加强进出网络的报文的安全性和控制能力。本章将讨论两种特性: T C P拦截和网络地址转换(Network Address Tr a n s l a t i o n,N AT),它们可以大大加强对网络中 数据流量的控制能力。先介绍 T C P拦截,并讨论其特性以及它是如何在网络中实现的。还将 介绍有关T C P拦截的所有配置和调试命令。在 T C P拦截这一部分,最后给出几个使用该特性的 示例。之后,介绍 N AT的整体概念,包括 N AT的引入、 N AT特性以及如何将其用于网络中。 最后将讨论有关N AT的配置和调试命令,并介绍许多详细的示例。 8.1 TCP拦截概述 T C P拦截(TCP intercept)从IOS 11 . 3开始引入,现在的所有路由器平台都有该功能。设 计该特征的目的是防止 S Y N攻击内部主机(第 7章已简要地讨论了 S Y N攻击)。S Y N泛洪攻击 是简单的。 T C P三路握手的第一个报文设置了 S Y N位。当某台设备接收到一个请求服务的初 始报文时,该设备响应这个报文,发回一个设置了 S Y N和A C K位的报文,并等待源端来的 A C K应答。如果请求的发出者不作响应,主机就会因为超时而结束连接。当主机在等待这个 事务完成时,这种 h a l f - o p e n的连接消耗了主机的资源。在等待三路握手时资源被耗尽就是攻 击的本质所在。 成千上万个设置了 S Y N位的报文被发往一台主机,以便在设备的侦听端口上建立一个 T C P连接。但是,这些报文中的源 I P地址是伪造的。这些报文中所设置的源地址都是不可达 的地址;在大多数情况下,源地址要么是来自 R F C 1 9 1 8(即,1 0 . 0 . 0 . 0 / 8,1 7 2 . 1 6 . 0 . 0 / 1 5以及 1 9 2 . 1 6 8 . 0 . 0 / 1 6)的未注册地址,要么是不存在的主机地址。从被攻击的主机到初始源 I P地址 主机的返回报文就永远不能到达一个真实的主机。这样,被攻击的主机就永远也收不到完成 三路握手的应答报文。因此,它必然因为成千上万个连接的超时而要关闭这些连接。最终, 被攻击的主机资源被耗尽,主机也就没什么用处了。如果发送有足够数量的 S Y N报文,则某 些操作系统也会崩溃,并且需要重启系统。 这就是常见的D o S攻击,这种攻击本身破坏性极强,而且它有时也作为更复杂的攻击的一 部分。例如,攻击者知道用户的某台服务器信任来自防火墙外面另一台服务器的报文,则他 会先攻击防火墙外面的那台服务器,并设置一个嗅探程序来查看用户网络报文。如果攻击者 不能攻破防火墙外面的这台服务器,他就无法打破防火墙,或者这时他就会尝试获取这两台 主机之间的信任关系。 第一步就是对防火墙外面的这台可信主机发起 S N Y泛洪,以阻止其响应任何新的网络会 话。攻击者而后使用外部服务器的源 I P地址向内部服务器发送报文。内部服务器就会响应该 可信外部服务器的I P地址,但外部服务器会由于 D o S攻击而不能响应内部服务器。攻击者的机 92 C i s c o访问表配置指南 下载 92 C i s c o访问表配置指南 下载 器可能看不到报文,但如果攻击者能够预测内部服务器所用的.. T C P顺序号,就会成功地完成.. T C P的三路握手,从而进一步地攻击到了内部服务器。根据所允许通过防火墙的服务类型,攻 击者可以将对外部可信主机的.. D o S攻击和I P欺骗结合起来,从而对内部主机实施攻击。图.. 8 - 1 说明了这种攻击。 中心问题是.. S Y N泛洪的危险性远不止只是攻破一个单一主机,它可以与其他攻击方法相 结合来攻破网络中的其他主机。 已攻陷的主机 使用源IP地址171.10.1.1 发送报文 信任主机 泛洪 路由器 内部主机 图8-1 对外部主机的DoS攻击。攻击过程分为两个阶段:(1) 用SYN泛洪“麻醉”主机使其不能响应;.. (2) 发送报文到内部主机,并欺骗源IP地址,这样内部主机就会相信来自可信主机的报文 在T C P连接请求到达目标主机之前,.. T C P拦截通过对其进行拦截和验证来阻止这种攻击。 这个特征可以在两种模式上工作:拦截和监视。在拦截模式下(.. intercept mode),路由器拦截 所有到达的.. T C P同步请求,并代表服务器建立与客户机的连接,并代表客户机建立与服务器 的连接。如果两个连接都成功地实现,路由器就会将两个连接进行透明的合并。路由器有更 为严格的超时限制,以防止其自身的资源被.. S Y N攻击耗尽。在监视模式下,路由器被动地观 察h a l f - o p e n连接(没有完成.. T C P三路握手的连接)的数目。如果超过了所配置的时间,路由 器也会关闭连接。访问表则用来定义要进行.. T C P拦截的源和目的地址。.. 8.1.1 开启TCP拦截 开启T C P拦截,有两个步骤是必需的:.. 1) 配置访问表,以开启需要保护的 I P地址。.. 2)开启.. T C P拦截 在第1步中,读者可以使用一个扩展的.. I P访问表。通常指定a n y作为源I P地址,因为我们一.. 第 8章 TCP拦截和网络地址转换 93 下载 般都希望T C P拦截检查所有到达脆弱主机的向内连接。在第 2步中,则真正地开启 T C P拦截特 性。如果第 2步中的访问表没有定义,则 T C P拦截将不会检查任何向内连接。 8.1.2 设置模式 T C P拦截可以在拦截和监视两种模式下工作,缺省为拦截模式。在这种模式下,路由器 响应到达的S Y N请求,并代替服务器发送一个响应初始源 I P地址的S Y N - A C K报文,然后等待 客户机的A C K。如果收到A C K,再将原来的 S Y N报文发往服务器,路由器代替原来的客户机 与服务器一起完成三路握手过程。这种模式增加了路由器的内存和 C P U的额外开销,并且增 加了一些初始会话的延时。 在监视模式下,路由器允许 S Y N请求直接到达服务器。如果这个会话在 3 0秒钟内(缺省 值)没有建立起来,路由器就给服务器发送一个 R S T,以清除这个连接。路由器等待的时间 是可以配置的。其模式可以使用下面的命令设置: 缺省模式是i n t e r c e p t。 8.1.3 主动门槛值 当一个路由器因为其所定义的门槛值而确认服务器正遭受攻击时,路由器就主动删除连 接,直到 h a l f - o p e n的连接值降到小于门槛值。首先关闭的是最早的连接,除非使用了“ ip tcp intercept drop-mode random”命令。当所设置的门槛值被超时时,路由器进行下面的动作: 1) 每一个新的连接导致一个最早的(或随机的)连接被删除。 2) 初始的重传超时时间被减少一半,直到 0 . 5秒。 3) 如果处于监视模式,则超时时间减半,直到 1 5秒。 有两个因素用来判断路由器是否正在遭受攻击。如果超过了两个高门槛值中的一个,则 表明路由器正遭受攻击,直到门槛值已经降至两个低门槛值以下。下面显示了有关的参数及 其缺省值,并对其加以简单描述。 1) ip tcp intercept max-incomplete high number 11 0 0 在路由器开始删除连接之前,能够存在的 h a l f - o p e n连接的最大数目。 2) ip tcp inercept max-incomplete low number 900 在路由器停止删除h a l f - o p e n连接之前,能够存在的最大 h a l f - o p e n连接数目。 3) ip tcp intercept one-minute high number 11 0 0 在路由器开始删除连接之前,每分钟内能存在的最大 h a l f - o p e n连接数目。 4) ip tcp intercept one-minute low number 900 在路由器停止删除连接之前,每分钟内能存在的最小 h a l f - o p e n连接数目。 h a l f - o p e n连接总数与每分钟 h a l f - o p e n连接的数量比率是相联系的。任何一个最大值到达, T C P拦截就被激活并且开始删除 h a l f - o p e n连接。一旦T C P拦截被激活,这两个值都必须下降到 T C P拦截的低设置值,以便停止删除连接。 8.1.4 其他命令 还有一些其他有用的命令可用于检查有关 T C P拦截的信息。下面给出了这些命令,并附 94 C i s c o访问表配置指南 下载 94 C i s c o访问表配置指南 下载 带了一个T C P拦截的简单示例: 下一节将介绍使用上述格式的.. T C P拦截的详细示例。.. 8.2 TCP拦截应用:示例1 在本例中,某公司使用一台路由器,将其一个E t h e r n e t连接到内部.. L A N,并将一个串行接 口连接到一个I S P。在E t h e r n e t上有一台.. We b服务器,其所用的.. I P地址为1 9 8 . 5 0 . 1 . 1 0 0,并且希 望使用.. T C P拦截功能来保护该服务器。该路由器是一个低端服务器,所以我们希望:在能够 监视进来的T C P连接的同时,尽可能多地保留资源(见图.. 8 - 2)。 服务器 工作站 内部网络 客户路 由器 提供者的 路由器 拥有198.50.1.100目的地址的 报文被TCP拦截所监视 图8-2 网络方案:示例1 8.2.1 解决方案 8.2.2 分析 在本方案中,先定义访问表.. 1 0 1,用以指出需要查看的报文,这些报文是到达.. 1 9 8 . 5 0 . 1 . 1 0 0的报文。而后定义.. T C P拦截命令,并将访问表.. 1 0 1用于匹配被监视的报文。还定 义了T C P拦截的操作模式是监视模式,这会比缺省的拦截模式使用更少的路由器资源。这些.. 第 8章 TCP拦截和网络地址转换 95 下载 步骤就是启用T C P拦截保护We b服务器的所有操作。 8.3 TCP拦截应用:示例2 在本例中,公司与示例 1中的公司相同,使用一台路由器,将其一个 E t h e r n e t接口连接到 内部L A N中,并将一个串行接口连接到一个 I S P。但本例中公司不是使用一个简单的 We b服务 器,而是使用一组 We b服务器,其 I P地址从1 9 8 . 5 0 . 1 . 1到1 9 8 . 5 0 . 5 0 . 1 0 0。在本网段中不再使用 其他的I P地址。我们希望使用 T C P拦截来保护所有的 We b服务器。由于使用了一台高性能路由 器,所以路由器资源并不是关键因素,我们有 1 0 0台We b服务器,并且期望有大量的 T C P请求 进来(见图8 - 3)。 目的地址198.50.1.1到198.50.1.100 的报文被TCP拦截所监测。 图8-3 网络方案:示例2 8.3.1 解决方案 8.3.2 分析 在这个方案中,定义了访问表 1 0 1,用来指定匹配目的 I P地址的范围在 1 9 8 . 5 0 . 1 . 0到 1 9 8 . 5 0 . 1 . 1 2 8之间的所有报文。注意到匹配上的地址比实际使用的地址要多,因为 We b服务器 的I P地址只用到 . 1 0 0,但这也不会产生任何问题。而后我们定义 T C P拦截命令来指定访问表 1 0 1用于匹配 T C P所监视到的报文。我们还改变了 T C P拦截的缺省阈值设置,因为我们期望在 大量的 We b服务器中应能够在任何时刻都有大量的 S Y N请求。我们保留拦截模式的缺省值, 因为有足够的资源来管理每个 T C P连接。 至此已介绍完了T C P拦截。下一节将讨论网络地址转换( N AT)。 8.4 网络地址转换概述 网络地址转换可以动态改变通过路由器的 I P报文的内容,以便修改报文的源 I P地址和 96 C i s c o访问表配置指南 下载 96 C i s c o访问表配置指南 下载 (或)目的I P地址。离开路由器的报文的源地址或目的地址会转换成与原来不同的地址。这种 功能使得管理员可以隐藏内部网络的 I P地址,并要求路由器可以执行 N AT。这项对于那些使 用来自 R F C 1 8 1 9的未注册地址空间的公司是必需的,或者对于那些为其他公司进行 I P注册的 组织也十分有用。 8.4.1 特征 N AT可以用来修改I P报文头中的源 I P地址和目的 I P地址。I P校验和由N AT处理过程自动进 行修改。有些应用程序将源 I P地址嵌入到了I P报文的数据部分中,所以需要对报文进行修改。 对于这些应用程序, N AT进程也必须修改报文的数据部分,以匹配 I P头中已修改过的源 I P地 址。N AT的C i s c o版本可以处理许多的应用,这些应用的报文数据部分包含 I P地址。C i s c o版本 也允许共享负载的T C P流量,这可以通过允许对单个 I P地址的T C P请求来实现。这些特性将在 本章后面介绍。 在诸如I n t e r n e t,或不同组织互连的管理域边界上, N AT使用得十分普遍。某些组织虽然 申请了一些地址空间,但上网主机的数目超过了 I P地址的数目,此时 N AT就十分有用。没有 注册的地址可以在内部使用,而注册地址只用于报文与外部网络通信。 N AT处理过程对于源 端和目的端主机都是透明的。 8.4.2 局限性 尽管N AT是一个很有用的工具,它还是有一些缺陷。 N AT所面临的最主要的困难在于: 有些应用程序将源I P地址嵌入到了I P报文的数据部分中。这样,报文的源 I P地址在经过N AT的 转换之后,就与报文数据部分的 I P地址不匹配。如果I P头中的源I P地址不匹配报文数据部分的 源I P地址,则这些在报文的数据部分嵌入 I P地址的应用程序不能正常工作。 C i s c o实现的N AT 能够处理许多将 I P地址包含在报文数据部分的应用程序。一个特别例子是 N e t B I O S会话服务。 N e t B I O S服务用于 Windows NT,所以它在数据网络中应用得很普遍。 C i s c o可以支持全部的 N e t B I O S服务。表8 - 1列举了C i s c o目前所支持的应用。 表8-1 Cisco NAT所支持的应用 任何非源和目的的T C P / U D P报文 在I P报文的数据部分中的I P地址 I C M P F T P T C P上的N e t B i o s(除了会话服务) R e a l A u d i o White Pines CUSeeMe S t r e a m w o r k s DNS “A”和 “ P T R”查询 H . 3 2 3① N e t M e e t i n g① V D O L i v e V x t r e m e ①在IOS 12.0.1或更高版本中支持。 Cisco NAT不支持表 8 - 2中的应用。如果读者要使用这些应用,就要知道当路由器执行 下载下载 第 8章 TCP拦截和网络地址转换 97 N AT时它们很可能工作不正常。 表8-2 Cisco NAT不支持的应用 I P组播 路由表更新 D N S域的迁移 B O O T P Talk, ntalk S N M P N e t S h o w 8.5 NAT的术语 讨论N AT时,要用到几个术语: 1) 内部本地地址( inside local address)——分配给内部网络上主机的 I P地址。这些地址 通常只有内部主机知道。 2) 内部全局地址(inside global address)——分配给内部主机的以用于 N AT处理的地址; 这种内部主机的地址可以被外部主机看到。 3) 外部本地地址( outside local address)——分配给外部主机的以用于 N AT处理的I P地 址;这些外部主机的地址可以被内部主机看到。 4) 外部全局地址(outside global address)——分配给外部网络上主机的 I P地址。这类地 址可以被外部主机知道,但不能被内部主机知道。 内部地址被内部网络所使用,这些地址可能要进行转换。外部地址被外部网络所使用, 也可能需要进行转换。术语“本地( l o c a l)”指的是其地址可以被内部主机看到。而术语“全 局(g l o b a l)”指的是地址可以被外部主机看到。注意,如果外部地址没有经过 N AT转换的话, 外部本地地址和外部全局地址可能是一样的。也就是说,外部主机地址在外部网络和内部网 络上可能是相同的,而实际情况也是如此。 理解这些术语的简单方法是抓住其第一个词语:内部或外部,它反映了报文的来源。内 部本地地址(inside local address)和内部全局地址(outside global address)这两个术语都表 明报文是来自内部网络的。第二个词语,本地或全局,则表明地址的可见范围。本地地址是 在本地网络中可见。全局地址则在外部网络上可见。这样,一个内部本地地址来自内部网络, 并且只在内部网络中可见。由于这些地址是在内部网络中,并且只对内部设备可见,因此不 需要进行 N AT操作。相反地,内部全局地址来自内部网络,但却在外部网络中可见。这些地 址一般都要进行N AT操作。 8.6 启用NAT 在路由器上启用 N AT功能需要了解几个命令。首先,读者需要确定在哪个接口上启用 N AT,以及该接口是内部接口还是外部接口。通常,连接到用户内部网络的接口是 N AT内部 接口,而连接到外部网络,例如 I n t e r n e t的接口,是N AT外部接口。这些约定很重要,因为在 后面将要介绍的其他N AT命令配置过程中要参考这些约定。每种接口命令的语法如下: 98 C i s c o访问表配置指南 下载 98 C i s c o访问表配置指南 下载 示例: 在确定启用 N AT的接口之后,接下来就要确定内部全局地址。根据已有的定义,具有这 些地址的报文从内部网络流出到外部网络以后,报文的地址在外部网络上是可见的。这通常 是转换地址。 地址转换可以是动态的或静态的。如果我们不关心哪些内部本地址应该转换为哪些内部 全局地址,则可以允许路由器从地址缓冲池中选取一个可用的地址。使用 ip nat pool命令来定 义该地址缓冲池: 示例: 注意,上述这些命令是等价的。另外我们已定义了将从 . 1到. 5 0的地址放在内部全局地址 缓冲池中。即使我们指定将掩码用于整个子网, < s t a r t - i p >和< e n d - i p >将地址范围限制在 . 1 到. 5 0之间。 定义了 N AT池之后,当需要将一个内部本地地址映射为内部全局地址时,路由器就从池 中取出第一个地址项。用户不能事先指定取池中的哪个地址。如果需要指定映射的 I P地址, 则需要使用静态映射。我们在后面提供了相关的示例。 在ip nat pool命令的语法中, r o t a r y关键字用于一个可用的内部本地 I P地址池,以将其中 的内部本地 I P地址映射到相同的内部全局地址。该关键字是很有用的,例如,读者拥有一个 繁忙的We b站点,并且希望多个服务器响应对同一 I P地址的We b请求,就应该使用该关键字。 我们将在后面给出示例。 一旦创建了内部全局地址池,读者就需要指定允许哪些报文获得池中的地址。这可以使 用ip nat inside source命令来完成。读者也可以在内部本地和内部全局地址间指定静态映射。 这两种方法都可用命令 ip nat iside source来实现,如下所示: 示例: 当使用 l i s t关键字时,该命令允许那些匹配访问表 l i s t的报文可以从名为 n a m e的N AT池中 获取地址。o v e r l o a d关键字启用端口地址转换( Port Address Translation, PAT)。通过在N AT转 换表中维持 T C P / U D P端口信息和 I P地址信息, PAT允许将多个内部本地地址转换为一个单一 的内部全局地址。当内部全局地址数目有限时,这种特性十分有用。单一的 PAT地址可以与 第 8章 TCP拦截和网络地址转换 99 下载 N AT外部接口的I P地址相同,这在公司只有一个来自 I S P的可用地址时十分有用。在大多数的 配置中,路由器所连接的 I n t e r n e t必须具有一个全局可路由的 I P地址,因此使用与 PAT相同的 地址是有用的。这种情况下还可以使用一种语法格式: 读者也可以将外部全局地址转换为外部本地地址,这在相互连系的公司之间各自所使用 的外部地址存在重叠时是十分有用的。例如,如果两个公司使用 RFC 1918中重叠的地址,例 如1 0 . 0 . 0 . 0 / 2 4网络,则转换外部全局地址的语法如下: 示例: 这些命令的示例,将在后面介绍。 8.7 其他命令 在路由器上配置 N AT时,应该了解一些其他命令。首先,可以使用命令来配置几个超时 值,用以节省地址和路由器内存空间。这里每个 N AT转换都需要一定的内存空间。如果不使 用端口地址转换,只使用如下的一个命令即可: 超时时间的单位是秒,缺省值是 2 4小时或者3 6 4 0 0秒。在需要大量 N AT转换的环境中,最 好将此超时值设为 1 ~ 2小时,或者更小,因为路由器可能没有足够的内存来使用。如果使用 PAT,则还需要其他的命令,这时路由器要查看其 N AT表中的端口号和I P地址(注意,如果不 使用PAT,则不会查看N AT表中的端口号)。要启用PAT功能,可使用如下的定时器: 这些值大多数都是含义自明的。 f i n r s t - t i m e o u t表示在路由器看到 F I N或RST TCP报文之后 的超时值。p o r t - t i m e o u t值用于T C P和U D P。s y n - t i m e o u t值在看到SYN TCP报文时启用。这些 超时值中绝大多数都很小,一般是几分钟,可以使用其缺省值。例外的是 T C P,其超时值为 2 4小时。如前面所述,我们希望 T C P超时值是1 ~ 2小时,或者更低。 如果使用PAT,随着计数器的增值计数, N AT表中的不活跃表项只能存在很短一段时间。 例如,即使 T C P超时值为2 4小时,如果在 N AT转换中出现了 F I N或R S T报文,则表项会在 1分 钟内被删除。由于正常终止的会话能看到一个 F I N或R S T报文,因此只有那些非正常结束的 T C P连接才会在N AT表中保留一段时间。这就是我们建议使用较低的 T C P超时值的原因。非正 常结束的连接在N AT表中转换时使用较小的超时值。 100 C i s c o访问表配置指南 下载 100 C i s c o访问表配置指南 下载 除了超时命令外,还有其他一些有用的命令。下面给出每个的简短描述和示例输出: 另一个极有用的其他N AT命令是: 该命令用于消除.. N AT表中的转换,这对于调试诊断有用。在后面的示例中,将不再提及 这睦命令,以免重复,但读者最好熟悉它们并在自己的应用中查看其输出。下一节将给出使 用N AT的几个详细示例。.. 8.8 NAT应用:示例1 在本例中,某公司使用一台具有两个E t h e r n e t的路由器。.. E t h e r n e t 0连接到内部网络,而.. 第 8章 TCP拦截和网络地址转换 101 下载 E t h e r n e t 1则连接到一个L A N网段。公司与其I S P的路由器共享该网段。在内部网络中,公司使 用1 0 . 0 . 0 . 0 / 2 4地址空间中的地址。公司为自己提供一个 I P地址或1 7 1 . 1 0 0 . 1 . 0 / 2 4。公司路由器 的接口使用 I P地址 1 7 1 . 1 0 0 . 1 . 1,而 I S P路由器接口则使用 I P地址 1 7 1 . 1 0 0 . 1 . 2,而将那些从 1 7 1 . 1 0 0 . 1 . 0 / 2 4开始的其余地址留给 N AT转换。公司希望在路由器上使用必要的命令,以使其 内部用户能够使用 I S P所提供的地址空间中的有效,全局可路由的地址,以访问 I n t e r n e t(见图 8 - 4)。 外部网络 内部网络 客户路由器 提供者的 路由器 图8-4 NAT应用方案:示例1 8.8.1 解决方案 8.8.2 分析 在该方案中定义了用于 N AT的接口。通过将相应的命令放在每个接口下面,指定该接口 是一个 N AT外部接口或内部接口。这是配置 N AT的第一步。如果读者不将接口指定为一个 N AT内部或N AT外部接口,或者指定的不正确,则 N AT就不能正确工作。如果不定义 N AT接 口,N AT根本不工作,并且debug ip nat detail命令也不会输出任何结果。如果读者已定义了所 有其他的N AT命令,但N AT还是不工作,则确认每个接口下面的所放的 N AT命令是否合理。 在每个接口下面定义了合适的 N AT命令之后,就可以定义存放内部全局地址的 N AT池。 我们定义的起始 I P地址是1 7 1 . 1 0 0 . 1 . 3,而结束地址为 1 7 1 . 1 0 0 . 1 . 2 5 4。我们不使用. 1和. 2地址是 因为这两个地址分别用于用户路由器和 I S P路由器。由于这两个地址也与用户路由器上的 E t h e r n e t 1接口所在的子网是同一子网地址,用户路由器将使用自己的 M A C地址回答来自 I S P 路由器的 A R P请求。这允许I S P路由器从N AT池中解析出I P地址,并使用从 N A P池中取出的目 的I P地址将报文发送给用户路由器。 102 C i s c o访问表配置指南 下载 102 C i s c o访问表配置指南 下载 注意,M AT地址池并非必须来自与用户路由器接口上所配置的子网相同。下一个示例显 示了一个类似的配置,其中 N AT池不是该用户路由器地址空间的一部分。 8.9 NAT应用:示例2 在本例中,公司使用一台具有两个接口的路由器,分别是以太网和串行接口。 E t h e r n e t 0 连接到内部网络,而串行接口则通过点到点协议( P P P)链路连接到 I S P路由器。在内部网络 中,公司使用的地址来自地址空间 1 0 . 0 . 0 . 0 / 2 4,该地址空间在 I n t e r n e t上是不可路由的。公司 自己使用I P地址范围1 7 1 . 1 0 0 . 1 . 0 / 2 4。到I S P的P P P链路使用来自 1 9 8 . 5 0 . 1 . 0 / 3 0子网的地址。公 司希望在路由器上配置合适的命令,以便内部用户可以通过使用有效的、全局可路由的地址 访问I n t e r n e t。这些地址应该是来自 I S P所提供的地址空间 1 7 1 . 1 0 0 . 1 . 0 / 2 4。我们打与上游的 I S P路由器交换O S P F(开放式最短路径优先)更新信息。从而可以从该路由器接收缺省路由, 并将其通知I S P路由器,该路由正在公司路由器上使用(见图 8 - 5)。 池 串行链接 提供者的路由器 内部网络 用户路由器 图8-5 NAT应用方案:示例2 8.9.1 解决方案1 8.9.2 解决方案2 第 8章 TCP拦截和网络地址转换 103 下载 8.9.3 分析 在解决方案1中,先定义了用于 N AT的接口,并通过将合适的命令放在每个接口下面,来 指定该接口是一个 N AT内部或外部接口。在每个接口下面定义了适当的 N AT命令之后,再定 义内部全局地址所在的 N AT池。定义全局地址的起始 I P地址为 1 7 1 . 1 0 0 . 1 . 1,结束 I P地址为 1 7 1 . 1 0 0 . 1 . 2 5 4。我们使用除. 1和. 2地址之外的所有主机地址,是因为这些主机地址都不用于路 由器接口。通过在 N AT池中使用与用户路由器接口所用子网不同的子网,可以获得一些主机 地址。但这又引入了一个新的问题。 在前一个示例中, I S P路由器直接连接到分配给 N AT池的子网上。这种情况下, I S P路由 器只发出一个 A R P请求,以请求 N AT池中的单个 N AT地址,而用户路由器则使用自己的 M A C 地址来响应,此时工作正常。但是,上游的 I S P路由器并不直接连接到 N AT地址池子网 1 7 1 . 1 0 0 . 1 . 0 / 2 4,所以必须告诉它如何通过路由协议或静态路由的方法到达 N AT池所在的子网。 在解决方案1中,我们启用了O S P F并且为1 7 1 . 1 0 0 . 1 . 0 / 2 4重新分配一个静态路由到 O S P F中。上 游的I S P路由器会接收到该路由,并且将所有目的地址为 N AT池中地址的报文转发到我们的路 由器中。 可选地,I S P可以在其路由器上安装一个静态路由,用来将所有 1 7 1 . 1 0 0 . 1 . 0 / 2 4网络的报文 指向我们的路由器。但是,我们希望:当 N AT池地址不是直接从相连的子网上取出时,能够 显示出路由信息的传播路径。注意,我们将整个 1 7 1 . 1 0 . 1 . 0 / 2 4子网的 N AT地址表置为 n u l l 0。 由于我们要指定 N AT地址表中的某些表项,而非整个 1 7 1 . 1 0 0 . 1 . 0 / 2 4子网,这时路由器并不丢 弃这些报文,而是将它们转发到 N AT表中所定义的内部主机上。 在解决方案 2中,我们使用了另一种方法来通知 I S P路由器有关 N AT池的信息。这种方法 是创建一个闭环( l o o p b a c k)接口,并给其分配一个 N AT池中的 I P地址。通过将 n e t w o r k 171.100.1.0 0.0.0.255 area 0语句包含在我们的 O S P F路由进程下面,可以将该闭环地址作为 O S P F路由的一部分。注意,我们将 . 1地址从N AT池中删除,而使用主机地址 . 2作为N AT池的 起始地址,这样就减少了 N AT池地址和用于闭环接口上的 I P地址重叠的可能性。另外,我们 在闭环接口下面使用接口命令 ip ospf ntwork point-to-point。一般地,O S P F将闭环接口看成是 一个 O S P F桩( s t u b)网络,并且将接口的 3 2位表项作为路由,而非整个子网。在本例中, O S P F进程会发送 1 7 2 . 1 0 0 . 1 . 1 / 3 2而非表 1 7 2 . 1 0 0 . 1 . 0 / 2 4。在这种情况下,由于需要将整个 104 C i s c o访问表配置指南 下载 104 C i s c o访问表配置指南 下载 1 7 1 . 1 0 0 . 1 . 0 / 2 4子网信息传送给上游的 I S P路由器,所以该地址转换过程不能工作。 O S P F接口 命令告诉 O S P F传送该接口的路由,就像该网络是点到点网络一样,而不像是一个桩( s t u b) 网络。这意味着它将通过 O S P F传送整个 1 7 1 . 1 0 0 . 1 . 0 / 2 4子网信息( ip ospf network point-top o i n t命令在I O S版本11 . 3或更高版本中使用),这两种方法都能正常工作,但使用哪一种则是 读者的偏好问题了。 注意:我们知道一个公司通常会在其路由器和 I S P路由器之间运行边界网关协议 (Border Gateway Protocol, BGP)。在本例中,我们选择了O S P F路由协议,目的是为了 分析ip ospf network point-to-point命令。 8.10 NAT应用:示例3 在本例中,公司与示例 2中的公司相同,但情况稍有不同。这里公司处于 I n t e r n e t环境中, 它决定提供一个能从 I n t e r n e t访问的We b服务器,以便那些浏览 We b的用户能够了解公司。该 服务器位于内部网络中,并且能够从 I n t e r n e t上的主机访问该服务器。这样它将拥有 I P地址 1 0 . 1 . 1 . 1 0 0。由于 We b服务器必须能够通过 I n t e r n e t来访问,所以这个源 I P地址在转发给 I S P路 由器之前,必须被转换成内部全局缓冲池中的地址。我们为公司 We b服务器选择 1 7 1 . 1 0 0 . 1 . 1 0 0作为其转换成的内部全局地址。 如示例2那样,E t h e r n e t 0连接到内部网络,而串行接口则通过 P P P链路连接到I S P路由器。 在内部网络中,公司使用 1 0 . 0 . 0 . 0 / 2 4中的地址,而全局池中的 I P地址范围是 1 7 1 . 1 0 0 . 1 . 0 / 2 4。 在本例中,我们将假定 I S P使用静态路由来找到我们的路由器,其中路由器地址在 1 7 2 . 1 0 0 . 1 . 0 / 2 4地址范围内。并且I S P将该路由传送到I n t e r n e t上(见图8 - 6)。 服务器 内部网络 客户路 由器 串行链接提供者的 路由器 拥有171.100.1.100目的地址的 报文被传输到10.1.1.100 图8-6 NAT应用:示例3 8.10.1 解决方案 第 8章 TCP拦截和网络地址转换 105 下载 8.10.2 分析 如其他示例那样,我们在使用任何其他 N AT命令之前,应先定义 N AT内部和外部接口。 而后需要配置N AT池地址和N AT源列表,以允许能够从池中获得地址。本例与示例 2的不同之 处在于:我们需要为 We b服务器设置I P地址1 7 1 . 1 0 0 . 1 . 1 0 0。另外,必须在内部全局地址和内部 本地地址之间给出静态映射关系。不然的话,就不能保证 N AT表中的 N AT转换会将N AT池中 的特定I P地址映射到 We b服务器。这也意味着无法从 I n t e r n e t上知道应该使用哪个地址才能到 达We b服务器,显然这是毫无用处的。 注意,我们在配置中使用 ip nat inside source static命令,以建立 1 0 . 1 . 1 . 1 0 0和 1 7 1 . 1 0 0 . 1 . 1 0 0之间的静态映射。注意到在本例中 N AT池的语法有些不同。 C i s c o已扩展了 N AT 语法,所以可以拆分 N AT池所用的 I P地址范围。我们定义了两个不同的地址范围:从 1 7 1 . 1 0 0 . 1 . 1到1 7 1 . 1 0 0 . 1 . 9 9,以及从 1 7 1 . 1 0 0 . 1 . 1 0 1到1 7 1 . 1 0 0 . 1 . 2 5 4。所以我们可以将 I P地址 1 7 1 . 1 0 0 . 1 . 1 0 0从N AT池中排除出去,因为我们使用该地址进行静态转换。我们使用 ip nat inside source list命令来定义I P地址,以允许该I P地址从N AT池中获取相应的I P地址。注意,至 此,只使用了标准I P访问表来定义I P地址。也可以使用一个扩展的 I P访问表,在本章后面的示 例中会涉及到。 8.11 NAT应用:示例4 在本例中,公司有一台三端口路由器、一个以太网端口和两个串行端口。每个串行端口 连接到不同的 I S P,而每个 I S P给本公司分配一个独立的 C类地址。 I S P 1为公司分配 1 7 1 . 1 0 0 . 1 . 0 / 2 4;而I S P 2则为公司分配1 9 8 . 5 0 . 1 . 0 / 2 4。公司通过B G P路由协议实现从每个 I S P的 完全路由过程,并且允许路由器将报文转发到具有到达目的地的最佳路由的 I S P上。为了报文 能够从原来发出报文的同一个 I S P路由回来,路由器在发送报文到相应 I S P之前,需要从每个 提供者的地址空间转换外出报文的源 I P地址。发送给 I S P 1路由器的报文,其源地址将被转换 为I S P 1地址空间中的地址;而发送给 I S P 2路由器的报文,其源地址则被转换为 I S P 2地址空间 中的地址。 除了允许内部主机能够从每个相应的提供者地址空间中获得地址,根据所选择的路由器 不同,该公司希望可以从任何一个提供者都能够访问内部的 We b服务器。这样所需的就是将 每个提供者的地址空间中的一个静态 I P地址分配给We b服务器,以便每个提供者都可用于到达 We b服务器的I P地址。换句话说, I S P 1的用户使用来自I S P 1的地址到达We b服务器;而I S P 2的 用户则使用来自 I S P 2的地址到达该服务器。如前面的示例那样,内部 E t h e r n e t使用1 0 . 0 . 0 . 0 / 2 4 地址空间,而 We b服务器的内部本地地址是 1 0 . 1 . 1 . 1 0 0。从I S P 1来看其地址是 1 7 1 . 1 0 0 . 1 . 1 0 0, 而从I S P 2来看则为1 9 8 . 5 0 . 1 . 1 0 0。每个I S P将保证能够使用合适的 D N S表项来将We b服务器名称 106 C i s c o访问表配置指南 下载 106 C i s c o访问表配置指南 下载 解析为每个相应的 I P地址(见图 8 - 7)。 服务器 静态: 静态: 池 池 提供者1的 路由器 客户路 由器 提供者2的 路由器内部网络 图8-7 NAT应用方案:示例4 8.11.1 解决方案 第 8章 TCP拦截和网络地址转换 107 下载 8.11.2 分析 该示例应该是比前面的几个示例要更加复杂些,并且有一些很吸引人的地方。先定义.. N AT内部和外部接口。在本例中,路由器有两条.. I n t e r n e t连接,每条连接分别位于一个串行接 口上,这样我们就需要两个外部接口。接下来是.. N AT池,内部客户使用该池获取内部全局地 址。如前所述,我们有两池地址,每个地址池来自一个提供者。这样我们就创建两个独立的.. N AT池,分别称为.. I S P 1和I S P 2。注意,由于我们使用每个.. N AT池中的。.. 1 0 0来创建We b服务器 的静态N AT映射,每个N AT池都不包含。.. 1 0 0主机。在前面的示例中已经介绍了.. N AT池语句的 语法。 在创建了.. N AT池之后,就需要定义源列表,用以告诉路由器我们允许哪些.. I P地址能够从 池中获取地址。注意,这里使用.. ip nat source route-map命令,而非ip nat source list命令。我们 使用一个路由映射,而不单单使用访问表。这样不仅能够使用.. I P地址来选择.. N AT池,而且还 可以使用诸如下一跳.. I P地址以及路由器的输出接口等此类内容来选择.. N AT池。我们定义了两 个路由映射语句,i s p - 1和i s p - 2。i s p - 1路由映射匹配访问表1和接口serial 0。这意味着如果I P报 文匹配列表1并且目的接口是serial 0,则表明匹配了i s p - 1路由映射。从接口serial 0上离开路由 器的报文流向.. I S P 1,这样就符合了我们的要求。.. i s p - 2路由映射的定义类似。我们的路由器持 有一组来自每个提供者的路由,这将告诉路由器:报文应从哪个接口离开。根据我们的.. B G P 配置,可以从向外的报文中获得一些负载平衡。注意我们定义.. N AT池的方法。.. ip nat inside source route-map语句允许路由器在将报文发送到.. I S P路由器之前,从每个.. I S P地址空间中选择 一个地址。这将会保证当报文返回时,它们将沿着原先离开内部网络时所用的.. I S P返回。通常 每个I S P只将自己地址空间中的.. I P地址通告给其他提供者。来自.. I S P 1的地址空间的报文将流回.. I S P 1;而来自I S P 2地址空间的报文也将流回到.. I S P 2。 配置的最后一步是允许.. I n t e r n e t上的设备访问公司的.. We b服务器。我们需要在一个内部全 局地址和内部本地地址之间建立一个静态的.. N AT映射。但是,这种情况下,我们需要定义两 个映射,分别用于从两个不同的内部全局地址映射到公司的.. We b服务器。该过程的关键是使 用可选的关键字e x t e n d a b l e。.. e x t e n d a b l e关键字告诉路由器将创建一个扩展的.. N AT映射,该映射是从每个内部全局地址 到单一的内部本地地址的映射;并且它不仅使用.. I P地址,而且还使用源和目的端口。对于从.. N AT内部接口流到.. N AT外部接口的报文而言,动态路由映射表将用于创建扩展的转换操作。 如果不使用e x t e n d a b l e关键字,路由器将不会允许我们将多个内部全局地址映射到一个单一的 内部本地地址。.. 8.12 NAT应用:示例5 在本例中,公司使用一台两接口路由器,一个E t h e r n e t和一个串行接口。其中.. E t h e r n e t 0连 接到内部网络,而串行接口则通过.. P P P链路连接到.. I S P路由器。在内部网络中,公司使用.. 1 0 . 0 . 0 . 0 / 2 4地址空间中的地址,该地址在.. I n t e r n e t上不能路由。公司还提供了.. I P地址范围.. 1 7 1 . 1 0 0 . 1 . 0 / 2 4,用以创建全局可访问的.. We b服务器。公司认为他们将有大量的.. We b服务器连 接,但服务器只是一个低端服务器。并且公司并不打买更多的机器,因为公司已经花费了 大量资金来购买硬件设备。公司希望只使用少数几台服务器,并且对于外界看来应该就像是 108 C i s c o访问表配置指南 下载 108 C i s c o访问表配置指南 下载 一台服务器一样。换句话说,公司希望发送到一个内部全局地址上的报文能被转换成多个内 部本地地址(见图8 - 8)。 服务器 服务器 服务器 内部网络 客户路 由器 提供者的 路由器 拥有171.100.1.100为目的地址 的报文采用轮循的方法发送到 10.1.1.2-10.1.1.4的机器上 图8-8 NAT应用方案:示例5 8.12.1 解决方案 8.12.2 分析 我们先定义用于 N AT的接口,并通过将合适的命令放在每个接口下面,来确定这些接口 是N AT内部接口,还是外部接口。在每个接口下面定义了合适的 N AT命令之后,接着定义 N AT池。在非本例的情况下,N AT池的We b地址标识了公司所有的 We b服务器的内部本地地址。 注意,在本例中我们使用参数 p r e f i x - l e n g t h而非n e t m a s k。值为2 9的p r e f i x - l e n g t h等价于掩码参 数值2 5 5 . 2 5 5 . 2 5 5 . 2 4 8。再注意 r o t a r y关键字的使用。这表明了我们打使用 r o u n d - r o b i n策略从 N AT池中取出相应的I P地址用于转换进来的I P报文。 在定义了N AT池之后,我们继续定义将从 r o t a r y池中选中的 I P地址。我们定义一个 i n s i d e 第 8章 TCP拦截和网络地址转换 109 下载 destination list语句,而不使用inside source list语句。其中.. inside destination list语句定义了其.. I P的地址匹配访问表.. 1的报文将使用.. r o u n d - r o b i n策略,将其目的地址转换成.. r o t a r y池中定义的 池地址。在这种情况下访问表.. 1将匹配一个单一的.. I P地址.. 1 7 1 . 1 0 0 . 1 . 1 0 0。这样,具有.. 1 7 1 . 1 0 0 . 1 . 1 0 0目的地址的报文会将其目的.. I P地址修改为:路由器使用轮询策略从.. r o t a r y池中所 取出的地址。这允许使用.. 3个内部服务器来接收目的地址为.. 1 7 1 . 1 0 0 . 1 . 1 0 0的向内报文。所有这 三个内部.. We b服务器将分担发送到该单一全局地址上的请求。着重指出的是路由器不会保证 三台We b服务器都是正常的。如果某台服务器故障,路由器仍会向该服务器发送报文。如果 需要功能更完善的解决方案,则.. C i s c o有一种称为本地导向器(.. Local Director)的产品,它可 以用来确定池中的服务器是否正常工作。对本地导向器的讨论已超出了本书所讨论的范围, 不过读者可以查看.. C i s c o文档,或者与本地的供应商联系来获得这方面的更多信息。.. 8.13 NAT应用:示例6 在本例中,公司使用一台两接口路由器,一个是E t h e r n e t,另一个是串行接口。.. E t h e r n e t 0 连接到内部网络,而串行接口则通过.. P P P链路连接到.. I S P路由器。在内部网络中,公司使用.. 1 0 . 0 . 0 . 0 / 2 4地址范围内的地址。公司已从其供应商那里获得了一个单一的全局可路由的.. I P地址.. 1 7 1 . 1 0 0 . 1 . 1,并且该地址用于路由器的串行接口上。公司使用.. PAT将其所有的内部本地地址转 换成单一的内部全局地址.. 1 7 1 . 1 0 0 . 1 . 1。公司希望提供可以从.. I n t e r n e t访问的F T P和We b服务器, 并且对We b服务器的请求应被送到.. We b服务器所在的地址.. 1 0 . 1 . 1 . 1 0 0,而F T P请求则被送到F T P 服务器所在的地址1 0 . 1 . 1 . 1 0 1(见图8 - 9)。 服务器 服务器 内部网络 客户路 由器 串行链接提供者的 路由器 拥有171.100.1.1为目的地址的 报文基于不同的部分被传输 图8-9 NAT应用方案:示例6 8.13.1 解决方案 110 C i s c o访问表配置指南 下载 110 C i s c o访问表配置指南 下载 8.13.2 分析 先定义.. N AT所用的接口,并通过将合适的命令放在每个接口下面来定义接口是.. N AT内部 或外部接口。通常,在定义.. N AT接口之后,就要定义.. N AT池来指定所用的内部全局地址。但 是,在本例中只使用了一个单一的内部全局地址,并且将该单一内部全局地址用于路由器的.. serial 0接口上。由于只有一个单一内部全局地址并且用于路由器自己的接口上,所以我们不 需要定义N AT池。我们只简单地使用示例中所示的.. inside source list语句即可。所定义源列表 使用路由器接口的.. I P地址,并且超载该单一.. I P地址。该命令允许来自.. 1 0 . 0 . 0 . 0 / 2 4网络的内部主 机访问I n t e r n e t。路由器执行.. PAT来创建T C P / U D P端口的N AT映射。完成该步以后,接下来需 要为内部We b和F T P服务器创建静态映射。 由于只有一个单一的内部全局.. I P地址,因此要根据I P地址以及T C P或U D P端口来定义静态 映射。在本例中,将目的地址为.. 1 7 1 . 1 0 0 . 1 . 1和目的T C P端口为8 0的报文地址转换成.. T C P端口8 0 上的1 0 . 1 . 1 . 1 0 0内部主机地址。我们还将目的地址为.. 1 7 1 . 1 0 0 . 1 . 1和目的T C P端口为2 1的报文地 址转换成T C P端口2 1上的1 0 . 1 . 1 . 1 0 1内部主机地址。这样我们就在不同的内部服务器上提供了.. We b和F T P服务,虽然我们只有一个单一的内部全局地址。注意,由于该命令语法允许指定内 部服务器的I P地址和端口,所以可以在内部提供多个.. We b和F T P服务器。例如,可以创建如下 的静态映射: 该转换操作将所有目的地址为.. 1 7 1 . 1 0 0 . 1 . 1且目的端口为2 7的向内报文的地址转换为.. F T P端 口上的地址1 0 . 1 . 1 . 1 0 2。当然,我们必须保证,外部用户能够知道我们的.. F T P服务器使用非标 准的端口,而大多数的.. F T P客户机都提供这一能力。显然公司可以使用各种不同的端口转换方 法来提供服务,即使公司只有一个全局可路由的.. I P地址。这些方法使Cisco NAT的功能更加强 大。..
RFC文档目录 RFC1 主机软件 RFC2 主机软件 RFC3 文档规范 RFC4 网络时间表 RFC6 与 Bob Kahn 会话 RFC10 文档规范 RFC13 零文本长度的EOF信息 RFC16 M.I.T RFC18 IMP-IMP和主机-主机控制联接 RFC19_可用来降低有限交换节点阻塞的两条协议性的建议 RFC20_用于网络交换的 ASCII 格式 RFC21 网络会议 RFC22 主机-主机控制信息格式 RFC23_多重传送的调节信息 RFC24 文档规范 RFC25 不使用高的连接号 RFC27 文档规范 RFC28 时间标准 RFC29 响应 RFC 28 RFC30 文档规范 RFC32 关于SRI所提议的实时时钟的一些想法 RFC34 关于ARC时钟的一些初步记录摘要 RFC35 网络会议 RFC36 协议注解 RFC37 网络会议结尾等 RFC38 NWG/RFC #36 网络协议的注解 RFC40 关于未来协议的更多注解 RFC41 IMP-IMP 通讯信息 RFC42 信息数据类型 RFC43 被提议的会议 RFC45 关于未来协议的更多注解 RFC53 官方协议机构 RFC58 逻辑信息同步 RFC60 简单的 NCP 协议 RFC63 迟来的网络会议报告 RFC66 NIC - 第三级别的想法和其它噪音 RFC69 提议改变 主机/IMP 规范来消除标记 RFC71 输入错误后的再分配 RFC72 建议改变网络协议延期执行 RFC73 响应 NWG/RFC 67 RFC75 网络会议 RFC78 NCP状态报告:UCSB/RAND RFC79 圆木协议错误 RFC81 涉及信息的请求 RFC84 NWG/RFC的1-80列表 RFC85 网络工作组会议 RFC90 CCN 作为一种网络服务中心 RFC99 网络会议 RFC101 对1971年2月17日伊利诺斯州的Urbana的网络工作组会议的注释 RFC102 主机-主机 协议故障清除委员会的说明 RFC103 中断键的执行 RFC104 连接 191 RFC105 通过 UCSB 进行远程登录和远程输出返回的网络说明书 RFC106 用户/服务器 站点协议的网络主机问卷 RFC107 主机-主机 协议故障清除委员会的说明 RFC108 1971年2月17-19日在 Urbana 举行的 NWG 会议的人员列表 RFC124 在 RFC 107 中有印刷错误 RFC132 RFC 107 的排版错误 RFC148 RFC 123 的注释 RFC149 最好的铺设计划 RFC154 风格显示 RFC156 伊利诺斯州站点的状态: 响应 RFC 116 RFC179 连接的数字分配 RFC185 NIC 分发手册 RFC188 数据管理会议公告 RFC198 站点证明-林肯实验室 360/67 RFC204_利用报路 RFC218 改变 IMP 状态报告设备 RFC228 澄清 RFC232 网络图形会议延缓 RFC245 预定网络工作组会议 RFC246 网络图形会议 RFC256 IMPSYS 变更通知 RFC276 NIC过程 RFC285 网络图形 RFC324 RJE 协议会议 RFC335 新界面 - IMP/360 RFC348_放弃过程 RFC404 文件迁移协议的注释 RFC405 给 TIP 用户的第二封信 RFC456 UCSB 的数据重置服务 RFC457_FTP 的服务器与服务器交互 RFC496 IMP/TIP 内存更新时间表(修订版 2) RFC516 丢失消息的检测 RFC591 在 NVT ASCII UCSB和在线系统之间的实验输入映象 RFC621 “注意圣诞节的时候要把长袜挂在烟囱下面” RFC628 更深的数据语言的设计观念 RFC634 最近的网络图 RFC637 SU-DSL网络地址的更改 RFC677 双重数据库的维护 RFC692 对于IMP/HOST 协议的改动的注释 (RFCS 687 AND 690) RFC697_FTP的CWD命令 RFC698_Telnet扩展ASCII选项 RFC763 角色邮箱 RFC775_面向目录的 FTP 命令 RFC779_Telnet发送-位置选项 RFC792_Internet 控制信息协议 RFC797 位图文件格式 RFC821_简单邮件传输协议 RFC826_以太网地址转换协议或转换网络协议地址 RFC827_Exterior 网关 协议 (EGP) RFC854_Telnet协议说明书 RF

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值