IPcost

Jak zablokować IP za pomocą .htaccess?

Nicolas Nicolas,


Plik .htaccess jest jednym z najpotężniejszych narzędzi dostępnych dla administratorów stron internetowych na serwerach Apache. Umożliwia precyzyjne kontrolowanie dostępu do witryny bez dotykania głównej konfiguracji serwera. Wśród jego najczęstszych zastosowań: blokowanie niechcianych adresów IP — złośliwe boty, scrapery, atakujący lub po prostu odwiedzający, których dostęp chcesz ograniczyć. Oto wszystkie dostępne metody, od najprostszej do najbardziej zaawansowanej.

Wymagania wstępne: włączenie mod_authz_host

Dyrektywy kontroli dostępu według IP w .htaccess wymagają, aby moduł Apache mod_authz_host był włączony na serwerze. Jest to domyślnie włączone na praktycznie wszystkich środowiskach hostingu współdzielonego i nowoczesnych serwerach Apache. Jeśli zarządzasz własnym serwerem, sprawdź za pomocą:

apache2ctl -M | grep authz

Zwróć też uwagę, że składnia nieco różni się między Apache 2.2 a Apache 2.4 (aktualną wersją). Obie składnie są pokazane poniżej.

Blokowanie pojedynczego IP

To najprostszy przypadek. Dodaj te linie do pliku .htaccess w katalogu głównym witryny:

Apache 2.4 (aktualna składnia):

<RequireAll>
  Require all granted
  Require not ip 123.456.789.0
</RequireAll>

Apache 2.2 (stara składnia):

Order Allow,Deny
Allow from all
Deny from 123.456.789.0

Zastąp 123.456.789.0 adresem IP, który chcesz zablokować. Odwiedzający otrzyma błąd 403 Forbidden.

Blokowanie wielu IP jednocześnie

Możesz dodać tyle adresów ile potrzebujesz, wymieniając je w tej samej linii lub w osobnych liniach:

Apache 2.4:

<RequireAll>
  Require all granted
  Require not ip 123.456.789.0
  Require not ip 98.76.54.32
  Require not ip 11.22.33.44
</RequireAll>

Apache 2.2:

Order Allow,Deny
Allow from all
Deny from 123.456.789.0 98.76.54.32 11.22.33.44

Blokowanie zakresu IP (podsieci)

Jeśli musisz zablokować cały blok adresów — na przykład wszystkie IP dostawcy internetu lub centrum danych — możesz użyć notacji CIDR lub prefiksu podsieci:

Według prefiksu (wszystkie IP zaczynające się od 123.456.789):

<RequireAll>
  Require all granted
  Require not ip 123.456.789
</RequireAll>

Według notacji CIDR (blok /24, czyli 256 adresów):

<RequireAll>
  Require all granted
  Require not ip 123.456.789.0/24
</RequireAll>

Inne popularne przykłady masek:

  • /32 — pojedynczy IP
  • /24 — 256 adresów (np. od 123.456.789.0 do 123.456.789.255)
  • /16 — 65 536 adresów (np. od 123.456.0.0 do 123.456.255.255)
  • /8 — 16 milionów adresów (np. od 123.0.0.0 do 123.255.255.255)

Blokowanie IP w konkretnym katalogu

Jeśli chcesz zablokować dostęp IP tylko do podkatalogu witryny (na przykład panelu administracyjnego), umieść plik .htaccess w tym konkretnym katalogu z regułą blokowania:

<RequireAll>
  Require all granted
  Require not ip 123.456.789.0
</RequireAll>
Warto wiedzieć: możesz też używać bloków <Directory>, <Files> lub <Location> bezpośrednio w pliku httpd.conf lub apache2.conf dla jeszcze precyzyjniejszej kontroli — na przykład blokując IP tylko dla konkretnego pliku. To podejście jest wydajniejsze niż .htaccess, ponieważ nie wymaga od Apache czytania pliku przy każdym żądaniu.

Lista biała: zezwolenie tylko na określone IP

Odwrotna operacja jest również możliwa: zezwolenie na dostęp tylko jednemu lub kilku konkretnym IP i blokowanie wszystkiego pozostałego. Jest to szczególnie przydatne do ochrony interfejsu administracyjnego:

Apache 2.4:

Require ip 123.456.789.0
Require ip 98.76.54.32

Apache 2.2:

Order Deny,Allow
Deny from all
Allow from 123.456.789.0
Allow from 98.76.54.32

Każdy IP spoza listy otrzyma błąd 403. Pamiętaj, że jeśli Twój IP jest dynamiczny (zmienia się przy każdym połączeniu), to podejście może zablokować Cię samego — w takim przypadku wybierz listę białą według zakresu podsieci.

Przekierowanie zablokowanego IP zamiast zwracania 403

Zamiast wyświetlać surowy błąd 403, możesz przekierować zablokowane IP na inną stronę — niestandardową stronę błędu lub nawet inny URL:

RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^123.456.789.0$
RewriteRule ^ /dostep-zabroniony.html [R=302,L]

Zwróć uwagę na escaping kropek za pomocą . w warunku RewriteCond — kropki mają specjalne znaczenie w wyrażeniach regularnych (pasują do dowolnego znaku), więc muszą być eskejpowane, aby pasowały tylko do dosłownej kropki.

Blokowanie według User-Agent zamiast IP

Niektóre złośliwe boty lub scrapery regularnie zmieniają IP, ale zachowują ten sam User-Agent. W tym przypadku blokowanie według User-Agent jest skuteczniejsze:

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^(BadBot|EvilScraper|MaliciousSpider) [NC]
RewriteRule .* - [F,L]

Flaga [F] zwraca błąd 403, [NC] sprawia, że porównanie jest niewrażliwe na wielkość liter. Możesz dodać tyle User-Agentów ile potrzebujesz, oddzielając je znakiem |.

Przypadek użyciaZalecana metodaKluczowa składnia
Blokowanie pojedynczego IPRequire not ipRequire not ip 1.2.3.4
Blokowanie wielu IPRequire not ip (wielokrotne)Require not ip 1.2.3.4 (powtarzane)
Blokowanie zakresu /24Notacja CIDRRequire not ip 1.2.3.0/24
Lista biała konkretnych IPLista białaRequire ip 1.2.3.4
Przekierowanie zamiast blokowaniaRewriteRuleRewriteCond %{REMOTE_ADDR}
Blokowanie według User-AgentRewriteRule + HTTP_USER_AGENTRewriteCond %{HTTP_USER_AGENT}
Warto wiedzieć: zmiany w pliku .htaccess są natychmiast uwzględniane przez Apache, bez potrzeby restartu serwera. Jednak nieprawidłowo sformatowany plik .htaccess może całkowicie uniemożliwić dostęp do witryny z błędem 500. Zawsze testuj zmiany w środowisku deweloperskim lub rób kopię zapasową oryginalnego pliku przed jakąkolwiek modyfikacją w produkcji. Jeśli witryna zwraca błąd 500 po modyfikacji, natychmiast przywróć poprzednią wersję pliku.