0
1

More than 1 year has passed since last update.

LAN内のラズパイからDockerコンテナへsyslog,http通信

Last updated at Posted at 2023-06-18

はじめに

家の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」を検索して実行
黒い窓が立ち上がる

image.png

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

image.png

あらたに3行の規則を追加する

image.png

セキュリティ上、念のため、送信元はラズパイ(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 に対してお手軽にメトリクスを送信する
を参考に、適当なメッセージを投げる

TCP
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送信すると、うまくいかない
(※ファイアウォールは開けている)

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はそれぞれ設定が必要だし・・

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通信)

sudo vim /etc/rsyslog.conf
# 追記ここから
*.*;auth,authpriv,cron,mail,user.none      @@192.168.10.101:24224
# 追記ここまで

もともとログの種類ごとに出力先が書かれているので
その近くに追記すると、あとから見返したときに分かりやすい

image.png

ラズパイの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)

糸冬了!!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1