2011年9月26日月曜日

鎌倉の素敵なお店

先日、鎌倉で4軒連続ではしごするという贅沢な体験をしてきたのですが、そこのお店がとてもよかったので、次回自分がいくためのことも考えてまとめです。本当は写真もあると良かったと思ったんですが、ちょっとそういう会ではなかったので、後日改めて行きたいところです。

田楽 (でんがく)
http://r.tabelog.com/kanagawa/A1404/A140402/14001490/
炉端焼きのお店。お店の真ん中に炉端があり、店員の方が焼いて(暖めて?)くれる。炭で焼くので時間もかかるが、その間の香りを楽しみ、そしてできた料理を食べるのはなかなかの贅沢。ちなみに店内は全部で10席と少し。金、土はかなり混雑するらしい。

いさむ
http://isamu.hanamizake.com/
いわゆる居酒屋だが、特筆するべきは自分でお燗をつけられるカウンター席。席にお湯がはってある部分があって、そこに徳利をいれて自分の好みの熱さで飲むことができる。頼んだお酒がぬるすぎになってしまうこともない。店舗はとても新しいが、かなり歴史のあるお店だそう。

ミルクホール
http://www.milkhall.co.jp/
ジャズが流れているとても雰囲気のよいお店。とても奥まったところにあり、道知らないととてもたどり着けない(と思った)ようなところにあるのだが、昼間などは店の外まで列ができているとか。閉店直前にいったので奇跡的に貸切のような状態だったが、短い時間しか滞在出来なかったのが残念。

MIKE's BAR
http://rp.gnavi.co.jp/3115695/
建物内の通路から入らないとならないため、こちらも事前に知らないと辿りつけないと思われる…。二種類しかお酒は飲まなかったが、お酒選びには妥協がないようでとても美味しい洋酒を飲ませてもらった。こちらもまた40年以上の歴史があるお店とのこと。ローストビーフがすばらしい逸品でした。

2011年9月8日木曜日

rotating tcpdump

tcpdumpでネットワークのダンプを取り続ける際、任意のタイミングでダンプを保存するファイルを切り替えるシェルスクリプトです。なんか5回ぐらい同じシェルスクリプト書いて、さすがに飽きてきたので、そこそこ使いまわせるように書いたものをgistにおいておきました。

冒頭部分のNIC, FILTERを編集すればあとは深く考えずに使えるはずです。まあ、一瞬で読めるので、解説も何も無いですけど。。

2011.9.9追記
最近のtcpdumpにもrotate機能があると某氏からのご指摘。

tcpdump version 4.1.1のmanより。
-C     Before  writing  a  raw  packet to a savefile, check whether the file is currently larger
       than file_size and, if so, close the current savefile and  open  a  new  one.   Savefiles
       after  the  first  savefile  will have the name specified with the -w flag, with a number
       after it, starting at 1 and continuing upward.  The units of file_size  are  millions  of
       bytes (1,000,000 bytes, not 1,048,576 bytes).

-G     If  specified,  rotates  the  dump file specified with the -w option every rotate_seconds
       seconds.  Savefiles will have the name specified by -w which should include a time format
       as  defined by strftime(3).  If no time format is specified, each new file will overwrite
       the previous.

-Cオプションがファイルサイズベースのrotate、-Gオプションが時間ベースのrotateとのことです。-Gオプションはちゃんとファイル名に時間までいれてくれるらしいが、time formatは自分でstrftime書式で指定しないとダメらしいですね。たとえば

tcpdump -w /tmp/timed_dumps.%s -G 10

のように書くと

% ls /tmp/
timed_dumps.1315521248
timed_dumps.1315521259
timed_dumps.1315521270

というようにファイルが生成されていくようです。任意のタイミングではrotateできないけど、とても便利そうです。

#!/bin/zsh
PID_FILE=$HOME/local/var/run/`basename $0`.pid
NIC=en0
DATA_DIR=$HOME/local/var/data
FNAME_PREFIX="dump"
FILTER="port not 80"
if [ "`id -u`" != "0" ]
then
echo "need root privillege"
exit
fi
if [ $# -ne 1 ]
then
echo "syntax)" `basename $0` "[start|rotate|stop]"
exit
fi
mkdir -p `dirname $PID_FILE`
mkdir -p $DATA_DIR
stop () {
if [ -e $PID_FILE ]
then
kill `cat $PID_FILE`
rm $PID_FILE
fi
}
start ()
{
SUFFIX=`date "+%Y%m%d%H%M%S"`
tcpdump -s 0 -w $DATA_DIR/$FNAME_PREFIX-$SUFFIX.pcap -ni $NIC $FILTER 2> /dev/null &
disown
PID=$!
echo $PID > $PID_FILE
}
case $1 in
"start")
start
;;
"rotate")
stop
start
;;
"stop")
stop
;;
*)
echo "syntax)" `basename $0` "[start|rotate|stop]"
;;
esac
view raw dumper.sh hosted with ❤ by GitHub

2011年9月4日日曜日

dpkt&pcapyでパケット解析 in Python

Impacketでパケット解析をしていたのですが、対応しているプロトコルがあまり充実していなかったので、dpktに鞍替え。

dpkt (http://code.google.com/p/dpkt/)
最終更新は今年の1月でとまっているものの、すでにかなりのプロトコルに対応してくれているのでかなり有用です。

NetBIOS名やmDNSを拾ってくるコードは以下のような感じ。

#!/usr/bin/env python
# coding: utf-8
#----------------------------------------------------
# packet capture & decoding
import pcapy
import dpkt
class network_monitor:
def __init__ (self):
pass
def start (self):
# TODO: specify a device or select all devices
# dev = pcapy.findalldevs()[0]
dev = 'en1'
p = pcapy.open_live(dev, 65536, False, 1)
p.loop(-1, self.handle_packet)
def handle_packet (self, header, data):
eth = dpkt.ethernet.Ethernet (data)
# print "%04X" % eth.type
if eth.type == dpkt.ethernet.ETH_TYPE_IP:
ip = eth.data
ip_data = ip.data
if isinstance (ip_data, dpkt.udp.UDP):
udp = ip_data
if udp.sport == 137:
nb = dpkt.netbios.NS(udp.data)
print "NetBIOS:"
for q in nb.qd:
print 'qd:', dpkt.netbios.decode_name(q.name)
for a in nb.an:
print 'an:', dpkt.netbios.decode_name(a.name)
for n in nb.ns:
print 'ns:'. dpkt.netbios.decode_name(n.name)
print ''
if udp.dport == 5353:
mdns = dpkt.dns.DNS (udp.data)
print "MDNS:"
print mdns.qd
print mdns.an
print mdns.ns
def main():
network_monitor ().start ()
if __name__=="__main__":
main ()