2017-03-19 5 views

답변

1

짧은 대답은 아니오입니다. 도메인에 대한 조회수를 제한하는 Squid 옵션이 없습니다. 오징어는 커스텀 스크립트를 실행하고 stdin/stdout에 연결할 수 있습니다. 응답을 사용하여 요청을 허용할지 거부 할지를 제어하는 ​​스크립트 &에 데이터를 보냅니다. 이 기능을 사용하여이 문제를 해결할 수 있습니다.

옵션 1 : 내가 생각할 수있는 두 가지 방법 도메인에 액세스하고 받아들이 도우미를 작성하고 그것을 보았다 모든 도메인의 집계하고 각각의 액세스 된 횟수, 다음 수익을 유지 Squid가 도메인을 초과/부족한 지 여부를 나타내는 Squid에 대한 응답으로, Squid는 요청을 허용/거부합니다. 이 접근법의 장점은 모든 로직이 하나의 스크립트에 포함된다는 것입니다. 단점은 Squid가로드에 응답하여 여러 도우미를 동적으로 실행한다는 것입니다. 즉, 스크립트의 각 인스턴스가 상태를 공유하고 Squid 프로세스를 종료/시작하는 방법을 찾아야합니다.

옵션 2 :는에, 로그 파일을보고 각 도메인에 액세스 된 횟수의 집계하고, 오징어는 외부 도우미로 실행할 수있는 두 번째 스크립트를 유지하기 위해, 두 개의 스크립트로 하나를 위의 논리를 분할 첫 번째 스크립트에서 유지 관리하는 집계를 참조하고 도메인이 임계 값을 초과했는지 임계 값 미만인지 여부를 나타내는 Squid에게 응답을 보냅니다. 이 접근법의 장점은 여러 도우미를 지원하도록 확장 할 수 있으며 Squid 프로세스를 다시로드/다시 시작한 후에도 유지할 수 있다는 것입니다.

먼저, 오징어 구성 :

logformat domainonly %>rd 
access_log daemon:/tmp/domains.log logformat=domainonly 
external_acl_type domaincheck concurrency=0 %>rd /tmp/domaincheck.pl 
acl overlimit-domains external domaincheck 
http_access deny overlimit-domains 

둘째, 로그를 볼 수있는 스크립트. 이것을 crontab에 넣고 시스템의 부하를 분산시키는 간격으로 발사 하시길 권장합니다. 탈리 파일에 히트가 보이기 전에 용인 할 수있는 한계 초과 접근량과 &이 Squid에 의해 차단되었습니다. 또한 Squid가 하루에 한 번 로그를 회전시키고 자정에 실행되도록 별도의 스크립트를 설정하여 $ basedir의 모든 파일을 지우고 다음 날을 대비하여 집계 파일을 제로로 만듭니다.

#!/usr/bin/perl 
# File:/tmp/domainwatch.pl 
use strict; 
use Data::Dumper; 
my $basedir = '/tmp/domaincntrs'; 
my $ptrfile = $basedir."/logpos.txt"; 
my $logfile = '/tmp/domains.log'; 
my $logpos = 0; 

# Get last log position from pointerfile, detect if it has wrapped 
if (open(INFILE, "<$ptrfile")) { 
    $logpos = <INFILE>; 
    close(INFILE); 
    $logpos = 0 if ($logpos > (-s $logfile)); 
} 

# Open logfile, seek and begin reading 
my %domainhash; 
if (open(LOGFILE, "<$logfile")) { 
    seek (LOGFILE, $logpos, 0); 
    while (my $domain = <LOGFILE>) { 
     chomp($domain); 
     $domainhash{$domain} = $domainhash{$domain} + 1; 
    } 
    $logpos = tell(LOGFILE); 
    close(LOGFILE); 
} else { 
    print "could not open logfile $logfile: $!\n"; 
} 

# Iterate over entries learned from log and increment counter files for each domain 
foreach my $domain (keys(%domainhash)) { 
    my $cntr = 0; 
    # Get current counter 
    if (open(CNTRFILE, "<".$basedir."/".$domain)) { 
     $cntr = <CNTRFILE>; 
     close(CNTRFILE); 
    } 
    # Write new counter 
    if (open(CNTRFILE, ">".$basedir."/".$domain)) { 
     print CNTRFILE ($cntr + $domainhash{$domain}); 
     close(CNTRFILE); 
    } 
} 

# Write current log position back to pointer file 
if (open (PTRFILE, ">$ptrfile")) { 
    print PTRFILE $logpos; 
    close PTRFILE; 
} else { 
    print "could not write to pointerfile $ptrfile: $!\n"; 
} 

그리고 마지막으로, 오징어는 정책 결정하기 위해 사용할 수있는 도우미 스크립트를 튜닝

#!/usr/bin/perl 
# File:/tmp/domaincheck.pl 
use strict; 

# Enable autoflush 
$|=1; 
my $basedir = '/tmp/domaincntrs'; 

# Set up infinite loop 
while (my $line = <STDIN>) { 
    my ($domain, $limit, $rest) = split(/\s+/, $line, 3); 
    chomp($line); 
    $limit = 100 if (!int($limit)); 
    my $cntr = 0; 
    my $resp = ''; 
    if (open(INFILE, $basedir."/".$domain)) { 
     $cntr = <INFILE>; 
     close(INFILE); 
    } 
    chomp($cntr); 
    $resp = ($cntr > $limit) ? 'OK' : 'ERR'; 
    if (open(LOGFILE, ">>/tmp/domaincheck.log")) { 
     print LOGFILE "domain=$domain limit=$limit cntr=$cntr resp=$resp\n"; 
     close(LOGFILE); 
    } 
    print "$resp\n"; 
} 

몇 가지 팁 : 당신의 domains.log에 안타를 많이받을거야 예기치 않은 액세스가있을 수 있습니다. 심지어 거부 된 항목의 경우에도 마찬가지입니다. 성공적인 요청 (예 : HTTP 결과 코드 200-299)을 정의하고 ACL을 access_log 문에 적용하여 해당 파일에 기록되는 내용을 제어하는 ​​ACL을 고려해야합니다.

domaincheck.pl 스크립트의 기본 제한은 100이지만 Squid 구성 파일에서 전달되는 변수 제한을 수용합니다. 당신은 당신의 기본적인 squid.conf에서 예를 그 ACL의 여러 호출을 지정하는 데 사용할 수 있습니다 많은 도메인/제한 임계 값에 대한

# Define our busy and quiet domains 
acl busy-domains dstdomain .google.com .microsoft.com 
acl quiet-domains dstdomain .centos.org .adobe.com 
# Define some busy and quiet limits 
acl busy-domains-limit external domaincheck 750 
acl quiet-domains-limit external domaincheck 100 
# Combine the domains and limits ACLs into policy rules to deny access when both conditions are true 
http_access deny busy-domains busy-domains-limit 
http_access deny quiet-domains quiet-domains-limit 

반복이 당신이 필요로하는.

+0

'FATAL : Bungled /usr/local/squid/etc/squid.conf 35 행 : acl overlimit-domains external 100 오징어 캐시 (버전 3.5.24) : 비정상적으로 종료되었습니다. CPU 사용량 : 0.050 초 = 0.050 사용자 + 0.000 sys 최대 상주 크기 : 36784KB 실제 I/O 페이지 오류 : 0' 100이 추가 될 때이 오류 표시 – Premchand

+0

"domaincheck"키워드가 누락 된 것 같습니다. 그곳에. 따라서 행은 다음과 같아야합니다. acl overlimit-domains external domaincheck 100 또한 domaincheck.pl 스크립트는 Squid 구성 파일에서 전달되는 추가 매개 변수를 고려하여 조정해야합니다. 이 질문에 답을 표시 할 수 있습니까? – djluko

+0

domaincheck.pl 스크립트에 필요한 변경 사항을 포함하도록 답변을 업데이트했으며 구성 예제도 제공했습니다. HtH. – djluko