8月 202017
 

自宅のネットワーク内で mDNS を流していたら LLDP 流す必要ないやんかー。などと思うんですけども。
mDNS は網内というかルータを超えないセグメント内でマルチキャストを流し、 LLDP も同様に L2 レベルでマルチキャストを流します。

LLDP (Link Layer Discovery Protocol) は接続しているマルチベンダーの機器に対して自分の情報をお知らせするためのプロトコルです。
CDP (Cisco Discovery Protocol) は CIsco 機器だけでしか機器の情報を交換することができませんが、 LLDP は様々なネットワーク機器・サーバが流すことができます。

例えば Cisco ルータ(スイッチでも良いけど;-) で CDP を利用しているとき、VMware ESXi などのハイパーバイザーの NIC は CDP を吸収します。そして、仮想マシンでは LLDP を流すことにより、どのスイッチに、どんな物理サーバ (ESXi が動作している物理サーバ) が接続していて、その物理サーバ上でなんという仮想マシンが乗っているか、 CDP+LLDP で一目瞭然把握できるのであります。

なので、サーバ上で LLDP を流すのはネットワーク機器にとっては良い感じなのですね。

サーバ運用者主体で機器情報を収集するのであれば mDNS を起動しておくだけでも全然問題はないのですが、スイッチのどのポートに何が接続しているか? と、いう情報まで収集したいのであれば ESXi で CDP を、仮想マシンでは LLDP を動作させるのがグーです。

 
FreeBSD には ports として net-mgmt/cdpd/ もあるし net-mgmt/lldpd/ もあるのでどっちも動作することができます;-)。

が、今回は LLDP について書いてみます。

まぁ、 ports から net-mgmt/lldpd/ を make install しておしまい。って感じですが、 make config のオプションが悩ましい。 BASH も ZSH もインストールしたくないので [ ] として、 SNMP を [X] にすると net-mgmt/net-snmp/ をインストールしてしまい大げさになるし・・。まぁ、お好みで;-)。
JOSN や READLINE 、 XML などは lldpctl -f で出力フォーマットを指定できるのですが、そのときに利用します。

そして、インストール後ですが、設定フアイルは sample さえもインストールされないので自力で用意する必要があります。設定ファイルは /usr/local/etc/lldpd.conf になります。 man lldpcli すると書式が解ります。
僕の場合は以下の書式を作りました。

#configure system hostname "wanchan"
#configure system description "FreeBSD-10.3-RELEASE"
configure system interface pattern em*,bge*,re*,wlan*,ue*,vmx*
configure system ip management pattern 192.168.*,*:*
#configure med fast-start enable
#configure med location address floor "32F"

 
最後の “configure med location address” な設定はどえりゃー複雑で、ちゃんと形式に沿って記述されてないとエラーになります。イヤになって、書く必要ねぇやぁ。みたいな感じですf(^^;;。
設定は上から順に

  • ホスト名
  • OS とバージョン
  • LLDP で流す NIC の情報 “,” で区切って複数指定できます
    IP アドレスの情報は勝手に取ってきて流してくれます
    実は wlan* は not an ethernet device なので動作してくれません
  • IP アドレスのレンジの情報
    IPv4・IPv6共に指定できます
  • Enable LLDP-MED extension の指定
    FreeBSDの ports の場合 configure 時に –enable-lldpmed が付いてないので不要っぽい
  • 上にも書いた通り設置場所情報
    snmpd が動作していれば不要だよねぇ。ふつーは・・

準備ができたら service lldpd onestart して、起動を確認します。

 
続いて確認方法ですが、僕の家には Cisco ルータもしくはスイッチが無いので VyOS で確認してみました。

まず VyOS で LLDP を有効にします。

set service lldp interface eth0

 
FreeBSD 側から LLDP が届いているか確認するには以下のコマンドを打ちます。

takachan@vyos:~$ show lldp neighbors 
Capability Codes: R - Router, B - Bridge, W - Wlan r - Repeater, S - Station
                  D - Docsis, T - Telephone, O - Other

Device ID                 Local  Proto  Cap   Platform             Port ID 
---------                 -----  -----  ---   --------             ------- 
wanchan.running-dog.net   eth0   LLDP   RS     FreeBSD 10.3-RELEAS em0     

 
VyOS には LLDP の確認コマンドに対しては show lldp neighbors しかないので貧弱です。Cisco スイッチのように show lldp entry HOGE みたいなのがあっても良いのですけどねぇ。そーいうのはないようです。

 
lldpd を起動した FreeBSD 側での確認するには lldpcli コマンドを利用します。
ウダウダ出るので詳細は書きませんが以下のコマンドを打つと『なるほどね。』となると思います。
あ。 root でコマンドを実行する必要があります。

  • lldpcli show chassis
  • lldpcli show neighbors
  • lldpcli show neighbors summary
  • lldpcli show neighbors ports vmx0
  • lldpcli show statistics

lldpcli コマンドは UI が貧弱なのでとんなオプションがるのかちぃーとも分かりません。しょーがないのでソースコードで確認です。 src/client/show.c を眺めてオプションを把握しますX-|。

なお、 lldpcli が面倒な場合は素直に lldpctl コマンドでオプション無しが良いでしょう。 -h でパラメータも表示してくれます。

 
ただ、 FreeBSD で動作する lldpd は多少問題があるようです。

1). ports の Makefile があやすぃ・・。
net-mgmt/lldpd/Mkaefile の中の CONFIGURE_ARGS で –with-privsep-chroot=/var/empty という行があるのですが、 /var/empty って Read Only やんけ。 lldpd は起動時に /var/empty/etc/timezone を生成しますがそれができないので WARNING なメッセージが出力されます。
僕は Makefile をいじって –with-privsep-chroot=/var/run/lldpd にしてしまいました。

2). bsnmpd と相性が悪い?
lldpd を起動すると以下のメッセージが出力されます。

snmpd[810]: RTM_NEWMADDR for unknown interface 0

 
/usr/lib/snmp_mibII.so の handle_rtmsg() で出ているんだけど、原因がイマイチ分からん。bsnmpd と lldpd を同時に起動すると上記のメッセージが出力される場合があります。

気付いたのはこの二点かな。

 
これで一応、FreeBSD も LLDP を投げるようになり lldpcli で確認することもできます。 lldpcli は mDNS でいうところの avahi-browse と似たようなモンんでしょうかね。

上にも書いた通り mDNS を利用するか LLDP を利用するかについてはネットワーク運用部門の人と綿密に計画を立てて行うのが良いかと思われます。 Cisco 機器の場合 LLDP をサポートしている機器や ISO のバージョンがあまり多くはないような気がしないでもないですし。

まぁ、それにしても、自宅のネットワークの場合は全て僕一人で行うんですけどもね;-)。

 コメントを書いてください。

HTML タグが利用できます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <img localsrc="" alt="">

(必須項目)

(必須項目)

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)