IP Whitelist cho WordPress: Hướng dẫn Apache, Nginx và OpenLiteSpeed (kèm custom login URL)

CD

Bảo mật WordPress là vấn đề quan trọng, đặc biệt là bảo vệ khu vực quản trị (/wp-admin/) khỏi các cuộc tấn công brute force. Bài này hướng dẫn cách giới hạn IP truy cập admin thông qua OpenLiteSpeed, đặc biệt khi bạn dùng custom login URL từ plugin như Perfmatters.

Vì sao cần IP whitelist?

  • Ngăn chặn brute force vào /wp-login.php
  • Bảo vệ admin dashboard khỏi truy cập trái phép
  • Tuân thủ chính sách bảo mật nội bộ
  • Giảm tải server vì chặn request từ IP không mong muốn ngay từ đầu

Trong quá trình triển khai bảo mật WordPress cho khách hàng tại Code Tốt, nhóm kỹ thuật nhận thấy rằng các dự án dùng custom login URL (thay đổi địa chỉ /wp-login.php thành /quantri/ chẳng hạn) không thể dùng .htaccess để chặn IP, vì plugin xử lý route trước khi Apache/Nginx đọc .htaccess. Với OpenLiteSpeed, giải pháp là dùng vhost rewrite config.

Cách 1: Dùng .htaccess (không dùng custom login)

Nếu bạn dùng /wp-admin/ mặc định, thêm vào .htaccess trong thư mục gốc:

# LiteSpeed / Apache: Chỉ cho phép IP nội bộ vào wp-admin
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/(wp-admin|wp-login\.php) [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.100$
RewriteCond %{REMOTE_ADDR} !^103\.123\.45\.67$
RewriteRule ^ - [F,L]

Cách này có hạn chế: không hoạt động nếu bạn dùng plugin đổi URL đăng nhập như Perfmatters, WPS Hide Login hoặc iThemes Security. Plugin này xử lý request trước khi redirect qua .htaccess.

Cách 2: OpenLiteSpeed Vhost Config (Được khuyến nghị)

Với OpenLiteSpeed, cấu hình rewrite trong vhost context hoạt động ở cấp độ server, trước khi WordPress xử lý bất kỳ request nào. Do đó nó bắt được cả custom login URL.

# OpenLiteSpeed vhost rewrite config
# Chỉ cho phép IP nội bộ truy cập vùng admin

RewriteCond %{REQUEST_URI} /(wp-admin|wp-login\.php|quantri|custom-login) [NC]
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.[0-9]+
RewriteCond %{HTTP:X-Forwarded-For} !^192\.168\.1\.[0-9]+
RewriteRule ^.*$ - [F,L]

Giải thích config

  • RewriteCond %{REQUEST_URI} — Kiểm tra request có vào các đường dẫn admin hay không. Bao gồm cả /quantri//custom-login/ nếu bạn dùng custom URL
  • %{REMOTE_ADDR} — IP thực của client. Có thể dùng regex như !^192\.168\.1\.[0-9]+ để cho phép cả dải IP nội bộ
  • %{HTTP:X-Forwarded-For} — IP thực nếu request qua proxy/load balancer
  • [F,L] — Trả về 403 Forbidden và dừng xử lý các rule phía sau

Cách 3: Nếu dùng Cloudflare

Nếu website chạy qua Cloudflare, %{REMOTE_ADDR} trả về IP của Cloudflare chứ không phải IP thật của người dùng. Bạn cần dùng header CF-Connecting-IP:

# Dành cho website qua Cloudflare
RewriteCond %{REQUEST_URI} /(wp-admin|wp-login\.php|quantri) [NC]
RewriteCond %{HTTP:CF-Connecting-IP} !^192\.168\.1\.100$
RewriteCond %{HTTP:CF-Connecting-IP} !^103\.123\.45\.67$
RewriteRule ^.*$ - [F,L]

Áp dụng config vào OpenLiteSpeed

Để áp dụng, làm theo các bước:

  1. Truy cập OpenLiteSpeed admin panel (thường port 7080)
  2. Vào Configuration > Virtual Hosts > Chọn vhost của bạn > Rewrite
  3. Bật Enable Rewrite thành Yes
  4. Dán config rewrite vào ô Rewrite Rules
  5. Bấm SaveGraceful Restart (hoặc Full Restart nếu thay đổi không có hiệu lực)

Kiểm tra với curl

# Kiểm tra từ IP được phép (trả về 200)
curl -I https://your-site.com/wp-admin/

# Kiểm tra từ IP không được phép (trả về 403)
curl -I --header "CF-Connecting-IP: 1.2.3.4" https://your-site.com/wp-admin/

Lưu ý quan trọng

  • Đảm bảo bạn không block chính mình! Luôn giữ ít nhất 1 IP admin được phép trước khi áp dụng config
  • Dùng vhost config thay vì .htaccess khi có custom login URL
  • Với Cloudflare: phải dùng CF-Connecting-IP thay vì REMOTE_ADDR
  • Sau khi thay đổi OpenLiteSpeed config, nên full restart (không chỉ graceful reload) để đảm bảo áp dụng

Tham khảo: OpenLiteSpeed Docs | So sánh plugin cache | Lando local dev