这是一个系列文章,你可以点击以下链接查看这个系列的其他文章。
CUPNET v0.2 设计大纲 - 自上而下,抗封锁软件定义的混合云(混乱云)网络架构设计构思详解
CUPNET v0.2 基础实现(0.5) - 搭建实验网络环境
CUPNET v0.2 基础实现(1) - 自动生成并推送Core节点的Wireguard VPN配置文件
由于CUPNET这个网络的整体设计与开发规模不算特别的微小,需要调试和测试的地方也不少,故最好先搭建一个开发环境,以便于之后的开发测试。
这篇文章简述我如何搭建开发试验使用的网络环境的。
使用Docker搭建实验网络环境
这个实验网络将会包含七个节点。
有3台Core,4台CE。其中CE全部位于NAT后面,Core全部暴露于公网,所有节点需要使用FRRouting和Wireguard进行测试。为了测试方便和部署方便,决定使用Docker搭建实验网络环境。
以接线方式划分,这七台机子都处于单一因特网内,所以将所有Docker容器划定为单一网络即可。划分IP的方式如下。
容器 | IP |
---|---|
Core1 | 100.90.1.1 |
Core2 | 100.90.1.2 |
Core3 | 100.90.1.3 |
CE1 | 100.90.2.1 |
CE2 | 100.90.2.2 |
CE3 | 100.90.2.3 |
CE4 | 100.90.2.4 |
创建网络。
docker network create net-test --subnet=100.90.0.0/16
编辑Dockerfile,自行构造一个包含SSH Server、Wireguard和FRR的Docker镜像
FROM frrouting/frr:latest
LABEL maintainer="cup@umy.moe"
RUN apk update && apk add wireguard-tools
ARG ssh_pub_key
RUN mkdir -p /root/.ssh \
&& chmod 0700 /root/.ssh \
&& passwd -u root \
&& echo "$ssh_pub_key" > /root/.ssh/authorized_keys \
&& apk add openrc openssh \
&& ssh-keygen -A \
&& echo -e "PasswordAuthentication yes" >> /etc/ssh/sshd_config \
&& echo -e "PermitRootLogin yes" >> /etc/ssh/sshd_config \
&& mkdir -p /run/openrc \
&& touch /run/openrc/softlevel
&& echo 'root:password' | chpasswd
WORKDIR /app
COPY dockerentry.sh /dockerentry.sh
ENTRYPOINT ["/dockerentry.sh"]
CMD ['']
在Dockerfile根目录外编辑dockerentry.sh文件,编辑Docker入口。
#!/bin/bash
sh -c rc-status
rc-service sshd start
/usr/lib/frr/docker-start
创建完毕之后打开使用以下命令构建镜像
docker build -t fullnet .
等待构建完毕之后使用以下命令启动镜像。
docker run --net net-test --ip 100.90.1.1 -d --cap-add cap_net_admin --cap-add cap_net_raw --cap-add cap_sys_admin --name CUPNET_CORE1 fullnet
docker run --net net-test --ip 100.90.1.2 -d --cap-add cap_net_admin --cap-add cap_net_raw --cap-add cap_sys_admin --name CUPNET_CORE2 fullnet
docker run --net net-test --ip 100.90.1.3 -d --cap-add cap_net_admin --cap-add cap_net_raw --cap-add cap_sys_admin --name CUPNET_CORE3 fullnet
docker run --net net-test --ip 100.90.2.1 -d --cap-add cap_net_admin --cap-add cap_net_raw --cap-add cap_sys_admin --name CUPNET_CE1 fullnet
docker run --net net-test --ip 100.90.2.2 -d --cap-add cap_net_admin --cap-add cap_net_raw --cap-add cap_sys_admin --name CUPNET_CE2 fullnet
docker run --net net-test --ip 100.90.2.3 -d --cap-add cap_net_admin --cap-add cap_net_raw --cap-add cap_sys_admin --name CUPNET_CE3 fullnet
docker run --net net-test --ip 100.90.2.4 -d --cap-add cap_net_admin --cap-add cap_net_raw --cap-add cap_sys_admin --name CUPNET_CE4 fullnet
也可以编写docker-compose.yml
进行配置
version: "3"
services:
core1:
build:
context: ./
dockerfile: Dockerfile
cap_add:
- ALL
networks:
test-main-network:
ipv4_address: "100.90.1.1"
test-core1:
ipv4_address: "100.64.1.2"
core2:
build:
context: ./
dockerfile: Dockerfile
cap_add:
- ALL
networks:
test-main-network:
ipv4_address: "100.90.1.2"
test-core2:
ipv4_address: "100.64.2.2"
core3:
build:
context: ./
dockerfile: Dockerfile
cap_add:
- ALL
networks:
test-main-network:
ipv4_address: "100.90.1.3"
test-core3:
ipv4_address: "100.64.3.2"
cd1:
build:
context: ./
dockerfile: Dockerfile
cap_add:
- ALL
networks:
test-main-network:
ipv4_address: "100.90.2.1"
ce2:
build:
context: ./
dockerfile: Dockerfile
cap_add:
- ALL
networks:
test-main-network:
ipv4_address: "100.90.2.2"
ce3:
build:
context: ./
dockerfile: Dockerfile
cap_add:
- ALL
networks:
test-main-network:
ipv4_address: "100.90.2.3"
ce4:
build:
context: ./
dockerfile: Dockerfile
cap_add:
- ALL
networks:
test-main-network:
ipv4_address: "100.90.2.4"
networks:
test-main-network:
ipam:
driver: default
config:
- subnet: "100.90.0.0/16"
test-core1:
ipam:
driver: default
config:
- subnet: "100.64.1.0/24"
test-core2:
ipam:
driver: default
config:
- subnet: "100.64.2.0/24"
test-core3:
ipam:
driver: default
config:
- subnet: "100.64.3.0/24"
测试SSH是否可以连接,默认密码为password
ssh root@100.90.1.1