내 아파치 설정에서 방문자가 특정 IP 범위에서 온 것을 본다면 환경 변수를 설정하고 싶습니다. 현재 나는 이렇게한다 :
SetEnvIfNoCase Remote_Addr "^194\.8\.7[45]\." banned=spammer-ip
SetEnvIfNoCase Remote_Addr "^212\.156\.170\." banned=spammer-ip
내가 선호하는 것은 다음과 같습니다.
SetEnvIfIpRange 194.8.74.0/23 banned=spammer-ip
SetEnvIfIpRange 212.156.170.0/24 banned=spammer-ip
… IP 주소를 문자열로 변환 한 다음 정규 표현식을 수행하는 것은 총 자원 낭비라고 생각하기 때문입니다.
나는 할 수 있었다
Deny From 194.8.74.0/23
…하지만 액세스가 거부 된 이유를 찾기 위해 403 오류 페이지에서 확인할 수있는 변수가 없습니다.
내가 놓칠 수있는 제안이 있습니까? “IP 주소 범위”를 기반으로 환경 변수를 설정할 수있는 Apache2 MOD가 있습니까?
답변
당신이 가진 것 (SetEnvIfNoCase Remote_Addr “^ abc”env_key = env_value)은 쉽게 할 수있는 최선입니다. 이 구성 스타일은 눈에 띄는 성능 저하없이로드가 많은 시스템 클러스터에서 구현되는 것을 보았습니다. CIDR 범위가 더 적절할 때 정규 표현식을 사용하는 데 동의합니다. CIDR 범위 목록에서 구성을 자동으로 생성하는 작은 프로그램을 작성할 수 있습니다.
Perl에 익숙하다면 modperl 핸들러를 작성하여 원하는 방식으로 요청을 허용 / 거부 할 수 있습니다. modperl을 사용하면 HTTP 요청 전체에서 다른 지점에서 코드를 실행할 수 있습니다. mod_perl 2.0 HTTP 요청주기 단계 . PerlAuthzHandler가 사용하기에 적합한 핸들러입니다.
로키
답변
SetEnv를 통해 설정된 변수는 일부 작업에서 보이지 않습니다 (행렬 참조).
당신의 해결책은
SetEnvIfExpr "-R '10.0.0.0/8' || -R '172.16.0.0/12' || -R '192.168.0.0/16'" rfc1918
참조 https://httpd.apache.org/docs/trunk/mod/mod_setenvif.html#SetEnvIfExpr를
답변
Apache 2.4에서 CIDR 형식을 사용할 수 있습니다 <If>
.
<If "%{REMOTE_ADDR} -ipmatch 194.8.74.0/23">
SetEnv banned = spammer-ip
</If>
답변
이것은 실제로 RegExp 에서 IP Ranges 로 이동하는 솔루션은 아니지만 Google에서 호스팅하는 멋진 스크립트를 사용하여 IP 범위를 일치하는 regexp로 변환합니다. 여러분 중 일부에게도 유용 할 수 있습니다.
[최신 정보]
Google이 IP 주소 도구를 제거한 것처럼 보이거나 최소한 사이트에있는 링크가 끊어진 것처럼 보이지만 http://www.analyticsmarket.com/freetools/ipregex 와 비슷한 도구가 있습니다.