나는 오징어를 처음 사용하며 사용자가 프록시를 사용할 때 도메인 당 히트 수를 설정하는 옵션이 있는지 알고 싶습니다. 예를 들어 사이트 http://example.com에 대한 조회수를 100으로 설정하고 한도를 초과하면 도메인을 차단해야합니다.오징어 - 각 도메인에 대한 조회수가 설정됩니다.
모든 제안 사항이 상당합니다.
나는 오징어를 처음 사용하며 사용자가 프록시를 사용할 때 도메인 당 히트 수를 설정하는 옵션이 있는지 알고 싶습니다. 예를 들어 사이트 http://example.com에 대한 조회수를 100으로 설정하고 한도를 초과하면 도메인을 차단해야합니다.오징어 - 각 도메인에 대한 조회수가 설정됩니다.
모든 제안 사항이 상당합니다.
짧은 대답은 아니오입니다. 도메인에 대한 조회수를 제한하는 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
반복이 당신이 필요로하는.
'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
"domaincheck"키워드가 누락 된 것 같습니다. 그곳에. 따라서 행은 다음과 같아야합니다. acl overlimit-domains external domaincheck 100 또한 domaincheck.pl 스크립트는 Squid 구성 파일에서 전달되는 추가 매개 변수를 고려하여 조정해야합니다. 이 질문에 답을 표시 할 수 있습니까? – djluko
domaincheck.pl 스크립트에 필요한 변경 사항을 포함하도록 답변을 업데이트했으며 구성 예제도 제공했습니다. HtH. – djluko