如何正确理解和获取S参数

        S参数是网络参数,定义了反射波和入射波之间的关系,S参数矩阵指定端口反射波b的矢量相对于端口入射波a的矢量,如下所示:

b=S∙a

        在此基础上,如下图所示,为一个常见的双端口网络拓扑图:

        其S参数矩阵可以表示如下:

        上图中矩阵下标的命名规则,可由下图进行定义描述:假设DUT为一段传输线,当传输线阻抗与端口阻抗不匹配时,会发生信号反射,一部分入射波能量会反射回输入端口,反射波和入射波的能量比值,称之为S11(回波损耗),另一部分入射波能量会沿着传输线继续向输出端传播,到达输出端的入射波与初始输入端的入射波的能量比值,称之为S21(插入损耗),当输入和输出端口发生互换时,即可得到S22S12

        当双端口网络演变为普通的四端口网络时,两个独立运行的传输线之间,必然会由于分布参数的影响(图中的CmLm)产生能量耦合效应,从而形成线间的串扰,并且,根据串扰传播的不同方向,会形成远端串扰(FEXT)和近端串扰(NEXT)的定义,那么,S参数会在双端口矩阵的基础之上,增加端口和端口之间的能量串扰的定义描述。

        为了实现更高速率的信号传输,差分传输系统会将有用信号叠加在一个直流偏置电压之上进行长距离的传输,以此达到将低电平变化的有用信号与地噪声之间进行隔离的效果,这种方式虽然有效,但导致传输系统中会存在两种能量分量:差模(Differential mode)共模(Common mode),对于实际工作,共模能量不是必须的,因此在终端,通常会使用隔直电容进行滤除,但如果“滤波”效果不理想,共模能量还是会与差模能量一起流入到端口中,并且由于两种能量均来自于有用信号,导致了两种能量之间的转换。

        把这种转换定义到S参数的端口矩阵中时,会形成如下的混合模式S参数矩阵,拓扑图看起来虽然略显复杂,但可以将其理解为是普通四端口网络的“强化版”:左上和右下分别是独立的差模和共模系统,左下和右上的串扰部分则替换为模式能量转换。

        差分系统的矩阵下标的具体定义如下图所示,需要注意其中s和d的区别:当DUT系统的port 1和port 2之间满足互易性(即结构对称)时,称之为差分平衡模式--d;当不满足互易性(即结构非对称)时,称之为单端非平衡模式--s,即s可以用于表征差分结构中的不对称现象。

        综上所述,因为差分端口的S参数是由双端口S参数逐步演化而来,因此,在数学中也可以从单端S参数推导而来,具体关系如下图的公式矩阵所示,在实际的仿真和测试中,软件和测量设备也是通过获取单端S参数矩阵再进行运算得到混合S参数矩阵的,并非直接获取。

        以一个简单的仿真举例说明上述公式的应用,对一段3米的USB线缆提取S参数,有以下两种方式:

        方式1,直接提取单端四端口的S参数,再以上述计算公式的方式获取混合模式S参数;

        方式2,利用仿真软件中自带的模式转换器(Balun4Port),自动获取混合模式S参数。

        其中,方式1在进行S参数计算时,一定要分清楚各个单端端口的摆放顺序,并分别获取如下的四组参数的计算公式:  

        最后的结果显示,两种方式提取的混合S参数结果,基本相同,从而说明了公式提取的准确性。    

        有了上述关于S参数的系统概念,再返回来查看网络分析仪的工作原理,即便描述非常简单,相信理解也将更为深刻!!!

  • 27
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
libusb1.0学习(一) 首先声明,这是看到国外论坛上的学习文章后,独立翻译过来作为笔记用,加入部分自我理解,并且全部原创。 介绍: libusb是一个开源库,可以帮助开发者在用户空间的层面上与UBS设备进行通讯。如果想了解更多,可以查看他们的主页:http://libusb.org/ 在其文档中,建议首先阅读USB2的规格说明:http://www.usb.org/developers/docs/,这可以帮助真正地了解USB是如何工作的。 libusb的安装: 你可以从官方的主页上获取源代码,并且编译安装。或者使用的发行版已经包含了软件包,可以很方便地安装。 如果已经安装完毕,请继续往下 通讯: 设备和客户端之间的通讯是个清楚的概念叫做使用管道。每个管道都是一个主机上的一个软件和设备上一个端点的通道。每个端点对于设备来说完成一部分特殊的目标,比如接受命令或者传输数据。一个全速设备最高可以拥有16个端点,然后低速的设备只拥有三个端点。 所有的USB设备当供电时都支持端口0。这个端口是默认的目标管道。当设备连接被检测到后,USBD软件会使用端口0来初始化设备,执行普通的(非特殊)配置,并且获得有设备提供的其他端点的信息。端点是以他们的端点数目(取决于设计的时间),总线宽带,访问频率,延迟和处理错误要求为特征区分的。 一旦设备里的端点识别并且配置完毕,管道就产生允许客户端软件与设备进行通讯。跟一个管道产生联系是以对总线的访问和带宽,传输的类型,传输的方向和最大数据负载大小为描述特征的。 USB定义了四种传输方式:控制传输,通常用来传输命令和状态操作;中断传输,通过设备初始化一些来自主机的请求;同步传输,用来传输投递关键事件的数据(比如视频和对话);批量传输,使用全部可以用的带宽但不是特定时间的。所有的数传使用相同格式的包装,包括控制信息,数据和错误效验区域。 这里有两种管道:消息管道和流管道。控制传输是使用消息管道。在消息管道中,在每个包中的数据部分对于USB系统软件是有意义的。 流管道被中断传输,同步传输和批量传输使用。在流管道中,在每个包中的数据部分对于USB是没有意义,仅仅在客户端软件和设备间传输。 同步接口: 同步接口允许你使用单独一个函数调用一个USB传输。当这个函数调用返回时,这个传输也已经完成并且返回结果供解析用。这种方式的优点是十分清晰的:你可以通过一个简单的函数调用做任何事。 尽管如此,这个接口还是有它的局限性。你的程序会进入休眠当在libusb_bulk_transfer()(当进行批量传输),直到传输完成。假如这需要花费三个小时,你的程序同样需要休眠同样的时间。实现将会在库里面结束,整体线程这期间是无用的。另一个问题是,当一个单独的传输线程结束,这里不存在可能多个端点和多个设备同时地进行I/O操作,除非你借助创造新的线程处理。另外的,当请求被提交后,这里没有机会可能取消传输。 设备和接口: 在libusb中,每个USB设备通过libusb_device和libusb_device_handle对象操作。libusb API 连接一个打开的设备至特定的接口。这意味着如果你在设备上请求多个接口,你必须同样多次打开设备来接受一个libusb_dev_handle,对应每个你想进行通讯的接口。不要忘记调用libusb_dev_handle。 这些意味着什么?这意味你在设备上操作以前,可以完成请求接口,同样,你可以在完成设备操作前,先释放接口。 每个设备都有自己独属的配置,比如vendor id,product id等。我们使用这些设置去发现需求的设备,并且通过这些配置来工作。首先我们写一个函数来查明这些配置并且打印出来,以便我们找到正确的一个;我们基本的操作如下: 1.通过调用libusb_init来初始化库,同时创建一个对话; 2.调用libusb_get_device_list来获得已经连接的设备的队列。这会创建一个libusb_device的数组,包含了所有连接到系统上的usb设备; 3.循环遍历所有的设备来检查他们的选项; 4.发现其中需要的一个,使用libusb_open或者libusb_open_device_with_vid_pid(当你知道这个设备vendor id和product id)来打开设备; 5.使用libusb_free_device_list清除使用libusb_get_device_list获得的队列; 6.通过libusb_claim_interface请求接口(需要你知道设备的接口数值); 7.操作想得到的I/O; 8.通过libusb_release_interface释放设备; 9.通过libusb_close将你之前打开的设备关闭; 10.通过libusb_exit来关闭对话; PS:英文需要苦练啊,一篇短的教程文章看的结结巴巴的 libusb1.0学习(二) 接学习一,学习二主要是看例程 ok,现在最简单的想法看看有多少信息包含在你的设备里,程序代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 #include <iostream> #include <libusb.h> using namespace std; void printdev(libusb_device *dev); //prototype of the function int main() { libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices libusb_context *ctx = NULL; //a libusb session int r; //for return values ssize_t cnt; //holding number of devices in list r = libusb_init(&ctx;); //initialize a library session if(r < 0) { cout<<"Init Error "<<r<<endl; //there was an error return 1; } libusb_set_debug(ctx, 3); //set verbosity level to 3, as suggested in the documentation cnt = libusb_get_device_list(ctx, &devs;); //get the list of devices if(cnt < 0) { cout<<"Get Device Error"<<endl; //there was an error } cout<<cnt<<" Devices in list."<<endl; //print total number of usb device ssize_t i; //for iterating through the list for(i = 0; i < cnt; i++) { printdev(devs[i]); //print specs of this device } libusb_free_device_list(devs, 1); //free the list, unref the devices in it libusb_exit(ctx); //close the session return 0; } void printdev(libusb_device *dev) { libusb_device_descriptor desc; int r = libusb_get_device_descriptor(dev, &desc;); if (r < 0) { cout<<"failed to get device descriptor"<<endl; return; } cout<<"Number of possible configurations: "<<(int)desc.bNumConfigurations<<" "; cout<<"Device Class: "<<(int)desc.bDeviceClass<<" "; cout<<"VendorID: "<<desc.idVendor<<" "; cout<<"ProductID: "<<desc.idProduct<<endl; libusb_config_descriptor *config; libusb_get_config_descriptor(dev, 0, &config;); cout<<"Interfaces: "<<(int)config->bNumInterfaces<<" ||| "; const libusb_interface *inter; const libusb_interface_descriptor *interdesc; const libusb_endpoint_descriptor *epdesc; for(int i=0; i<(int)config->bNumInterfaces; i++) { inter = &config;->interface[i]; cout<<"Number of alternate settings: "<<inter->num_altsetting<<" | "; for(int j=0; j<inter->num_altsetting; j++) { interdesc = &inter;->altsetting[j]; cout<<"Interface Number: "<<(int)interdesc->bInterfaceNumber<<" | "; cout<<"Number of endpoints: "<<(int)interdesc->bNumEndpoints<<" | "; for(int k=0; k<(int)interdesc->bNumEndpoints; k++) { epdesc = &interdesc;->endpoint[k]; cout<<"Descriptor Type: "<<(int)epdesc->bDescriptorType<<" | "; cout<<"EP Address: "<<(int)epdesc->bEndpointAddress<<" | "; } } } cout<<endl<<endl<<endl; libusb_free_config_descriptor(config); } 写完之后,编译看看会出现什么。首先运行程序并检查设备,然后连上我自己的设备在执行程序。会发现有新的内容出现,可以根据vendor id和product id发现这正是我自己连上打开的设备。 注意:发现设备(调用libusb_get_device_list())会返回新的内存分配的设备队列。当你完成这个队列的使用后必须释放他。 Libusb同样需要知道当一切完成时清除队列的内容;设备的本身。 为处理这些问题,libusb提供了两个单独的条目: 一个释放队列本身的函数 一个针对设备内部的参考计数系统 新的设备由libusb_get_device_list()函数展示,都拥有一个参考计数1。你可以使用libubs_ref_device()和libusb_unref_device()增加或减少参考计数。当一个设备的参考计数为0时,该设备就被销毁 通过以上的信息,打开设备的基本流程可以视为如下步骤: 1. 使用libusb_get_device_list()发现设备; 2. 选择你想操作的设备,调用libusb_open(); 3. 在设备队列中unref所有的设备; 4. 释放已经发现的设备队列; 这个次序是十分重要的,在尝试打开设备之前,你不能够unreference设备,因此unreference操作有可能导致设备的销毁。 为了方便起见,libusb_free_device_list()函数包含一个参数,在释放队列本身前,该参数能够选择性地在队列中unreference所有设备。这包含了以上的步骤3和步骤4。 如果还有需要,可以去libusb1’s API(http://libusb.sourceforge.net/api-1.0/index.html)文档参考你需要的函数。 好了,现在你可以找到你需要的设备了。现在是打开设备,请求并且执行一个简单的I/O。如果你知道vendor ID和prouct ID,使用libusb_open_device_with_vid_pid。 另外需要注意的,如果内核(你的OS)已经连接到这个设备,你将无法请求到它。在这种情况下,你需要调用libusb_detach_kernel_drive来从内核中检测设备。如果你想知道内核是否可用的,使用libusb_kernel_drive_active,如果返回值为1,对于你的设备内核可以加载驱动。 批量传输 为了在你的设备上使用批量传输,你应该获得为你的USB设备获得一个设备句柄,并且你应该知道使用哪个端点(从之前设备说明获得)。 关于语法上的信息参考这里(http://libusb.sourceforge.net/api-1.0/group__syncio.html#gab8ae853ab492c22d707241dc26c8a805) 这里有个简单的例子包含所有我提到的相关部分: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 #include <iostream> #include <libusb.h> using namespace std; int main() { libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices libusb_device_handle *dev_handle; //a device handle libusb_context *ctx = NULL; //a libusb session int r; //for return values ssize_t cnt; //holding number of devices in list r = libusb_init(&ctx;); //initialize the library for the session we just declared if(r < 0) { cout<<"Init Error "<<r<<endl; //there was an error return 1; } libusb_set_debug(ctx, 3); //set verbosity level to 3, as suggested in the documentation cnt = libusb_get_device_list(ctx, &devs;); //get the list of devices if(cnt < 0) { cout<<"Get Device Error"<<endl; //there was an error return 1; } cout<<cnt<<" Devices in list."<<endl; dev_handle = libusb_open_device_with_vid_pid(ctx, 5118, 7424); //these are vendorID and productID I found for my usb device if(dev_handle == NULL) cout<<"Cannot open device"<<endl; else cout<<"Device Opened"<<endl; libusb_free_device_list(devs, 1); //free the list, unref the devices in it unsigned char *data = new unsigned char[4]; //data to write data[0]='a';data[1]='b';data[2]='c';data[3]='d'; //some dummy values int actual; //used to find out how many bytes were written if(libusb_kernel_driver_active(dev_handle, 0) == 1) { //find out if kernel driver is attached cout<<"Kernel Driver Active"<<endl; if(libusb_detach_kernel_driver(dev_handle, 0) == 0) //detach it cout<<"Kernel Driver Detached!"<<endl; } r = libusb_claim_interface(dev_handle, 0); //claim interface 0 (the first) of device (mine had jsut 1) if(r < 0) { cout<<"Cannot Claim Interface"<<endl; return 1; } cout<<"Claimed Interface"<<endl; cout<<"Data->"<<data<<"<-"<<endl; //just to see the data we want to write : abcd cout<<"Writing Data..."<<endl; r = libusb_bulk_transfer(dev_handle, (2 | LIBUSB_ENDPOINT_OUT), data, 4, &actual;, 0); //my device's out endpoint was 2, found with trial- the device had 2 endpoints: 2 and 129 if(r == 0 && actual == 4) //we wrote the 4 bytes successfully cout<<"Writing Successful!"<<endl; else cout<<"Write Error"<<endl; r = libusb_release_interface(dev_handle, 0); //release the claimed interface if(r!=0) { cout<<"Cannot Release Interface"<<endl; return 1; } cout<<"Released Interface"<<endl; libusb_close(dev_handle); //close the device we opened libusb_exit(ctx); //needs to be called to end the delete[] data; //delete the allocated memory for data return 0; } 结尾:这个教程对于这个话题来说是十分简单的介绍,需要时间需联系同步传输,然后移动是异步的,这还有很多需要学习。 希望这些对你的初学有帮助。
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的功能更加强 大。..
### 回答1: Sigrity 17.4 是一种用于进行电磁仿真和验证的软件工具,其中包括了提取S参数的功能。 S参数(S-parameters)是评估电路中信号传输特性的一种重要参数。通过提取S参数,我们可以了解电路中各端口之间的传输特性,例如幅度响应、相位延迟和反射等。 在使用Sigrity 17.4提取S参数的过程中,首先需要导入电路布局和设计文件。用户可以使用Sigrity自带的导入工具,或者通过标准格式导入电路设计的几何图形和网络连接。 导入电路设计之后,使用Sigrity的分析工具对电路进行仿真。通过设置仿真参数,例如工作频率范围、激励信号源和端口等,可以指定需要提取S参数的具体范围和要素。 在完成仿真设置后,Sigrity将对电路进行仿真计算,得到输出结果。其中包括了各个端口之间的传输响应、反射系数和传输相移等信息。 用户可以根据需要对输出结果进行查看和分析。Sigrity提供了图表显示功能,可以显示S参数的振幅和相位等信息。此外,用户还可以导出结果,以便在其他软件工具中进行进一步分析和处理。 总的来说,Sigrity 17.4提取S参数的过程包括导入设计文件、设置仿真参数、进行仿真计算和分析结果等步骤。通过这些步骤,用户可以获取电路的S参数,并对电路的传输特性进行评估和优化。 ### 回答2: Sigrity 17.4是一种尖端的电磁仿真和信号完整性工具,可以用于提取S参数。S参数是指散射参数,用于描述电路或网络中各个端口之间的传输特性。 使用Sigrity 17.4提取S参数的过程如下: 1. 打开Sigrity 17.4软件,并选择相关电路或网络的设计文件。 2. 在软件界面中选择“提取S参数”的选项。 3. 根据设计文件中的引脚或端口定义,设置仿真测试点。 4. 在仿真设置中选择所需的频率范围。 5. 运行仿真并等待Sigrity 17.4进行数值计算。 6. 提取完成后,软件会将得到的S参数显示在界面上,并可以导出到其他工具或文件中。 Sigrity 17.4的S参数提取功能可以帮助工程师评估电路或网络的传输特性,包括增益、相位、衰减等。通过对S参数进行分析和优化,可以改进电路设计,减少传输线损耗,提高信号完整性,从而提高系统性能。 Sigrity 17.4还提供了其他强大的电磁仿真和信号完整性功能,如电磁场分析、信号完整性分析、串扰分析等,可帮助工程师解决电路设计中的各种问题。在日益复杂的电子系统中,Sigrity 17.4的S参数提取功能无疑是一项重要的工具,可以提高设计效率和质量。 ### 回答3: Sigrity是一款用于信号完整性分析和电磁兼容性分析的软件套件,其版本17.4中包含了提取S参数的功能。 S参数是用于描述电路传输线或网络系统中的电磁信号传输特性的参数。通过提取S参数,我们可以了解电路的频率响应、反射损耗、传输损耗等信息,从而进一步优化电路设计。 在Sigrity17.4中,提取S参数的步骤如下: 1.准备工作:在Sigrity软件中打开待分析的电路设计文件,并确保电路已经正确地布局和连线。 2.定义端口:根据需要,选择所需的端口(即输入和输出信号所连接的位置)。 3.设置分析参数:选择所需的分析范围和频点范围,以及频率步长和考虑的端口个数等。 4.运行分析:点击运行分析按钮,Sigrity软件将自动提取电路的S参数,并将结果以图形或表格的形式呈现出来。 5.分析结果:根据提取的S参数结果,我们可以评估电路的性能和特性,如阻抗匹配、信号耦合、信号传播延迟等,以便进行进一步的优化和调整。 通过Sigrity17.4软件提取S参数,我们可以更好地理解电路的信号传输特性,从而有效地改进和优化电路设计,提高电路的性能和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只豌豆象

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值