如果一个主机有多个网络接口,当向一个特定的IP地址 发送分组时,它怎样决定使用哪个接口呢?答案就在路由表中。来看下面的例子:
目的 | 子网掩码 | 网关 | 标志 | 接口 |
---|---|---|---|---|
201.66.37.0 | 255.255.255.0 | 201.66.37.74 | A | eth0 |
201.66.39.0 | 255.255.255.0 | 201.66.39.21 | A | eth1 |
主机将所有目的地为网络201.66.37.0内主机(201.66.37.1-201.66.37.254)的数据通过接口eth0 (IP地址为201.66.37.74)发送,所有目的地为网络201.66.39.0内主机的数据通过接口eth1(IP地址为201.66.39.21)发送。标志A表示该路由状态为 “active”(即激活状态)。对于直接连接的网络,一些软件并 不象上例中一样给出接口的IP地址,而只列出接口。
此例只涉及了直接连接的主机,那么目的主机在远程网络中如何呢?如果你通过 IP地址为201.66.37.254的网关连接到网络 73.0.0.0,那么你可以在路由表中增加这样一项:
目的 | 掩码 | 网关 | 标志 | 接口 |
---|---|---|---|---|
73.0.0.0 | 255.0.0.0 | 201.66.37.254 | AG | eth0 |
此项告诉主机所有目的地为网络73.0.0.0内主机的分组 通过201.66.37.254路由过去。标志S(static) 表示此项通过静态指定把分组导向外部网关。类似的,也可以定义通过网关到达特定主机的路由,也标志 为S:
目的 | 掩码 | 网关 | 标志 | 接口 |
---|---|---|---|---|
91.32.74.21 | 255.255.255.255 | 201.66.37.254 | AS | eth0 |
下面是路由表的基础,除了特殊表 项之外:
目的 | 掩码 | 网关 | 标志 | 接口 |
---|---|---|---|---|
127.0.0.1 | 255.255.255.255 | 127.0.0.1 | A S | lo0 |
default | 0.0.0.0 | 201.66.37.254 | AS | eth1 |
第一项是loopback接口,用于主机给自己发送数据,通 常用于测试和运行于IP之上但需要本地通信的应用。这是到特定地址127.0.0.1的主机路由(接口lo0是IP协议栈内部的“假”网卡,在RouterOS中)。第二项十分有意思,为了防止在主机 上定义到因特网上每一个可能到达网络的路由,可以定义一个缺省路由,如果在路由表中没有与目的地址 相匹配的项,该分组就被送到缺省网关。多数主机简单地通过一个网卡连接到网络,因此只有通过一个路 由器到其它网络,这样在路由表中只有三项:loopback项、本地子网项和缺 省项(指向路由器)。
假设在路由表中有下列重叠项:
目的 | 掩码 | 网关 | 标志 | 接口 |
---|---|---|---|---|
1.2.3.4 | 255.255.255.255 | 201.66.37.253 | AS | eth0 |
1.2.3.0 | 255.255.255.0 | 201.66.37.254 | AS | eth0 |
1.2.0.0 | 255.255.0.0 | 201.66.37.253 | AS | eth1 |
default | 0.0.0.0 | 201.66.39.254 | AS | eth1 |
之所以说这些路由重叠是因为这四个路由都含有地址1.2.3.4,如果向1.2.3.4发送数据,会选择哪条路由呢?在这种情况下,会选择第一条路由,通过网关201.66.37.253。原则是选择具有最长(最精确)的子网掩码。类似的,发往1.2.3.5的数据选择第二 条路由。
注意:这条原则只适用于间接路由(通过网关)。把两个接口定义在同一子网在很多软件实现上是非法的。例如下面的设置通常 是非法的(不过有些软件将尝试在两个接口进行负载平衡):
接口 | IP地址 | 子网掩码 |
---|---|---|
eth0 | 201.66.37.1 | 255.255.255.0 |
eth1 | 201.66.37.2 | 255.255.255.0 |
对于重叠路由的策略是十分有用的,它允许缺省路由作为目的为0.0.0.0、子网掩码为0.0.0.0的路由进行工作,而不需要作为路由软件的一个特殊情况来实现。
回头看看我们已建立的路由表,已有了六个表项:
目的 | 掩码 | 网关 | 标志 | 接口 |
---|---|---|---|---|
127.0.0.1 | 255.255.255.255 | 127.0.0.1 | AS | lo0 |
201.66.37.0 | 255.255.255.0 | 201.66.37.74 | AS | eth0 |
201.66.39.0 | 255.255.255.0 | 201.66.39.21 | AS | eth1 |
default | 0.0.0.0 | 201.66.39.254 | AS | eth1 |
73.0.0.0 | 255.0.0.0 | 201.66.37.254 | AS | eth0 |
91.32.74.21 | 255.255.255.255 | 201.66.37.254 | AS | eth0 |
该网络图示如下
这些表项分别是怎么得到的呢?第一个是当路由表初始化 时由路由软件加入的,第二、三个是当网卡绑定IP地址时自动创建的,其余 三个必须手动加入。
NAT技术主要解决IP地址短缺问题,最初提出的建议是在子网内部使用局部地址,而在子网外部使用 少量的全局地址,通过路由器进行内部和外部地址的转换。局部地址是在子网内部独立编址的,可以与外 部地址重叠。这种想法的基础是假定在任何时候子网中只有少数计算机需要与外部通信,可以让这些计算 机共享少量的全局IP地址。后来根据这种技术又开发出其他一些应用,下面 讲述两种最主要的应用:
第一种应用事动态地址翻译(Dynamic Address Translation)。为此首先引入存根域的概念,所谓存根域(Stub Domain)就是内部网络的抽象,这样的网络只是处理源和目标都在子网内部 的通信。任何时候存根域内只有一部份主机要与外界通信,甚至还有许多主机可能从不与外界通信,所有 整个存根域只需要共享少量的全局IP地址。存根域有一个边界路由器,由它 来处理域内与外部的通信。这种NAT地址使用如下特点:
只要缓冲区中存在 尚未使用的C类地址,任何从内向外的连接请求都可以得到响应,并且在边界路由器的动态NAT表中为之建立一个映像 表项;
如果内部主机的映 像存在,就可以利用它建立连接;
从外部访问内部主 机是有条件的,即动态NAT表必须存在该主机的映像。
动态地址翻译的好处是节约了全局适用的IP地址,而且不需要改变子网内部的任何配置,只需要在边界路由器中设置一个动 态地址变换表就可以工作了。
另一种特殊的NAT应用是 m:1翻译,这种技术也叫做伪装(Masquerading),因为用一个路由器的IP地址可以把子网中的所有主机的IP地址都隐藏起来。如果子 网中有多个主机要同时通信,那么还要对端口号进行翻译,所以这种技术更经常称为网络地址和端口翻译 (Network Address Port Translation NAPT)。在很多NAPT实现中专门保留一部分端口给伪装使用,叫做伪装端口号。这种方法有以下特点:
出口分组的源地址 被路由器的外部IP地址所代替,出口分组的源端口号被一个未使用的伪装端口号所代替;
如果进来的分组的 目标地址是本地路由器的IP地址,而目标端口号是路由器的伪装端口号,则NAT路由器就检查该分组 是否为当前的一个伪装会话,并试图通过它的伪装表对IP地址和端口进行翻译。
伪装技术可以作为一种安全手段使用,借以限制对外部内 部主机的访问。另外还可以用这种技术实现虚拟主机和虚拟路由,以便达到负载均衡和提高可靠的目的。
联系客服