t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

Cisco スイッチのDHCP Relay機能を使ってVLANで分割したネットワークにそれぞれのIPアドレスを割り当てる検証

今回は自宅のメインスイッチであるCisco CBS250のDHCP Relay機能を使ってVLANで分割したネットワークにそれぞれDHCPでアドレスを割り当ててみた。

これまた知識不足により4時間くらいハマったのでうまくいった方法を忘れないようにメモしておこうと思う。

ハマった原因はルーティング。
簡単にいえば、NWの世界では相手に到達できても、戻ってこれるとは限らないのだ。
この特性を現実世界に例えるなら、実在する住所から郵便物が届いたので、こちらも送り返そうとしたら配達員に「そんな宛先知らない」って言われる感じ。

いやあんたが持ってきたんだよね??

現実世界ではあんまりあり得ないけど、ネットワークの仕組み上はちゃんと行きと帰りでそれぞれルーティングされてないとこうなる。

構成

この微妙な図はNW学習始めたばかりの素人なのでご容赦を。。
f:id:t-hom:20220327004553p:plain

前提知識

DHCPとはIPアドレスを自動で割り当てる機能のことで、ホームネットワークだと通常はブロードバンドルーターやNTT等のルーター機能付きONU(ホームゲートウェイ)がDHCPサーバーの機能を持っている。

基本的にDHCPは同じネットワーク内の端末へIPアドレスを配るが、異なるネットワークの端末へIPアドレスを直接払いだすことはできない。

ではどうするかというと、1つはネットワークごとにDHCPサーバーを用意するという方法がある。
もうひとつは、ルーターやL3スイッチ等にDHCP通信を中継してもらって異なるネットワークにIPアドレスをお届けするという方法がある。この中継機能をDHCPリレーという。

始めにやったこと

TEST_VLANの作成

f:id:t-hom:20220327001735p:plain

ポート4をTEST_VLANへ参加

f:id:t-hom:20220327001945p:plain

TEST_VLANに固定IPアドレス10.1.1.1を割当

f:id:t-hom:20220327002639p:plain

DHCPリレーのプロパティでDHCPサーバーのIP情報を追加

f:id:t-hom:20220327002237p:plain

DHCPリレーのインターフェース設定でTEST_VLANを指定

f:id:t-hom:20220327002738p:plain
※ポート4とVLAN1はハマっていろいろ試したときの名残りで恐らく蛇足。
 近々綺麗にするつもりだけど、とりあえず今日のところはこれで動いているということで。

ISC-DHCPの設定追加

# これは以前から書いてたやつ
subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.150 192.168.1.200;
  option routers 192.168.1.1;
  option domain-name "local.thom.jp";
  option domain-name-servers 192.168.1.1, 192.168.1.1;
  option broadcast-address 192.168.1.255;
  ignore declines;
#このあとホストごとの固定IP指定が続くけどスペースの都合で省略
}

# 以下が今回追加
subnet 10.1.1.0 netmask 255.255.255.0 {
  range 10.1.1.100 10.1.1.200;
  option routers 10.1.1.1;
  option domain-name "local.thom.jp";
  option domain-name-servers 192.168.1.1, 192.168.1.1;
  option broadcast-address 10.1.1.255;
  ignore declines;
}

書いたらISC-DHCPサーバー再起動

ハマったことと解消方法

DHCPサーバーはIPを払い出そうとしてるのにクライアントに届かない

1) VLAN検証端末はDHCPサーバーを探そうとしてDHCP Discoverを送り続ける。
2) DHCPサーバーはDHCP Discoverを受け取り、IPアドレスを提案しようとしてDHCP Offerを送りつづける。
3) しかし一向にIPアドレスが割り当てられることはない。

原因

パケットの帰り道のルーティングがないのが原因だった。
ネットワークエンジニアからすればそら繋がらんわという話だろうけど、まだまだ一般人な私は「来た道辿って帰れるでしょ」と無意識に考えてしまう。
そうじゃないんだ。

動作としては、
1) VLAN検証端末(IP未定)がDHCP Discoverをブロードキャストする
VLAN検証端末:「誰かDHCPくださーーーーい!」

2) Cisco CBS250スイッチ(10.1.1.1)が聞き取って、DHCPリレーによりDHCPサーバー(192.168.1.100)に届ける
Cisco CBS250スイッチ「DHCPサーバーさん、VLAN検証端末がIP欲しいそうなんでこれよろしく」

3) DHCPサーバーがIPアドレスをデフォルトゲートウェイ(192.168.1.1)経由でオファーしようとする
DHCPサーバー「ゲートウェイさん、スイッチ(10.1.1.1)にこのIP(10.1.1.101)のオファーもらえますか」

4) ゲートウェイ(192.168.1.1)側に10.1.1.0/24ネットワークのルーティングが無いのでコケる
ゲートウェイ「は?10.1.1.1て、どこの誰?」

解決した方法

本来はこのCBS250がL3ルーティング機能を持ってるのがややこしくて、やるならVLAN1のゲートウェイをCBS250に担当させれば良いのかもしれない。
今回取った方法はそうではなく、単にNTTホームゲートウェイ(192.168.1.1)に10.1.1.0/24に対するスタティックルート192.168.1.254を設定したこと。
f:id:t-hom:20220327011902p:plain

普段はネットへの中継機としてしか使わないPR-500KI。
一応ルーティング機能も持ってた。

4-Take2) ゲートウェイ(192.168.1.1)は10.1.1.0/24ネットワーク宛ての通信が来たのでCBS250のVLAN1(192.168.1.254)に渡す
ゲートウェイ「CBS250さん、10.1.1.1宛てにIPアドレスオファー届いてるんで渡しといて」

5) CBS250はTEST_VLANに受け取ったIPをブロードキャストする
CBS250「あ、これ私の裏口(TEST_VLAN)宛てだわ。VLAN検証端末さん宛のIPオファーきましたよーー」

6) VLAN検証端末はそのIPで避ければ正式にDHCP Requestする
VLAN検証端末「あ、これ欲しい。よろしくおねがいしまーーーす。」

あと動作的には2)~繰り返して正式確定させる感じ。

VLAN検証端末からネットに出られない。

IPはもらえたけどネットに繋がらない。
googleのDNS 8.8.8.8宛てにtracerouteしてみると、10.1.1.1でパケット破棄されてるっぽい。

原因

これまたルーティングの問題。
CBS250はDHCPブロードキャストが来たら192.168.1.100に通すというルールを知ってるけど、192.168.1.1をデフォルトゲートウェイに設定してあげないと、8.8.8.8とか言われてもどこに渡せば良いのか分からないのだ。
デフォルトゲートウェイってのは、知らない宛先が来たら転送する先のこと。

解決した方法

CBS250のIPv4スタティックルート設定で0.0.0.0/24宛ての通信を192.168.1.1へ転送するように設定。
f:id:t-hom:20220327013908p:plain

これも本当に合ってるのは不明。
Tracerouteがかなり時間かかるようになったのとスイッチのWebUIが遅い気がしていて、ひょっとしてネットワークループとか発生してたらどうしようと心配しているところではある。

ま、一応これでTEST_VLANからインターネットにも出られるようになった。

もうちょっと基本的な事をしっかりと勉強しないといけないなぁと思いつつも、基礎知識に興味もつ前に一応曲がりなりにも意図したとおりに動いたという体験が、もっと知りたいという学習へのモチベーションになるので、今回の検証はその意味で成功だったと思う。

このまま運用なんてことは怖くて到底できないけど。

以上。

Redmineを使い始めてみた ~ プロジェクト管理&資産管理(CMDB)

最近Redmine環境を構築したので、早速プロジェクト管理と資産管理で使ってみた。
本格的に使うのは初めてだが、一応Vagrantで開発サーバーを立てて検証は何度かやって、1冊書籍を読んだくらいの知識はある。

まずはプロジェクト管理。
最近自宅のネットワーク環境を、勉強(道楽)を兼ねて無駄に強化したいという想いが強まっているのだが、想っているだけでは物事は実現しない。
よってタスクを分解して、実現までの段取りを計画してやる必要がある。
Redmineを使ってこのように計画を立ててみた。
f:id:t-hom:20220325132900p:plain
※まだタスク登録の途中なので不足する項目はあると思う。

何のことはない、ただのToDoリストである。
ToDoに比べると非常にカスタマイズ性が高いので、将来的に何か追加の管理項目を増やしたい場合も簡単に対応できる。


次にプロジェクトに関連するネットワーク端末を管理することを考えたが、これもどうせならExcelじゃなくてRedmine管理にしてみた。
こんな感じ。
f:id:t-hom:20220325132707p:plain

もちろん本来Redmineは資産管理ツールではないので自動インベントリ収集機能などはなく企業で使うのには向いていない。
ただカスタムフィールドを作れるので、個人資産の手動管理であれば十分対応できる能力がある。

プロジェクトは1タスク=1チケット。資産管理は1機器=1チケット。
チケット管理という単一の仕組みでいろんな使い方に応用できるのが面白いと思った。

Redmineの難しさ

こんな記事でもひょっとすると興味を持ってくれる方がいるかもしれないが、Redmineは前提知識なしに直感的に導入できるツールではないので、Wordpressみたいな操作感を期待していると面食らってしまうと思うので下調べが必要。
もし使いたい場合はYouTubeや書籍で一通り下調べしてみると良いかと思う。

管理者が初期設定とプロジェクトに応じたカスタマイズを済ませたあと、ユーザーとして使う分には比較的簡単に使えると思う。

面倒くさがらずに運用するために

私はRedmine活用に先立って以下の書籍で学習したのだが、その中の教訓として「なるべくシンプルに設計すべき」という趣旨の話が書かれていた。

入門Redmine 第5版

入門Redmine 第5版

Amazon

例えばステータスやカテゴリー等は頑張ればいくらでも細かく設定できるし、カスタム入力フィールドもいくらでも作れる。
あらゆる項目を必須入力にしてガチガチに運用することもできる。

でも多分、最初からそんなに張り切ってたんじゃ燃え尽きるのも時間の問題だ。
少し運用してみて分かったのが、Redmineでは後から項目を追加するのがすこぶる簡単だということ。
まぁそもそもDBなので当たり前なのかもしれないが、システムによっては項目を増やすと全アイテムの項目に一つずつ設定しなければならないケースもある。

Redmineでは項目を増やしても、チケットを全選択あるいは必要な部分だけポチポチと選択した後に一括で値を設定する機能がある。

従って不要な機能や設定はバサッと削除して、これが無いとそもそも機能しないという必要最小限の構成で運用を始めると良いと思う。

こういう必要になるまで追加しないというスタンスをソフトウェア開発の現場ではYAGNI原則という。
"You Ain't Gonna Need It"→「直:お前それ要らんやろ」

RedmineでYAGNI原則が通用するのは整合性を破壊することなく簡単に追加できるからである。

ということで、今後も緩めに運用していこうと思う。

沢山機能があるからといって、張り切らないこと。
管理は必要悪と心得る。これが長く続けるコツかなぁと思った。
ま、使い始めたばかりで何を語ってるんだという話だけども。

以上

Docker上のRedmineにテーマを設定する

最近、個人的なプロジェクト管理にRedmineを使えないか検証しているのだが、「よしこれを使い続けよう」と思えるためにはツールのビジュアルはとても重要である。

幸いなことに有志が作成したテーマがいくつか公開されている。
www.redmine.org

その中から、自分の感性に合うテーマ2つほどを見繕ってみた。
f:id:t-hom:20220324004103p:plain

白ヘッダーの方↓
github.com

青ヘッダーの方↓
github.com


無償であること、git cloneのみで導入できること、redmine4.2をサポートしていることという条件で探すと上記の2つプラスアルファくらいしかなかったけど、まぁ気に入ったので結果オーライ。

通常だと/var/lib/redmine/public/themesにcdしてgit cloneで落としてくるだけなんだけど、Dockerの場合は問題が2つある。

  1. dockerイメージは軽量化のために通常と異なるディレクトリ構成を取っている可能性が高い
  2. Dockerfileでインストールできるのかよく分からない。

まずディレクトリ構成ついて調べてみた。
以下のdockerコマンドで、起動中のrm-containerへ入ってみると、、

sudo docker exec -it rm-container /bin/bash

最初から「/usr/src/redmine」に居るようだ。
そこにpublic/themesがある。

つまりテーマのインストール先指定は単にpublic/themes/とすれば良さげ。

次にDockerfileを使ったテーマのインストールを検索していみるとズバリなページが見つかった。
qiita.com

サブディレクトリの記述については特に必要なかったので読み飛ばすとして、やってることは単に必要なUNIXコマンドいれてダウンロードしてフォルダーにコピーして不要ファイルを消して。。というだけ。

それなら、ちょっと強引だけどgit導入してcloneするという処理をそのまま書けば動くのでは。。ということでやってみた。

FROM redmine:4.2.4-bullseye

ENV REDMINE_DB_MYSQL=mysql-container \
    REDMINE_DB_USERNAME=root \
    REDMINE_DB_PASSWORD=ここにデータベース接続パスワードを書く

RUN apt-get update \
 && apt-get install -y --no-install-recommends git \
 && rm -rf /var/lib/apt/lists/* \
 && git clone -b redmine4.2 --depth 1 https://github.com/farend/redmine_theme_farend_bleuclair.git public/themes/bleuclair \
 && git clone -b v1.2.1 --depth 1 https://github.com/makotokw/redmine-theme-gitmike.git public/themes/gitmike \

redmineバージョンとテーマのバージョンを合わせる必要があったので、どちらもバージョン指定している。

これで2つのテーマが入ったので、あとは管理→設定→表示→テーマと辿るだけ。

参考

テーマが変更できるというのはこの動画で知った。
youtu.be

テーマの変更方法は上記の講演者と同じく、前田 剛さんが執筆されている以下の書籍で知った。

入門Redmine 第5版

入門Redmine 第5版

Amazon

バーベキューの段取りでRedmineを体験してみようという、掴みが面白い本なのでRedmineに興味がある方は確認してみると良いかと思う。

第5版が出てから随分経ってるのでそろそろ電子版に対応したレイアウトで第6版が出ると嬉しいのだが。

以上

Raspberry Pi 3B+にdockerを導入してRedmineサーバーを作成

今回はラズパイにDockerを導入してRedmineサーバーをコンテナとして構築してみた。

ラズパイならではのハマりどころがいくつかあったので記事として残しておこうと思う。

参考書籍

参考にしたのは次の書籍。

まさにRedmineを構築する事例が紹介されているので、そちらを使う算段である。

機材

必要な機材はRaspberry Pi 3B+とある程度速度が出るMicroSDカードである。

SDカードは、初めは10枚5000円くらいで買った激安品を使っていたが、redmineのコンテナを起動する際に頻繁にフリーズして使い物にならなかった。そこで1枚3000円くらいの普通のSDカードに切り替えたところうまくいった。

以下はうまくいかなかったカードとうまくいったカードのベンチマーク比較。

これで数時間ハマった。

OS

OSはRasbberry Pi OS Lite 64bit版を使用する。

理由として、Dockerは公開されているコンパイル済イメージをダウンロードする仕組みになっており、32bit版を選んでしまうと適合するイメージがあまり公開されていない為である。

これまた数時間ハマった。

64bitOSは、公式のSDカード書き込みツールだとOtherの中にある。

手順

OSのUpdateとdockerのインストール

sudo apt update
sudo apt upgrade
sudo reboot ←upgrade後に再起動
sudo apt install docker

Dockerファイルの準備

/home
└── pi
    └── docker
        └── mydatabase
            ├── mysql
            │   └── Dockerfile ←(1)
            ├── phpmyadmin
            │   └── Dockerfile ←(2)
            └── redmine
                └── Dockerfile ←(3)
(1) MySQLのDockerfile
FROM mysql/mysql-server

ENV MYSQL_ROOT_PASSWORD=ここにデータベースのrootユーザーパスワードを書く \
    MYSQL_ROOT_HOST="%"

CMD ["mysqld",\
"--character-set-server=utf8mb4","--collation-server=utf8mb4_unicode_ci",\
"--default-authentication-plugin=mysql_native_password"]

注意) ここで設定するパスワードはダブルクォートで囲ったりしないようで、私の場合は囲ってしまったのでダブルクォートごとパスワードになってしまった。。まぁアプリ同士が通信する用で、自分が普段使いするものではないのでそのまま運用する予定。

(2) PHP MyAdminのDockerfile
FROM phpmyadmin
ENV PMA_HOST=mysql-container \
    PMA_USER=root \
    PMA_PASSWORD=ここにMySQLで設定したのと同じrootユーザーパスワードを書く
(3) RedmineのDockerfile
FROM redmine

ENV REDMINE_DB_MYSQL=mysql-container \
    REDMINE_DB_USERNAME=root \
    REDMINE_DB_PASSWORD=ここにMySQLで設定したのと同じrootユーザーパスワードを書く

イメージ構築

Dockerコンテナ同士が通信するための内部ネットワーク作成
sudo docker network create mysql-nw
データの永続性を担保するためのデータボリュームとそれを保持するデータボリュームコンテナ作成
sudo docker volume create --name=db-volume
sudo docker run -v db-volume:/var/lib/mysql/ --name=db-container busybox
アプリケーションコンテナのビルドと起動

MySQLの起動

sudo docker build -t mysql-image ~/docker/mydatabase/mysql
sudo docker run --volumes-from=db-container --name=mysql-container --net=mysql-nw -d mysql-image

phpMyAdminの起動

sudo docker build -t pma-image ~/docker/mydatabase/phpmyadmin
sudo docker run --net=mysql-nw --name=pma-container -p 8080:80 -d pma-image

これでPCのブラウザからラズパイのIPの8080ポートにアクセスするとphpMyAdminが起動するのでredmineという名前の空のデータベースを作っておく。
ここまで終わったらphpMyAdminのコンテナは停止・破棄しても良い。

Redmineの起動

sudo docker build -t rm-image ~/docker/mydatabase/redmine
sudo docker run --net=mysql-nw --name=rm-container -p 80:3000 -d rm-image

設定が正しければこれでブラウザからラズパイにアクセスするとredmineが表示される。
ただ、コンテナ起動直後はアクセスがうまくいかず、初回ページを開こうとしたらアクセス拒否されたと表示された。
しばらく時間を置くとうまくいく。
※内部で何かIOアクセスをしているようで、ここがショボいSDカードだといつまでたってもアクセス拒否のままで進まなかった。

時間を置いても失敗する場合はhttp://もちゃんとつけると良い。SSLを導入していないのでブラウザがお節介でhttpsでアクセスしようとすると失敗する。

よし、動いた。

運用手順

電源OFF

Dockerはコンテナは使い捨てというコンセプトなので電源を切るときはアプリケーションコンテナは破棄する運用とした。
ただしデータボリュームコンテナを破棄すると面倒なのでそれは置いておく。

まずはdocker ps -aコマンドで破棄対象を確認する。

hom@raspberrypi:~ $ sudo docker ps -a
[sudo] password for thom:
CONTAINER ID   IMAGE         COMMAND                  CREATED             STATUS                       PORTS                       NAMES
4f6765d72a86   rm-image      "/docker-entrypoint.…"   About an hour ago   Up About an hour             0.0.0.0:80->3000/tcp        rm-container
4c73f0ae2f39   mysql-image   "/entrypoint.sh mysq…"   About an hour ago   Up About an hour (healthy)   3306/tcp, 33060-33061/tcp   mysql-container
76d78ea098ea   busybox       "sh"                     4 hours ago         Exited (0) 4 hours ago                                   db-container

次にコンテナIDの先頭数桁を指定してコンテナを止める。
他のIDと区別できれば良いので、上記の場合なら2桁目までで問題ない。

sudo docker stop 4f 4c

データボリュームコンテナ以外のコンテナを削除する

sudo docker rm 4f 4c

シャットダウンする

sudo systemctl poweroff

電源ON

作成したDockerネットワーク・データボリューム・データボリュームコンテナと、ビルドしたイメージはそのまま残っているので、電源を入れた際に対応するのはコンテナ作成のみ。

以下のように2つコンテナを起動させれば元通りである。

sudo docker run --volumes-from=db-container --name=mysql-container --net=mysql-nw -d mysql-image
sudo docker run --net=mysql-nw --name=rm-container -p 80:3000 -d rm-image

終わりに

何かひとつでも自宅環境でDockerを使った本番運用してみたいと思っていたので今回その目的が達成できた。

Dockerは誰かが構築してくれたインフラ+アプリに可搬性を持たせて簡単に環境構築できるようにしてくれる便利なツールである。
今回もMySQLやRedmineのパッケージインストールや依存関係との闘い、パラメーター設定等のややこしいことをせずに最低限のDockerfile記述だけで環境構築ができた。

しかもコンテナは使い捨てなので、運用中にもし何かおかしくなっても破棄してイメージから再作成すれば良い。
作成したイメージには可搬性があるのでもし本体のOSがおかしくなっても同じ64bit版のラズパイ宛であれば環境ごと移行することもできる。

もしDockerに興味がある方は私が購入したこちらの書籍がおススメ。

第6章くらいで書いてある通りに進められない箇所が出てくるけど、それを差し引いても入門書としてはコンパクトにまとまっていて、作業内容が明確なので、Linuxを触り慣れていてDockerは初心者という方が始めるにはちょうど良いと思う。

VLANを理解するためにCisco 892ルーターで色々と遊んでみた

今回は手持ちのルーターCisco 892を使ってVLANの挙動を確かめてみた。

Vagrantで仮想マシンを4台起動させてUSB-LANアダプターへブリッジネットワークを作成し、ルーターと次のように接続している。
f:id:t-hom:20220323003944p:plain

4台の仮想マシンをそれぞれのLANアダプターへブリッジさせる方法は以下の記事参照。
thom.hateblo.jp

ルーターは内部的にはスイッチング機能とルーター機能に分かれていて、スイッチング機能のほうは実質L2スイッチとなっている。各FastEthernetポートはデフォルトではVLAN 1が割り当てられており、たとえネットワークセグメントが違ったとしてもポートに接続された機器同士は通信ができてしまう。
f:id:t-hom:20220323004702p:plain

ここで今回ややこしいのが、VMにネットワークの出口が2つあるということだ。
ひとつはeth0で、ホストPCへ繋がっている。
もう一つはeth1で、ルーターのスイッチポートへ繋がっている。

何がややこしいかというと、eth1と異なるネットワークへ通信しようとした場合、通常はeth0へ探しに行ってしまうということ。

なのでVM側で経路設定してやらないと、先ほど書いた「たとえネットワークセグメントが違ったとしてもポートに接続された機器同士は通信ができてしまう。」ということを検証できない。

VM側で経路設定するにはip routeコマンドを使用する。
例えばVM-A(10.1.10.2)とVM-B(10.1.10.3)で以下のコマンドを入力することで、10.1.20.0/24ネットワークへ向かう場合の出口はeth1だということを教えてやることができる。

sudo ip route add 10.1.20.0/24 via 0.0.0.0 dev eth1

VM-C(10.1.20.2)とVM-D(10.1.20.3)では反対に10.1.10.0/24への経路を設定する。

sudo ip route add 10.1.10.0/24 via 0.0.0.0 dev eth1

何とも面倒な話なので、以前はデフォルトゲートウェイをeth1側にすれば良いのではと思ってたんだけど、そうするとaptコマンドで特定のパッケージをインストールするのにネットに繋げたいというときに不便なので、これくらいの検証ならスタティックに経路設定するというところに落ち着いた。

さて、この設定が終わると、例えばVM-AからVM-Cへのpingが疎通するようになる。

IPアドレスのネットワークセグメントが違うのにどうして通信できるのか?
ルーターだからルーティングしてるのでは?と思うかもしれないけどルーティングはしてない。

答えは単純で、スイッチングはそもそもL2(データリンク層)の話なので、IPアドレスなんて最初から見てなくて、MACアドレスで通信してるから。

これを論理的にネットワーク分割する機能がVLAN。
以下のようにVLAN 10とVLAN 20に分けた場合、VM-AからVM-Cへのpingは通らなくなる。
f:id:t-hom:20220323011335p:plain

ルーターやL3スイッチの場合はVLANの仮想インターフェースにIPアドレスを設定することでVLAN間がルーティングされ、再びVM-AからVM-Cへpingが疎通するようになる。
f:id:t-hom:20220323011656p:plain


もともと1つだったものをVLANで分けて、またルーターで繋げるなんて、なんでそんなややこしいことをするのか?
私が理解したメリット以下の3つである。

  1. VLANで分割することによりブロードキャスト(全員宛通信)の範囲を絞ることができる。
  2. どのVLANの通信を優先的にインターネットと通信させるかなど、通信の優先度をコントロールできる。
  3. VLAN間をルーターで接続することで特定の相手との通信は可能になり、さらにどんな通信を通してどんな通信をブロックするのか細やかに制御できる。


ということで今回はVLANで分割したり、VLAN間をルーティングさせたりということを1台のルーターを使ってやってみた。
やはり書籍を読んだだけでは理解がおぼつかなかった部分も実機を触ってみるとスッキリと理解できるということを改めて実感した。

ラズパイをGUIから固定IP化するとDHCP INFORMパケットがネットワークに溢れてしまう件

昨日ラズパイでDHCPサーバーを立てる検証をしたという記事を書いた。
thom.hateblo.jp

実はあの後、ラズパイ3B+で本番DHCPサーバ兼DNSサーバーを構築して、このようにPoE給電で稼働している。(DNSも兼務)
f:id:t-hom:20220321224715p:plain

※PoEもLAN挿しただけでは電源が入らずに何時間も悩んだんだけど、そっちは活線挿抜がご法度だったことを思い出してスイッチごと電源落とした状態で接続してスイッチ電源入れたら無事に稼働した。

さて、安定稼働しているように思えたのだが、M5 Stackからの接続に時折失敗するということに気づいてsyslogを調査していたところ、やけにDHCP関連のログが多い。

こちらはラズパイメイン機(192.168.1.101)からラズパイDHCP機(192.168.1.101)へDHCP Informパケットが流れている様子。
f:id:t-hom:20220321223930p:plain

よく見たら多いなんてもんじゃなくて、秒単位でガンガン送ってる。

やめろ。。。ブロードキャストだぞこれ。。

それで色々検索してみると、/etc/dhcpcd.confのipアドレス設定がstaticではなくてinformになってることが原因だということが分かった。
forums.raspberrypi.com

どうやらラズパイのGUIから固定IPアドレスを設定すると、StaticではなくてInformという設定になってしまうらしい。

今回の対処としてはstaticではなくて、結局DHCP取得に戻すことにした。
理由としてはローカルドメイン名(local.thom.jp)も併せてDHCPで配布しないとホスト名だけでの名前解決ができないので、結局DHCPに頼ることになる為である。ローカルドメインもスタティックに指定するという方法はあるが、それはそれで複数台もってると管理が面倒くさくて一元管理したくなる。

DHCPに戻すときは単にGUIから設定をクリアするだけ。
f:id:t-hom:20220322001649p:plain

Staticにしたい時はGUIは使わずに/etc/dhcpcd.confを編集する。

設定が終わったらDHCPクライアントサービスを再起動しておく。

sudo systemctl restart dhcpcd.service

以上でクライアント側の設定修正完了。

あと今回の事象とは直接の関係はないけど、そもそもDHCPのIPアドレスのリース期間が600秒は短すぎた。
クライアントは期限切れの半分の時間で延長リクエスト出してくるので、実際には300秒=5分毎にIPアドレス更新をリクエストされる。
公衆ネットワークの場合は使わないIPはなるべく早く返却してもらって次の端末の為に開放する必要があるためリース期間を短くするが、自宅や会社などではクライアントが概ね固定なので普通は長めにとるらしい。

ということでDHCPサーバーの/etc/dhcp/dhcpd.confのリースタイムを次のように編集。

default-lease-time 172800;
max-lease-time 604800;

デフォルトが48時間(172800秒)で、クライアントがそれ以上を要求した場合の最大値が7日(604800秒)とした。
ちょうど半分の24時間でアドレス更新リクエストが来るイメージ。

この設定が終わったらDHCPサーバーのサービスも再起動しておく。

sudo systemctl restart isc-dhcp-server.service

これでサーバー側も修正作業完了。

終わりに

今回はDHCPサーバー立てたおかげでDHCPクライアント側のおかしな挙動に気づくことが出来た。
またログが出るので自分でDHCPがどうなってるのか理解できるようになったのも大きい。より本格的にやるならパケットキャプチャ―になるんだろうけど、DHCPサーバーのsyslogを見るだけでも割と勉強になる。

以下はクライアントからのリクエストに応えているログ

Mar 21 22:26:08 raspberrypi dhcpd[1001]: DHCPDISCOVER from b8:27:eb:XX:XX:XX via eth0
Mar 21 22:26:08 raspberrypi dhcpd[1001]: DHCPOFFER on 192.168.1.101 to b8:27:eb:XX:XX:XX via eth0
Mar 21 22:26:08 raspberrypi dhcpd[1001]: DHCPREQUEST for 192.168.1.101 (192.168.1.100) from b8:27:eb:XX:XX:XX via eth0
Mar 21 22:26:08 raspberrypi dhcpd[1001]: DHCPACK on 192.168.1.101 to b8:27:eb:XX:XX:XX via eth0

上の会話を翻訳するとこんな感じかな。
DHCPDISCOVER … (クライアント)IPアドレス探してます!
DHCPOFFER … (サーバー)この番号どうですか?
DHCPREQUES … (クライアント)あ、じゃあそれください。
DHCPACK … (サーバー)はいどうぞ。

あ、あとNTTホームゲートウェイの方はDHCPもWi-Fiも無効化することが出来たので今やほぼ只のONUと化している。
そのせいか、ホームゲートウェイの再起動がすぐに完了するようになった。だからどうしたという話ではあるけど。

以上

ネットワークラボを別室へ移しても使えるようにUSBデバイスサーバーを買ってみた。

最近ネットワークの勉強をしている為、机の上にルーターが常時鎮座しておりなかなか圧迫感が凄い。
今回はこれをなんとかするための実験的取り組みである。
f:id:t-hom:20220312232005p:plain

なぜこうなるかと言うと、スペックの高いメインパソコンでバーチャルマシン(VM)をたくさん動かして、VM同士を通信させているため、どうしてもPCとルーター間のケーブル本数が増えてしまうためだ。
f:id:t-hom:20220320204948p:plain

さすがに4本の長ーいLANケーブルをそのまま別の部屋まで引っ張るということはしたくないが、かといって長ーいUSBケーブルでUSBハブごと別室にもっていくというのもあまり気が進まない。
そもそもUSBの伝送距離はたかだか10m程度だったと思う。

コンソール接続についてはコンソールサーバーとして使えるCisco2509というルーターを見つて注文したのでこれで解決するんだけど、端末であるVMを繋ぐのにどうするかというのが目下の課題だった。

そこで色々調べまわっていたら、USBデバイスサーバーというアイテムに出会った。
これはUSBハブをネットワーク接続にしてしまって、パソコンから専用ソフトを使うことであたかも自分のPCにUSBハブがそのまま挿さっているかのように扱えるという代物。

ただ口コミを探しても精々NW非対応のプリンターをUSB化したりNAS代わりにUSBハードディスクを挿すという使い方ばかりで、NW経由でUSB-LANアダプタを繋ぐなんていう変な使い方は全く情報がない。

そんなのに1万も出すのはちょっと怖いなぁと思ってたところ、旧式のCoregaCG-NUH04がメルカリで安く売られていたので購入してみた。もうとっくにサポートも終了しているのでネット経由ではユーティリティダウンロードもできないため、ユーティリティディスク付きを購入した。

検証の接続図はこんな感じ。
f:id:t-hom:20220320204012p:plain

完全にダメ元だったけど、これがなんと、PCから普通に検証用ルーターにpingが通ったのだ。

PCが放ったpingはUSBネットワークカードに宛てたUSB信号となり、コレガのユーティリティがそのUSB信号をネットワーク信号に変換してコレガのデバイスサーバーまで届けられ、一旦USB信号に復号化されたのちにTP-LinkのUSB-LANアダプタで再びネットワーク信号になって検証用ルーターまで届けられる。恐らくそういう動作だ。すげぇなこれ。。

USB2.0は実測300Mbpsくらいしか出ないので普段使いのネットワークに組み込むのには向いてないけど、もともとラボ用のルーターは100Mbpsなので、今回の用途にはうってつけだった。

f:id:t-hom:20220320211606p:plain

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。