本文作者:Sammy Liu
1.1.3 路由分类之静态路由
静态路由是指由用户或网络管理员手工配置的路由信息。当网络的拓扑结构或链路的状态发生变化时,网络管理员需要手工去修改路由表中相关的静态路由信息。静态路由信息在缺省情况下是私有的,不会传递给其他的路由器。当然,网管员也可以通过对路由器进行设置使之成为共享的。静态路由一般适用于比较简单的网络环境,在这样的环境中,网络管理员易于清楚地了解网络的拓扑结构,便于设置正确的路由信息。
以上面的拓扑结构为例,在没有配置路由的情况下,计算机1 和 2 无法互相通信,因为 1 发给 2 的包在到达路由器 A 后,它不知道怎么转发它。B 也同样。管理员可以配置如下的静态路由来实现 1 和 2 之间的通信:
计算机配置默认网关:
- 计算机1 上:route add default gw 192.168.1.1
- 计算机2 上:route add default gw 192.168.3.1
路由器配置:
- R1 上:ip route 192.168.3.0 255.255.255.0 f0/1 (意思为:目标网络地址为 192.168.3.0/24 的数据包,经过 f0/1 端口发出)
- R2 上:ip route 192.168.1.0 255.255.255.0 f0/1 (意思为:目标网络地址为 192.168.1.0/24 的数据包,经过 f0/1 端口发出)
或者 - R1 上:ip route 192.168.3.0 255.255.255.0 192.168.2.2 (意思为:要去 192.168.3.0/24 的数据包,下一路由器 IP 地址为 192.168.2.2)
- R2 上:ip route 192.168.1.0 255.255.255.0 192.168.2.1
1.1.4 路由分类之动态路由
动态路由是指路由器能够自动地建立自己的路由表,并且能够根据实际情况的变化适时地进行调整。它是与静态路由相对的一个概念,指路由器能够根据路由器之间的交换的特定路由信息自动地建立自己的路由表,并且能够根据链路和节点的变化适时地进行自动调整。当网络中节点或节点间的链路发生故障,或存在其它可用路由时,动态路由可以自行选择最佳的可用路由并继续转发报文。
常见的动态路由协议有以下几个:路由信息协议(RIP)、OSPF(Open Shortest Path First开放式最短路径优先)、IS-IS(Intermediate System-to-Intermediate System,中间系统到中间系统)、边界网关协议(BGP)是运行于 TCP 上的一种自治系统的路由协议。
1.1.5 ip rule,ip route,iptables 三者之间的关系
以一例子来说明:公司内网要求192.168.0.100 以内的使用 10.0.0.1 网关上网 (电信),其他IP使用 20.0.0.1 (网通)上网。
- 首先要在网关服务器上添加一个默认路由,当然这个指向是绝大多数的IP的出口网关:ip route add default gw 20.0.0.1
- 之后通过 ip route 添加一个路由表:ip route add table 3 via 10.0.0.1 dev ethX (ethx 是 10.0.0.1 所在的网卡, 3 是路由表的编号)
- 之后添加 ip rule 规则:ip rule add fwmark 3 table 3 (fwmark 3 是标记,table 3 是路由表3 上边。 意思就是凡事标记了 3 的数据使用 table3 路由表)
- 之后使用 iptables 给相应的数据打上标记:iptables -A PREROUTING -t mangle -i eth0 -s 192.168.0.1 – 192.168.0.100 -j MARK –set-mark 3
因为 mangle 的处理是优先于 nat 和 fiter 表的,所以在数据包到达之后先打上标记,之后再通过 ip rule 规则,对应的数据包使用相应的路由表进行路由,最后读取路由表信息,将数据包送出网关。
这里可以看出 Netfilter 处理网络包的先后顺序:接收网络包,先 DNAT,然后查路由策略,查路由策略指定的路由表做路由,然后 SNAT,再发出网络包
1.1.6 Traceroute 工具
我们在 linux 机器上,使用 traceroute 来获知从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。在 MS Windows 中该工具为 tracert。 在大多数情况下,我们会在linux主机系统下,直接执行命令行:traceroute hostname;而在Windows系统下是执行tracert的命令: tracert hostname。
- 命令格式:traceroute [参数] [主机]
- 命令功能:traceroute 指令让你追踪网络数据包的路由途径,预设数据包大小是 40Bytes,用户可另行设置。
- 具体参数格式:traceroute [-dFlnrvx][-f<存活数值>][-g<网关>…][-i<网络界面>][-m<存活数值>][-p<通信端口>][-s<来源地址>][-t<服务类型>][-w<超时秒数>][主机名称或IP地址][数据包大小]
- 命令参数:
- -d 使用Socket层级的排错功能,-f 设置第一个检测数据包的存活数值TTL的大小,-F 设置勿离断位,-g 设置来源路由网关,最多可设置8个,-i 使用指定的网络界面送出数据包,-I 使用ICMP回应取代UDP资料信息,-m 设置检测数据包的最大存活数值TTL的大小,-n 直接使用IP地址而非主机名称。
- -p 设置UDP传输协议的通信端口,-r 忽略普通的Routing Table,直接将数据包送到远端主机上,-s 设置本地主机送出数据包的IP地址,-t 设置检测数据包的TOS数值。
- -v 详细显示指令的执行过程,-w 设置等待远端主机回报的时间,-x 开启或关闭数据包的正确性检验。
(1)例子
说明:
- 记录按序列号从1开始,每个纪录就是一跳 ,每跳表示一个网关,我们看到每行有三个时间,单位是 ms,其实就是 -q 的默认参数。
- 探测数据包向每个网关发送三个数据包后,网关响应后返回的时间;如果您用 traceroute -q 4 www.58.com ,表示向每个网关发送4个数据包。
- 有时我们 traceroute 一台主机时,会看到有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了ICMP 的返回信息,所以我们得不到什么相关的数据包返回数据。
- 有时我们在某一网关处延时比较长,有可能是某台网关比较阻塞,也可能是物理设备本身的原因。当然如果某台 DNS 出现问题时,不能解析主机名、域名时,也会 有延时长的现象;您可以加-n 参数来避免DNS解析,以IP格式输出数据。
- 如果在局域网中的不同网段之间,我们可以通过 traceroute 来排查问题所在,是主机的问题还是网关的问题。如果我们通过远程来访问某台服务器遇到问题时,我们用到traceroute 追踪数据包所经过的网关,提交IDC服务商,也有助于解决问题;但目前看来在国内解决这样的问题是比较困难的,就是我们发现问题所在,IDC服务商也不可能帮助我们解决。
(2)原理
Traceroute 程序的设计是利用 ICMP 及 IP header 的 TTL(Time To Live)栏位(field)。
- 首先,traceroute 送出一个 TTL 是 1 的 IP datagram(其实,每次送出的为3个40字节的包,包括源地址,目的地址和包发出的时间标签)到目的地,当路径上的第一个路由器(router)收到这个datagram 时,它将TTL减1。此时,TTL变为0了,所以该路由器会将此 datagram 丢掉,并送回一个「ICMP time exceeded」消息(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),traceroute 收到这个消息后,便知道这个路由器存在于这个路径上。
- 接着,traceroute 再送出另一个TTL 是 2 的datagram,发现第2 个路由器……
- 然后,traceroute 每次将送出的 datagram 的 TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个datagram 抵达目的地。当datagram到达目的地后,该主机并不会送回ICMP time exceeded消息,因为它已是目的地了,那么traceroute如何得知目的地到达了呢?
Traceroute 在送出 UDP datagrams 到目的地时,它所选择送达的 port number 是一个一般应用程序都不会用的号码(30000 以上),所以当此 UDP datagram 到达目的地后该主机会送回一个「ICMP port unreachable」的消息,而当traceroute 收到这个消息时,便知道目的地已经到达了。所以traceroute 在Server端也是没有所谓的Daemon 程式。Traceroute提取发 ICMP TTL 到期消息设备的 IP 地址并作域名解析。每次 ,Traceroute 都打印出一系列数据,包括所经过的路由设备的域名及 IP地址,三个包每次来回所花时间。
本文转载自 http://geek.csdn.net/news/detail/75200