弁財天

ゴフマン「専門家を信じるのではなく、自分自身で考えて判断せよ」

出現したExitノード・プレフィクスの2日間限定ブロックを評価ちうw update5

Torの出口ノードを使ったDDOS攻撃をiptablesでブロック

TorのExitノードだけをブロックしていたのだけど、Exitノードが固定されたIPアドレスでない場合もあり、dhcpなどを使って別のアドレスに割り振ってF/Wを通過させるとこもあるようだw

出現したExitノードのIPアドレスのプレフィクスを調べて広範囲にブロックする方法をテストちう…

Fedora30からFedora31にアップグレード

2020-02-15 11:32:15 "弁財天: ゴフマン「専門家を信じるのではなく、自分自身で考えて判断せよ」" http://benzaiten.dyndns.org/roller/ 162.247.74.202 ブルックリン区 ニューヨーク州 アメリカ合衆国 US New York New York djb.tor-exit.calyxinstitute.org [ASN4224 The Calyx Institute 162.247.74.0/24] Win10 Firefox/68.0
2020-02-15 11:32:59 "弁財天: 名古屋大大学院環境学研究科准教授の男(43)の店じまい… update2" /entry/env-nagoya-u-acjp 162.247.74.202 ブルックリン区 ニューヨーク州 アメリカ合衆国 US New York New York djb.tor-exit.calyxinstitute.org [ASN4224 The Calyx Institute 162.247.74.0/24] Win10 Firefox/68.0

Torのコンソールから"getinfo ns/all"で最新のノードのリストを習得、 リストのExitノードのIPアドレスからプレフィクスを調べる。

Data::Dumper形式で出現したプレフィクスをファイルに保存していく…なんて乱暴なw
するとヤキトリのタレみたいに濃くなっていくのであるw

そのプレフィクスのリストでnftablesのコマンドを生成しまとめてブロックしてしまうw。nftablesマニア向けw

#!/usr/bin/perl

use strict;

use MaxMind::DB::Reader;

use Net::Abuse::Utils qw( :all );
use Net::DNS::Resolver;
use Net::Subnet;

use Data::Dumper;
use Date::Simple;

my $today = Date::Simple->new();
my $last_date = $today->format('%Y%m%d');

$Data::Dumper::Useperl = 1;
$Data::Dumper::Terse = 1;   # no '$VAR1 = '
#$Data::Dumper::Useqq = 1;   # double quoted strings

my $classifier;

my %C = dd_in('prefix_dd_c.txt'); 
my %P = dd_in('prefix_dd.txt'); 
foreach my $p (keys(%P)) {
    delete $P{$p} if ($P{$p} =~ /NoPrefix/ || $P{$p} !~ /ASN/);
}
my %S = dd_in("prefix_dd_s.txt"); 

sub dd_out {
    my ($file, $aoh_ref) = @_;
    open my $fh, '>', $file    or die "Can't write '$file': $!";
    print $fh Dumper $aoh_ref;
    close $fh or die "Can't close '$file': $!";
}

sub dd_in {
    my ($file) = @_;

    print STDERR "$file ...\n";

    open my $fh, '<', $file    or die "Can't read '$file': $!";
    local $/ = undef;  # read whole file
    my $dumped = <$fh>;
    close $fh or die "Can't close '$file': $!";
    return %{ eval $dumped };
}

sub ip_asn() {
    my ($ip) = @_;
    my $asn_c;
    my @ai;

    my $prefix = $classifier->($ip);

    if ($prefix eq "") {
        @ai = get_asn_info($ip);
        $prefix = $ai[1];
    }
    else {
        print STDERR "Cache $ip $prefix ...\n";
    }

    #print STDERR Dumper(@ai);

    if ($C{$prefix} eq "" && $ai[0] ne "") {
        my @ac;
        @ac = get_as_company($ai[0]);
        my $company = $ac[0];
        $asn_c = "ASN".$ai[0]." ".$ac[0];
        $C{$prefix} = $asn_c;
    }
    else {
        $asn_c = $C{$prefix};
        print STDERR "Cache $prefix $asn_c ...\n";
    }
    ($prefix, $asn_c);
}

my @px;
foreach my $pk (keys %P) {
    push @px, $pk;
}

$classifier = subnet_classifier (@px);

my $tor_r;
my $tor_s;
my $tor_w;

while (<>) {
    s/\r+\n/\n/g;
    chomp;
    my $line = $_;
    if (/^r /) {
        $tor_r = $line;
    }
    if (/^s /) {
        my @items = split(/ /, $tor_r);
        $tor_s = $items[6];
        if ($line =~ /Exit/) {
            my ($prefix, $asn) = &ip_asn($tor_s);
            if ($prefix ne "" && $asn ne "") {
                $P{$prefix} = "# $last_date Exit $prefix $asn";
                #print STDERR $prefix." # $last_date Exit prefix $prefix asn $asn\n";
            }
            else {
                $P{$tor_s} = "# $last_date Exit NoPrefix NoASN $tor_s";
                #print STDERR $tor_s." # $last_date Exit NoPrefix NoASN $tor_s\n";
            }
        }
        else {
            #$S{$prefix} = "# $last_date NoExit $prefix $asn" if ($prefix ne "");
            $S{$tor_s} = "# $last_date NoExit $tor_s";
            print STDERR $tor_s." # $last_date NoExit NoPrefix NoASN\n";
        }
    }
    if (/^w /) {
        $tor_w = $line;
        $tor_w =~ s/w Bandwidth=//;
    }
}

dd_out('prefix_dd_c.txt', \%C);
dd_out('prefix_dd.txt', \%P);
dd_out('prefix_dd_s.txt', \%S);

open(NFT, ">nft_tor_exit_rule.sh") or die("$!");
print NFT "#!/usr/sbin/nft -f\n";
print NFT "flush chain ip filter TOR_EXIT_BLOCK\n";
print NFT "define tor_exit_nodes = {\n";

foreach my $p (sort(keys(%P))) {
    print NFT $p.",\n";
}

print NFT "}\n";
#print NFT "add rule filter TOR_EXIT_BLOCK ip saddr \$tor_exit_nodes tcp dport { 80,443,8443 } drop\n";
print NFT "add rule filter TOR_EXIT_BLOCK meta l4proto { tcp, udp } \@th,16,16 { 80,443,8443 } ip saddr \$tor_exit_nodes drop\n";
close(NFT);

# End of FILE.

print NFT "add rule filter TOR_EXIT_BLOCK meta l4proto { tcp, udp } \@th,16,16 { 80,443,8443 } ip saddr \$tor_exit_nodes drop\n";

@と$をエスケープするw

マニア向け、リアルタイム実況w

#!/usr/sbin/nft -f
flush chain ip filter TOR_EXIT_BLOCK
define tor_exit_nodes = {
103.208.220.0/23,
103.234.220.0/24,

略

97.74.232.0/21,
}
add rule filter TOR_EXIT_BLOCK meta l4proto { tcp, udp } @th,16,16 { 80,443,8443 } ip saddr $tor_exit_nodes drop

        if ($tor_s =~ /Exit/) {

のとこを外せば何もかもブロックすることになるが、Exit宣言したノードだけでいいのでは?w

プレフィクスでブロックしていくと400件くらいで頭打ちになるw。レコードに最終更新日付を入れて何日も使われてないレコードを対象から外すとかw、広範囲になるプレフィクスも外すとか…

2020-02-16 12:57:19 "弁財天: ゴフマン「専門家を信じるのではなく、自分自身で考えて判断せよ」" http://benzaiten.dyndns.org/roller/ 193.169.255.102 ポーランド共和国 PL Mazovia Warsaw Linux x86_64 Firefox/68.0

IPv4のアドレスからASNやPrefixが不明なポーランドのアドレスw

投稿されたコメント:

コメント
コメントは無効になっています。