Skip to content

ハンズオンの流れ

127.0.0.1 edited this page Feb 15, 2018 · 71 revisions

ハンズオン環境の準備

最初に、ハンズオンに必要な環境を準備します。

VMのダウンロード

今回のハンズオン環境用にVMを準備してありますので、以下のリンクからVMをダウンロードします。

VMのダウンロードが完了したら、VirtualBox にVMイメージをインポートして起動し、起動確認をします。

VirtualBoxを起動し、ダウンロードしたVMのイメージをインポートしましょう。 インポートの方法については、こちらを参考にしてください。

なお、VMへのSSHアクセスにはVirtualBoxのポートフォワード設定が必要ですので、こちらを参考に設定しておきましょう。

インポートが完了したら、メモリを4GB以上割り当ててVMを起動します。(メモリ 4GB は最低限動作するレベルです。4GB よりも多く割り当てられる場合は多めに割り当てることを推奨します。)

仮想環境へのログイン

VMの中の構成は以下のようになっています。

構成

中には複数のVMが入れ子で起動しており、それぞれの子VMは 親VMの scenario からアクセスすることができます。これらのVMは、「テスト対象」と「テストシステム(NetTester)」です。本来「テスト対象」はスイッチやルータなど物理的なネットワーク機器ですが、ハンズオンではこれを仮想マシンとして用意します。各 VM がどのような役割を持つかについては、後述するミッションを参照してください。

Teratermなどを開き、起動したVM ( scenario ) にログインしてみましょう。ログイン先IPアドレスは localhost、ポートは先程設定したポートフォワードのポートを指定します。

VM IPアドレス ユーザ パスワード
scenario localhost:ssh_forwarded_port handson handson

補足

scenario には screen, tmux がインストール済みです。複数VMの操作や時間のかかるテストの実行などで便利なので、必要に応じて利用してください。

子VMの起動

scenario にログイン出来たのち、ほかのVMも起動しましょう。

handson@scenario:~$ sudo ./hands-on/setup/scenario/boot-vm.sh
Domain global-vyos started

Domain yoyodyne-vyos started

Domain tajimax-nettester started

Domain yoyodyne-nettester started

starting NetTester APIs
done

コマンド実行後、3~5分で上記のように done が表示されるまで待ちます。

scenario から、それぞれのVMにログインできることを確認してください。IPアドレス、ユーザ、パスワードは以下のとおりです。

VM (on scenario) IPアドレス ユーザ パスワード
yoyodyne-nettester 172.16.0.2 handson handson
tajimax-nettester 172.16.0.3 handson handson
yoyodyne-vyos 172.16.0.4 vyos vyos
global-vyos 172.16.0.5 vyos vyos

テストシナリオの取得と実行

ここまでの手順で環境が正しく起動していることが確認できました。それでは、scenario でテストシナリオを流して動作するところを見てみましょう。 今回はあらかじめテストシナリオと必要なライブラリはインストールされているため、シナリオディレクトリに入る部分だけを実行します。

handson@scenario:~$ # シナリオのインストール。ハンズオン用VMでは不要。
handson@scenario:~$ # git clone https://github.com/net-tester/hands-on.git
handson@scenario:~$
handson@scenario:~$ # シナリオディレクトリへ移動。
handson@scenario:~$ cd hands-on/scenario
handson@scenario:scenario$ # シナリオの更新
handson@scenario:scenario$ git pull
handson@scenario:scenario$ # ライブラリのインストール・更新
handson@scenario:scenario$ bundle install --path=vendor/bundle
handson@scenario:scenario$ # Vyosの設定を初期化
handson@scenario:scenario$ scp ../setup/yoyodyne-vyos/apply-acl.sh [email protected]:/home/vyos/apply-acl.sh
The authenticity of host '172.16.0.4 (172.16.0.4)' can't be established.
RSA key fingerprint is ce:13:1b:0a:fe:6d:99:4c:1a:7a:e7:24:d8:f0:20:0b.
Are you sure you want to continue connecting (yes/no)? yes ( <- yesを入力 )
Warning: Permanently added '172.16.0.4' (RSA) to the list of known hosts.
Welcome to VyOS
[email protected]'s password: ( <- vyosを入力)
apply-acl.sh                                  100% 5276     5.2KB/s   00:00
handson@scenario:scenario$ ssh [email protected] /home/vyos/apply-acl.sh
Welcome to VyOS
[email protected]'s password: ( <- vyosを入力)

準備が整ったら、テストシナリオを実行します。(注意: 全シナリオ実行なので時間がかかります。)

handson@scenario:scenario$ bundle exec rake

このログの背景で一体何が起こっているかを、こちらのドキュメントを見ながら説明します。

ミッション

大まかな仕組みがわかったところで、早速実際にシナリオを書いてみましょう。

状況設定

あなたの企業(ヨーヨーダイン社)では現在、ソフトウェアの開発プロジェクトを持っています。 開発業務の一部は協力会社(タジマックス通信工業社)に委託しており、委託先からはVPNで接続した上で開発いただいている状況にあります。 セキュリティに煩い昨今、ネットワーク通信はファイアウォールにより厳格にコントロールされているようです。

突然ですが、この度ネットワーク管理者が全治2ヶ月程度の怪我をしてしまい、あなたはその間の代理として任命されました。 管理者はどうやらファイアウォール運用業務について負担の多い人力ACL管理をどうにかしようと、NetTesterを使ってテストシナリオを記述している最中だったようです。 話によればシナリオはほぼ完成しているそうで、ACLをリファクタリングしようとしていたとのことです。

ネットワーク構成

このネットワークは以下のような構成になっているようです。

network

このネットワークがVMのネットワークとどのように関連しているかを以下に示します。

  • テスト対象: ヨーヨーダイン社およびタジマックス社のネットワーク機器 (yoyodyne-vyos および tajimax-vyos)
  • テストシステム: NetTester (yoyodyne-nettester および tajimax-nettester)
    • テストに必要なテスト用ノードの操作とテスト対象への接続、テストプロセス(ping等)の実行をおこないます。

networkmap

通信要件

このネットワークでは、以下のような通信要件があるようです。

No. 送信元 送信先 サービス プロトコル 内容 feature
1 社内 PC インターネット上のサーバ http、https 443/tcp Web検索 features/user/user_pc_to_internet_host/web.feature
2 社内 PC 社内のテスト環境サーバ telnet 23/tcp テストサーバでの作業 features/user/user_pc_to_test_host/telnet.feature
3 社内 PC 社内のテスト環境サーバ http 13000/tcp Jenkins webコンソールアクセス features/user/user_pc_to_test_host/jenkins.feature
4 社内 PC インターネット上の NTP サーバ ntp 123/udp、123/tcp 時刻同期 features/user/user_pc_to_internet_ntp_host/ntp.feature
5 社内 PC 社内の資産管理サーバ git 11000/tcp 資産へのアクセス features/user/user_pc_to_git_host/git.feature
6 社内 PC DMZ の DNS サーバ dns 53/udp、 53/tcp 名前解決 features/user/user_pc_to_dns_host/dns.feature
7 社内 PC インターネット上のサーバ ping icmp 疎通確認 features/admin/user_pc_to_internet_host/ping.feature
8 社内 PC 社内のテスト環境サーバ ssh 22/tcp 管理業務 features/admin/user_pc_to_test_host/ssh.feature
9 社内 PC DMZ のサーバ ping icmp 疎通確認 features/admin/user_pc_to_dmz_host/ping.feature
10 社内 PC DMZ のサーバ ssh 22/tcp 管理業務 features/admin/user_pc_to_dmz_host/ssh.feature
11 DMZ のサーバ インターネット上の NTP サーバ ntp 123/udp、123/tcp 時刻同期 features/admin/dmz_host_to_internet_ntp_host/ntp.feature
12 DMZ の DNS サーバ インターネット上の DNS サーバ dns 53/udp、 53/tcp 名前解決 features/admin/dns_host_to_internet_dns_host/dns.feature
13 社内 PC VPN サーバ ssh 22/tcp 管理業務 features/admin/user_pc_to_vpn_host/ssh.feature
14 DMZ の VPN アドレスプール 社内の資産管理サーバ git 11000/tcp 資産へのアクセス features/admin/vpn_address_pool_to_git_host/git.feature
15 社内 PC 社内の資産管理サーバ ssh 22/tcp 管理業務 features/admin/user_pc_to_git_host/ssh.feature
16 インターネット上のサーバ 外部 LAN のルータ ping icmp 疎通確認 features/admin/internet_pc_to_router/ping.feature
17 DMZ のサーバ 社内 PC ping icmp 疎通確認 features/admin/dmz_host_to_user_pc/ping.feature
18 DMZ の VPN アドレスプール 社内のテスト環境サーバ telnet 23/tcp テストサーバでの作業 features/admin/vpn_address_pool_to_test_host/telnet.feature
19 DMZ の VPN アドレスプール 社内のテスト環境サーバ http 13000/tcp Jenkins webコンソールアクセス features/admin/vpn_address_pool_to_test_host/jenkins.feature
20 インターネット上のサーバ 外部 LAN のファイアウォール ping icmp 疎通確認 features/admin/internet_pc_to_firewall/ping.feature
21 DMZ のサーバ インターネット上のパッケージサーバ http 80/tcp、 443/tcp パッケージアップデート features/admin/dmz_host_to_internet_host/web.feature
22 DMZ のサーバ インターネット上のサーバ ping icmp 疎通確認 features/admin/dmz_host_to_internet_host/ping.feature
23 社内 PC DMZ の DNS サーバ ping icmp 疎通確認 features/admin/user_pc_to_dns_host/ping.feature
24 社内 PC DMZ の DNS サーバ ssh 22/tcp 管理業務 features/admin/user_pc_to_dns_host/ssh.feature

あなたの仕事

話によれば、シナリオは完成間近ではありましたが、No.3 ユーザPCからテスト環境へのJenkins Webコンソール接続、No.12 DMZのDNSサーバからインターネット上のDNSサーバへのTCP接続のシナリオは要件としてあるものの、まだシナリオが完成していない、とのことでした。

これらについて、シナリオを作成し、テストを実行してみてください。

ハンズオン課題1. テストシナリオの記述と実行

シナリオを書く

今回修正する必要があるシナリオは No.3 と No.12 です。 DNS scenario Jenkins scenario

修正が必要なシナリオについては、非常によく似たシナリオが既に定義されています。

こちらを参考に記述してみましょう。(なお、単純なコピーペーストでは動作しません。)

先ほどの背景で不足しているシナリオを書いていきます。編集するシナリオファイルは下記2ファイルです。直接開いて編集します。

@wip (Work In Progress) タグがファイルの先頭に記述されているテストシナリオは実行されず、記述を保留するのに利用されます。今回は jenkins.feature@wip がついていて作業中になっているため、この行を削除して作業を進めます。

また、 features/admin/dns_host_to_internet_dns_host/dns.feature に関しては一旦完成として @wip が無い状態ですが、どうやら要件が追加されたようですので、そのまま追記することにします。

追記したシナリオの実行

記述が完了したら、シナリオを実行してみましょう。先ほどは rake で全てのシナリオを実行しましたが、個別に実行することも可能です。

handson@scenario:scenario$ bundle exec cucumber features/user/user_pc_to_test_host/jenkins.feature
handson@scenario:scenario$ bundle exec cucumber features/admin/dns_host_to_internet_dns_host/dns.feature

結果を確認してみましょう。

jenkins.feature に関しては成功したものの、 dns.feature に関しては要件どおりに試験を書いたにも関わらず、以下のようにテストは失敗してしまったはずです。

handson@scenario:scenario$ bundle exec cucumber features/admin/dns_host_to_internet_dns_host/dns.feature
Feature: DNS で名前解決
 ネットワーク管理者として、
 社内の DNS サーバから上位 DNS サーバへ問い合わせたい
 なぜなら、毎回 IP アドレスを指定するのは不便だから

 Scenario: DNS サーバで名前解決 (UDP)                                         # features/admin/dns_host_to_internet_dns_host/dns.feature:7
   Given DMZ の DNS サーバ                                                # features/step_definitions/virtual_host.rb:14
   And インターネット上の DNS サーバ                                              # features/step_definitions/virtual_host.rb:34
   When DMZ の DNS サーバにログイン                                            # features/step_definitions/client_steps.rb:10
   And インターネット上の DNS サーバに dig コマンドで "www.google.com" の IP アドレスを問い合わせる # features/step_definitions/dns_steps.rb:26
   Then 名前解決に成功                                                       # features/step_definitions/success_steps.rb:29

  -- snip --

   Then 〇〇〇                                                             # features/step_definitions/〇〇〇.rb:〇〇〇
     expected "" to match /〇〇〇/
     Diff:
     @@ -1,2 +1,2 @@
     -/〇〇〇/
     +""
      (RSpec::Expectations::ExpectationNotMetError)
     ./features/step_definitions/〇〇〇.rb:〇〇〇:in `/^〇〇〇$/'
     features/admin/dns_host_to_internet_dns_host/dns.feature:〇〇〇:in `Then 〇〇〇'

Failing Scenarios:
cucumber features/admin/dns_host_to_internet_dns_host/dns.feature:〇〇〇 # Scenario: 〇〇〇

2 scenarios (1 failed, 1 passed)
10 steps (1 failed, 9 passed)
1m4.096s

ハンズオン課題2. ACLのリファクタリング

どうやら、修正した dns.feature については要件通りのACL設定になっていない可能性がでてきました。 シナリオどおりに通信が成功するよう、ACLを見直してみましょう。

使用するIPの一覧

仮想ノード定義が記述されている features/factories.rbfeatures/step_definitions/virtual_host.rb を見ると、それぞれのテストノードのIPアドレスは以下のようになっています。

仮想ノード 日本語名 IPアドレス
git_host 社内の資産管理サーバ 10.10.10.1/24
test_host 社内のテスト環境サーバ 10.10.10.2/24
user_pc 社内 PC 10.10.10.4/24
dmz_host DMZ のサーバ 10.10.0.100/24
dns_host DMZ の DNS サーバ 10.10.0.10/24
vpn_host VPN サーバ 10.10.0.11/24
vpn_addrpool DMZ の VPN アドレスプール 10.10.0.130/24
internet_pc インターネット上の PC 198.51.100.1/24
internet_dns_host インターネット上の DNS サーバ 198.51.100.2/24
internet_host インターネット上のサーバ 198.51.100.3/24
internet_ntp_host インターネット上の NTP サーバ 198.51.100.4/24
tajimax_pc タジマックス社の PC 198.51.100.94/24

ACLの編集

Vyosへログインして、ACLの確認と修正を行いましょう。IPアドレスやアカウントは以下のようになっていました。

VM (on scenario) IPアドレス ユーザ パスワード
yoyodyne-vyos 172.16.0.4 vyos vyos
global-vyos 172.16.0.5 vyos vyos

ログイン後、ACLを確認するには以下のコマンドを入力します。編集モードに入ってからの show firewall では、具体的な設定の記述が表示されます。

vyos@yoyodyne-vyos:~$ configure
[edit]
vyos@yoyodyne-vyos# show firewall
name dmz {
     default-action drop
     rule 50 {
         action accept
         state {
             established enable
             related enable
 -- snip --

firewall の編集に関しては、こちら を参考にしながら行います。

vyos@yoyodyne-vyos# # 編集の例
vyos@yoyodyne-vyos# set firewall name to-internet rule 100 protocol udp
[edit]
vyos@yoyodyne-vyos# set firewall name to-internet rule 100 destination port 123
[edit]
vyos@yoyodyne-vyos# …

編集が完了したら、 commitsave を実行します。

vyos@yoyodyne-vyos# commit
[edit]
vyos@yoyodyne-vyos# save
Saving configuration to '/config/config.boot'...
Done
[edit]
vyos@yoyodyne-vyos#

修正が終わったら、再度 cucumber を実行し、仕様通りに動作することを確認しましょう。

handson@scenario:scenario$ # 修正対象の確認
handson@scenario:scenario$ bundle exec cucumber features/admin/dns_host_to_internet_dns_host/dns.feature

他の通信要件への影響を確認

最後に、他の通信に影響がでていなかを確認しましょう。 なお、回帰テストについては初回同様非常に時間が掛かるため、修正が完璧であると感じたら実行してみましょう。

handson@scenario:scenario$ # 回帰テスト
handson@scenario:scenario$ bundle exec rake

ハンズオン環境の停止

子VMの停止

scenario の停止前に子VMを停止します。

handson@scenario:~$ sudo ./hands-on/setup/scenario/shutdown-vm.expect
spawn virsh console yoyodyne-nettester

(snip)

Will now halt.
[  787.258159] reboot: Power down

done

上記の done 表示後、 scenario をshutdownしてください。