2014年10月16日木曜日

Raspberry Piセットアップ日記(14)logger

logger:syslogにログを出力するコマンド。


シェルの標準出力をloggerに送るラッパーシェルを作ってみた。

cronで自動実行した際に、標準エラー出力に出力があったときだけメールされ、
通常時はログに吐くだけとなるようにしてみた。

・標準出力は、loggerに送る
・標準エラー出力は、loggerに送った上で、標準エラー出力にも冗長出力する
・コマンドライン
 logger_wrapper.sh シェル シェル引数

標準出力と標準エラー出力のパイプを分けるやり方は
試行錯誤の結果名前付きパイプにしてみた。
mktempで一時ファイルを使ってもいいだろう。

#!/bin/bash

if [ $# -lt 1 ]; then
        echo "argument not enough"
        exit 8
fi

THIS_NAME=`basename $0 .sh`
EXEC_NAME=`basename $1`
LOGGER_OPTS="-t ${EXEC_NAME}"

# create named pipe
PIPE=${THIS_NAME}_$$.pipe
mkfifo ${PIPE} 

# stderr logging (duplicate to stderr)
logger ${LOGGER_OPTS} -s -f ${PIPE} &

# execute program
$@ 2>${PIPE} | logger ${LOGGER_OPTS}

# cleanup
rm ${PIPE}

2014年9月28日日曜日

Raspberry Piセットアップ日記(13)UFW BLOCKメッセージ


気づいたら、/var/log/messagesに以下のようなメッセージが頻発していた。(1分に1回)

Sep 28 08:08:20 raspberrypi kernel: [1807838.540815] [UFW BLOCK] IN=eth0 OUT= MAC=<文字列72桁> SRC=<ルータIP> DST=224.0.0.1 LEN=32 TOS=0x00 PREC=0xA0 TTL=1 ID=24734 PROTO=2 
Sep 28 08:09:20 raspberrypi kernel: [1807898.640777] [UFW BLOCK] IN=eth0 OUT= MAC=<文字列72桁> SRC=<ルータIP> DST=224.0.0.1 LEN=32 TOS=0x00 PREC=0xA0 TTL=1 ID=2006 PROTO=2 

どうもブロードバンドルーターからの何らかのブロードキャストメッセージをブロックしている模様。
denyすることでログに吐かなくなるようだが、せっかくなのでどんなメッセージが飛んでいるのか
解析してみる。

1、syslogの見方

●参考
Linux LPIC - /var/log/messages
システムログの読み方を理解しよう
Raspberry Pi as a Syslog Server



以下のような読み方になるもよう

Sep 28 08:08:20 raspberrypi kernel: [1807838.540815] [UFW BLOCK] IN=..
+- timestamp -+ +- host --+ +-src-+ +-- msg body ..

カーネルが、[1807838...というメッセージを出力している、ということになる
"[1807838.540815]"という表記は、なんとなくタイムスタンプ(の別表現)のような感じなので、意味のある情報は
[UFW BLOCK]..以降だろう。

2、ufwの動作確認

ここで一度ufwの動作設定がどうなっているのかを確認する
ufwの動作状態確認

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip

To                         Action      From
--                         ------      ----
22                         ALLOW IN    Anywhere
5901                       ALLOW IN    Anywhere
...以下略

3、UFW BLOCK以降のログの見方

[UFW BLOCK] IN=eth0 OUT= MAC=<文字列72桁> SRC=<ルータIP> DST=224.0.0.1 LEN=32 TOS=0x00 PREC=0xA0 TTL=1 ID=24734 PROTO=2 
[UFW BLOCK] IN=eth0 OUT= MAC=<文字列72桁(2)> SRC=<ルータIP> DST=224.0.0.1 LEN=32 TOS=0x00 PREC=0xA0 TTL=1 ID=2006 PROTO=2 

INは入力デバイスだろう。
OUTはoutgoingのメッセージではないので出ないのだろう。
MACは通常のMACアドレスにしては長い気がするのと、最後の2オクテットの値が違うのでただのMACアドレスではなさそうだが、とりあえず保留。
SRC以降は、IPヘッダの情報くさい。

IPパケットの基本構造

SRC=送信元IP ルータIP
DST=宛先IP 224.0.0.1
LEN=データグラム長、IPパケット全体の大きさ 32 理論的なIPパケットの最小は20bytes
TOS=サービスタイプ 0x00、指定なし
PREC=? 0xA0 とりあえず保留
TTL=寿命 1
ID=IPフラグメント(分割)が起こった時の識別子、通常ランダム 同じフラグメント(分割)されたパケットは同じ値になる 2006
PROTO=プロトコル番号 2 /etc/protocolsファイルによると「igmp(Internet Group Management)」

どうも、IGMPパケットのようだ。

4、IGMPとは?
Internet Group Management Protocol

Internet Group Management Protocol (IGMP) とは、IPネットワーク上でマルチキャスト(特定の一対多または多対多通信)を行うために、
マルチキャストに参加するホストのグループを設定し、ネットワークに通知するための通信プロトコルである。

LEN=32であることから、おそらくMembership Queryパケットである可能性が高い。
Membership Query (Type 0x11)
ホストがマルチキャストのグループへ参加するときにルータに送信される。参加しているグループの最新の状態を知りたいときにも送信される。

ただ、内容的には「ホストからルータへ投げられるパケット」であり、
今回のように「ルータからブロードキャストへ」投げられるパケットでは無い様に見受けられるので、解せない。

一方こちらでは
マルチキャスト編<第2回> IGMPを知る

どうも「グループの維持」のために、クエリパケットを60秒に1回投げられるらしい。
意味的にはルータが投げてもおかしくない(というかグループを管理するのはルータらしいのでルータが投げるのが正論だろう)、おそらくこいつだろう。

4、解決策
結論として、IGMPをallowにしてみようと思う。

●参考
Ubuntu で ufw を利用して ping を拒否する設定
KVMのインストールと設定
Question about UFW log entries

IGMPプロトコルそのものに設定することはできなさそう。
公式サイトでバグ報告上がってるがwishlistになっており
マルチキャスト設定で対応する旨書かれている

https://bugs.launchpad.net/ufw/+bug/946322


というわけで、以下のように実行し、ログが増えないことを確認して終了。

$ sudo ufw allow in from ルータIP to 224.0.0.0/8 
Rule added
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip

To                         Action      From
--                         ------      ----
22                         ALLOW IN    Anywhere
5901                       ALLOW IN    Anywhere
..中略..
224.0.0.0/8                ALLOW IN    ルータIP

5、おまけ

ufwのヘルプ
$ ufw help


2014年9月23日火曜日

Raspberry Piセットアップ日記(12)repository.wolfram.com


●repository.wolfram.com
apt-updateするとrepository.wolfram.comがいないと言われ怒られる。

$ sudo apt-get update
...略...
ヒット http://mirrordirector.raspbian.org wheezy/rpi armhf Packages            
エラー http://repository.wolfram.com stable Release.gpg                        
  repository.wolfram.com:80 (140.177.204.60) へ接続できませんでした。 - connect (113: ホストへの経路がありません)
無視 http://repository.wolfram.com stable Release                              
エラー http://repository.wolfram.com stable/non-free armhf Packages            
  repository.wolfram.com:http へ接続できません:
エラー http://repository.wolfram.com stable/non-free Translation-ja_JP         
  repository.wolfram.com:http へ接続できません:
エラー http://repository.wolfram.com stable/non-free Translation-ja            
  repository.wolfram.com:http へ接続できません:
エラー http://repository.wolfram.com stable/non-free Translation-en            
  repository.wolfram.com:http へ接続できません:
無視 http://raspberrypi.collabora.com wheezy/rpi Translation-ja_JP             
...略...

raspberry piのフォーラムによると、最新のrespbianディストリではrepository.wolfram.comは
含まれていないとのこと
http://www.raspberrypi.org/forums/viewtopic.php?f=28&t=87501

workaroundに従い、wolfram.listをmv

$ cd /etc/apt/sources.list.d/
$ sudo mv wolfram.list wolfram.list.20140923bk1
$ sudo apt-get update
ヒット http://raspberrypi.collabora.com wheezy Release.gpg
ヒット http://mirrordirector.raspbian.org wheezy Release.gpg
...略...
無視 http://mirrordirector.raspbian.org wheezy/rpi Translation-en
パッケージリストを読み込んでいます... 完了
N: ディレクトリ '/etc/apt/sources.list.d/' の 'wolfram.list.20140923bk1' が無効なファイル名拡張子を持っているため、無視します

余計なメッセージが出ているようだが、いったん気にしないことにする