아파치 로그에서 다음과 같은 요청이 많이 발생합니다.
www.example.com:80 10.240.1.8 - - [06/Mar/2013:00:39:19 +0000] "-" 408 0 "-" "-" -
요청이없고 사용자 에이전트가없는 것 같습니다. 전에 본 사람 있어요?
답변
Elastic Load Balancer 뒤에서 Amazon에서 웹 서버를 실행할 가능성이 있습니까?
그들의 건강 점검으로 인해 많은 408 개의 응답을 생성하는 것 같습니다 .
해당 포럼 스레드의 일부 솔루션은 다음과 같습니다.
-
RequestReadTimeout header=0 body=0
요청 시간이 초과되면 408 응답이 비활성화됩니다.
- ELB 상태 확인을 다른 포트로 변경하십시오.
-
다음을 사용하여 ELB IP 주소에 대한 로깅을 비활성화하십시오.
SetEnvIf Remote_Addr "10\.0\.0\.5" exclude_from_log CustomLog logs/access_log common env=!exclude_from_log
그리고이 블로그 게시물에서 :
- 요청 시간 제한을 60 이상으로 조정하십시오.
답변
무언가가 포트에 연결되어 있고 데이터를 보내지 않습니다. HTTP 408은 “시간 초과”오류입니다. 여기에 좋은 글이 있습니다 : http://www.checkupdown.com/status/E408.html
답변
여기에 이미 몇 가지 좋은 답변이 있지만 구체적으로 언급되지 않은 추가 메모 하나를 위험에 빠뜨리고 싶습니다. 이전의 많은 주석가가 이미 언급했듯이 408은 시간 초과를 나타냅니다. 웹 서버에서 시간 초과가 발생하는 상황이 많이 있습니다.
따라서 서버에서 악용 여부를 검사하는 다양한 경우 408 오류가 발생할 수 있습니다. 이러한 경우 클라이언트는 사용자 에이전트를 거의 나타내지 않고 갑자기 연결을 종료하여 해당 연결이 중단되어 408 오류가 발생할 수 있습니다.
예를 들어, 나는 여전히 POODLE 취약점에 취약한 컴퓨터를 인터넷에서 검색하는 끔찍한 해커라고 가정 해 봅시다. 따라서 SSL 버전 3을 허용하는 서버를 찾기 위해 많은 양의 IP 주소에 대한 연결을 여는 스크립트를 작성했습니다. 나중에 해당 목록을 사용하여 POODLE 익스플로잇을 구체적으로 스캔합니다. 이 첫 번째 스크립트는 다음과 같이 openssl을 사용하여 SSLv3을 확인하는 연결을 설정합니다.
openssl s_client -connect [IP]:443 -ssl3
이 명령은 많은 Apache 구성에서 설명한대로 408 메시지를 생성합니다. 내 두 대의 서버에서이 명령을 수행하면 액세스 로그에 다음 항목이 생성되었습니다.
<remote IP address> - - [04/Nov/2015:08:09:33 -0500] "-" 408 - "-" "-"
OP가 어떤 형태의로드 밸런싱을 사용하지 않는 상황에서도 여러 가지 상황에서 408 오류가 발생할 수 있습니다. 일부는 악의적이며 일부는 클라이언트에 문제가 있음을 나타내고 일부는 서버에 문제가 있음을 나타냅니다. (OP에서 제공 한 로그에서 로컬 IP가 원격 IP로 표시되었지만 OP는로드 밸런서 사용을 구체적으로 언급하지 않았으므로 OP가 단순히 라우팅 할 수없는 IP를 목적으로 사용했는지 확실하지 않았습니다. URL과 마찬가지로 데모
어쨌든 내 게시물이 분명히 늦게 OP에 도움이되기에 너무 늦었더라도 희망하는 시간 초과 오류에 대한 해결책을 찾고 여기에 도착하는 다른 사람들을 도울 수 있습니다.
답변
408 타임 아웃에는 여러 가지 이유가 있습니다. 그러나 모든 것이 괜찮다는 전제에서 시작하여 어느 시점에서이 408이 액세스 로그에 나타나기 시작합니다 (예 : 408 0 “-” “-“).
많은 사람들이 인터넷에서 지적한 것처럼 408은 연결이 이루어졌지만 적절한 시간 단위로 요청이 전송되지 않았 음을 나타내므로 서버는 408과 연결을 끊습니다. 오만한 한 사람이 – “시간 초과의 어떤 부분을 이해하지 못합니까?”
나는 이것이 초보 답변이라고 생각하며 일부 보안 방법이 웹 서버 소프트웨어에서 어떻게 작동하는지 완전히 이해하지 못하고 있음을 보여줍니다.
그래서 처음으로 돌아가서, 왜이 모든 408을 보게됩니까? 우리가 서버를 관리하는 다른 사람들과 공통점이있는 한 가지는 매일받는 대규모 공격입니다. 자, 이것들에 대해 무엇을하십니까? 글쎄 : 선택한 보안 방법을 사용하여이를 처리 할 수 있습니다.
아주 쉬운 예를 들어 보자. IP 주소 삭제. iptabes 파일 (rules.v4)에 “-A ufw-user-input -s 37.58.64.228 -j DROP”이 포함되어 있습니다. 방화벽은 IP를 인식하고 연결을 끊습니다. 많은 구성에서 문을 두드리는 것을 알지 못할 것입니다.
이제 몇 가지 기준에 따라 연결을 끊는 고급 예를 들어 보겠습니다. iptabes 파일 (rules.v4)에 “-A INPUT -p tcp -m tcp –dport 80 -m string –string”cgi “–algo bm –to 1000 -j DROP”가 있습니다. 이 iptable 규칙에서 요청 문자열의 처음 1000 바이트를보고 “cgi”의 하위 문자열을 찾을 수 있는지 확인하고 해당 하위 문자열을 찾으면 아무 것도 가지지 않기 때문에 다릅니다 또한 연결을 끊기 만하면됩니다.
여기서 보안 방법은 좋지만 로그가 오도되는 한 좋습니다. 408 0 “-” “-“는 이러한 상황에서 가장 좋은 아파치입니다. 규칙이 연결을 끊는 기준을 충족했기 때문에 연결이 이루어지고 문자열 비교 규칙을 적용하기 위해 요청이 어느 시점까지 수락되어야했습니다. 그래서, 우리의 작은 초보자 사랑 자들은 그들이 시도한다면 더 잘못 될 수 없었습니다. 연결되고 요청이 수신되었습니다 (이러한 상황에서는 표시되지 않습니다). 408이 생성되었지만 ‘Timeout’이 아닙니다. 방화벽 규칙과 관련하여 요청이 이루어진 후 서버가 단순히 연결을 끊었습니다. 동일한 408 상황을 생성하는 다른 많은 규칙이 있습니다. 님’
이상적으로 또 다른 Apache 생성 오류 코드가있을 것입니다. 예를 들어 ‘499’는 ‘서버가 귀하의 요청을 읽고 결정한 것으로 귀찮게 할 수 없음-Sod Off HaHa’를 의미합니다.
최신 웹 서버 소프트웨어를 사용하면 DOS 공격을 실질적으로 배제 할 수 있으며 예측 기능을 통합 한 새로운 브라우저는이 문제를 일으키지 않습니다.
요컨대, 408은 서버가 요청에 응답하지 않았기 때문에 생성되는데, 클라이언트가 연결 시간 초과에 관한 한, 실제로 서버가 요청을 읽지 만 시간 종료 대기 이외의 이유로 연결을 끊은 경우 요청.
답변
우리는이 문제를 매우 오랫동안 당황했습니다. 우리가 생각 해낸 최고의 솔루션은 AWS 지원의 ELB 팀이 제안한 것입니다. 기본적으로 httpd 서버의 시간 초과 설정이 ELB idle timeout
설정 보다 큽니다 (기본값 : 60 초).
- 아파치
Timeout
지시어 값이idle timeout
ELB 설정의 두 배 인지 확인하십시오 . - 온 켜고
KeepAlive
, 기능이 보장MaxKeepAliveRequests
합니다 (0 무한 또는 매우 높은, 2000 등) 매우 큰, 그것은KeepAliveTimeout
당신의 ELB의보다 큰idle timeout
.
우리는 KeepAlive
(및 관련 설정) 설정이 특히 408의 양을 효과적으로 0으로 줄였습니다.
답변
AWS Elastic Load Balancer 뒤에이 문제가있었습니다. 상태 확인은 로그에 엄청난 양의 408 응답을 생성했습니다.
나를 위해 일한 유일한 솔루션은 Load Balancer의 유휴 시간 초과 설정을 상태 확인의 응답 시간 초과 보다 낮게 설정하는 것 입니다.
답변
동료는 최근에 마지막 게시물에 408이 보안 조치와 연관 될 수있는 방법에 대한 올바른 설명을 제공했지만 해결책을 제시하지 않았다고 말했습니다.
파이프 액세스 로그는 내 개인 솔루션입니다.
다음은 대부분의 우분투 구성에서 기본적으로 작동하며 다른 Apache 구성에서는 최소한의 땜질로 작동합니다. 가장 이해하기 쉽기 때문에 PHP를 선택했습니다. 두 개의 스크립트가 있습니다. 첫 번째 스크립트는 408이 액세스 로그에 기록되지 않도록합니다. 두 번째 스크립트는 모든 408을 별도의 로그 파일로 보냅니다. 어느 쪽이든 결과는 액세스 로그에 더 이상 408이 아닙니다. 구현할 스크립트를 선택하십시오.
좋아하는 텍스트 편집기를 사용하십시오. 저는 nano를 사용합니다. ‘LogFormat’및 ‘CustomLog’지시문이있는 파일을여십시오. 평소 #로 원고를 주석 처리하고 다음을 추가하십시오. 이러한 지시문은 아래 파일에서 찾을 수 있습니다.
sudo nano / etc / apache2 / sites-available / default
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" AccessLogPipe
CustomLog "|/var/log/apache2/PipedAccessLog.php" AccessLogPipe env=!dontlog
참고 : 액세스 로그에 이미지를 기록하지 않습니다. 내 etc / apache2 / httpd.conf 파일에 줄을 포함시킵니다.
SetEnvIfNoCase Request_URI ".(gif)|(jpg)|(png)|(css)|(js)|(ico)$" dontlog
이것이 관심이 없다면 지시어 env=!dontlog
에서 를 제거하십시오 CustomLog
.
이제 다음 PHP 스크립트 중 하나 (생성 #!/usr/bin/php
위치가 사용자의 시스템에 맞게 설정되어 있는지 확인 인터프리터의 위치에 대한 참조입니다 – 당신은 프롬프트 $에 입력하여이 작업을 수행 할 수 있습니다 whereis php
-이 같은 뭔가를 반환해야 php: /usr/bin/php /usr/bin/X11/php /usr/share/man/man1/php.1.gz
당신으로. #!/usr/bin/php
내 설정에 맞는 것을 볼 수 있습니다 ).
sudo nano /var/log/apache2/PipedAccessLog.php
#!/usr/bin/php
<?php
$file = '/var/log/apache2/access.log';
$no408 = '"-" 408 0 "-" "-"';
$stdin = fopen ('php://stdin', 'r');
ob_implicit_flush (true);
while ($line = fgets ($stdin)) {
if($line != "") {
if(stristr($line,$no408,true) == "") {
file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
}
}
}
?>
sudo nano /var/log/apache2/PipedAccessLog.php
#!/usr/bin/php
<?php
$file = '/var/log/apache2/access.log';
$file408 = '/var/log/apache2/408.log';
$no408 = '"-" 408 0 "-" "-"';
$stdin = fopen ('php://stdin', 'r');
ob_implicit_flush (true);
while ($line = fgets ($stdin)) {
if($line != "") {
if(stristr($line,$no408,true) != "") {
file_put_contents($file408, $line, FILE_APPEND | LOCK_EX);
}
else {
file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
}
}
}
?>
PipedAccessLog.php
스크립트 를 저장했습니다 . $ 프롬프트에서 다음을 실행하여 root에게 소유권이 있는지 확인하십시오.
sudo chown -R root:adm /var/log/apache2/PipedAccessLog.php
PipedAccessLog.php
스크립트는 읽기 / 쓰기 및 사용 권한이 너무 프롬프트 $에서 다음을 실행 실행해야합니다.
sudo chmod 755 /var/log/apache2/PipedAccessLog.php
마지막으로 모든 작업을 수행하려면 Apache 서비스를 다시 시작해야합니다. $ 프롬프트에서 다음을 실행하십시오.
sudo service apache2 restart
Apache 로그가 다른 곳에 있으면 구성에 맞게 경로를 변경하십시오. 행운을 빕니다.