CORE Services服务
原文链接:CORE Services
1. 服务
CORE使用服务的概念来指定节点启动时在节点上运行的进程或脚本。 第3层节点(例如路由器和PC)由它们运行的服务定义。
可以为每个节点定制服务,或者可以创建新的定制服务。可以创建每个具有不同名称,图标和默认服务集的新节点类型。每个服务定义每个节点的目录,配置文件,启动索引,启动命令,验证命令,关闭命令以及与节点关联的元数据。
注意:网络命名空间节点不经历使用初始化、启动或系统框架的正常引导过程。这些轻量级节点使用配置的 CORE 服务。
2. 可用服务
| 服务组 | 服务 |
|---|---|
| [BIRD] | BGP, OSPF, RADV, RIP, Static |
| [EMANE] | Transport Service |
| [FRR] | BABEL, BGP, OSPFv2, OSPFv3, PIMD, RIP, RIPNG, Zebra |
| [Quagga] | BABEL, BGP, OSPFv2, OSPFv3, OSPFv3 MDR, RIP, RIPNG, XPIMD, Zebra |
| [SDN] | OVS, RYU |
| [Security] | Firewall, IPsec, NAT, VPN Client, VPN Server |
| [Utility] | ATD, Routing Utils, DHCP, FTP, IP Forward, PCAP, RADVD, SSF, UCARP |
| [XORP] | BGP, OLSR, OSPFv2, OSPFv3, PIMSM4, PIMSM6, RIP, RIPNG, Router Manager |
2.1. BIRD
原文链接:BIRD Internet Routing Daemon
2.1.1. 概述
BIRD Internet Routing Daemon 是一个路由守护进程; 即,负责管理内核数据包转发表的软件。它旨在开发一个动态 IP 路由守护进程,完全支持所有现代路由协议,易于使用的配置界面和强大的路由过滤语言,主要针对(但不限于)Linux 和其他类 UNIX 系统,并在 GNU 下分发通用公共许可证。BIRD 免费实现了几种众所周知的通用路由和路由器补充协议,即 RIP、RIPng、OSPFv2、OSPFv3、BGP、BFD 和 NDP/RA。BIRD 支持 IPv4 和 IPv6 地址系列、Linux 内核和几个 BSD 变体(在 FreeBSD、NetBSD 和 OpenBSD 上测试)。BIRD 由 bird 守护进程和用于监督的 birdc 交互式 CLI 客户端组成。
为了能够使用 BIRD Internet 路由协议,您必须首先在您的机器上安装该项目。
2.1.2. BIRD 包安装
sudo apt install bird
2.1.3. BIRD 源码安装
从官方仓库获取源码:官方仓库。然后运行以下命令:
./configure
make
sudo make install
vim /etc/bird/bird.conf
安装会将 bird 目录放在 /etc 中,您还可以在其中找到它的配置文件。
为了能够使用 Bird Internet 路由协议,您必须修改 Bird.conf,因为除了允许 Bird 守护程序启动之外,没有配置给定的配置文件,这意味着如果您运行它,则不会发生任何其他事情。Keeran Marquis 有一个关于在 Ubuntu 上使用 Bird 配置 BGP 的非常详细的示例,它可以用作构建块来实现您的自定义路由守护程序。
2.2. EMANE
2.3. FRR
原文链接:frr
2.3.1. 概述
FRRouting 是一个路由软件包,它提供基于 TCP/IP 的路由服务,并支持 BGP、RIP、OSPF、IS-IS 等路由协议。FRR 还支持特殊的 BGP 路由反射器和路由服务器行为。除了传统的 IPv4 路由协议,FRR 还支持 IPv6 路由协议。通过支持 AgentX 协议的 SNMP 守护进程,FRR 提供路由协议 MIB 只读访问(SNMP 支持)。
FRR(从 v7.2 开始)目前支持以下协议:
- BGPv4
- OSPFv2
- OSPFv3
- RIPv1/v2/ng
- IS-IS
- PIM-SM/MSDP/BSM(AutoRP)
- LDP
- BFD
- Babel
- PBR
- OpenFabric
- VRRPv2/v3
- EIGRP (alpha)
- NHRP (alpha)
2.3.2. 包安装
Ubuntu 19.10 以及更新的版本。
sudo apt update && sudo apt install frr
Ubuntu 16.04 和 18.04
sudo apt install curl
curl -s https://deb.frrouting.org/frr/keys.asc | sudo apt-key add -
FRRVER="frr-stable"
echo deb https://deb.frrouting.org/frr $(lsb_release -s -c) $FRRVER | sudo tee -a /etc/apt/sources.list.d/frr.list
sudo apt update && sudo apt install frr frr-pythontools
Fedora 31
sudo dnf update && sudo dnf install frr
2.3.3. 源码安装
从源代码构建 FRR 是确保您拥有最新功能和错误修复的最佳方式。每个受支持平台的详细信息,包括依赖包列表、权限和其他问题,都在开发人员的文档中。
git clone https://github.com/FRRouting/frr.git
cd frr
./bootstrap.sh
然后,选择您希望用于安装的配置选项。 您可以在 FRR 的官方网页上找到这些选项。 选择配置选项后,运行配置脚本并传递您选择的选项:
./configure \
--prefix=/usr \
--enable-exampledir=/usr/share/doc/frr/examples/ \
--localstatedir=/var/run/frr \
--sbindir=/usr/lib/frr \
--sysconfdir=/etc/frr \
--enable-pimd \
--enable-watchfrr \
...
配置软件后,您就可以在系统中构建和安装它了。
make && sudo make install
2.4. NRL
原文链接:nrl
2.4.1. 概述
Protean 协议原型库 (ProtoLib) 是一个跨平台库,允许构建应用程序,同时支持多种平台,包括 Linux、Windows、WinCE/PocketPC、MacOS、FreeBSD、Solaris 等以及 NS2 的模拟环境和 Opnet。Protolib 的目标是提供一组简单的、跨平台的 C++ 类,允许开发可以在不同平台和网络模拟环境中运行的网络协议和应用程序。虽然 Protolib 为开发工作协议实现、应用程序和模拟模块提供了一个整体框架,但各个类都被设计为尽可能用作独立组件。尽管 Protolib 主要用于研究目的,但代码的构建目的是为实际应用程序提供强大、高效的性能和适应性。在某些情况下,代码由在协议实现中有用的数据结构等组成,在其他情况下,为系统服务和功能(例如,套接字、计时器、路由表等)提供通用的跨平台接口。
目前海军研究实验室使用这个库来开发各种各样的协议。NRL Protolib 目前支持以下协议:
- MGEN_Sink
- NHDP
- SMF
- OLSR
- OLSRv2
- OLSRORG
- MgenActor
- arouted
2.4.2. 安装
为了能够使用 NRL 提供的不同协议,您必须首先下载支持库本身。您可以从他们的 NRL Protolib Repo 获取源代码。
2.4.3. Multi-Generator (MGEN)
从 NRL MGEN Repo 下载 MGEN,解压并将 protolib 库复制到主文件夹 mgen 中。 执行以下命令来构建协议。
cd mgen/makefiles
make -f Makefile.{os} mgen
2.4.4. 邻域发现协议 (NHDP)
从 NRL NHDP Repo 下载 NHDP。
sudo apt-get install libpcap-dev libboost-all-dev
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.8.0/protoc-3.8.0-linux-x86_64.zip
unzip protoc-3.8.0-linux-x86_64.zip
然后将二进制文件放在 $PATH 中。要知道您的路径,您可以发出以下命令:
echo $PATH
转到下载的 NHDP tarball,解压缩并将 protolib 库放在 NHDP 主文件夹中。 现在,编译 NHDP 协议。
cd nhdp/unix
make -f Makefile.{os}
2.4.5. 简化组播转发 (SMF)
从 NRL SMF Repo 下载 SMF,解压并将 protolib 库放在 smf 主文件夹中。
cd mgen/makefiles
make -f Makefile.{os}
2.4.6. 优化链路状态路由协议 (OLSR)
要安装 OLSR 协议,请从他们的 NRL OLSR Repo 下载他们的源代码。 解压并将之前下载的 protolib 库放在 nrlolsr 主目录中。 然后执行以下命令:
cd ./unix
make -f Makefile.{os}
2.5. Quagga
原文链接:Quagga 路由套件
2.5.1. 概述
Quagga 是一个路由软件套件,为 Unix 平台,特别是 FreeBSD、Linux、Solaris 和 NetBSD,提供 OSPFv2、OSPFv3、RIP v1 和 v2、RIPng 和 BGP-4 的实现。Quagga 是 GNU Zebra 的一个分支,由 Kunihiro Ishiguro 开发。Quagga 架构由核心守护进程 zebra 组成,它充当底层 Unix 内核的抽象层,并通过 Unix 或 TCP 流向 Quagga 客户端提供 Zserv API。 正是这些 Zserv 客户端通常实现路由协议并将路由更新传送到 zebra 守护程序。
2.5.2. 安装
sudo apt install quagga
2.5.3. 源码安装
首先,从他们的官方网页下载源代码。
sudo apt install gawk
解压缩 tarball,转到当前解压缩代码的目录并发出以下命令。
./configure
make
sudo make install
2.6. SDN
原文链接:Software Defined Networking
2.6.1. 概述
Ryu 是一个基于组件的软件定义网络框架。 Ryu 提供具有定义明确的 API 的软件组件,使开发人员可以轻松创建新的网络管理和控制应用程序。 Ryu 支持管理网络设备的各种协议,如 OpenFlow、Netconf、OF-config 等。关于 OpenFlow,Ryu 完全支持 1.0、1.2、1.3、1.4、1.5 和 Nicira 扩展。 所有代码都在 Apache 2.0 许可下免费提供。
2.6.2. 安装
- 先决条件
sudo apt-get install gcc python-dev libffi-dev libssl-dev libxml2-dev libxslt1-dev zlib1g-dev
- Ryu 包安装
pip install ryu
- Ryu 源码安装
git clone git://github.com/osrg/ryu.git
cd ryu
pip install .
2.7. Security
安全服务提供了多种协议,能够满足大多数可用的用例。 安全服务,如 IP 安全协议,用于在 IP 层提供安全性,以及旨在通过 IP 网络数据包的身份验证和加密来提供该安全性的协议套件。 虚拟专用网络 (VPN) 和防火墙也可供用户使用。
2.8. Utility
原文链接:Utility
2.8.1. 概述
用于执行常见网络更改的各种便利服务。
以下服务作为实用程序提供:
- UCARP
- IP Forward
- Default Routing
- Default Muticast Routing
- Static Routing
- SSH
- DHCP
- DHCP Client
- FTP
- HTTP
- PCAP
- RADVD
- ATD
2.8.2. 安装
要安装之前提到的服务的功能,您可以运行以下命令:
sudo apt-get install isc-dhcp-server apache2 libpcap-dev radvd at
2.8.3. UCARP
UCARP 允许几个主机共享公共虚拟 IP 地址以提供自动故障转移。 它是安全且无专利的通用地址冗余协议(CARP,OpenBSD 替代专利膨胀的 VRRP 的替代方案)的便携式用户空间实现。
CARP 协议的优点是:非常低的开销、加密签名的消息、不同操作系统之间的互操作性以及冗余主机之间不需要任何专用的额外网络链接。
安装:
sudo apt-get install ucarp
2.9. XORP
原文链接:XORP routing suite
2.9.1. 概述
XORP是一个开放的网络平台,支持 OSPF、RIP、BGP、OLSR、VRRP、PIM、IGMP(组播)等路由协议。大多数协议在适用的情况下支持 IPv4 和 IPv6。众所周知,它适用于各种 Linux 发行版和 BSD 风格。
XORP 最初是美国加利福尼亚州伯克利国际计算机科学研究所 ICSI 开放网络中心 (ICON) 的一个项目,并在 XORP, Inc. 的团队中度过了一段时间。现在由一名志愿者维护和改进由长期 XORP 开发人员和一些较新的贡献者组成的核心基础。
XORP 的主要目标是成为网络协议实施的开放平台,并成为当今市场上专有和封闭网络产品的替代品。它是唯一提供集成组播功能的开源平台。
XORP的设计理念是:
- 模块化
- 可扩展性
- 表现
- 健壮性 这是通过将功能小心地分成独立模块并为每个模块提供 API 来实现的。
XORP 分为两个子系统。 更高级别(“用户级别”)子系统由路由协议组成。 下层(“内核”)管理转发路径,并提供 API 供上层访问。
用户级 XORP 使用多进程架构,每个路由协议一个进程,以及一种称为 XRL(XORP 资源定位器)的新型进程间通信机制。
下层子系统可以使用传统的 UNIX 内核转发,或者 Click 模块化路由器。 较低层与用户层子系统的模块化和独立性使其可以轻松替换为其他解决方案,包括基于硬件的高端转发引擎。
2.9.2. 安装
为了能够安装 XORP Routing Suite,您必须先安装 scons 才能编译它。
sudo apt-get install scons
然后,从其官方发布网页下载 XORP。
http://www.xorp.org/releases/current/
cd xorp
sudo apt-get install libssl-dev ncurses-dev
scons
scons install
3. 节点类型和默认服务
以下是默认节点类型及其服务:
| 结点类型 | 服务 |
|---|---|
| router | zebra, OSFPv2, OSPFv3, 以及用于IGP链路状态路由的IPForward服务 |
| host | 默认路由和SSH服务,表示SSH服务器在直接连接到路由器时具有默认路由。 |
| PC | 默认路由服务,用于在直接连接到路由器时拥有默认路由。 |
| mdr | 用于无线优化的移动自组网指定路由器路由的zebra、OSPFv3MDR和IPForward服务。 |
| prouter | 物理路由器,具有与路由器节点类型相同的默认服务;用于将Linux测试平台机器整合到仿真中。 |
每个服务都可以自动生成配置文件。例如,CORE 会自动为路由器节点生成路由协议配置,以简化虚拟网络的创建。
要更改与节点关联的服务,请双击该节点以调用其配置对话框,然后单击“服务”按钮,或者右键单击一个节点,然后从菜单中选择“服务”。通过单击服务名称可以启用或禁用它们。每个服务名称旁边的按钮允许为此节点自定义此服务的所有方面。例如,可以将特殊的路由重新分配命令插入与 zebra 服务关联的 Quagga 路由配置中。
要更改与节点类型关联的默认服务,要使用第 3 层节点工具栏末尾的“编辑”按钮提供的“节点类型”对话框,或从“会话”菜单中选择“节点类型”。请注意,如果已自定义节点,则所选的任何新服务都不会应用于现有节点。
节点类型保存在 ~/.core/nodes.conf 文件中,而不保存在 .imn 文件中。更改现有节点类型的默认服务时,请记住这一点;最好只创建一个新的节点类型。不要更改默认的内置节点类型。可以在 CORE 机器之间复制 node.conf 文件以保存自定义类型。
4. 定制服务
可以针对特定节点完全定制服务。在节点的配置对话框中,单击服务名称旁边的按钮以调用该服务的服务定制对话框。该对话框具有三个选项卡,用于配置服务的不同方面:文件,目录和启动/关闭。
注意:服务旁边的黄色自定义图标表示该服务需要自定义(例如防火墙服务)。绿色的自定义图标表示存在自定义配置。定制服务时,单击“默认值”按钮以删除所有定制。
“文件”选项卡用于显示或编辑用于此服务的配置文件或脚本。可以从下拉列表中选择文件,其内容显示在下面的文本条目中。文件内容由 CORE 守护程序根据调用定制对话框时存在的网络拓扑生成。
目录选项卡显示此服务的每个节点目录。对于默认类型,CORE 节点共享同一文件系统树,但服务定义的这些每节点目录除外。例如,对于每个运行 Zebra 服务的节点,/var/run/quagga 目录必须是唯一的,因为在每个节点上运行的 Quagga 需要将单独的 PID 文件写入该目录。
注:默认情况下,每个节点唯一地挂载
/var/log和/var/run目录。 可以在/tmp/pycore.nnnnn/nN.conf/中找到每个节点的安装目标(其中nnnnn是会话号,N是节点号)。
“启动/关闭”选项卡列出了用于启动和停止此服务的命令。启动索引允许相对于为此节点启用的其他服务来配置此服务的启动时间。启动索引值较低的服务将在启动索引值较高的服务之前启动。由于“文件”选项卡生成的 shell 程序脚本没有设置执行权限,因此启动命令应包含 shell 程序名称,如 sh script.sh。
关闭命令可以选择终止与此服务关联的进程。通常,它们使用 kill 或 kill all 命令向正在运行的进程发送终止信号。如果该服务未使用 shutdown 命令终止正在运行的进程,则在终止 vnoded 守护程序(使用 kill -9)并销毁名称空间时,这些进程将被终止。最好指定关闭命令,以允许适当地终止进程以及对停止和重新启动服务进行运行时控制。
验证命令在启动命令之后执行。 验证命令可以执行一个过程或脚本,如果服务成功启动,则该过程或脚本应返回零,对于启动有问题的服务,其返回值应为非零。例如,pidof 命令将检查进程是否正在运行,并在找到时返回零。当验证命令生成非零返回值时,将生成异常,这将导致在“检查仿真灯”中显示错误。
注意:要在运行时启动,停止和重新启动服务,请右键单击节点,然后使用“服务…”菜单。
5. 新服务
服务可以节省配置节点所需的时间,尤其是在许多节点需要类似的配置过程的情况下。 可以引入新服务来自动执行任务。
6. 利用用户定义的
将新流程的配置捕获到服务中的最简单方法是使用 UserDefined 服务。这是一项空白服务,可以在任何方面进行自定义。用户定义服务可在添加新服务类型之前方便地测试服务构想。
7. 创建新服务
-
修改如下所示的示例服务
它可以生成config/script文件,安装每个节点的目录,启动进程/脚本等。sample.py是一个Python文件,定义了一个或多个要导入的类。可以创建多个将要导入的 Python 文件。 将任何新文件名添加到__init__.py文件中。 -
将这些文件放在
/home/username/.core/myservices这样的目录下。注意,目录myservices的最后一个组件不应该命名为类似于services的名称,因为它与现有的 Python 名称相冲突(使用语法from myservices import *)。 -
将
custom_services_dir = /home/username/.core/myservices条目添加到/etc/core/core.conf文件。custom_services_dir中使用的目录名称应该是唯一的,并且不应与任何现有的 Python 模块名称相对应。例如,不要使用名称子进程或服务。 -
重新启动CORE守护程序(core-daemon)。任何导入错误(Python语法)都应显示在
/var/log/core-daemon.log日志文件中(或在屏幕上)。 -
开始在节点上使用自定义服务。可以创建使用服务的新节点类型,或者更改现有节点类型的默认服务,或者更改单个节点。
8. 定制服务示例
以下是带有一些文档的自定义服务的框架。 大多数可能只会设置所需的类变量(名称/组)。然后定义配置(它们要生成的文件)并实现 generate_config 函数以动态创建所需的文件。最后,将提供启动命令,该命令通常倾向于运行生成的 shell 文件。
"""
Simple example custom service, used to drive shell commands on a node.
"""
from typing import Tuple
from core.nodes.base import CoreNode
from core.services.coreservices import CoreService, ServiceMode
class ExampleService(CoreService):
"""
定制CORE服务示例
:cvar name: 名称用作此服务的唯一ID,并且是必填项,不能有空格
:cvar group: 允许以通用名称将GUI中的服务分组
:cvar executables: 该服务依赖于可执行文件的功能,如果可执行文件不在路径中,则不会加载该服务
:cvar dependencies: 此服务用于启动所依赖的服务,服务名称的元组
:cvar dirs: 该服务将在节点内创建的目录
:cvar configs: 此服务将生成的文件,没有完整路径,该文件将进入节点目录,例如 /tmp/pycore.12345/n1.conf/myfile
:cvar startup: 用于启动此服务的命令,任何非零的退出代码都将导致失败
:cvar validate: 用于验证服务已启动的命令,任何非零的退出代码都将导致失败
:cvar validation_mode: 验证模式,用于确定启动成功。
NON_BLOCKING - 运行启动命令,并使用验证命令验证成功
BLOCKING - 运行启动命令,并使用启动命令本身验证成功
TIMER - 运行启动命令,并通过仅等待“ validation_timer”来验证成功
:cvar validation_timer: 在TIMER / NON_BLOCKING模式下确定成功之前,服务等待验证的时间(以秒为单位)。
:cvar validation_period: 重试验证之前要等待的秒数,仅在NON_BLOCKING模式下使用
:cvar shutdown: 关闭命令以停止该服务
"""
name: str = "ExampleService"
group: str = "Utility"
executables: Tuple[str, ...] = ()
dependencies: Tuple[str, ...] = ()
dirs: Tuple[str, ...] = ()
configs: Tuple[str, ...] = ("myservice1.sh", "myservice2.sh")
startup: Tuple[str, ...] = tuple(f"sh {x}" for x in configs)
validate: Tuple[str, ...] = ()
validation_mode: ServiceMode = ServiceMode.NON_BLOCKING
validation_timer: int = 5
validation_period: float = 0.5
shutdown: Tuple[str, ...] = ()
@classmethod
def on_load(cls) -> None:
"""
提供一种在加载服务时运行任意逻辑的方法,可能有助于简化环境的动态设置。
:return: 无
"""
pass
@classmethod
def get_configs(cls, node: CoreNode) -> Tuple[str, ...]:
"""
提供一种从服务将运行的节点动态生成配置文件的方法。 默认为类定义,如果不需要,可以将其完全省略。
:param node: 正在运行服务的CORE节点
:return: 创建配置文件的元组
"""
return cls.configs
@classmethod
def generate_config(cls, node: CoreNode, filename: str) -> str:
"""
返回文件的字符串表示形式,给定服务将在节点上启动的配置文件名,此信息将用于该文件名。 如果定义了“ configs”,则必须定义它。
:param node: 正在运行服务的CORE节点
:param filename: 配置文件生成
:return: 配置文件内容
"""
cfg = "#!/bin/sh\n"
if filename == cls.configs[0]:
cfg += "# auto-generated by MyService (sample.py)\n"
for iface in node.get_ifaces():
cfg += f'echo "Node {node.name} has interface {iface.name}"\n'
elif filename == cls.configs[1]:
cfg += "echo hello"
return cfg
@classmethod
def get_startup(cls, node: CoreNode) -> Tuple[str, ...]:
"""
提供一种从服务将运行的节点动态生成启动命令的方法。 默认为类定义,如果不需要,可以将其完全省略。
:param node: 正在运行服务的CORE节点
:return: 要运行的启动命令的元组
"""
return cls.startup
@classmethod
def get_validate(cls, node: CoreNode) -> Tuple[str, ...]:
"""
提供一种从服务将运行的节点动态生成验证命令的方法。 默认为类定义,如果不需要,可以将其完全省略。
:param node: 正在运行服务的CORE节点
:return: 命令元组,用于通过以下命令验证服务启动
"""
return cls.validate
COREServices是网络模拟平台CORE中的服务集合,用于定义节点启动时运行的进程或脚本。服务包括BIRD、EMANE、FRR、Quagga等,覆盖了BGP、OSPF、RIP等多种路由协议。用户可以自定义服务,创建新的节点类型,或调整节点服务以适应不同的网络需求。安装和配置这些服务涉及源码编译、包管理器安装以及配置文件定制。此外,服务提供了节点类型和默认服务的详细信息,便于用户快速搭建复杂的网络拓扑。
2304

被折叠的 条评论
为什么被折叠?



