OpenStackにEVE-NGをたてる

WinPC上のVMWare Playerではなく, OpenStackのインスタンスとしてEVE-NGをたてる。

手順

  1. EVE-NG公式サイトからovaファイルをダウンロードする
  2. ovaファイルからvmdkファイルを抽出する
  3. vmdkファイルをqcow2へ変換
  4. OpenStackにイメージ登録
  5. 起動

1と2はそのままなのでスキップ。

3. qcow2変換

qemu-img convert -f vmdk -O qcow2 ./EVE_Community_VM-disk1.vmdk EVE_Community_VM-disk1.qcow2

4. イメージ登録

 openstack image create --file ./EVE_Community_VM-disk1.qcow2 --disk-format qcow2 EVE-NG

5. 起動

ダッシュボードからでもCLIからでも。

openstack server create --image EVE-NG --flavor m1.large --network external EVE-NG

はじめてのAnsible on EVE-NG

EVE-NGでAnsibleを触ってみるための環境構築メモ。

手順

  1. VMWare Playerで仮想マシンのNIC追加
  2. Ubuntu VMを立てる
  3. Ansible 入れる
  4. Playbook試す

VMWare Playerで仮想マシンのNIC追加

シミュレータ上でUbuntuをたて, apt-getでAnsibleをインストールするために外部接続用のNICを追加する。

ブリッジタイプのvNICを追加

外部ネットワークとの接続設定の確認。
eth1はCloud1に, eth2はCloud2というようにブリッジの設定が入っている。

# Cloud devices
iface eth1 inet manual
auto pnet1
iface pnet1 inet manual
bridge_ports eth1
bridge_stp off

iface eth2 inet manual
auto pnet2
iface pnet2 inet manual
bridge_ports eth2
bridge_stp off

今回はeth1が外部接続用のネットワークとなる。

簡単な構成イメージ

Ubuntu VMを立てる

ubuntuイメージは以下からダウンロードする。
linux_image_for_eve_pro
ちなみにバージョンは16.04.4。

その後はオフィシャルにある通りのやり方でイメージを登録する。

# cp ./virtioa.qcow2 /opt/unetlab/addons/qemu/linux-ubuntu-srv-16.04.4-webmin/
# /opt/unetlab/wrappers/unl_wrapper -a fixpermissions

これでVMを登録できる。

Linuxが選択できるようになる

追加したubuntuのイメージで起動
今回はNICは2つ

Cloud1とUbuntuを接続してInternetにつながるか確認。

テスト環境はこんな感じ
「To Internet」とあるのがCloud1

Ansibleインストール

UbuntuにログインしてアップデートからのAnsibleインストール。
オフィシャルドキュメントに従っていけばOK。
ただし, このイメージだとwebminのリポジトリがリンク切れ?なのかエラーになるので, これをコメントアウトする。

# vi /etc/apt/sources.list

# deb http://download.webmin.com/download/repository sarge contrib

Ansibleインストール。

# apt-get update
# apt-get install software-properties-common
# apt-add-repository ppa:ansible/ansible
# apt-get update
# apt-get install ansible

完了。

Playbookお試し

ルータ4台構成し, バナーメッセージを変更するPlaybookを作成して試行する。
事前準備として, ルータにはIPアドレス設定とSSH設定までは行っておく必要がある。(AnsibleはSSH接続前提のため)

まず最初に /etc/ansible/hosts の設定をする。ここに管理対象となる機器のIPアドレス(ないしはホスト名)を記述する。今回は簡単にルータのIPアドレスを記述し, それらをCiscoというグループでまとめる。
# vi /etc/ansible/hosts

[Cisco]
10.10.10.2
10.10.10.3
10.10.10.4
10.10.10.5

[Cisco:vars] # Ciscoグループ共通のパラメータ設定
ansible_connection=network_cli # ネットワーク機器なので network_cli を指定する
ansible_network_os=ios # Ciscoのiosを指定する
ansible_user=cisco # SSHのログインユーザ名
ansible_ssh_pass=cisco # SSHのログインパスワード(本番環境では非推奨)
ansible_become=yes # 特権モードになるか
ansible_become_method=enable # Ciscoなのでenable
ansible_become_pass=cisco # enable パスワード

Playbook準備。

# vi ~/playbook/ios.yml

- hosts: Cisco                                    # Ciscoグループ対象
gather_facts: no # 機器情報取得しない

tasks: # タスクを登録
- name: insert banner # 1つ目。バナー入れるタスク
ios_banner: # ios_banner というモジュールを利用
banner: motd # motd を対象
text: | # バナーメッセージ登録
You are logged in on $(hostname)
state: present # 登録。absent ならバナー削除

- name: save running to startup when modified # 設定保存するタスク
ios_config: # iso_config というモジュール利用
save_when: modified # 変更されていれば保存実行

実行結果。
# ansible-playbook ios.yml

root@ubuntu:~/playbook# ansible-playbook ./ios.yml

PLAY [Cisco] *********************************************************************************************************************************************************

TASK [insert banner] *************************************************************************************************************************************************
changed: [10.10.10.5]
changed: [10.10.10.4]
changed: [10.10.10.3]
changed: [10.10.10.2]

TASK [save running to startup when modified] *************************************************************************************************************************
changed: [10.10.10.2]
changed: [10.10.10.4]
changed: [10.10.10.3]
changed: [10.10.10.5]

PLAY RECAP ***********************************************************************************************************************************************************
10.10.10.2 : ok=2 changed=2 unreachable=0 failed=0
10.10.10.3 : ok=2 changed=2 unreachable=0 failed=0
10.10.10.4 : ok=2 changed=2 unreachable=0 failed=0
10.10.10.5 : ok=2 changed=2 unreachable=0 failed=0

すっごい簡単。
ログインしてみると・・・。

ちゃんと変わっている

Ansibleは冪等性といわれる「何度やっても同じ結果が得られる」というコンセプトのもと開発されているので, このPlaybookを2回目やってみると,

root@ubuntu:~/playbook# ansible-playbook ./ios.yml

PLAY [Cisco] *********************************************************************************************************************************************************

TASK [insert banner] *************************************************************************************************************************************************
ok: [10.10.10.3]
ok: [10.10.10.5]
ok: [10.10.10.4]
ok: [10.10.10.2]

TASK [save running to startup when modified] *************************************************************************************************************************
ok: [10.10.10.3]
ok: [10.10.10.4]
ok: [10.10.10.2]
ok: [10.10.10.5]

PLAY RECAP ***********************************************************************************************************************************************************
10.10.10.2 : ok=2 changed=0 unreachable=0 failed=0
10.10.10.3 : ok=2 changed=0 unreachable=0 failed=0
10.10.10.4 : ok=2 changed=0 unreachable=0 failed=0
10.10.10.5 : ok=2 changed=0 unreachable=0 failed=0

このように, 「changed=0」と変更したものは無いよ, という結果になる。スバラシイ。マクロよりも全然よいと思われる。

まだ手を付け始めたばかりのため理解及んでいませんが, これはすごい楽しい未来がやってくる気がする。なので, これからどんどん試していく。

なお, ネットワーク機器においてのAnsibleはこちらのスライドが超絶わかりやすいのでオススメです。

【メモ】CatalystでのPBRとVRF

Catalyst3650, 3850等でPBRを使う時, VRFインタフェースとは併用できないので注意。

“互いに排他”とあります。

Cisco IOS XE Denali 16.1.1(Catalyst 3650 スイッチ) ソフトウェアコンフィギュレーションガイド

VRF と PBR は、スイッチ インターフェイス上で相互に排他的です。PBR がインターフェイスでイネーブルになっているときは、VRF をイネーブルにはできません。その反対の場合も同じで、VRF がインターフェイスでイネーブルになっているときは、PBR をイネーブルにできません。

VRFのsetコマンドも使えるものが限定的です。
set vrf や set global は利用できないようです。

また, デフォルトでプロセススイッチングになるのでFast Switchingを有効にするにはインタフェースで ip route cache policy を入れる必要があります。

EVE-NGのHTTPS化

公式のマニュアルまんまです。
自己証明書なので, ブラウザの警告がでるからアンチウィルスソフト使っている場合は適宜除外設定する。

公式マニュアル
http://www.eve-ng.net/documentation/howto-s/81-howto-enable-ssl-on-eve

SSL有効化

root@eve-ng:~# a2enmod ssl
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
service apache2 restart

自己証明書作成

root@eve-ng:~#  openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
Generating a 2048 bit RSA private key
..+++
.......................................+++
writing new private key to '/etc/ssl/private/apache-selfsigned.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Personal
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:192.168.10.20
Email Address []:

Conf修正

root@eve-ng:~# cat << EOF > /etc/apache2/sites-enabled/default-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /opt/unetlab/html/
ErrorLog /opt/unetlab/data/Logs/ssl-error.log
CustomLog /opt/unetlab/data/Logs/ssl-access.log combined
Alias /Exports /opt/unetlab/data/Exports
Alias /Logs /opt/unetlab/data/Logs
SSLEngine on
SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
<FilesMatch ".(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
<Location /html5/>
Order allow,deny
Allow from all
ProxyPass http://127.0.0.1:8080/guacamole/ flushpackets=on
ProxyPassReverse http://127.0.0.1:8080/guacamole/
</Location>

<Location /html5/websocket-tunnel>
Order allow,deny
Allow from all
ProxyPass ws://127.0.0.1:8080/guacamole/websocket-tunnel
ProxyPassReverse ws://127.0.0.1:8080/guacamole/websocket-tunnel
</Location>
</VirtualHost>
</IfModule>
EOF

Apacheリスタート

root@eve-ng:~# /etc/init.d/apache2 restart
[ ok ] Restarting apache2 (via systemctl): apache2.service.

以上。簡単なのでやっておくべし。

HTTPSになっている

【メモ】MTUの種類

Catalystでジャンボフレームに対応させる設定を調べていて, MTU周りについてのメモ。

参考)
インターフェイスおよびハードウェア コンポーネント コンフィギュレーション ガイド、Cisco IOS XE Release 3SE(Catalyst 3650 スイッチ)
Interface and Hardware Component Configuration Guide, Cisco IOS XE Release 3SE (Catalyst 3650 Switches)
微妙に日本語と英語のサイトが違う。

System MTU Values

The following MTU values can be configured:
  • System MTU–This value applies to switched packets on the Gigabit Ethernet and 10-Gigabit Ethernet ports of the switch. Use the system mtu bytes global configuration command to specify the system jumbo MTU value.
  • System Jumbo MTU–This value applies to switched packets on the Gigabit Ethernet and 10-Gigabit Ethernet ports of the switch. Use the system mtu jumbo bytesglobal configuration command to specify the system jumbo MTU value.
  • Protocol-specific MTU–This value applies only to routed packets on all routed ports of the switch or switch stack. Use the ip mtu bytes or ipv6 mtu bytes interface configuration command to specify the protocol-specific MTU value.

・system mtu コマンド
1Gと10Gのスイッチングポートに適用。設定後再起動が必要。
・system mtu jumbo コマンド
1Gと10Gのスイッチングポートに適用。設定後再起動が必要。
上と何が違うんだ???
・ip mtu コマンド
Routed-portに適用される設定。インタフェースに設定。再起動不要。
system mtu の値より大きいものは設定不可。

うーん。「system mtu」と「system mtu jumbo」違いが分からない。
と, ここでCat3650が1Gbps以上のインタフェースしか持っていないからこういうマニュアルになっているのか?と思って別の機種も含めて調べてみると・・・。

 Catalyst スイッチでのジャンボ/ジャイアント フレーム サポートの設定例

すべての 10/100 インターフェイスで MTU を変更するには、system mtu コマンドを使用します。 このコマンドは、10/100 インターフェイスについてのみ効力があります。
3750(config)# system mtu 15463750(config)# exit3750# reload
すべてのギガビット イーサネット インターフェイスで MTU を変更するには、system mtu jumbo コマンドを使用します。 このコマンドは、ギガビット イーサネット インターフェイスについてのみ効力があります。
3750(config)# system mtu jumbo 90003750(config)# exit3750# reload
: system mtu コマンドはギガビット イーサネット ポートには影響せず、 system mtu jumbo コマンドは 10/100 ポートには影響しません。 system mtu jumbo コマンドを設定していない場合は、system mtu コマンドの設定がすべてのギガビット イーサネット インターフェイスに適用されます。

とあった。1G以上のインタフェースしかないスイッチでは「system mtu」でも「system mtu jumbo」でもどちらでもすればよさそう。

NAT on a stick

例えばNATに対応していない機器(L3SW等)があったとして, それでもNATしなくてはならない場合。
図のようにワンアームでルータをつないでNATボックスとする構成が取れる。

図ではルータのアイコンになっているけれど, R1がNATに対応していないとき

ヘアピンNATやNAT on a Stick と呼ぶらしい。
Ciscoサイトを参照して検証する。
参照URL:スティック上のネットワーク アドレス変換

構成概要

    • 172.16.10.0/24 を172.20.10.0/24 へネットワークNATする。
    • NATポイントはR2。
    • VPC2は172.20.10.0/24のアドレスでアクセスする。

      そのため, R1では必然的にPBRを利用してVPC1の通信をR2へ転送する。

      Config

      ※ 抜粋
      R1 Config

      !
      interface Ethernet0/0
      description to R3
      ip address 192.168.2.1 255.255.255.0
      !
      interface Ethernet0/1
      description to R2
      ip address 10.10.10.1 255.255.255.0
      !
      interface Ethernet0/2
      description to R4
      ip address 192.168.1.1 255.255.255.0
      ip policy route-map PBR
      !
      ip route 172.16.10.0 255.255.255.0 192.168.1.2
      ip route 172.16.20.0 255.255.255.0 192.168.2.2
      ip route 172.20.10.0 255.255.255.0 10.10.10.2
      !
      ip access-list extended PBR
      permit ip 172.16.10.0 0.0.0.255 any
      !
      !
      route-map PBR permit 10
      match ip address PBR
      set ip next-hop 10.10.10.2
      !
      !

      R2 Config

      !
      interface Loopback0
      ip address 1.1.1.1 255.255.255.255
      ip nat outside
      ip virtual-reassembly in
      !
      interface Ethernet0/0
      description to R1
      ip address 10.10.10.2 255.255.255.0
      ip nat inside
      ip virtual-reassembly in
      ip policy route-map NAT
      !
      !
      ip nat inside source static network 172.16.10.0 172.20.10.0 /24 no-alias
      ip route 0.0.0.0 0.0.0.0 10.10.10.1
      ip route 172.20.10.0 255.255.255.0 Ethernet0/0
      !
      ip access-list extended PBR
      permit ip 172.16.10.0 0.0.0.255 any
      permit ip any 172.20.10.0 0.0.0.255
      !
      !
      route-map NAT permit 10
      match ip address PBR
      set interface Loopback0
      !

      パケットフロー
      CiscoルータにおけるNATの処理は公式ページにあるとおり。
      参考:NATの処理順序
      今回関係する箇所を太文字で。

      1. IPSec ACL チェック
      2. 復号化
      3. 入力ACLチェック
      4. 入力レート制限をチェック
      5. 入力アカウンティング
      6. Web キャッシュにリダイレクト
      7. ポリシー ルーティング
      8. ルーティング
      9. Inside から Outside への NAT
      10. クリプト(暗号化用のマップのチェックとマーク)
      11. 出力アクセス リストをチェック
      12. CBAC検査
      13. TCP インターセプト
      14. 暗号化
      15. キューイング
      1. IPSec ACL チェック
      2. 復号化
      3. 入力ACLチェック
      4. 入力レート制限をチェック
      5. 入力アカウンティング
      6. Web キャッシュにリダイレクト
      7. OutsideからInsideへの NAT
      8. ポリシー ルーティング
      9. ルーティング
      10. クリプト(暗号化用のマップのチェックとマーク)
      11. 出力アクセス リストをチェック
      12. CBAC 検査
      13. TCP インターセプト
      14. 暗号化
      15. キューイング

      プチ解説

      @R1
      NAT変換後のアドレスをR2へ向けます。

      ip route 172.16.20.0 255.255.255.0 192.168.2.2

      VPC1からのトラフィックをR2(NATボックス)へ捻じ曲げます。

      interface Ethernet0/2
      description to R4
      ip address 192.168.1.1 255.255.255.0
      ip policy route-map PBR
      !
      !
      ip access-list extended PBR
      permit ip 172.16.10.0 0.0.0.255 any
      !
      !
      route-map PBR permit 10
      match ip address PBR
      set ip next-hop 10.10.10.2

      @R2
      物理IFをinsideに指定します。

      interface Ethernet0/0
      description to R1
      ip address 10.10.10.2 255.255.255.0
      ip nat inside
      ip virtual-reassembly in

      Loopbackをoutsideに指定します。

      interface Loopback0
      ip address 1.1.1.1 255.255.255.255
      ip nat outside
      ip virtual-reassembly in

      NAT設定。IOS15以降はno-aliasが必要です。

      ip nat inside source static network 172.16.10.0 172.20.10.0 /24 no-alias

      global insideのアドレスを自身に持たせるためStatic Routeを物理IFへ指定します。
      が, この構成ではなくてもいけました。(NATの処理フロー見ると不要な気がするんですが未だ理解できず。)

      ip route 172.20.10.0 255.255.255.0 Ethernet0/0

      NAT対象となる通信をPBRでLoopbackインタフェース(outside IF)へ送り込みます。これでinside-outsideに偽装します。

      interface Ethernet0/0
      description to R1
      ip address 10.10.10.2 255.255.255.0
      ip nat inside
      no ip virtual-reassembly in
      ip policy route-map NAT
      !
      !
      ip access-list extended PBR
      permit ip 172.16.10.0 0.0.0.255 any
      permit ip any 172.20.10.0 0.0.0.255
      !
      !
      route-map NAT permit 10
      match ip address PBR
      set interface Loopback0
      !

      通信確認。

      VPCS> ping 172.16.20.1

      84 bytes from 172.16.20.1 icmp_seq=1 ttl=251 time=1.802 ms
      84 bytes from 172.16.20.1 icmp_seq=2 ttl=251 time=3.606 ms
      84 bytes from 172.16.20.1 icmp_seq=3 ttl=251 time=4.168 ms
      84 bytes from 172.16.20.1 icmp_seq=4 ttl=251 time=3.517 ms
      84 bytes from 172.16.20.1 icmp_seq=5 ttl=251 time=3.150 ms


      R2#sh ip nat translations
      Pro Inside global Inside local Outside local Outside global
      icmp 172.20.10.10:28052 172.16.10.10:28052 172.16.20.1:28052 172.16.20.1:28052
      icmp 172.20.10.10:28308 172.16.10.10:28308 172.16.20.1:28308 172.16.20.1:28308
      icmp 172.20.10.10:28564 172.16.10.10:28564 172.16.20.1:28564 172.16.20.1:28564
      icmp 172.20.10.10:28820 172.16.10.10:28820 172.16.20.1:28820 172.16.20.1:28820
      icmp 172.20.10.10:29076 172.16.10.10:29076 172.16.20.1:29076 172.16.20.1:29076
      --- 172.20.10.10 172.16.10.10 --- ---
      --- 172.20.10.0 172.16.10.0 --- ---
      R2#

      VPCS> ping 172.20.10.10

      84 bytes from 172.20.10.10 icmp_seq=1 ttl=59 time=2.539 ms
      84 bytes from 172.20.10.10 icmp_seq=2 ttl=59 time=4.796 ms
      84 bytes from 172.20.10.10 icmp_seq=3 ttl=59 time=5.276 ms
      84 bytes from 172.20.10.10 icmp_seq=4 ttl=59 time=4.397 ms
      84 bytes from 172.20.10.10 icmp_seq=5 ttl=59 time=6.855 ms

      VPCS>

      注意点

      Loopback IFへトラフィックを投げるのでCPU処理に落ちます。
      スループットが気になる場合は物理的に(もしくはトランク等して)2本インタフェースを用意したほうがベター。
      IOS12台と15台でコマンドが若干違うので古いバージョンを使うときは確認しましょう。

      EVE-NGインストールメモ

      GNS3の代わりになるシミュレータ。
      VMWare Workstation上で動かせるので入れてみた。

      事前準備

      – Win10 + VMWare Workstation にOVAファイルを展開して利用する。
      ここからコミュニティ版をダウンロード。
      http://www.eve-ng.net/index.php/community
      – Windowsのクライアントパックもダウンロード&インストール。
      http://www.eve-ng.net/downloads/windows-client-side-pack

      – 仮想マシンをインポート。
      プロセッサのIntel VT-xにチェックを入れる。

      – 起動。ログイン。
      root/eve

      – ログインするとパスワード変えろと言われる。

      – 続いてhostname。そのまま。

      – ドメイン。そのまま。

       – IPアドレスどうするかと。変わると面倒なのでStatic。

      – 適当に。

      – サブネットマスク入れる。

      – ゲートウェイ設定。VMWare Playerは「1」ではなく「2」がゲートウェイになるそうな。

      – DNSも同じにして。この後セカンダリも入れるので今流行りの「1.1.1.1」にした。

      – NTP無し。

      – Proxy無し。

      – で完了&再起動。

      – 改めてログインする。

      – いけてる。

      – ブラウザでアクセス。
      admin/eve

      – GNS3ではプロジェクトだったけれど, EVE-NGではラボ(Lab)だそうな。

      その後。

      – sshでログイン。
      – IOS/IOUをアップロード。ライセンス設定。
        IOSはbinからimageへファイル変更。permission変更。IDLE-PC設定。
      http://www.eve-ng.net/documentation/howto-s/64-howto-add-dynamips-images-cisco-ios

      – パーミッション変更

      # /opt/unetlab/wrappers/unl_wrapper -a fixpermissions

      個人的な感想ですが, 慣れればGNS3よりもこっちのほうが良いかもしれない。なんとなく安定しているし。
      しかし, ホストPCのVMWare Playerの上で動かす場合, リモートからアクセスできないので, 例えばUbuntu上でサービスとして動かすGNS3のようにX Forwardingできる方が検証環境としては場所にとらわれなくてよいかなとも思った。

      [OSPF] DRとBDRの話

      最近になってOSPFでDRに関する認識が間違えていたことに気がついた。

      ということでメモ。
      何かというと, DRが落ちるとBDRがDRに昇格されるまでの間, そのネットワーク内ではルートが消失するということ。
      正直, BDRがDB保持しているのでネイバーはそれを即時引き継ぐものだと思っていた。
      しかし, とある環境で「なーんかメインの経路じゃないルータが落ちてPingロストするなー」なんて思って調べていて, わかったのがこれ。◯十年ネットワークエンジニアやっていたけど, この挙動は全く知なかったし意識したこともなかった。「障害ポイントによっては収束に時間がかかる場合があるよな」くらいの認識でした。
      まだまだ知らないことばかり。
      OSPF v2のRFC「https://www.ietf.org/rfc/rfc2328.txt」にも書いてありました。
      Section 2 of this document discusses the directed graph
      representation of an area. Router nodes are labelled with their
      Router ID. Transit network nodes are actually labelled with the
      IP address of their Designated Router. It follows that when the
      Designated Router changes, it appears as if the network node on
      the graph is replaced by an entirely new node. This will cause
      the network and all its attached routers to originate new LSAs.
      Until the link-state databases again converge, some temporary
      loss of connectivity may result.
      This may result in ICMP
      unreachable messages being sent in response to data traffic.
      For that reason, the Designated Router should change only
      infrequently. Router Priorities should be configured so that
      the most dependable router on a network eventually becomes
      Designated Router.

      改めて検証してみる。
      ルータ3台でOSPFを組むシンプルな構成。
      PC1からPC2の経路はRouter1~Router2となるようにOSPFのコストを調整する。その上で, Router 1のPriorityを0にしてDR選出から外し, 2のPriorityを50, 3のPriorityを100にする。これで, 通信経路はRouter2をメインとするが, DRはRouter3になる。

      正常時のshow ip ospf neとshow ip ro の出力結果。設定どおり。

      Router1のネイバー

      IOU1#sh ip ospf ne

      Neighbor ID Pri State Dead Time Address Interface
      192.168.3.2 50 FULL/BDR 00:00:35 192.168.2.2 Ethernet0/0
      192.168.3.3 100 FULL/DR 00:00:31 192.168.2.3 Ethernet0/0

      IOU1#sh ip route
      Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
      D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
      N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
      E1 - OSPF external type 1, E2 - OSPF external type 2
      i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
      ia - IS-IS inter area, * - candidate default, U - per-user static route
      o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
      + - replicated route, % - next hop override

      Gateway of last resort is not set

      192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks
      C 192.168.1.0/24 is directly connected, Ethernet0/1
      L 192.168.1.1/32 is directly connected, Ethernet0/1
      192.168.2.0/24 is variably subnetted, 2 subnets, 2 masks
      C 192.168.2.0/24 is directly connected, Ethernet0/0
      L 192.168.2.1/32 is directly connected, Ethernet0/0
      O 192.168.3.0/24 [110/110] via 192.168.2.2, 00:10:35, Ethernet0/0

      Router 2のネイバー

      IOU2#sh ip ospf ne
      Neighbor ID Pri State Dead Time Address Interface
      192.168.2.1 0 FULL/DROTHER 00:00:33 192.168.2.1 Ethernet0/0
      192.168.3.3 100 FULL/DR 00:00:35 192.168.2.3 Ethernet0/0
      IOU2#sh ip route 
      Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
      D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
      N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
      E1 - OSPF external type 1, E2 - OSPF external type 2
      i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
      ia - IS-IS inter area, * - candidate default, U - per-user static route
      o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
      + - replicated route, % - next hop override

      Gateway of last resort is not set

      O 192.168.1.0/24 [110/110] via 192.168.2.1, 00:11:53, Ethernet0/0
      192.168.2.0/24 is variably subnetted, 2 subnets, 2 masks
      C 192.168.2.0/24 is directly connected, Ethernet0/0
      L 192.168.2.2/32 is directly connected, Ethernet0/0
      192.168.3.0/24 is variably subnetted, 2 subnets, 2 masks
      C 192.168.3.0/24 is directly connected, Ethernet0/1
      L 192.168.3.2/32 is directly connected, Ethernet0/1

      Router 3のネイバー

      IOU3#sh ip ospf
      *Apr 18 07:04:07.804: %SYS-5-CONFIG_I: Configured from console by console
      IOU3#sh ip ospf ne

      Neighbor ID Pri State Dead Time Address Interface
      192.168.2.1 0 FULL/DROTHER 00:00:38 192.168.2.1 Ethernet0/0
      192.168.3.2 50 FULL/BDR 00:00:34 192.168.2.2 Ethernet0/0
      IOU3#sh ip route 
      Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
      D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
      N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
      E1 - OSPF external type 1, E2 - OSPF external type 2
      i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
      ia - IS-IS inter area, * - candidate default, U - per-user static route
      o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
      + - replicated route, % - next hop override

      Gateway of last resort is not set

      O 192.168.1.0/24 [110/210] via 192.168.2.1, 00:12:06, Ethernet0/0
      192.168.2.0/24 is variably subnetted, 2 subnets, 2 masks
      C 192.168.2.0/24 is directly connected, Ethernet0/0
      L 192.168.2.3/32 is directly connected, Ethernet0/0
      192.168.3.0/24 is variably subnetted, 2 subnets, 2 masks
      C 192.168.3.0/24 is directly connected, Ethernet0/1
      L 192.168.3.3/32 is directly connected, Ethernet0/1

      と, ここまでやってCiscoでは収束が早くて事象が出ない。 たまにPingロスト起きるけどこれOSPF関係ないやつだ。

      Debugとってみたらコンマ数秒で切り替わっていたのでCiscoはよく出来ているということがわかりました。


      ということでVyOSで検証。

      VyOSではBDRがいなくなるとルートアップデートしないというバグらしき挙動をするので構成はちょっと変えた。

      VyOS1のステータス。VyOS3がDRでVyOS2がBDR。PC2への宛先はVyOS2に向いている。なお, Helloは5秒。Deadは15秒にした。

      vyos1@vyos:~$ sh ip ospf ne

      Neighbor ID Pri State Dead Time Address Interface RXmtL RqstL DBsmL
      10.10.20.2 50 Full/Backup 11.994s 10.10.10.2 eth0:10.10.10.1 0 0 0
      10.10.10.3 100 Full/DR 10.991s 10.10.10.3 eth0:10.10.10.1 0 0 0
      vyos@vyos:~$ sh ip route
      Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
      I - ISIS, B - BGP, > - selected route, * - FIB route

      O 10.10.10.0/24 [110/10] is directly connected, eth0, 00:17:16
      C>* 10.10.10.0/24 is directly connected, eth0
      O>* 10.10.20.0/24 [110/30] via 10.10.10.2, eth0, 00:00:08
      O>* 10.10.30.0/24 [110/40] via 10.10.10.2, eth0, 00:00:08
      C>* 127.0.0.0/8 is directly connected, lo
      O 192.168.1.0/24 [110/10] is directly connected, eth3, 00:17:16
      C>* 192.168.1.0/24 is directly connected, eth3
      O>* 192.168.2.0/24 [110/40] via 10.10.10.2, eth0, 00:00:08

      この時点で, PC1からPC2への経路はVyOS1~VyOS2~VyOS4となっている。VyOS3はバックアップラインとなっている。
      ここで, 通信に影響の無いはずのVyOS3(DR)のインタフェースをDisableにする。
      VyOS3

      vyos3@vyos# set interfaces ethernet eth0 disable
      [edit]
      vyos@vyos# commit
      [edit]
      vyos@vyos#

      VyOS1

      vyos1@vyos:~$ sh ip ro
      Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
      I - ISIS, B - BGP, > - selected route, * - FIB route

      C>* 10.10.10.0/24 is directly connected, eth0
      C>* 127.0.0.0/8 is directly connected, lo
      O 192.168.1.0/24 [110/10] is directly connected, eth3, 00:33:43
      C>* 192.168.1.0/24 is directly connected, eth3
      vyos@vyos:~$
      vyos@vyos:~$ sh ip ospf ne

      Neighbor ID Pri State Dead Time Address Interface RXmtL RqstL DBsmL
      10.10.20.2 50 Full/DR 14.753s 10.10.10.2 eth0:10.10.10.1 1 0 0

      Pingの状態はというと・・・。

      84 bytes from 192.168.2.10 icmp_seq=136 ttl=61 time=4.304 ms
      84 bytes from 192.168.2.10 icmp_seq=137 ttl=61 time=5.105 ms
      *192.168.1.1 icmp_seq=138 ttl=64 time=0.999 ms (ICMP type:3, code:0, Destination network unreachable)
      *192.168.1.1 icmp_seq=139 ttl=64 time=0.832 ms (ICMP type:3, code:0, Destination network unreachable)
      *192.168.1.1 icmp_seq=140 ttl=64 time=0.925 ms (ICMP type:3, code:0, Destination network unreachable)
      *192.168.1.1 icmp_seq=141 ttl=64 time=1.416 ms (ICMP type:3, code:0, Destination network unreachable)
      192.168.2.10 icmp_seq=142 timeout
      *192.168.1.1 icmp_seq=143 ttl=64 time=1.184 ms (ICMP type:3, code:0, Destination network unreachable)
      192.168.2.10 icmp_seq=144 timeout
      *192.168.1.1 icmp_seq=145 ttl=64 time=1.185 ms (ICMP type:3, code:0, Destination network unreachable)
      192.168.2.10 icmp_seq=146 timeout
      *192.168.1.1 icmp_seq=147 ttl=64 time=1.224 ms (ICMP type:3, code:0, Destination network unreachable)
      192.168.2.10 icmp_seq=148 timeout
      *192.168.1.1 icmp_seq=149 ttl=64 time=0.886 ms (ICMP type:3, code:0, Destination network unreachable)
      192.168.2.10 icmp_seq=150 timeout
      192.168.2.10 icmp_seq=151 timeout
      192.168.2.10 icmp_seq=152 timeout
      84 bytes from 192.168.2.10 icmp_seq=153 ttl=61 time=3.531 ms

      16秒ほどパケロスしていた。
      VyOSなので, DRが切り替わってBDRが選出されるまでの間が通信断になっていると思われる。

      OSPFの仕様ということでしょうがないのかもしれないが, アクティブなルートに関係ないところでDRが落ちると影響出るというのは設計時には要注意ですね。
      アップデートの負荷が小さいのであれば, イーサネットでもPoint-to-Multipointにした方が良いのではないかと思いました。

      ubuntu 17.10 にGNS3を入れる

      環境はWin10 + VMWare Workstation + Ubuntu 17.10 server

      SSHDインストール

      # apt-get install openssh-server -y

      ※ sshdの設定 ※ 適宜Password認証許可等

      GNS3インストール

      参考
      # apt install software-properties-common
      # add-apt-repository ppa:gns3/ppa
      # apt-get update
      # apt-get install gns3-gui
      # dpkg --add-architecture i386
      # apt-get update
      # apt-get install gns3-iou

      ※ GNS3を利用するユーザにkvmのグループ追加
      これをしないとqemuのアプライアンスが利用できない。(kvmの権限がないためエラーとなる)

      # usermod -a -G kvm ubuntu

      その他設定

      ・コンソールをEtermに変更

      # apt-get install eterm

      カスタムコンソールで

      Eterm -e /bin/sh -c "telnet 127.0.0.1 5009"

      とする。

      ・ASAはHDDのタイプをVirtioにする

      ・Cisco IOUはライセンス登録しないと利用できない

      CiscoルータでのVTI+IKEv2設定(NAT越し)

      EC2にCisco1000vを立て, 自宅とVPNを張る。
      以前, VyOSとでGRE over IPSecVTIと2パターンやったが, 今回はVTI+IKEv2でやる。
      まずはCisco同士でトライ。

      はじめに

      「何故IKEv2でやろうとしたか」
      単純にv2だからより安全なんだろうと思ったから。
      IKEv1と何が違うのかは様々なサイトに詳しく書いてある。
      ・UNIVERGE IXシリーズ FAQ「IKEv2に関するFAQ
      ・Cisco IOS セキュリティ コンフィギュレーション ガ イド「Cisco IOS セキュリティ コンフィギュレーション ガ イドインターネット キー エクスチェンジ バージョ ン 2(IKEv2)の設定
      個人的には設定の可視化レベルがcrypto mapよりは高いと感じた。P1のポリシーもピア毎に指定できるのでこのあたりは便利だと思う。(Site-to-Siteだとあまり恩恵は感じられないかもしれない)

      構成概要

      2台のルータでIPSecをVTI+IKEv2で張る。
      それぞれのルータはNAT越しに通信する。
      鍵交換はPSK。
      暗号化周りはAES256, SHA2-256, DH 14。

      構成概略図

      前提条件

      ・EC2上にインスタンス作成済
      ・そのインスタンスにElastic IP割当済
      ・適切にセキュリティグループは設定済(UDP500・4500は許可等)
      ・自宅のGlobal IPは固定前提
      ・ブロードバンドルータでポートフォワーディング設定済

      設定手順

      Config上から流し込んでいくイメージでOK。
      ・IKEv2のプロポーザル設定
      ・IKEv2のポリシー設定
      ・IKEv2のKey設定
      ・IKEv2のプロファイル設定
      ・トランスフォームセット設定
      ・IPSECプロファイル設定
      ・トンネルインタフェース作成
      ・VTI適用

      いざ設定

      Configを抜粋。
      基本的にこのまま流し込めばOK。

      C841M
      C1000v
      !プロポーザル設定
      crypto ikev2 proposal IKEv2_Proposal
      encryption aes-cbc-256
      integrity sha256
      group 14

      ! ポリシー設定
      crypto ikev2 policy IKEv2_Policy
      proposal IKEv2_Proposal

      !キー設定
      crypto ikev2 keyring IKEv2_Key_Cisco
      peer C1000V
      address A.A.A.A
      pre-shared-key password

      ! プロファイル設定
      crypto ikev2 profile IKEv2_Profile_Cisco
      match identity remote address 10.200.10.12 255.255.255.255
      identity local address 192.168.1.2
      authentication remote pre-share
      authentication local pre-share
      keyring local IKEv2_Key_Cisco
      lifetime 3600

      ! トランスフォームセット設定
      crypto ipsec transform-set IPSEC esp-aes 256 esp-sha256-hmac
      mode tunnel

      ! IPSECプロファイル設定
      crypto ipsec profile VTI_Cisco
      set transform-set IPSEC
      set ikev2-profile IKEv2_Profile_Cisco

      ! Tunnelインタフェース設定
      interface Tunnel1
      ip address 172.16.10.1 255.255.255.0
      tunnel source G0/0
      tunnel mode ipsec ipv4
      tunnel destination A.A.A.A
      tunnel protection ipsec profile VTI_Cisco
      ! プロポーザル設定
      crypto ikev2 proposal IKEv2_Proposal
      encryption aes-cbc-256
      integrity sha256
      group 14

      ! ポリシー設定
      crypto ikev2 policy IKEv2_Policy
      proposal IKEv2_Proposal

      !キー設定
      crypto ikev2 keyring IKEv2_Key_Cisco
      peer C841M
      address B.B.B.B
      pre-shared-key password

      ! プロファイル設定
      crypto ikev2 profile IKEv2_Profile_Cisco
      match identity remote address 192.168.1.2 255.255.255.255
      identity local address 10.1.1.10
      authentication remote pre-share
      authentication local pre-share
      keyring local IKEv2_Key_Cisco
      lifetime 3600

      ! トランスフォームセット設定
      crypto ipsec transform-set IPSEC esp-aes 256 esp-sha256-hmac
      mode tunnel

      ! IPSECプロファイル設定
      crypto ipsec profile VTI_Cisco
      set transform-set IPSEC
      set ikev2-profile IKEv2_Profile_Cisco

      ! Tunnelインタフェース設定
      interface Tunnel1
      ip address 172.16.10.2 255.255.255.0
      tunnel source G0/0
      tunnel mode ipsec ipv4
      tunnel destination B.B.B.B
      tunnel protection ipsec profile VTI_Cisco

      確認

      c1000v#sh crypto ikev2 sa
      IPv4 Crypto IKEv2 SA

      Tunnel-id Local Remote fvrf/ivrf Status
      1 10.1.1.10/4500 B.B.B.B/4500 none/none READY
      Encr: AES-CBC, keysize: 256, PRF: SHA256, Hash: SHA256, DH Grp:14, Auth sign: PSK, Auth verify: PSK
      Life/Active Time: 3600/2111 sec

      IPv6 Crypto IKEv2 SA

      c1000v#sh crypto ipsec sa

      interface: Tunnel1
      Crypto map tag: Tunnel1-head-0, local addr 10.1.1.10

      protected vrf: (none)
      local ident (addr/mask/prot/port): (0.0.0.0/0.0.0.0/0/0)
      remote ident (addr/mask/prot/port): (0.0.0.0/0.0.0.0/0/0)
      current_peer B.B.B.B port 4500
      PERMIT, flags={origin_is_acl,}
      #pkts encaps: 10, #pkts encrypt: 10, #pkts digest: 10
      #pkts decaps: 10, #pkts decrypt: 10, #pkts verify: 10
      #pkts compressed: 0, #pkts decompressed: 0
      #pkts not compressed: 0, #pkts compr. failed: 0
      #pkts not decompressed: 0, #pkts decompress failed: 0
      #send errors 0, #recv errors 0

      local crypto endpt.: 10.1.1.10, remote crypto endpt.: B.B.B.B
      plaintext mtu 1422, path mtu 1500, ip mtu 1500, ip mtu idb GigabitEthernet1
      current outbound spi: 0x3478CA01(880331265)
      PFS (Y/N): N, DH group: none

      inbound esp sas:
      spi: 0x9AF7C1FF(2599928319)
      transform: esp-256-aes esp-sha256-hmac ,
      in use settings ={Tunnel UDP-Encaps, }
      conn id: 2068, flow_id: CSR:68, sibling_flags FFFFFFFF80000048, crypto map: Tunnel1-head-0
      sa timing: remaining key lifetime (k/sec): (4607998/1485)
      IV size: 16 bytes
      replay detection support: Y
      Status: ACTIVE(ACTIVE)

      inbound ah sas:

      inbound pcp sas:

      outbound esp sas:
      spi: 0x3478CA01(880331265)
      transform: esp-256-aes esp-sha256-hmac ,
      in use settings ={Tunnel UDP-Encaps, }
      conn id: 2067, flow_id: CSR:67, sibling_flags FFFFFFFF80000048, crypto map: Tunnel1-head-0
      sa timing: remaining key lifetime (k/sec): (4607999/1485)
      IV size: 16 bytes
      replay detection support: Y
      Status: ACTIVE(ACTIVE)

      outbound ah sas:

      outbound pcp sas:

      c1000v#sh crypto session
      Crypto session current status

      Interface: Tunnel1
      Profile: IKEv2_Profile
      Session status: UP-ACTIVE
      Peer: B.B.B.B port 4500
      Session ID: 6
      IKEv2 SA: local 10.1.1.10/4500 remote B.B.B.B/4500 Active
      IPSEC FLOW: permit ip 0.0.0.0/0.0.0.0 0.0.0.0/0.0.0.0
      Active SAs: 2, origin: crypto map

      以上, お疲れ様でした。