%# -*- coding: utf-8-unix -*-

\section{三层路由器组网}
\label{sec:c:router-ob:s:networking}

\subsection{实验目的}
\label{subsec:c:router-ob:s:networking_object}

本实验的主要目的是让学生将自己开发的路由器进行组网实验，引入路由协议的配置与学习，实现多网段主机间的相互通信。熟悉Quagga软件的安装与使用和两种基本路由协议（RIP与OSPF）的配置与使用。

\subsection{实验内容}
\label{subsec:c:router-ob:s:networking_content}

使用学生开发的路由器平台，搭建至少跨两跳路由器的复杂路由组网环境，验证多网段主机的相互连通性。主要完成以下内容：

\begin{enumerate}
  \item \textbf{搭建自研路由器环境：}使用学生自己研发的路由器组建网络，搭建不少于2台路由器和2台测试主机的网络环境进行验证；
  \item \textbf{安装并配置路由协议学习环境：}运行Quagga环境，分别配置RIP路由协议与OSPF路由协议，并将两种协议启动运行；
  \item \textbf{验证组网功能：}验证不同路由协议下组网运行功能，验证不同网段内主机的相互通信功能；
  \item \textbf{观察分析路由器工作流程：}观察各路由节点学习非互联网段的路由转发表，打印输出各路由节点的FIB表；
  \item \textbf{观察分析内核FIB的变化：}在网络正常运行状态下，断开中间某个路由器间的链路，观察断开链路两端路由器的内核FIB表变化情况，同时验证路由器内FIB表同步情况。
\end{enumerate}

\subsection{实验原理、方法和手段}
\label{subsec:c:router-ob:s:networking_principle}

\subsubsection{路由协议及基本工作原理}

路由协议工作在路由器的控制平面，创建了路由表，描述了网络拓扑结构。通过在路由器之间共享路由信息来相互学习整个网络可达区域内路由网段信息。路由信息在相邻路由器之间传递，确保所有路由器知道到其它路由器的路径。

路由协议主要包括：RIP、OSPF、IS-IS和BGP等。RIP、OSPF、IS-IS是内部网关协议（IGP），适用于单个ISP的统一路由协议的运行，一般由一个ISP运营的网络位于一个AS（自治系统）内，有统一的AS number（自治系统号）。BGP是自治系统间的路由协议，是一种外部网关协议，多用于不同ISP之间交换路由信息，以及大型企业、政府等具有较大规模的私有网络。

\subsubsection{路由组网环境}

本实验建议采用学生自研的路由器进行组网测试，组网测试通过的组可以在中间穿插商用路由器一起验证。

\subsection{实验条件}
\label{subsec:c:router-ob:s:networking_requirement}

\begin{itemize}
  \item 可编程网络平台两个，交换测试主机两台，网络配置与连接拓扑如
  图\ref{fig:c:router-ob_networking-topo}所示；
  \item 串口线两根，网线三根；
  \item 学生自研路由器程序。
\end{itemize}

\begin{figure}[!ht]
  \centering
  \includegraphics[width=12cm]{networking-topo}
  \caption{三层路由组网实验拓扑图}
  \label{fig:c:router-ob_networking-topo}
\end{figure}

\subsection{实验步骤}
\label{subsec:c:router-ob:s:networking_procedure}

\begin{enumerate}
  \item 在每个路由器节点安装quagga软件，配置其正常工作。
  路由协议选择RIP和OSPF两种，每次测试只启动一种协议即可；
  \begin{itemize}
    \item Quagga安装
    \begin{code}[console]
      root@HNXS-FAST:/home/hnxs# apt-get install quagga      
    \end{code}

    \item Quagga启动配置
    
    修改Quagga的启动模块配置文件：/etc/quagga/daemons，主要内容如下：
    \begin{code}[text]      
      zebra=yes
      bgpd=no
      ospfd= yes
      ospf6d=no
      ripd= yes
      ripngd=no
      isisd=no
      babeld=no
    \end{code}

    将上述文件内容中的3个no修改为yes，表示启动该功能模块。

    \item RIP协议启动配置
    
    修改RIP协议模块配置文件：/etc/quagga/ripd.conf，在空行处添加网段信息与邻居信息。原文件其他所有内容均无需修改。ripd.conf添加内容如下：

    \begin{code}[text]
      
      network obx0
      network obx1
      network obx2
      network obx3
      neighbor 192.168.3.1
      
    \end{code}
    上述文件是S4-A路由器的rip配置文件，另一台配置文件与上述基本相同，只是其neighbor的地址是192.168.3.2。这两台路由器是通过S4-A的一个端口（IP为192.168.3.1，故其neighbor为192.168.3.2）和S4-B的一个端口（IP为192.168.3.2）连接。

    \item OSPF协议启动配置
    
    修改OSPF协议模块配置文件：/etc/quagga/ospfd.conf，添加网段与ID信息。原文件其他所有内容均无需修改。ospfd.conf添加内容如下：

    \begin{code}[text]
      
      ospf router-id 192.168.3.1
      network 192.168.0.0/24 area 0
      network 192.168.1.0/24 area 0
      network 192.168.2.0/24 area 0
      network 192.168.3.0/24 area 0
      
    \end{code}

    上述为S4-A路由器的配置文件，另一台路由器配置文件添加内容如下：
    \begin{code}[text]
      
      ospf router-id 192.168.3.2
      network 192.168.4.0/24 area 0
      network 192.168.5.0/24 area 0
      network 192.168.6.0/24 area 0
      network 192.168.3.0/24 area 0
      
    \end{code}
  \end{itemize}

  \item 启动路由协议
  \begin{code}[console]
    root@HNXS:/home/hnxs# systemctl start quagga
  \end{code}

  \item 将自研路由器和测试主机组网，路由节点不少于2个；
  \item 运行自研路由器，并在两个测试主机上分别ping对方主机IP地址；
请参考实验\ref{sec:c:router-ob:s:router}内容。
  \item 观察某个节点路由器分组处理流程，从打印消息上观察控制平面与数据平面的分组处理情况；
  \item 观察每个节点上内核FIB表内容；

  \begin{code}[console]
    root@HNXS-FAST:/mnt/openbox# route -n
   \end{code}
  \begin{code}[text]
    Kernel IP routing table
    Destination  Gateway     Genmask       Flags Metric Ref Use Iface
    192.168.0.0  0.0.0.0     255.255.255.0 U     0      0     0 obx0
    192.168.1.0  0.0.0.0     255.255.255.0 U     0      0     0 obx1
    192.168.2.0  0.0.0.0     255.255.255.0 U     0      0     0 obx2
    192.168.3.0  0.0.0.0     255.255.255.0 U     0      0     0 obx3
    192.168.4.0  192.168.3.2 255.255.255.0 UG    2      0     0 obx3
    192.168.5.0  192.168.3.2 255.255.255.0 UG    2      0     0 obx3
    192.168.6.0  192.168.3.2 255.255.255.0 UG    2      0     0 obx3
  \end{code}
  观察新增加的表项内容，最后三条是非本地路由可直达的网段，均需要通过192.168.3.2网关才可达。
  \item 观察路由器FIB表的更新情况，判断是否检测到内核FIB变化，是否已经同步更新。
\end{enumerate}

\subsection{思考题}
\label{subsec:c:router-ob:s:networking_rethink}

\begin{enumerate}
  \item 路由协议的邻接信息学习后如何去重？如何收敛？
  \item 默认网关的作用是什么？
\end{enumerate}

\subsection{注意事项及有关说明}
\label{subsec:c:router-ob:s:networking_notice}

\begin{enumerate}
  \item RIP协议与OSPF协议一定要根据网络连接接口及相应IP地址配置网段信息，
  修改文件时注意不要使用中文符号；
  \item 每次只启动一个协议，以更好验证其效果。
\end{enumerate}

\subsection{考核方法}
\label{subsec:c:router-ob:s:networking_criterion}

完成本次实验，需要提交一份实验报告和一份程序输出日志。
\begin{enumerate}
  \item （20分）在规定时间内完成实验，并提交实验成果；
  \item （30分）实验报告内容详细，有关键步骤截图与分析说明；
  \item （20分）所有节点正常运行，不同网段的主机可以相互ping通；
  \item （20分）Quagga安装配置正确，RIP和OSPF配置正确，工作正常；
  \item （10分）实验报告与源代码内容完整、格式规范。
\end{enumerate}
