はじめに
家のLAN内でラズパイのsyslogを監視したい
ラズパイのsyslogを fluentd で捕捉したい
・・・そしていずれは kibana でグラフィカルに見たい!
今回はラズパイのsyslogをDockerに立てたfluentdで閲覧するところまで行う
(おまけ)その過程で、疎通確認も兼ねてHTTPアクセスもしてみた
~編集後記~
単にWinマシンのIPアドレスへアクセスしてもDockerコンテナまでは届かない
HTTPによるTCP通信も同時に試していたことで、syslog(UDP)がDockerコンテナへ届かない問題の原因切り分けができた
検証環境
DockerのホストはWindowsマシン
同一のプライベートアドレス空間にあるラズパイがWindowsへsyslogを投げる
- Windows 11 Home (Dockerホスト)
- 192.168.10.101
- ラズパイ 3B+
- 192.168.10.81
まだWindowsにDocker環境がない場合の参考:Windows+WSL2でDocker環境を用意しよう
LANからDockerコンテナへアクセス許可
冒頭の編集後記でも書いた通り、単純に 「http://Windowマシン」としても
Dockerホスト以外のマシンDockerコンテナへまで通信が届かない
(ホストからはhttp://localhostで簡単にDockerコンテナへアクセスできるのに)
WSL2から既定の動作が変わっているらしい
ローカル エリア ネットワーク (LAN) からの WSL 2 ディストリビューションへのアクセス
コマンドプロンプトで wsl -l -v
を実行すると、WSLのVERSIONを確認できる
NAME STATE VERSION
* docker-desktop-data Running 2
podman-machine-default Stopped 2
Ubuntu Running 2
docker-desktop Running 2
VERSIONは2でした
なので、ひと手間必要です
(WSL1がどうだったかは知る由もない)
WSL2(Ubuntu)のIPアドレスを取得する
Windowsの検索で「Ubuntu」を検索して実行
黒い窓が立ち上がる
ip addr
でetho0に割り当てられているIPアドレス(ここでは 172.17.82.122
) を調べる
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:7b:a8:d8 brd ff:ff:ff:ff:ff:ff
inet 172.17.82.122/20 brd 172.17.95.255 scope global eth0
Windowsポートフォワード設定
先ほど調べたIPアドレス 172.17.82.122
に対してポートフォワード設定を行う
netsh interface portproxy add v4tov4 listenport=24224 listenaddress=0.0.0.0 connectport=24224 connectaddress=172.17.82.122
netsh interface portproxy add v4tov4 listenport=8000 listenaddress=0.0.0.0 connectport=8000 connectaddress=172.17.82.122
netsh interface portproxy add v4tov4 listenport=5140 listenaddress=0.0.0.0 connectport=5140 connectaddress=172.17.82.122
設定が反映されているか確認する
netsh interface portproxy show v4tov4
コマンドの結果2行が表示され、設定が反映されていることがわかる
ipv4 をリッスンする: ipv4 に接続する:
Address Port Address Port
--------------- ---------- --------------- ----------
0.0.0.0 24224 172.17.82.122 24224
0.0.0.0 8000 172.17.82.122 8000
0.0.0.0 5140 172.17.82.122 5140
Windowsファイアウォールの設定
受信の規則から、必要なポートへのアクセスを許可する
今回許可するのは以下3つ
- syslog用
5140/tcp
- 汎用デバッグ用
24224/tcp
- HTTP用
8000/tcp
あらたに3行の規則を追加する
セキュリティ上、念のため、送信元はラズパイ(192.168.10.81
)に限定している
Dockerコンテナを立ち上げる
fluentdと軽量httpサーバの2つを立ち上げる
docker-compose.yml
- fluentdは固定IPアドレスを持つ
- ポートをホストに3つ公開する
- webも固定IPアドレスを持つ
- 8000ポートを公開する
- webのログはfluentdに流す
version: "3"
services:
fluentd:
build: ./fluentd
volumes:
- ./fluentd/conf:/fluentd/etc
ports:
- "24224:24224"
- "24224:24224/udp"
- "5140:5140"
networks:
efk-net:
ipv4_address: 172.22.0.10
web:
image: nginx:alpine-slim
ports:
- 8000:80
logging:
driver: "fluentd"
options:
fluentd-address: 172.22.0.10:24224
fluentd-async-connect: "true"
fluentd-retry-wait: 2s
fluentd-max-retries: 30
tag: httpd.access
networks:
efk-net:
ipv4_address: 172.22.0.20
depends_on:
- fluentd
networks:
efk-net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.22.0.0/16
fluentdのdockerfileについては、前回記事参照
fluent.config
ソースは2つ
- ポート24244でHTTPログと、ラズパイのechoを取得する
- ポート5140でラズパイのsyslogを取得する
取得した内容はすべて標準出力(stdout)する
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<source>
@type syslog
port 5140
bind 0.0.0.0
protocol_type tcp
tag raspi
</source>
<match raspi.**.***>
@type stdout
</match>
<match httpd.access>
@type stdout
</match>
<match debug.**>
type stdout
</match>
注意点として、syslogプラグインのデフォルトがUDPになっているので
明示的に protocol_type tcp
でTCPを指定する
docker起動、ログ表示など
関連するコマンド一覧
# 開始、ログ表示
docker compose up -d
docker compose logs -f
# コンフィグやymlファイルを更新したら再起動で反映
docker compose restart
# 検証後に環境をきれいにする
docker compose down -v
いざ、疎通確認!
ラズパイにTeraTermで接続し、3つの疎通確認をおこなう
(1)デバッグ用 echo メッセージ
馴染みあるツールで fluentd に対してお手軽にメトリクスを送信する
を参考に、適当なメッセージを投げる
echo '["debug.ciela.test",1459845632,["a","b",{"first":"one","second":"two"}]]' | nc 192.168.10.101 24224
fluentdにログが表示されている、成功!
2306_fluentdstudy-fluentd-1 | 2016-04-05 08:40:32.000000000 +0000 debug.ciela.test: ["a","b",{"first":"one","second":"two"}]
UDP通信がうまくいかない
nc -u
でUDP送信すると、うまくいかない
(※ファイアウォールは開けている)
echo '["debug.ciela.test",1459845632,["a","b",{"first":"one","second":"two"}]]' | nc -u 192.168.10.101 24224
DockerホストであるWindowsでポートの状態を調べると、ちゃんとUDPで待っているようにみえる・・・?
PS C:\> netstat -an | Select-String 24224
TCP 0.0.0.0:24224 0.0.0.0:0 LISTENING
UDP 0.0.0.0:24224 *:*
WindowsのportproxyはUDPに非対応
<思考過程>
- ポートフォワードの設定が足りていないのでは?
- デフォルトがTCPで、UDPの設定も別途必要だとか
- WindowsファイアォールもTCPとUDPはそれぞれ設定が必要だし・・
- デフォルトがTCPで、UDPの設定も別途必要だとか
Netsh - redirect UDP traffic to VM ←ここに答えがあった。
TCPだけがサポートされています
# netsh interface portproxy add v4tov4
パラメーター:
タグ 値
listenport - リッスンする IPv4 ポートです。
connectaddress - 接続する IPv4 アドレスです。
connectport - 接続する IPv4 ポートです。
listenaddress - リッスンする IPv4 アドレスです。
protocol - 使用するプロトコルです。現在、TCP だけがサポート
されています。
ということで、ラズパイからのUDP通信はDockerコンテナに届かないことがわかった
(2)HTTP通信
ラズパイからcurl
でWindowsマシン8000ポートにアクセスする
curl -v 192.168.10.101:8000
fluentdにログが表示されている、成功!
1行目はコンテナ自身のログ
2行目はfluentdが受信したログ
2306_fluentdstudy-web-1 | 172.22.0.1 - - [18/Jun/2023:04:55:04 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.52.1" "-"
2306_fluentdstudy-fluentd-1 | 2023-06-18 04:55:04.000000000 +0000 httpd.access: {"container_id":"6eb8246366cdca7bc7817887de8dcfa4575a644ae010263635cb4e07bb078002","container_name":"/2306_fluentdstudy-web-1","source":"stdout","log":"172.22.0.1 - - [18/Jun/2023:04:55:04 +0000] \"GET / HTTP/1.1\" 200 615 \"-\" \"curl/7.52.1\" \"-\""}
(3)Syslog通信
ラズパイのsyslogコンフィグファイルに1行だけ追加する
@@
をつけることで、TCP通信になる(@
1つだとUDP通信)
# 追記ここから
*.*;auth,authpriv,cron,mail,user.none @@192.168.10.101:24224
# 追記ここまで
もともとログの種類ごとに出力先が書かれているので
その近くに追記すると、あとから見返したときに分かりやすい
ラズパイのsyslogサービスを再起動する
systemctl restart rsyslog.service
ラズパイからSyslogメッセージ送信
汎用ファシリティlocal0
とプライオリティinfo
を組み合わせて
疑似メッセージをラズパイから送信する
logger -p local0.info "Message from RaspberryPi"
fluentdにログが表示されている、成功!
2306_fluentdstudy-fluentd-1 | 2023-06-18 14:26:19.000000000 +0000 raspi.local0.info: {"host":"redmagic","ident":"pi","message":"Message from RaspberryPi"}
さらに、サービスを再起動したときのログを見る
syslogデーモンを再起動する
systemctl restart rsyslog.service
raspi.daemon.info
タグでfluentdに表示されていることがわかる
2306_fluentdstudy-fluentd-1 | 2023-06-18 14:28:13.000000000 +0000 raspi.daemon.info: {"host":"redmagic","ident":"systemd","pid":"1","message":"Stopping System Logging Service..."}
2306_fluentdstudy-fluentd-1 | 2023-06-18 14:28:13.000000000 +0000 raspi.local7.info: {"host":"redmagic","ident":"liblogging-stdlog","message":"[origin software=\"rsyslogd\" swVersion=\"8.24.0\" x-pid=\"6708\" x-info=\"http://www.rsyslog.com\"] exiting on signal 15."}
2306_fluentdstudy-fluentd-1 | 2023-06-18 14:28:13.000000000 +0000 raspi.daemon.info: {"host":"redmagic","ident":"systemd","pid":"1","message":"Stopped System Logging Service."}
2306_fluentdstudy-fluentd-1 | 2023-06-18 14:28:13.000000000 +0000 raspi.daemon.info: {"host":"redmagic","ident":"systemd","pid":"1","message":"Starting System Logging Service..."}
2306_fluentdstudy-fluentd-1 | 2023-06-18 14:28:13.000000000 +0000 raspi.local7.info: {"host":"redmagic","ident":"liblogging-stdlog","message":"[origin software=\"rsyslogd\" swVersion=\"8.24.0\" x-pid=\"6919\" x-info=\"http://www.rsyslog.com\"] start"}
2306_fluentdstudy-fluentd-1 | 2023-06-18 14:28:13.000000000 +0000 raspi.daemon.info: {"host":"redmagic","ident":"systemd","pid":"1","message":"Started System Logging Service."}
おわりに
fluentdをDockerコンテナに立てて
ラズパイのsyslogを捕捉した
ラズパイのsyslogを、Dockerコンテナの標準出力で見ることができた
今度はラズパイのsyslogをkibana(ブラウザ)でみたい
参考
WSL2 内の Docker サーバーに LAN 内の別 PC からアクセスする (netsh)