ネットワークプロトコルをテストするための仮想ネットワーク環境。 QEMU + YOCTO + TAPを使用します



IPsecおよびGREプロトコルを使用してデバイスを起動およびデバッグする必要が生じたときに、ネットワークテスト環境を作成するというアイデアが生まれました。 StrongSwan開発者も同様の問題に直面しました。 問題は、単体テストの実行にありました。 彼らはUML(ユーザーモードlinux)に基づいて仮想ネットワークを準備しました。 このドキュメントでは、それが何であり、どのように機能するかを概説します。 仮想ネットワークをできるだけ早くUMLに持ち込み、最初の段階でQEMUおよびYOCTO向けに準備されたディストリビューションでテスト環境を作成しました。 したがって、この記事では、例として、独自のLinuxディストリビューションを作成し、複数のQEMUインスタンスを作成して構成し、仮想ネットワークを構成し、GREトンネルを設定する方法について説明します。 これは、ルーターのデバッグとテストに非常に役立つことがわかりました。 だから、私は以下に興味があるすべての人を招待します。

ホストとして、Ubuntuディストリビューションが使用されました。

Linux 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux 

Linuxの配布を準備しています


そのため、まず、仮想マシン用のLinuxディストリビューションを準備します。 これを行うには、YOCTOビルドシステムを使用します。 配布は簡単であり、カーネルを構成/コンパイルして追加のパッケージをインストールすることもできます。 もう1つのプラスは、Linuxディストリビューションのクロスプラットフォームディストリビューションです。 仮想アセンブリのトレーニングを行った後、組み込みシステムに配布を転送できます。 配布の準備には約1〜2時間かかる場合があります。 準備ができたアセンブリはここで取得できます

必要なツール

 $sudo apt-get install chrpath gawk texinfo python 

他の何かが必要になる場合があります。

a)yoctoをインストールする


 $mk yocto $cd yocto $git clone -b pyro git://git.yoctoproject.org/poky.git $git clone -b pyro git://git.openembedded.org/meta-openembedded $source ./poky/oe-init-build-env 

b)設定ファイルの編集


作業ディレクトリは「yocto / build」になります
インストールを修正します。
conf / bblayers.confファイルで、修正します

BBLAYERS ?= " \
/home/user/yocto/poky/meta \
/home/user/yocto/poky/meta-poky \
/home/user/yocto/poky/meta-yocto-bsp \
/home/user/yocto/meta-openembedded/meta-oe \
/home/user/yocto/meta-openembedded/meta-networking \
/home/user/yocto/meta-openembedded/meta-webserver \
/home/user/yocto/meta-openembedded/meta-python \
/home/user/yocto/meta-openembedded/meta-multimedia \
"

いくつかの便利なパッケージをインストールします。 ファイル/conf/local.conf内

# We default to enabling the debugging tweaks.
EXTRA_IMAGE_FEATURES ?= "debug-tweaks"

CORE_IMAGE_EXTRA_INSTALL = " \
kernel-modules \
lrzsz \
setserial \
strongswan \
opkg \
nbench-byte \
lmbench \
alsa-utils \
i2c-tools \
devmem2 \
dosfstools \
libdrm-tests \
netkit-ftp \
iproute2 \
iptables \
bridge-utils \
socat \
wget \
curl \
vlan \
dhcp-server \
dhcp-client \
ntp \
libstdc++ \
nginx \
ppp \
proftpd \
boost \
openssl \
openssh \
fcgi \
mc \
ethtool \
minicom \
procps \
tcpdump \
file"

さらに、sshd構成ファイル「yocto / poky / meta / recipes-connectivity / openssh / openssh / sshd_config」を修正する必要があります。

# override default of no subsystems
#Subsystem sftp /usr/libexec/sftp-server
Subsystem sftp internal-sftp

この修正は、追加のsftpサーバーをインストールしないために必要です。 sshを介してファイルシステムをマウントするときに使用されます。

c)アセンブリの開始


 $bitbake core-image-minimal 

待つ必要があります。

アセンブリが成功した場合、出力は次のとおりです。

rootfs - /yocto/build/tmp/deploy/images/qemux86/core-image-minimal-qemux86-20170803162854.rootfs.ext4

kernel - /yocto/build/tmp/deploy/images/qemux86/bzImage—4.10.17+git0+e92bd55409_6648a34e00-r0-qemux86-20170801184648.bin

ビルドシステムは何が変更されたかを判断し、ファイル名にタイムスタンプを付けてファイルを追加します。 最新バージョンはリンクで示されます。

«bzImage»
«core-image-minimal-qemux86.ext4»

d)アセンブリを確認します


ホストプラットフォームにqemuをインストールします。 この場合、x86 64ビットです。

 $sudo apt-get install qemu-system-x86 $qemu-system-x86_64 --version QEMU emulator version 2.0.0 (Debian 2.0.0+dfsg-2ubuntu1.34), Copyright (c) 2003-2008 Fabrice Bellard 

qemuを起動します。

 $cd ~/yocto/build/tmp/deploy/images/qemux86 $qemu-system-x86_64 -hda ./core-image-minimal-qemux86.ext4 -kernel ./bzImage -append "console=ttyS0 root=/dev/hda initrd=/initrd" -nographic 



次の図が表示される場合、仮想マシンは起動しています。

仮想ネットワーク構成


スクリプトとインストールはhttps://github.com/framer/test-netあります

a)ネットワーク図の作成


明確にするために、仮想ネットワーク図を作成します。



H1、H2、R1、R2-仮想マシン。
BR0、BR1、BR2、BR3-仮想スイッチ。

各仮想マシンには、BR0スイッチに接続された管理インターフェイス(eth0)があります。 また、ネットワーク192.168.40.0/24も作成します。 これらのインターフェイスとネットワークは、インストールと管理に使用されます。

b)仮想スイッチのインストール


最初に、仮想マシンのTAPインターフェースが接続する仮想スイッチを配置します。 異なるネットワークセグメントに複数の仮想スイッチをインストールします。 次のようにインストールできます。

 $cd ./src $sudo ./setup_bridge.sh 4 $ip link 



BR0スイッチの場合、制御アドレスを割り当て、インターフェイス間のパケット送信を有効にします。

 $ip addr add 192.168.40.1/24 dev br0 $sysctl -w net.ipv4.ip_forward=1 

c)設定ファイル「conf.json」


設定ファイルは、図に従って準備されます。 何かを変更または補足する必要がある場合は、このファイルを編集する必要があります。 このファイルには、管理インターフェースとアドレスのインストールが含まれています。 テストされたネットワークのアドレスの設定は、仮想マシンの起動後に行われます。

d)仮想マシンインスタンスの作成


まず、以前に作成したカーネルとルートファイルシステムを「src」ディレクトリにコピーします。

ファイル名は次のとおりです。
bzImage-カーネル
rootfsはシステムのルートファイルです。
誰かがディストリビューションを持っていない場合は、 ここで既製のアセンブリを取得できます

インスタンスを作成するには、create_network.pyスクリプトを使用します。

 $./create_network.py 

スクリプトは仮想マシンのインスタンスを作成します。 管理ネットワークの構成はまだないため、ネットワークを介した仮想マシンへのアクセスはありません。 このスクリプトは、入力/出力ストリームのインターセプトモードで仮想マシンを起動し、制御ネットワークのインストールを行います。

スクリプトを実行した後、各仮想マシンのディレクトリが作成されます。

 $ls .. -Al 



d)環境の実行


環境を開始するには、次を実行します。

 $sudo ./run_network.py 



マシンがタップインターフェイスを作成するので、sudoから始めます。 車はバックグラウンドで動作します。 標準コンソールはoutput.logファイルに書き込まれます。

マシンへのアクセスはssh経由です。 1つの問題があります。 環境を再作成すると、マシンがssh用に起動すると、キーが再び生成されます。 ホストは、他のキーを持つマシンが同じアドレスで動作していると判断し、誓い始めます。 この場合、「。ssh / known_hosts」ファイルを消去する必要があります。

マシンが起動したら、システムのルートファイルをマウントできます。

 $./mount_fs.py 

マウントされたシステムファイルは、ディレクトリH1 / tmp、H2 / tmp、R1 / tmp、R2 / tmpにあります。

f)ネットワーク設定


環境を開始すると、仮想マシンには管理ネットワークのみがインストールされます。 図に従って残りのネットワークパラメータを設定します。すべてのマシンに対して一度にスクリプトを実行できます。

  $cd ../scripts $./static.sh 

static.shは、静的ルーティングを使用したネットワークの例です。

理論的には、ネットワークは構成されています。

ネットワーク診断。 ネットワーク診断は、各仮想スイッチで実行できます。

sshを介してH1に接続します。
H1で、H2でpingを実行します。

 root@H1:~# ping 192.168.51.10 

ホストで、診断を実行します

 $ sudo tcpdump -i br2 



f)ネットワークのシャットダウン


システムファイルを停止してアンマウントするには、実行します。

 $sudo ./stop_network.py 

GRE設定


a)ネットワーク図を修正する




b)環境の開始と環境のインストール



 $sudo run_network.py 

待って、システムファイルをマウントします。
 $mount_fs.py 

環境オプションを設定する

 $cd ../scripts $./gre.sh 

c)ネットワーク診断


sshを介してH1に接続します。
H1で、H2でpingを実行します。

 root@H1:~# ping 192.168.51.10 

ホストで実行

 $ sudo tcpdump -i br2 



おわりに


なんでこんなこと?

まず第一に。 ルーターの作成に取り組んでいる人は誰でも驚異的です。 「そして、それは実際の条件でどのように機能しますか?」そしてここで、与えられたシステムが救助に来ます。 ホストに追加のネットワークカードがあれば、実際のカードを仮想スイッチに接続して、仮想マシンを実際のデバイスに置き換えることができます。 環境の作成を自動化すると、さまざまな作業シナリオを準備し、実際のデバイスの機能を確認できます。
第二に。 おそらく学生向け。

Source: https://habr.com/ru/post/J335038/


All Articles