# 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 容器,因此慎用。