Jak zablokować IP za pomocą .htaccess?
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 authzZwróć 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.0Zastą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.44Blokowanie 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.32Apache 2.2:
Order Deny,Allow
Deny from all
Allow from 123.456.789.0
Allow from 98.76.54.32Każ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życia | Zalecana metoda | Kluczowa składnia |
|---|---|---|
| Blokowanie pojedynczego IP | Require not ip | Require not ip 1.2.3.4 |
| Blokowanie wielu IP | Require not ip (wielokrotne) | Require not ip 1.2.3.4 (powtarzane) |
| Blokowanie zakresu /24 | Notacja CIDR | Require not ip 1.2.3.0/24 |
| Lista biała konkretnych IP | Lista biała | Require ip 1.2.3.4 |
| Przekierowanie zamiast blokowania | RewriteRule | RewriteCond %{REMOTE_ADDR} |
| Blokowanie według User-Agent | RewriteRule + HTTP_USER_AGENT | RewriteCond %{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.
Nicolas,