ちゃんおぎのメモ置き場

ネットワークに強くなるために少しづつ頑張るブログです.

Netbox DockerでNetbox Pluginを動かしてみる

1. はじめに

NetBox v2.8でPlugin機能[1]が追加されました。 NetBox Pluginは既存の機能に拡張機能を簡単に追加できるようにしたものです。 また、拡張機能の開発が簡単になりました。

今回はPluginをNetBox Docker[2]にInstallしてみた時のメモを書いておこうと思います。
install方法は公式のWiki[3]を参照しただけなので、そちらを参照したほうがわかりやすいかもしれません。

2. 概要

このセクションではNetbox DockerへPluginがInstallされるまでの大まかな原理について説明します。 PluginのInstallがどのように行われているかについて興味がない人は3. PluginのInstallセクションまで飛ばしてください。

まずInstallする前のNetbox Dockerのコンテナ構成を見てみます。

$ docker-compose ps 
            Name                           Command               State                           Ports
-------------------------------------------------------------------------------------------------------------------------------
netbox-docker_netbox-worker_1   python3 /opt/netbox/netbox ...   Up
netbox-docker_netbox_1          /opt/netbox/docker-entrypo ...   Up
netbox-docker_nginx_1           nginx -c /etc/netbox-nginx ...   Up      80/tcp, 0.0.0.0:8000->8080/tcp,0.0.0.0:32773->8080/tcp
netbox-docker_postgres_1        docker-entrypoint.sh postgres    Up      5432/tcp
netbox-docker_redis-cache_1     docker-entrypoint.sh sh -c ...   Up      6379/tcp
netbox-docker_redis_1           docker-entrypoint.sh sh -c ...   Up      6379/tcp

Netbox DockerはNginx, PostgreSQL, Redis, NetBoxApp(Django App)が動作しています。 詳細なApplication Stackはドキュメント[4]を参照してください。

今回、重要になってくるコンテナはNetBoxApp(Django App)であるnetbox-docker_netbox1netbox-docker_netbox-worker_1になります。 この2つのコンテナにPluginをInstallすることによって、Pluginが動作するようになります。

PluginをInstallする方法として、2つのコンテナに直接PluginをInstallする方法があります。しかし、この方法は2つのコンテナを直接変更する必要があるためあまりスマートではありません。 またNetboxのバージョンをUpdateするときなどに管理が大変になります。

そのため公式Wikiで紹介されている方法はPlugin用のコンテナを新たに作成し、まずそこへPluginをInstallします。 Pluginはrequirements.txtを利用してpipでinstallします。 その後docker-composeのoverride機能[5]を使用して、netbox-docker_netbox1netbox-docker_netbox-worker_1にPluginをInstallしたコンテナをOverrideします。

3. PluginのInstall

このセクションでは実際にPluginをInstallする方法について説明します。
今回はNetBox Onboarding plugin[6]をInstallしたいと思います。

3.1 Requirements

Netbox DockerでPluginをInstallするには4つのファイルを作成または変更する必要があります。
新たに作成するファイルは以下の3つになります。

  • plugin_requirements.txt
  • Dockerfile-Plugins
  • docker-compose.override.yml

また、変更が必要なファイルは以下になります。

  • configuraiton.py

3.2 Install

まずNetbox DockerをGithubからCloneしてきます。

$ git clone https://github.com/netbox-community/netbox-docker.git && cd $(basename $_ .git)

3.1で説明した3つのファイルを作成します。

$ touch plugin_requirements.txt Dockerfile-Plugins docker-compose.override.yml

plugin_requirements.txtにinstallしたいplugin名を記載します。

ntc-netbox-plugin-onboarding

Dockerfile-Pluginsに以下の内容を記載します。

FROM netboxcommunity/netbox:latest

copy ./plugin_requirements.txt /
RUN pip install  --no-warn-script-location -r /plugin_requirements.txt

docker-compose.override.ymlに以下の内容を記載します。

version: '3.4'
services:
  nginx:
    ports:
      - 8000:8080
  netbox:
    build:
      context: .
      dockerfile: Dockerfile-Plugins
    image: netbox:latest-plugins
  netbox-worker:
    image: netbox:latest-plugins

configuraiton.pyの一番に下にinstallしたいPlugin名とPluginのConfig(今回は書いてない)を以下のように記載します。

PLUGINS = ["netbox_onboarding"]

# PLUGINS_CONFIG = {
#   "netbox_onboarding": {
#     ADD YOUR SETTINGS HERE
#   }
# }

コンテナをBuildして、Deployします。

$ docker-compose build --no-cache
$ docker-compose up -d

http://localhost:8000/plugins/onboarding/にアクセスして以下のような画面が表示されると、Installは成功です。

f:id:tyanogi:20200723124426p:plain Pluginの使い方やConfigはドキュメントを参照してください。

4. まとめ

NetBox v2.8で追加されたPluginをNetBox Dockerで使用してみました。 現在、リリースされているPlugin[7]はまだ少ないですが今後増えていくことに期待したいですね。

次回はNetBox Pluginの開発方法について書きたいと思います。

5. 参考

[1] NetBox v2.8 Release Notes : https://netbox.readthedocs.io/en/stable/release-notes/version-2.8/
[2] NetBox Docker : https://github.com/netbox-community/netbox-docker
[3] Using Netbox Plugins : https://github.com/netbox-community/netbox-docker/wiki/Using-Netbox-Plugins
[4] Application Stack : https://netbox.readthedocs.io/en/stable/
[5] docker-compose.override.yml : https://docs.docker.jp/compose/extends.html#id12
[6] NetBox Onboarding plugin : https://github.com/networktocode/ntc-netbox-plugin-onboarding
[7] Plugin List : https://github.com/topics/netbox-plugin

Cisco Aironet 1702iのIOSを集中管理型から自立型に切り替える

1. はじめに

Cisco Aironet 1702iのIOSを集中管理型から自立型に切り替えた時のメモ.

2. 集中管理型 → 自立型

Cisco AIRで集中管理型から自立型に切り替えるためには,読み込むIOSを変更する必要があります. 詳しくは[1]で紹介されています. 私の購入したAPにはK9W8がインストールされていました.

ap#dir flash:/
Directory of flash:/

  ...
   20  drwx        2688  Mar 11 2017 13:41:42 +00:00  ap3g2-k9w8-mx.153-3.JD3
  ...

これは集中管理型で動作するIOSになります. [1]によると,APを自立型で動作させるためにはK9W7のIOSが必要みたいです. そのため私はK9W7のIOSMac上で動作しているTFTP ServerからAPに転送してインストールすることにしました.

集中管理型から自立型へ変換するための具体的な方法は色々な所で紹介されているので割愛します.私が調べた中でわかりやすかったのは下記になります.

  • k9w7がAPにインストールされていない場合[1]
  • k9w7がすでにAPにインストールされている場合[2]

Mac OSXでTFTPサーバを起動する方法は[3]で紹介されています. [3]にも書かれているのですが, tftpd のファイル置き場は/private/tftpbootになります. 私はこれに気づいていなくて時間を溶かしました…

ポンコツすぎる…

3. 補足

Cisco AIRを購入する上でいくつか製品を選定していたのですが,私自身の知識が乏しく型番だけで見分けることができませんでした. 調べてみると型番の意味を詳しく紹介して下さっているサイト[4]を見つけました.ありがたやー.

参考

[1] Lightweight - Autonomous AP変換方法,https://community.cisco.com/t5/%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%AC%E3%82%B9-%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/lightweight-autonomous-ap%E5%A4%89%E6%8F%9B%E6%96%B9%E6%B3%95/ta-p/3155986 [2] AIR-CAP1702I-Q-K9 を自律型で使用したい,https://community.cisco.com/t5/%E8%87%AA%E5%BE%8B%E5%9E%8B%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88/air-cap1702i-q-k9-%E3%82%92%E8%87%AA%E5%BE%8B%E5%9E%8B%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%81%84/td-p/2638786
[3] mac osx には tftp サーバーが内蔵されてるので起動してみた,http://takuya-1st.hatenablog.jp/entry/2016/02/27/030544
[4] ゼミにCisco APを導入したお話。,https://sumizome.hateblo.jp/entry/2017/12/08/232640

Ciscoルータ内で動作しているDHCP Serverが意図しないNAKを返す

1. はじめに

 Ciscoルータ内で動作しているDHCP Serverが意図しないNAKを返していたため,それを解決した時に調査した内容のメモ.

2. ネットワークの概要

 某所のネットワークをCisco1941を使用して管理していました.管理を行なっていたネットワーク図(今回の問題に関係する部分だけを示している)は図1のようなものになっています.インターネットにはNAPT変換を使用しており,私たちが所属する建物を管理する管理者のネットワークを介して接続されています.またIPアドレスDHCPで取得し,Cisco1941上でローカル向けにDHCPサーバが動作しています. f:id:tyanogi:20180717155533p:plain

図1:管理してるネットワーク図

3. インターネットに接続できなくなった

 ある日インターネット側のIPアドレスが割り当てられなくなり,インターネットに接続することができなくなりました.建物の管理者に問い合わせたところ管理していないDHCPサーバが送信元のパケットを検知したため,IPアドレスの割り振りを遮断したとのことでした(通知をしないまま遮断するのはやめて…).

4. 再現性を確保する

 建物の管理者と連絡を取りながら問題を解決するのは時間がかかるため,なんとか私が管理できるネットワーク内でこの問題を再現できるようにします. 

4.1 原因の特定

 建物の管理者の連絡から問題の原因を推測すると以下のようなことが考えられました.

  • Gi0/0から入ってきたDHCP要求に対してGi0/0にDHCP OfferメッセージまたはNACKメッセージを送信している可能性がある.
  • Gi0/1から入ってきたDHCP要求に対してGi0/0にDHCP OfferメッセージまたはNACKメッセージを送信している可能性がある.

 建物の管理者からの連絡は情報量が少なくなく,DHCPサーバがどうようなパケットを送信していたのかがわからなかったため再問い合わせしました.するとpcapファイルをいただくことができました!!(原因の特定をするのがめんどくさかったのでは…)
 実際にpcapファイルを調査したところ,どうやらCisco1941内で動作しているDHCPサーバからNAKを返しているようでした.

4.1 実験

 原因を特定できたので実際にDHCP Requestメッセージを送信した際にDHCPサーバがNAKを返すか実験してみます.今回はDHCP Discoverメッセージも反応するか確認するため送信しています.
 結果,DHCP Requestメッセージを作成してGi0/0に送信してみたところNAKが返ってきました! 図2はその時にパケットキャプチャしたものです.パケットキャプチャはDHCP Requestメッセージを送信した端末でおこないました.Gi0/0のIPアドレスは一時的に172.16.0.254/16を割り当ててあります.

f:id:tyanogi:20180717151807p:plain

図2:パケットキャプチャした図

 しかし,なぜDHCP Requestメッセージには反応してDiscoverメッセージには反応しないのか調べてもよくわかりませんでした.IOSの仕様?分かる方がいましたら教えていただけると幸いです.
 

5. 問題の解決

 さてこの問題の解決方法なのですが,私の場合拡張ACLを使用して解決をしました.NAKを返す原因を特定してからまず初めに思い浮かんだのがこの解決方法だったのですが,他の方法もあるのではないかと思い調査していました(2週間くらい探してた…).
 結果,私の調査した範囲では拡張ACLを使用する方法 [1]しか見つかりませんでした.以下がCisco1941に適応させた拡張ACLの設定になります.

ip access-list extended Deny_DHCP_Client
 deny   udp any any eq bootps
 permit ip any any

int gi0/0
ip access-group Deny_DHCP_Client in

参考

[1] WAN interface sending DHCP NAK,https://supportforums.cisco.com/t5/lan-switching-and-routing/wan-interface-sending-dhcp-nak/m-p/2615904

Ubuntu18.04 LTSでネットワークの設定方法

1. はじめに

Ubuntu16.04から18.04に移行した際に固定IPアドレスの設定で詰まったので,そのときに調査した内容のメモ.

2. ネットワークの設定方法が変わった

Ubuntu17.10からネットワークの設定を「Netplan」で行う方法に変更されたらしい[1].そのため設定ファイルやディレクトリ構造も変化した.またUbuntu16.04で使用していた「/etc/network/interfaces」はデフォルトの設定ファイルではなくなった.

2.1 Netplan

2.2 設定ファイル [2]

設定ファイルは「/etc/netplan/」下に配置されている.私の環境(Ubuntu18.04 LTS Desktop)での設定ファイル名は「01-network-manager-all.yaml」であった.初期の設定ファイルの内容は以下のようになっている.

# Let NetworkManager manage all devices on this system
network:
  version: 2
  renderer: NetworkManager

上記の設定ファイルでは「NetworkManager」がシステム上で唯一のネットワーク設定レンダラであることを意味している.また「NetworkManager」がデフォルトですべてのネットワークデバイスを管理することを意味する.

NetplanはOS起動時に上記の設定ファイルを読み込み,「/run/NetworkManger/conf.d/10-globally-managed-devices.conf」ファイルを生成する.

3. IPアドレスを固定する

「/etc/netplan/01-network-manager-all.yaml」に下記の設定を記述する.

# Let NetworkManager manage all devices on this system
network:
  version: 2
  renderer: NetworkManager

  ethernets:
    enp3s0:
        dhcp4: n
        addresses: [192.168.11.100/24]
        gateway4: 192.168.11.1
        nameservers:
            addresses: [192.168.11.1]
        dhcp6: n

下記を実行して設定を反映する.

$ sudo netplan apply

おまけ. IPアドレスを動的に取得する(DHCP Client)

「/etc/netplan/01-network-manager-all.yaml」に下記の設定を記述する.

# Let NetworkManager manage all devices on this system
network:
  version: 2
  renderer: NetworkManager

  ethernets:
    enp3s0:
        dhcp4: y
        dhcp6: n

下記を実行して設定を反映する.

$ sudo netplan apply

参考

[1] Ubuntu 17.10 その23 - ネットワークの設定方法がNetplanに変わる,https://kledgeb.blogspot.com/2017/06/ubuntu-1710-23-netplan.html
[2] Quick and easy network configuration with Netplan, https://blog.ubuntu.com/2017/07/05/quick-and-easy-network-configuration-with-netplan

RM mini3:初期設定に苦戦したお話

はじめに

自宅の家電製品のリモコンが多くいちいち操作するのが面倒だと思ったので,最近流行りのスマートスピーカー(Google Home)と学習リモコンで家電を操作しようと考えました.学習リモコンは"Broadlink RM mini3"を購入しました.今回はRasbperry Piを使用せずにGoogle HomeからRM mini3を中継して家電を操作する方法を試して見ました.

f:id:tyanogi:20180424135807j:plain

初期設定

初期設定は以下のサイトを参考に行いました.

私の場合はアプリとRM mini3のペアリングがうまくいきませんでした.ペアリングが成功するまでに結構時間がかかった… そのため本記事は私が行なった設定を書いてます.

1. IHC(Inteligent home center)アプリのインストール

私はIHCアプリをAndroid端末でインストールしました. IHCアプリはGoogle play上ではインストールできないため,Apkファイルをダウンロードサイトからダウンロードしてアプリをインストールします.

Apkファイルのダウンロードサイトは以下に示します. https://www.apkmonk.com/app/cn.com.broadlink.econtrol.plus/

参考にしたサイトではアプリケーションのバージョンをおとしてペアリングが成功したと記されていますが,私の場合は2018年4月24日時点で最新の"Ver.1.9.7.4325"で成功しました.

次にIHCアプリをインストールしたAndroid端末の設定言語を英語に変更します.
設定言語を英語に変更しなければIHCアプリ側でRM mini3の設定を行うことができません.

2. IHCアプリとRM mini3のペアリング

インストールしたIHCアプリを起動します.

起動するとログイン画面が出てくるのでログインします.
次にバーコードを読み込む画面が出てきます.
パッケージのバーコード(QRコードではない方)を読み込むとすぐに設定画面に移動できます.しかし今回は手動で設定していきます.
"Add Device by category"をタップしデバイスを選択していきます.

f:id:tyanogi:20180424133721j:plain]

RM mini3は"Universal Remotes"の中にあります.Android端末の設定言語を日本語に設定していた場合,"Universal Remotes"が表示されないので注意してください. 左が日本語設定の場合,右が英語設定の場合です.

日本語英語

IHCアプリでRM mini3を選択するとRM mini3側のリセットボタンを2〜3秒ほど長押ししてペアリングモードにしろと言われるので,リセットボタンを長押しします.
その後Wifiの設定を行うとペアリングが始まります.

f:id:tyanogi:20180424134826j:plain

ペアリングが100%になると結果が出力されます.私の場合,"Cannot find the device to be add"と言われペアリングに失敗しました.
失敗した場合,Try other methodsをタップします.画面を進めていくと右側の画面にたどり着きます.WifiをBroadlinkProvに接続しろと言われるので接続します.

BloadlinkProvに接続したあとに再度ペアリングを行うと,ペアリングが成功しました.

3. リモコンを学習させる&GoogleHomeと連携するためにシーンを追加する

これは上記に示した参考サイトがわかりやすく説明されていたので説明は省略します.

まとめ

RM mini3を使用して家電操作をGoogle Homeから行えるようにしたわけですが,私が行いたいと考えているシーンの追加ができなかったりと少し不便な所がありました.またログを取得したいと考えているので,最終的にはRaspberry Pi経由で家電を操作することになりそうです.
基本的な家電操作のみを行いたい人であればこの記事で記した方法で十分だと思います!
RM mini3をいろいろいじったらまた記事を書きたいと思います.

Cisco841m:バックアップと初期化

はじめに

1年前からCisco841mを購入して色々といじっていたのですが,勉強も兼ねて設定を初期化しようと思います. 以下の設定は購入した時の状態から始めています.

Cisco841とは

f:id:tyanogi:20180422164917j:plain

設定

Cisco841mは初期起動の時点で設定が書き込まれています.私は設定されていない状態から設定を行いたかったため,工場出荷の状態に戻します.工場出荷の状態に戻す前に書き込まれている設定のバックアップを取っておきます.今回はTFTP Serverにバックアップを取ります.

TFTP以外のバックアップの取り方やバックアップを取り忘れてしまって購入した時の状態に戻せない場合などは"C841M リカバリ&初期化ガイド"というものがあるのでこちらで対処します.

設定はMacでコンソールケーブルを使用して行います.

Macからルータに接続

screen /dev/tty.usbserial-**** 9600

初期アカウントはUsername:cisco,Password:ciscoになります. このアカウントは1回目のログイン後,無効になってしまうため注意が必要です.設定を保存する前にACアダプタを抜いてから差し込み直す(Cisco841mは電源スイッチがありません)と初期アカウントで再度ログイン可能になります.

私は1年前にこの設定があることに気づかず,設定を保存してしまったため再度ログインできなくなったことがあります.その場合は上記に示したサイトを見ながら再設定を行います.

バックアップと初期化

yourname#enable
# バックアップ
yourname# copy running-config tftp://<ipaddress>/customer-config.txt
# 工場出荷の状態に戻す
yourname#erase startup-config
# 再起動
yourname#reload

以上で初期化は完了です.