次のコードを使用して、Python で基本的なリモート syslog サーバーを実装しました。
self.UDPsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.UDPsock.bind(self.addr)
self.UDPsock.settimeout(1)
while self.carryOn:
try:
data = self.UDPsock.recv(self.buf)
print data
except socket.timeout:
pass
これを使用して、ルーター (Tomato Shibby v108) からログ メッセージを受信しています。「プレゼンス」スクリプトを作成できるように、携帯電話からのメッセージを傍受することに特に関心があります。
私は最初、テストのために次の iptable エントリを試しました。
iptables -I FORWARD -s 192.168.2.54 -m limit --limit 1/minute --limit-burst 1 -j LOG
これは期待どおりに機能し、次のようなメッセージを受け取りました。
<12>Apr 1 21:51:47 kernel: IN=br0 OUT=ppp0 SRC=192.168.2.54 DST=17.158.8.77 LEN=70 TOS=0x00 PREC=0x00 TTL=63 ID=23055 DF PROTO=TCP SPT=60779 DPT=993 WINDOW=65535 RES=0x00 ACK PSH URGP=0 MARK=0x5
ただし、静的 IP に依存したくないので、iptable フィルターを MAC アドレスでトリガーするように変更しました。
iptables -t raw -A PREROUTING -m mac --mac-source SOURCE_MAC -m limit --limit 1/minute --limit-burst 1 -j LOG --log-ip-options
ここでの問題は、ログ エントリごとに 50 を超えるメッセージを受信したことでした。すべてが次の形式の重複です。
<12>Apr 1 19:54:00 kernel: IN=br0 OUT= MAC=DEST_MAC:SOURCE_MAC:08:00 SRC=192.168.2.54 DST=224.0.0.251 LEN=101 TOS=0x00 PREC=0x00 TTL=255 ID=36530 PROTO=UDP SPT=5353 DPT=5353 LEN=81
フィルターを次のように変更したとき:
iptables -t raw -A PREROUTING -m mac --mac-source SOURCE_MAC -m limit --limit 1/minute --limit-burst 1 -j LOG
重複の数を 4 に減らしました。
<12>Apr 2 12:21:55 kernel: IN=br0 OUT= MAC=DEST_MAC:SOURCE_MAC:08:00 SRC=192.168.2.54 DST=224.0.0.251 LEN=101 TOS=0x00 PREC=0x00 TTL=255 ID=1384 PROTO=UDP SPT=5353 DPT=5353 LEN=81
なぜこれが起こっているのかについて、誰かが洞察を提供できますか? これを引き起こしているある種の「面白い」キャラクターがあると思います。メッセージごとに 1 つのログ エントリのみを受信するように、iptable エントリまたは Python プログラムを変更できますか?