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.