Core 分布式

CORE 分布式仿真

概述

大型模拟场景可以部署在多个模拟服务器上由单个Core-GUI控制。表示整个拓扑的GUI可以是 其中一台模拟服务器或单独的只运行GUI的机器。

作为模拟的每台机器都需要安装一个分布式CORE包和一些允许root用户使用ssh的配置。

CORE 配置

使用分布式功能所需的核心配置设置:

最好先了解CORE的控制网络章节内容

core运行的配置文件默认为 /etc/core/core.conf 可以修改该文件来配置core的相关参数,或者运行core-daemon时指定自定义的配置文件(-f 选项)

# 取消注释并将其设置为远程服务器的地址
# 此地址用于主控网络返回至主机,即为主服务器真实IP地址
distributed_address = 129.168.0.101

# 不配置Emance默认所有分布式服务器和主控制服务器使用同一主控制网段
# 仿真中所有节点都会分配一个该网段内IP并将节点attach每台服务器对应的主控网桥上
# 各分布式主网桥数据会直接汇总到主服务器的控制网桥,服务器的主控制网络会自动建立一个隧道联通物理网卡eth0和主控网桥
controlnet =  172.16.0.0/24

若是单独跑分布式数据,这里主控网不配置也是能走通的,可不开启。

分布式 EMANE 特定配置

EMANE 需要在 core.conf 中配置 controlnet 才能正确启动。 地址前的名称需要与配置的分布式服务器的名称相匹配。

# 与上面所有分布式服务器的主控制网桥使用同一网段(在同一局域网内)不同
# 分布式Emance要求每一台分布服务器的主控制网桥工作在不同网段
# 最后各分布式服务器主控网桥的数据会通过隧道汇总到主控网络
controlnet = 172.16.0.0/24
controlnet1 = 172.16.1.0/24
emane_event_generate = True

配置 SSH

分布式CORE使用python fabric库在远程服务器上通过SSH运行命令。

远程 GUI 终端

您需要确保每个服务器上的用户名相同,因为运行CORE GUI的用户会登录相同用户的远程bash(ssh)

Edit -> Preferences… -> Terminal program: 目前建议将此设置为xterm -e作为默认值,gnome-terminal无法工作。 如果没有安装,可能需要安装xterm

    sudo apt install xterm

分布式服务器SSH配置

首先,必须将分布式服务器配置为允许通过SSH进行无密码的root用户登录,或者分布式服务器插入主服务器的公钥免密登录。

在分布式服务器上如此配置:

# 安装 openssh-server
sudo apt install openssh-server

# 打开 sshd 配置
vi /etc/ssh/sshd_config

# 验证这些配置是否启用
PermitRootLogin yes
PasswordAuthentication yes

# 如果需要,添加/修改以下行以允许SSH
# 接受所有env变量
AcceptEnv *

# 重启 sshd
sudo systemctl restart sshd

在主服务器上:

# 安装环境所需包
sudo apt install openssh-client

法1:公钥登录(推荐)

# 在主服务器上生成SSH公、密钥
# 要确保生成的公钥密钥文件的绝对路径是 ~/.ssh,如下所示密钥文件为core,公钥文件为core.pub  
ssh-keygen -o -t rsa -b 4096 -f ~/.ssh/core

如果遇到类似 not a valid RSA private key file 的错误时使用此条命令。

ssh-keygen -o -m PEM -t rsa -b 4096 -f ~/.ssh/core

这是因为现在通过 ssh-keygen -o 使用新的OpenSSH格式而不是更兼容的PEM格式保存私钥。新格式增加了对暴力破解密码的抵抗力,但OpenSSH 6.5之前的版本不支持所以该模块无法识别。Ed25519密钥总是使用新的私钥格式。-m 支持格式有 “RFC4716”(RFC4716/SSH2)、“PKCS8”(PEM PKCS8)或“PEM”

# 将公钥复制到从服务器地址server的authorized_keys文件中(需输入密码登录)
ssh-copy-id -i ~/.ssh/core root@server
# 当然运行core-gui的user用户也需要如上配置,否则无法使用远程终端界面
ssh-copy-id -i ~/.ssh/core user@server

# 配置fabric使用Core SSH密钥
sudo vi /etc/fabric.yml

# 添加/修改配置文件,其中路径中的user改为对应用户名
connect_kwargs: {"key_filename": "/home/user/.ssh/core"}

法2:设置无需密码登录

# 在分布式服务器上,打开 sshd 配置
vi /etc/ssh/sshd_config

# 将root登录的配置更改为不需要密码
PermitRootLogin without-password

# 重启 sshd
sudo systemctl restart sshd

在 GUI 中添加仿真服务器

在 core-gui 的导航菜单中: Session -> Emulation servers… 在出现的对话框中,添加或修改现有服务器(如果存在)以使用您计划使用的服务器的名称、地址和端口(真实环境下参数)

服务器配置默认加载到下面的GUI 的配置文件 ~/.core/servers.conf

# 名字 地址 端口
server2 192.168.0.2 4038

分配节点

用户需要为场景中的仿真服务器分配节点。不分配意味着节点将在主服务器上模拟。在每个节点的配置窗口中,位于Node name和Image按钮之间的下拉框将选择模拟服务器的名称。默认情况下,此菜单显示 (none),表示该节点将在 master 上本地模拟。进入执行模式时,CORE GUI 将在其分配的仿真服务器上部署节点。

分配仿真服务器的另一种方法是使用选择工具选择一个或多个节点(按住 Ctrl 键单击以选择多个),然后右键单击其中一个节点并选择 Assign to….

CORE emulation servers对话框也可以用于为服务器分配节点。分配的服务器名称显示在节点名称旁边的括号中。要将所有节点分配给其中一台服务器,请单击服务器名称,然后单击all nodes按钮. 已分配节点的服务器在服务器列表中显示为蓝色. 另一种选择是先选择一个节点子集, 然后打开CORE emulation servers 选项并使用 selected nodes 按钮.

注意: 如果要在主服务器上运行这些节点,则不要分配它们。无需显式地将节点分配给主服务器

GUI 可视化

如果位于不同服务器上的两个节点之间存在链接,GUI将用虚线绘制链接。

问题和局限性

  • 无线模型
    只有当 EMANE 模型用于 WLAN 时,无线节点,即连接到 WLAN 节点的那些节点,才能被分配到不同的仿真服务器并参与相同的无线网络。由于使用了 Linux 网桥和 ebtables 规则,basic无线模型不能跨多个服务器工作

  • 主从服务器流量
    自己测试发现,所有仿真中节点跨从服务器数据都是先发送到主服务器上再转发至从服务器,而且主控制网络路由也是需要主服务器转发。从服务器数量增多后势必导致主服务器转发路由负荷过大。正在测试能否使用控制网间的隧道或其他方法使从服务器间有直接联通的链路,而非主服务器转发。

注意: basic无线模型不支持分布式仿真,但EMANE支持

当节点跨服务器链接时, core-daemons将在执行时自动在节点之间创建必要的隧道。应注意安排拓扑以使隧道的数量最小化。隧道在服务器之间传送数据以连接拓扑中指定的节点。这些隧道是使用 GRE 隧道创建的,类似于隧道工具

分布式配置清单

  1. 在主服务器上安装 CORE
  2. 在所有需要的服务器上安装分布式 CORE 包
  3. 在所有服务器上安装和配置公钥 SSH 访问(如果想要使用双击打开终端或是窗口部件)为 GUI 用户(用于终端)和 root 运行 CORE 命令
  4. 根据需要更新 CORE 配置
  5. 选择参与分布式仿真的服务器
  6. 将节点分配给所需的服务器,若是节点在主服务器仿真则不分配(NONE)。
  7. 主服务器按start按钮启动分布式仿真,分服务器无须开启gui和daemon