October 05, 2005
おいらの勤め先に、iTunes で人の共有ばっか聴いて、自分は共有しないという、DOM な人が結構いることが判明。
DOM つったって、Document Object Model ではないです。
Download Only Member ってやつです。
なんかしょっちゅう同じ香具師が繋ぎにきててハラ立つんで、折角 Developer Tools 入れてる Mac OS X なんだし、ポートスキャンツールである Nmap を入れて、DOM さんを、ファイアウォールの
共有名とかに「にぽたん@共有しない香具師は排除」とかにしとけば、空気読んで「自分も共有する」とか、「もう二度と繋ぎに来ない」とかするでしょう。
Update:
どうも
厳密に Net::DAAP::Client 使って曲リストまで取得し、「DOM じゃない人」の定義は「パスワード制限してなくて共有している曲数が 1 曲以上ある人」ってことにしたほうが良さげだったので、修正しますた。
あと「もう共有したから火壁を開放汁!」って怒られないように、改心した DOM さんに対して、ファイアウォールを解除するようにも修正しますた。
DOM つったって、Document Object Model ではないです。
Download Only Member ってやつです。
なんかしょっちゅう同じ香具師が繋ぎにきててハラ立つんで、折角 Developer Tools 入れてる Mac OS X なんだし、
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とかで、ファイアウォールのルールを解除してあげてください。