おまいの iTunes も共有汁 - にぽたん研究所

October 05, 2005

このエントリーをはてなブックマークに追加
おいらの勤め先に、iTunes で人の共有ばっか聴いて、自分は共有しないという、DOM な人が結構いることが判明。
DOM つったって、Document Object Model ではないです。
Download Only Member ってやつです。

なんかしょっちゅう同じ香具師が繋ぎにきててハラ立つんで、折角 Developer Tools 入れてる Mac OS X なんだし、ポートスキャンツールである Nmap を入れて、DOM さんを、ファイアウォールの ipfw コマンドを使って排除するっちゅースクリプトをちょろっと書いてみた。

共有名とかに「にぽたん@共有しない香具師は排除」とかにしとけば、空気読んで「自分も共有する」とか、「もう二度と繋ぎに来ない」とかするでしょう。

Update:
どうも nmap だとちゃんと判別出来なかったり、別プロトコルでポート開放したり、パスワード付きで共有したり、一曲も共有してないけど共有だけ開放したり…とかありますね…。
厳密に Net::DAAP::Client 使って曲リストまで取得し、「DOM じゃない人」の定義は「パスワード制限してなくて共有している曲数が 1 曲以上ある人」ってことにしたほうが良さげだったので、修正しますた。
あと「もう共有したから火壁を開放汁!」って怒られないように、改心した DOM さんに対して、ファイアウォールを解除するようにも修正しますた。



(パスは環境に合わせて適宜書き換えてください)
#!/usr/local/bin/perl

use strict;
use Net::DAAP::Client;

my $ITUNES_PORT = 3689;
my $PRIV_IP_RE = qr{
    \b(?:
	10\.(?:\d\d?|1\d\d|2(?:[0-4]\d|5[0-5]))|  # class A
	172\.(?:1[6-9]|2\d|3[01])|                # class B
	192\.168                                  # class C
    )
    \.(?:\d\d?|1\d\d|2(?:[0-4]\d|5[0-5]))
    \.(?:\d\d?|1\d\d|2(?:[0-4]\d|5[0-5]))\b
}x;

my @ip_list =
    `/sbin/ifconfig | /usr/bin/grep "inet "` =~ /inet\s+($PRIV_IP_RE)/g;
my $my_addr =
    sprintf('(%s)\.%d',
	join('|', map { quotemeta($_) } @ip_list), $ITUNES_PORT);
my $netstat =
    sprintf(q,%s -n | grep -E '%s',, '/usr/sbin/netstat', $my_addr, $ITUNES_PORT);
my %listeners =
    map { $_->[1] => $_->[0] }
	map { my @ip = (split /\s+/)[3, 4]; $ip[1] =~ s/^(.+?)\.\d+$/$1/; \@ip }
	    `$netstat`;
my $ipfw_state = `/sbin/ipfw -a list`; # current state
while (my($target, $my_addr) = each %listeners) {
    $my_addr =~ s/\.$ITUNES_PORT$//;
    my $rulestr =
	sprintf('deny tcp from %s to %s %d',
	    quotemeta($target), quotemeta($my_addr), $ITUNES_PORT);
    my($blocked) = $ipfw_state =~ /^(\d+)\s+\d+\s+\d+\s+$rulestr\b/m;
    my $daap = Net::DAAP::Client->new(
	SERVER_HOST => $target,
	SERVER_PORT => $ITUNES_PORT
    );
    $daap->connect;
    my $songs = eval { $daap->songs } || {};
    $daap->disconnect;
    my $status = scalar keys %$songs; # number of shared songs.
    my @ipfw = ();
    unless ($status) {
	warn("$target is DOM iTunes !!");
	if ($blocked) {
	    warn("$target was already blocked.");
	    next;
	}
	@ipfw = (
	    qw(/sbin/ipfw add deny tcp from),
		$target, 'to', $my_addr, $ITUNES_PORT,
	);
    }
    elsif ($blocked) {
	@ipfw = ('/sbin/ipfw', 'delete', $blocked);
    }
    if (@ipfw) {
	warn(join " ", @ipfw);
	system(@ipfw);
    }
}
こんなのを root の crontab とかに 3 分に一回程度仕込んでおけば、自分は共有してないのに、おいらの共有とかを聴きに来た場合、このスクリプトが実行された時に突如再生が出来なくなる。

「DOM の香具師のためにこっちの Mac のリソースが食われている」

と考えただけで、なんかそれって理不尽じゃねぇか?…とお嘆きの方は、自己防衛にどうぞご利用くださいな。

あと、「そろそろ勘弁してやるかぁ」

って思われる、心の広い方は、日頃 ipfw を使ってないなら
# ipfw -f flush
とかで、ファイアウォールのルールを解除してあげてください。

nipotan at 23:21 | Comments(6) | TrackBack(0) | 技術 
このエントリーをはてなブックマークに追加

Trackback URL for this entry

Comments

1. Posted by k.daiba   October 06, 2005 10:55
DOM の香具師がPORTを開けました.

> NEXT?

# RPGやんないので,口調がわかんない.(^^;

------------------------------
#!/bin/perl
use IO::Socket;
$PORT = 3869;

$server = IO::Socket::INET->new(
Proto => 'tcp',
LocalPort => $PORT,
Listen => SOMAXCONN,
Reuse => 1
);

die "can't setup server" unless $server;
print "[Server $0 accepting clients]\n";

while ($client = $server->accept()){
$client->autoflush(1);
print $client "Welcome to $0\n";
close $client;
}
2. Posted by k.daiba   October 06, 2005 14:13
なんか,ものの見事に撃沈されていたので再度挑戦!
これ
http://poe.perl.org/?POE_Cookbook/TCP_Port_Redirection
を使って,にぽたんのPCにポートフォワードするってので対抗したらどうじゃっ (笑)
3. Posted by nipotan   October 06, 2005 14:57
ぬー。
そこまでやられたら無理っぽいですね。

というか台場さんはモロにネットワーク屋さんなので、実際はネットワークネタに疎い自分は、台場さんが敵だったら、多分どんな手段を使っても勝てなさそげです。。。
4. Posted by k.daiba   October 06, 2005 17:40
kuromomoさんがおっしゃるところの,「インターネット世代(37才より上なイメージ。独断による)」な者ですから,志向がかなりネットに偏ってます.ハイ

まだまだ若いものには,以下略… 笑)
5. Posted by BlogPetのにぽたん   October 08, 2005 11:31
ウォールで空気などありますね
良さとか、繋ぎやパスワードとかなんだし
あととかを制限すればよかった?


6. Posted by BlogPetのにぽたん   October 15, 2005 12:12
にぽたんが、ウォールで広い曲リストとかないコマンドなどを取得すればよかった?


Post a comment

Name:
URL:
  Remember info?: Rate: Face    Star