# Quagga_Docker_Sim **Repository Path**: coolmoon327/quagga_docker_sim ## Basic Information - **Project Name**: Quagga_Docker_Sim - **Description**: No description available - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-11-29 - **Last Updated**: 2022-11-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 通信网络系统基础课程实验 ## 一、任务要求 ​ 将Linux系统配置成为一台IPv4路由器,具备RIP、OSPF(单区域)和路由重分配功能。搭建至少6个路由器节点的实验测试网络。 ## 二、实验环境 ​ 开发环境:macOS 12.0.1(i9 9880H,16 GB DDR4,Radeon Pro 5500M) ​ 部署环境:ubuntu 20.04(40 CPUs x Intel(R) Xeon(R) Gold 6133 CPU @ 2.50GHz,256 GB DDR4 ECC) ​ 实验工具:Docker-20.10.11,quagga-1.2.4,Termius-7.26.2,telnet,python-3.8 ​ 配置方案:在 ubuntu 服务器上,打包一个配置有 Quagga 的 Docker 镜像,并基于该镜像部署数个 Docker 容器,每个容器作为一个路由器。 ​ 网络拓扑:
## 三、环境配置 1. Docker 配置 ```bash # 安装 docker curl -sSL https://get.daocloud.io/docker | sh # 拉取 ubuntu 镜像 sudo docker pull ubuntu # 安装 doker compose sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose # 安装 python sudo apt update sudo apt install python3.8 ``` 2. Quagga 安装 ```bash # 依赖环境安装 sudo apt update sudo apt install -y wget net-tools automake autoconf gcc make libtool texinfo gawk libreadline6-dev pkg-config libc-ares2 libc-ares-dev python3.8 telnet inetutils-ping tcpdump traceroute # 下载并编译 Quagga cd ~/Downloads wget https://github.com/Quagga/quagga/releases/download/quagga-1.2.4/quagga-1.2.4.tar.gz tar -xzvf ./quagga-1.2.4.tar.gz cd ./quagga-1.2.4 ./configure --enable-vtysh --enable-user=root --enable-group=root --enable-vty-group=root sudo make sudo make install # 配置文件设置 sudo cp ./lib/.libs/libzebra.so.1 /lib sudo cp ./ospfd/.libs/libospf.so.0 /lib sudo cp ./ospfd/ospfd.conf.sample /usr/local/etc/ospfd.conf sudo cp ./ripd/ripd.conf.sample /usr/local/etc/ripd.conf sudo cp ./zebra/zebra.conf.sample /usr/local/etc/zebra.conf ``` 3. Dockerfile 快速构建镜像 ```dockerfile # ./Dockerfile FROM ubuntu WORKDIR /code ENV TIME_ZONE Asia/Shanghai ARG DEBIAN_FRONTEND=noninteractive COPY . . RUN apt update \ && apt install -y wget net-tools automake autoconf gcc make libtool texinfo gawk libreadline6-dev pkg-config libc-ares2 libc-ares-dev python3.8 telnet inetutils-ping tcpdump traceroute \ && wget https://github.com/Quagga/quagga/releases/download/quagga-1.2.4/quagga-1.2.4.tar.gz \ && tar -xzvf ./quagga-1.2.4.tar.gz \ && cd ./quagga-1.2.4 \ && ./configure --enable-vtysh --enable-user=root --enable-group=root --enable-vty-group=root \ && make \ && make install \ && cp ./lib/.libs/libzebra.so.1 /lib \ && cp ./ospfd/.libs/libospf.so.0 /lib \ && cp ./ospfd/ospfd.conf.sample /usr/local/etc/ospfd.conf \ && cp ./ripd/ripd.conf.sample /usr/local/etc/ripd.conf \ && cp ./zebra/zebra.conf.sample /usr/local/etc/zebra.conf \ && zebra -d ``` ​ 使用 Dockerfile 创建 Docker 镜像: ```bash ~/Code/Quagga_Docker_Sim$ sudo docker build -t router:v1 . ``` 4. Docker Compose 快速配置多个容器 ```yaml version: '3' services: router: container_name: R_ build: . image: quagga_ubuntu cap_add: - ALL device: container_name: D_ build: . image: quagga_ubuntu cap_add: - ALL ``` ​ 使用 Docker Compose 从镜像中创建容器: ```bash ~/Code/Quagga_Docker_Sim$ sudo docker-compose up -d ``` ​ 使用 Docker Compose 从镜像中创建指定数量的容器: ```bash ~/Code/Quagga_Docker_Sim$ sudo docker-compose up --scale router=#number_r -d ~/Code/Quagga_Docker_Sim$ sudo docker-compose up --scale device=#number_d -d ``` ​ **已弃用:Docker Compose 不能依次创建指定的 docker container name。** ## 四、创建拓扑 > ifconfig 学习:https://www.howtoing.com/ifconfig-command-examples/ > > Quagga 文档:https://www.quagga.net/docs/quagga.html#Starting-and-Stopping-ripd > > Docker 学习:https://www.runoob.com/docker/docker-command-manual.html > > ip link 学习:https://www.kancloud.cn/chunyu/php_basic_knowledge/2137337 ​ **整个流程分为三个步骤:** 1. 创建 docker 容器 2. 使用 ip link 工具在宿主机上为所有 docker 来配置虚拟网络 3. 为 docker 容器配置网络 ​ 细枝末节不多做赘述,在此介绍 quagga 的配置方法。 - RIP 路由器设置: ```bash # 1. 启动守护进程 zebra -d ripd -d # 2. 使用 telnet 配置 ripd 守护进程(端口 2602) telnet 127.0.0.1 2602 zebra # 输入密码:zebra en # 进入特权模式 config t # 修改配置文件 router rip # 设置为 rip 路由器 network x.x.x.x/24 # 声明当前路由器相连的网络号 ... end ``` - OSPF 路由器设置: ```bash # 1. 启动守护进程 zebra -d ospfd -d # 2. 使用 telnet 配置 ospfd 守护进程(端口 2604) telnet 127.0.0.1 2604 zebra # 输入密码:zebra en # 进入特权模式 config t # 修改配置文件 router ospf # 设置为 ospf 路由器 network x.x.x.x/24 area 0 # 声明当前路由器相连的网络号与 ospf 区域号(单区域,指定为 0) ... end ``` - 中介路由器(路由重分配)设置: ```bash # 1. 启动守护进程 zebra -d ripd -d ospfd -d # 2. 使用 telnet 配置 ripd 守护进程(端口 2602) telnet 127.0.0.1 2602 zebra # 输入密码:zebra en # 进入特权模式 config t # 修改配置文件 router rip # 设置为 rip 路由器 network x.x.x.x/24 # 声明当前路由器相连的网络号 ... redistribute ospf metric 10 # 路由重分发到 ospf 网络中,权重为 10 end # 3. 使用 telnet 配置 ospfd 守护进程(端口 2604) telnet 127.0.0.1 2604 zebra # 输入密码:zebra en # 进入特权模式 config t # 修改配置文件 router ospf # 设置为 ospf 路由器 network x.x.x.x/24 area 0 # 声明当前路由器相连的网络号与 ospf 区域号(单区域,指定为 0) ... redistribute rip metric 10 # 路由重分发到 rip 网络中,权重为 10 end ``` ## 五、执行脚本 ​ 我将网络配置过程整理到了 `build_networks.py` 文件中,只需要简单执行该 python 脚本即可: ```bash sudo python3 build_networks.py ``` ​ `build_networks.py` 文件需要引用 `config.py` 与 `build_router.py`,前者用于记录各终端与路由器的配置信息,后者用于配置单个机器(使用设备名称来指定机器类型,如 Dn 表示编号为 n 的终端,Rm 表示编号为 m 的路由器)。**我们规定容器名称与设备名称统一。**因此可以用以下代码来配置 docker 容器的网络,以及路由器的 Quagga 环境: ```bash sudo docker exec -itd 容器名称 /bin/python3.8 ./build_router.py 容器名称 ``` ​ 为了方便操作,我还提供了**一键清理**的脚本: ```bash sudo python3 build_networks.py ``` ​ 该脚本能自动删除所有 docker 容器与创建的虚拟链路,注意是所有 docker 容器,因此慎用。