Apache httpd : 어떻게 서브넷에서 허용, 서브넷에서 IP 거부를 거부 할 수 있습니까?


26

주식 Apache httpd-2.2.3으로 CentOS 5.5를 실행하고 있습니다.

Location / server-status에서 mod_status 를 활성화 했습니다. 다음과 같은 방법으로이 단일 위치에 대한 액세스를 허용하고 싶습니다.

  1. 모두 거부
  2. 서브넷에서 허용 192.168.16.0/24
  3. 192.168.16.0/24 서브넷에있는 IP 192.168.16.100에서 거부하십시오.

1과 2는 쉽습니다. 그러나 "192.168.16.0/24에서 허용"이므로 192.168.16.100에서 거부 할 수 있습니까?

192.168.16.100에 대해 Deny 문을 추가하려고 시도했지만 작동하지 않습니다. 관련 구성은 다음과 같습니다.

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  all
    Deny from  192.168.16.100 # This does not deny access from 192.168.16.100
    Allow from 192.168.16.0/24
</Location>

또는:

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  all
    Deny from  192.168.16.100 # This does not deny access from 192.168.16.100
    Allow from 192.168.16.0/24
</Location>

그러나 액세스 로그에 설명 된대로이 특정 페이지에 대한 액세스를 차단하지는 않습니다.

www.example.org 192.168.16.100 - - [11/Mar/2011:16:01:14 -0800] "GET /server-status HTTP/1.1" 200 9966 "-" "

mod_authz_host 매뉴얼에 따르면 :

거부 허용

먼저 모든 허용 지시문이 평가됩니다. 하나 이상이 일치해야합니다. 그렇지 않으면 요청이 거부됩니다. 다음으로 모든 거부 지시문이 평가됩니다. 일치하는 경우 요청이 거부됩니다.

IP 주소는 Deny 지시문과 일치하므로 요청을 거부해서는 안됩니까?

mod_authz_host 페이지의 표에 따르면이 IP 주소는 "허용 및 거부 둘 다 일치"와 "최종 일치 제어 : 거부"규칙이 적용되어야합니다.

    일치 허용, 결과 거부 거부, 결과 허용
    일치 허용 요청 만 허용 요청 허용
    경기 거부 만 요청 거부 요청이 거부되었습니다.
    일치하지 않음 기본-두 번째 지시문 : 거부 기본값-두 번째 지시문 : 허용
    허용 및 거부 최종 경기 컨트롤 모두 일치 : 최종 경기 종료 컨트롤 : 허용

192.168.16.100 모두 거부-여기서 "all"을 사용하므로 모든 요청이 모든 IP 주소에서 거부 될 것으로 예상합니다. 다른 일이 일어나고 있다고 생각하십시오.
— micah

@Michah : 나는 또한하고있다 Allow from 192.168.16.0/24. 설명서를 이해하면 192.168.16.0/24 네트워크의 모든 요청자 IP가이 Allow 문과 일치하므로 요청이 허용됩니다.
— Stefan Lasiewski

위에 붙여 넣은 문서를 따릅니다. "먼저 모든 허용 지시문이 평가됩니다. 하나 이상이 일치하거나 요청이 거부됩니다"==> "192.168.16.0/24에서 허용"과 일치해야하지만 "다음, 모든 거부 지시문은 일치하는 항목이 있으면 요청이 거부됩니다 ""모두 거부 "를 사용하면 모든 요청이 해당 두 번째 부분과 일치하지 않아 거부되지 않습니까?
— micah

해당 IP 주소가 시스템에 대한 완전한 액세스를 거부하거나 httpd에서만 액세스하려는 경우 실제로 고려해야합니다. 전자가 아파치 지시문을 사용하는 방식을 계속한다면. 후자의 경우 방화벽에서 수행해야합니다.
— Andrew Case

ACase 감사합니다. 이 특정 페이지에 대한 192.168.16.100의 액세스를 거부하고 싶습니다. 192.168.16.100 이이 웹 서버의 다른 모든 페이지에 액세스 할 수 있기를 바랍니다.
— Stefan Lasiewski

답변:


35

테스트하지는 않았지만 거의 거기에 있다고 생각합니다.

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  192.168.16.100
    Allow from 192.168.16.0/24
</Location>

Deny from all필요하지 않습니다. 사실 모든 것이 일치 all하므로 거부 되기 때문에 망할 것입니다 (아파치가 똑똑하고 어리석은 일을하려고한다고 생각합니다). 난 항상 아파치의 발견 Order, Allow그리고 Deny지침 그래서 항상 (에서 가져온 테이블에 물건을 시각화, 혼란 워드 프로세서 ) :

경기 | 허용, 거부 결과 | 거부, 결과 허용
-------------------------------------------------- -----
허용 | 허용 | 허용됨
거부 만 | 거부 됨 | 거부
일치하지 않습니다 | 기본값 : 거부 | 기본값 : 허용
둘 다 일치 | 결승전 : 거부 | 최종 경기 : 허용

위 설정으로 :

  • 192.168.16.100의 요청은 "Match both"를 받고 거부됩니다.
  • 192.168.16.12의 요청은 "허용 만"으로되어 허용됩니다.
  • 123.123.123.123의 요청은 "일치하지 않음"을 얻으므로 거부됩니다.

1

포트 80의 단일 호스트를 거부하고 모든 것을 거부하고 서브넷을 허용하기 위해 IPTables 규칙을 추가하는 것도 고려할 것입니다.

서브넷을 허용 한 후 특정 주소에서 거부 규칙을 설정하는 데 아무런 문제가 없습니다. 순서대로하세요.


내 답변을 업데이트했습니다. "192.168.16.100에서 거부"규칙을 포함했지만 192.168.16.100
— Stefan Lasiewski

이 호스트에서 다른 모든 위치에 대한 액세스를 허용하고 싶습니다. 그러나 특정 위치를 거부하고 싶습니다. IPTables는 여기에 도움이되지 않습니다.
— Stefan Lasiewski

IPTables는 사용자가 지시하지 않는 한 아웃 바운드 트래픽을 구체적으로 거부하지 않습니다. 그러나 전 세계의 인바운드 트래픽과 특정 주소를 거부 할 수 있지만 모두 서브넷을 허용합니다.
— Mike

내 요청을 오해 한 것 같아 이 액세스 제어를 전체 호스트가 아닌 / server-status에만 적용하고 싶습니다. IPtables는 내 지식으로는 쉽게 할 수 없습니다.
— Stefan Lasiewski

-4

PHP를 사용할 수 있습니까? 그렇다면 해당 특정 IP 주소에 대해 php 문을 추가 / 종료

예:

$ deny = array ( "111.111.111", "222.222.222", "333.333.333");

if (in_array ($ _SERVER [ 'REMOTE_ADDR'], $ deny))

{header ( "위치 : http://www.google.com/ ");

출구();

참조 : http://perishablepress.com/press/2007/07/03/how-to-block-ip-addresses-with-php/


2
웹 서버가 호스팅하는 모든 단일 페이지에 있어야합니다. 이 솔루션은 실용적이지 않으며 웹 서버에 대한 액세스를 필터링하려는 위치가 아닙니다.
— Andrew Case
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.