Prometheus+snmp_exporterでIX2105を監視する

前回(IX2105でDS-Liteと接続して爆速インターネットをやる)に引き続き、IX2105の設定を行っていきます。 今回はPrometheusでの監視をやっていきます。

  • IX2105でSNMPを有効化する
  • snmp_exporterの導入
  • カスタムモジュールを定義してsnmp_exporterにPRを投げる
  • Prometheusの設定を行う
  • Grafanaで可視化する

IX2105でSNMPを有効化する

まずIX2105側のSNMP機能を有効にします。 今回はIP制限を行いません。

snmp-agent ip enable
snmp-agent ip community public

手元のLinuxマシンから接続が行えるかを確かめてみます。

$ snmpwalk -v1 192.168.111.1 -c public 1.3.6.1.2.1.1
iso.3.6.1.2.1.1.1.0 = STRING: "NEC Portable Internetwork Core Operating System Software, IX Series IX2105 (magellan-sec) Software, Version 9.7.15, RELEASE SOFTWARE, Compiled Mar 13-Tue-2018 18:18:58 JST #2, IX2105"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.119.1.84.14.1
iso.3.6.1.2.1.1.3.0 = Timeticks: (17331617) 2 days, 0:08:36.17
iso.3.6.1.2.1.1.4.0 = ""
iso.3.6.1.2.1.1.5.0 = STRING: "Router"
iso.3.6.1.2.1.1.6.0 = ""
iso.3.6.1.2.1.1.7.0 = INTEGER: 72

snmp_exporterの導入

次はPrometheusからの監視を行いたいので、snmp_exporterのバイナリを適当にダウンロードして試してみます。 デフォルトではポート 9116 でHTTPサーバが起動します。

DL先: https://github.com/prometheus/snmp_exporter/releases

$ ./snmp_exporter &
$ curl localhost:9116/snmp?target=192.168.111.1
$ curl localhost:9116/snmp?target=192.168.111.1&module=if_mib  # 同じ意味(モジュール名を明示的に指定)

すると、こんな調子でつらつらとメトリクスが出てきます。

# TYPE ifHCInOctets counter
ifHCInOctets{ifAlias="",ifDescr="GigaEthernet0",ifIndex="1",ifName="GigaEthernet0"} 1.5119176458e+10
ifHCInOctets{ifAlias="",ifDescr="GigaEthernet0-Multiplexor",ifIndex="3",ifName="GigaEthernet0-Multiplexor"} 1.5119176458e+10
ifHCInOctets{ifAlias="",ifDescr="GigaEthernet0.0",ifIndex="355",ifName="GigaEthernet0.0"} 1.5119176458e+10
ifHCInOctets{ifAlias="",ifDescr="GigaEthernet0.0-LAN",ifIndex="13",ifName="GigaEthernet0.0-LAN"} 1.5119176458e+10
ifHCInOctets{ifAlias="",ifDescr="GigaEthernet1",ifIndex="2",ifName="GigaEthernet1"} 5.20355025575e+11
ifHCInOctets{ifAlias="",ifDescr="GigaEthernet1-Multiplexor",ifIndex="4",ifName="GigaEthernet1-Multiplexor"} 5.20355024179e+11
ifHCInOctets{ifAlias="",ifDescr="GigaEthernet1.0",ifIndex="356",ifName="GigaEthernet1.0"} 5.20355024179e+11
ifHCInOctets{ifAlias="",ifDescr="GigaEthernet1.0-LAN",ifIndex="14",ifName="GigaEthernet1.0-LAN"} 5.20355024179e+11
ifHCInOctets{ifAlias="",ifDescr="Tunnel0",ifIndex="223",ifName="Tunnel0"} 9.327241604e+09
ifHCInOctets{ifAlias="",ifDescr="Tunnel0.0",ifIndex="726",ifName="Tunnel0.0"} 9.327241604e+09

適当にSNMPの代表的なメトリクスをexportしてくれます。 gauge, counterとかの区別も付いていてすごいですね。 ですが、プライベートMIBに含まれる機器特有のファン回転数・筐体温度等のメトリクス情報は取得できません。

IXの場合は、以下のURLに取得できる情報の一覧が有りました。 温度・ファン・CPU使用率・メモリ・IPsec等、面白そうなメトリクスが多数含まれています。 これらを snmp_exporter で取得するためにはモジュールの定義を行う必要があります。 デフォルトでは標準的なメトリクスを取得する if_mib モジュールの他、ベンダー依存の cisco_wlc arista_sw ddwrt keepalived が定義されています。 NEXのIXは定義されていないので、今回は nec_ix モジュールを作ってみましょう。

IXでのSNMP仕様: https://jpn.nec.com/univerge/ix/faq/snmpv1.html

カスタムモジュールを定義してsnmp_exporterにPRを投げる

自分が投げたPRがマージされたので、次のリリースからIXの監視を行うためにカスタムモジュールを定義する必要はなくなりました。モジュール名は nec_ix として公開されています。 https://github.com/prometheus/snmp_exporter/pull/427

どのSNMPのメトリクス値を取得して何のラベルを付けるかは、同一ディレクトリに保存されている snmp.yml ファイルで定義しています。 見てみると、CiscoWLC, Arista, keepalived等のプライベートMIBが含まれることが分かると思います。

https://github.com/prometheus/snmp_exporter/blob/master/snmp.yml

ただ、この1万行を超えるファイルを手で管理しているわけではありません。 MIBの定義ファイルから自動で生成するためのジェネレータが同一リポジトリに有ります。

https://github.com/prometheus/snmp_exporter/tree/master/generator

  1. makeでMIBの定義ファイルを取得する
  2. generator.yml に書かれたルールに従ってMIB定義ファイルを参照
  3. 各メトリクスの名前・種類・説明文などを snmp.yml に出力
  4. snmp_exporterが snmp.yml の情報を使用して、SNMPエージェントが持つ値を取得・ /metrics へ公開

ですので通常拡張を行うときは、 Makefile generator.yml のみ編集すれば良いです。 今回は、 generator.yml に以下のように追記しました。 今回はメトリクスの定義が素直だったので、walkのみ記述すれば適切にメトリクスの取得が行えました。 この定義を行うことで、 picoSystem 以下の picoCelsius picoFahrenheit 等の子のメトリクスが再帰的に取得できるようになります。

modules:
  nec_ix:
    walk:
      - picoSystem
      - picoIpSecFlowMonitorMIB
      - picoExtIfMIB
      - picoNetworkMonitorMIB
      - picoIsdnMIB
      - picoNgnMIB
      - picoMobileMIB
      - picoIPv4MIB
      - picoIPv6MIB

curl localhost:9116/snmp?target=192.168.111.1&module=nec_ix と叩けば、CPU使用率・ヒープ使用率・IPSecの状態・ファンの状態・電源の状態など、面白そうなメトリクスが取得できるようになりました。

Prometheusの設定を行う

スクレイピングの設定を行います。 ポイントとしては、ネットワーク機器のIPアドレスを指定しますが、その機器にHTTPでメトリクスを取得しに行くことは出来ないので、 __address__ ラベルを置換して全てsnmp_exporterにリクエストを送信する必要があります。

設定例はこのようになります。 snmp-exporter.example.com:9116 は、自分で立てたsnmp_exporterのアドレスを指定してください。 moduleには複数指定が出来ないので、屈辱的ですがこのように2つ書くことになります。

scrape_configs:
  - job_name: 'snmp_if_mib'
    static_configs:
      - targets:
        - 192.168.111.1  # ix2105
    metrics_path: /snmp
    params:
      module: [if_mib]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: snmp-exporter.example.com:9116  # The SNMP exporter's real hostname:port.
  - job_name: 'snmp_nec_ix'
    static_configs:
      - targets:
        - 192.168.111.1  # ix2105
    metrics_path: /snmp
    params:
      module: [nec_ix]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: snmp-exporter.example.com:9116  # The SNMP exporter's real hostname:port.

Grafanaで可視化する

とりあえず {job="snmp_nec_ix"} などでクエリを叩けばざーっと値が出てくるので、ほしそうなモノをDashboardに突っ込んでいくだけです。

Exploreでの表示例。

snmp exporter 2019 07 02 23 39 40

ダッシュボードの設定例。

snmp exporter 2019 07 02 23 37 53

ファンが搭載されているモデルだと回転数などが取れるようになったのですが、IX2105はファンレスなので残念ながら確認できないです。 ホンマか?と思うものの、通信を大量に流してもせいぜいCPUは20%程度しか使っていないようです。 なので、特に温度が上がるわけでもなく暇なグラフになっています… 異常なときに調査できるように貯めておくので良いんですが寂しいです。

おわり

PRも無事マージされたし、IXは安定して動いているし満足です。 VyosをHypter-Vで動かしていたので、WindowsUpdateが発生してネットが定期的に落ちるという心配もなくなりました。

続きを読む

IX2105でDS-Liteと接続して爆速インターネットをやる

もくじ

  • IPv6への接続
  • DS-Liteへの接続
  • フィルタ適用
  • DHCPサービスの設定
  • ベンチマーク

NEC UNIVERGE IX2105は、CiscoライクなCLIを持つ拠点用ルータです。 カタログスペックによると、IPSec性能も440Mbps有り非常に高性能です。 にも関わらずヤフオクだと5000円以下で入手することが出来るので、現時点でトップクラスのコスパを誇る機種だと考えています。

今回はそんなIX2105でIIJ(Internet Multifeed)のDS-Liteへ接続したいと思います。

IMG 5991 s

1年ちょっと前にも似たようなことをやってたんですが、飽きてたのでこの際入れ替えようという気持ちです。 赤鯖にVyos入れて最高のインターネッツを手に入れた

IPv6への接続

IX2105の設定はCiscoと同じく、RJ-45コネクタのシリアルコンソールケーブル、通称きしめんを用いて行います。 自分はこちらを使用しています。FTDI以外信用出来ないです。

デフォルトユーザ・パスワードは user: admin pass: admin らしいので、ログインします。 ファームウェア新し目で助かる…

login: admin
Password: 
NEC Portable Internetwork Core Operating System Software
Copyright Notices:
Copyright (c) NEC Corporation 2001-2018. All rights reserved.
Copyright (c) 1985-1998 OpenROUTE Networks, Inc.
Copyright (c) 1984-1987, 1989 J. Noel Chiappa.
Router# 
Router# show version 
NEC Portable Internetwork Core Operating System Software
IX Series IX2105 (magellan-sec) Software, Version 9.7.15, RELEASE SOFTWARE
Compiled Mar 13-Tue-2018 18:18:58 JST #2 by sw-build, coregen-9.7(15)

今回設定するIX2105は、1つのGigaEthernet0ポートと、4つのGigaEthernet1ポートがあります。 上流回線はGigaEthernet0に接続し、クライアントはGigaEthernet1のスイッチポートに接続します。

まず、IPv6の接続を行うために、IPoEの設定を行います。 ここでは固定のIPv6アドレスを設定していますが、 ipv6 address autoconfig receive-default とすることで、アドレス・ルーティングの自動設定を行うことができます。

ipv6 dhcp client-profile dhcpv6-cl
  information-request
  option-request dns-servers

interface GigaEthernet0.0
  no ip address
  ipv6 enable
  ipv6 address ????:????:????:????::1/64
  ipv6 dhcp client dhcpv6-cl
  ipv6 nd ra enable
  no shutdown

ipv6 route default GigaEthernet0.0 dhcp

ここまで設定を投入すると、 show ipv6 address GigaEthernet0.0 でIPv6アドレスが設定されていることが確認できます。 ルータ上から ping6 2001:4860:4860::8888 で疎通の確認も行えます。

クライアントPCでもIPv6が使用できるようにブリッジの設定等を投入します。 ブリッジは、IPv6の通信のみ有効としています。

bridge irb enable
no bridge 1 bridge ip

interface GigaEthernet0.0
  bridge-group 1

interface GigaEthernet1.0
  ipv6 enable
  bridge-group 1
  no shutdown

これでスイッチポートに接続している機器はIPv6接続が行えるようになったと思います。

DS-Liteへの接続

DS-Liteは 4-over-6 トンネルを使用します。 トンネルの設定と、ついでにLANでのルータのIPアドレスを設定します。

interface GigaEthernet1.0
  ip address 192.168.111.1/24

interface Tunnel0.0
  tunnel mode 4-over-6
  tunnel destination fqdn gw.transix.jp
  tunnel source GigaEthernet0.0
  ip unnumbered GigaEthernet1.0
  ip tcp adjust-mss auto
  no shutdown

ip route default Tunnel0.0

トンネルの宛先にドメイン名が設定できない機種が多いですが、IXは行えるようです。

フィルタ適用

不正なIPv6の通信を防止するために、フィルタを適用します。

DHCPv6, ICMPv6に関しては許可・その他は内側から開始した通信に許可を行うダイナミックフィルタを適用します。 ipv6 filter コマンドの4つ目に書いている数字は、フィルタの適用順らしいです。

ipv6 access-list dhcpv6-list permit udp src any sport any dest any dport eq 546
ipv6 access-list dhcpv6-list permit udp src any sport any dest any dport eq 547
ipv6 access-list icmpv6-list permit icmp src any dest any
ipv6 access-list permit-list permit ip src any dest any
ipv6 access-list dynamic dflt-list access permit-list

interface GigaEthernet0.0
  ipv6 filter dhcpv6-list 1 in
  ipv6 filter icmpv6-list 2 in
  ipv6 filter dhcpv6-list 1 out
  ipv6 filter icmpv6-list 2 out
  ipv6 filter dflt-list 100 out

DHCPサービスの設定

IPv4端末にアドレスを配布するためのDHCPサービスを設定します。 必要であれば、MACアドレスに対して静的にアドレスを設定する fixed-assignment を行います。

ip dhcp profile dhcpv4-sv
  assignable-range 192.168.111.100 192.168.111.150
  default-gateway 192.168.111.1
  dns-server 8.8.8.8 8.8.4.4
  fixed-assignment 192.168.111.11  ??:??:??:??:??:??

ip dhcp enable

ベンチマーク

speedtest.netが100Mbpsを超えたあたりから正しい計測が出来ていない疑惑が有るので、Softetherの速度計測ツールを使って確かめてみました。

speedtest.v6.softether.co.jp でのIPv6速度テスト ix2105 2019 06 22 22 41 01

speedtest.softether.co.jp でのIPv4速度テスト ix2105 2019 06 22 22 40 55

v4/v6共に非常に高速だとわかります。 IPv6では700Mbpsを超えますが、これを処理できるサービスプロパイダは少なそうですね。

ブラウザで一番マトモに計測できるであろう fast.com では400Mbpsという計測結果になりました。

ix2105 2019 06 22 22 47 06

全力で通信している際も、ルータのCPU使用率は20~30%程度でした。コンソールも非常に安定して操作が可能でした。

おわり

この速度が5000円で手に入るの素晴らしいです。 設定もCisco機器が触れれば違和感がないと思います。

次回はSNMPを用いたIX2105の監視を行いたいと思います。 Prometheus+snmp_exporterでIX2105を監視する

続きを読む