כיצד לחסום כתובות IP בדף הכניסה של Nginx/WordPress


זהו מדריך צעד אחר צעד למתחילים מראה כיצד להגדיר את Nginx לחסום כתובות IP מסוימות או טווח IP מגישה לאתר שלך, ולחסום את כל האחרים בזמן שרק אתה (וכתובות IP שצוינו) יכולים לגשת לדפי הכניסה לוורדפרס.

האתר הזה היה תחת מתקפה לפני כמה ימים. מישהו ביצע עשרות אלפי בקשות קבועות שהאטו את תגובת השרת. וזה מה שעשיתי כדי לחסום ידנית כתובות IP של תוקפים ולהגביל את הגישה לעמוד ההתחברות.

הערה: עבור כמות גדולה של התקפות DDoS, מומלץ להשתמש בכלים/שירותים של צד שלישי, כגון fail2ban או CloudFlare, כדי להפחית על ידי חסימה אוטומטית של כתובות ה-IP.

שלב 1: גלה כתובות IP של התוקף

1. ראשית, התחבר לשרת Linux שלך והפעל פקודה לעריכת קובץ תצורה של Nginx:

sudo nano /etc/nginx/nginx.conf

לאחר מכן, ודא שהוא כולל את הקו access_log /var/log/nginx/access.log; עבור יומן הגישה.

2. אם יומן הגישה לא הופעל, עליך להוסיף ידנית שורה זו ולשמור קובץ (הקש Ctrl+S ולאחר מכן Ctrl+X).

בנוסף, החל שינוי על-ידי ביצוע בדיקת תצורה והפעלה מחדש של השירות:

sudo nginx -t
sudo systemctl restart nginx.service

3. מבלי לגלוש בקובץ היומן ולספור את כניסות ה- IP באופן ידני, תוכל להפעיל את הפקודה היחידה למטה בשרת:

sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr |more

פקודה זו תחפש את קובץ היומן (/var/log/nginx/access.log) ותדפיס את כתובות ה- IP העליונות ותספור כמה בקשות הם שלחו.

הערה: אם אתה משתמש ב- CloudFlare CDN עבור האתר שלך, Nginx כברירת מחדל אינו מציג את כתובות ה- IP האמיתיות של המבקרים.

במקרה, עליך ליצור קובץ תצורה עבור Nginx על ידי הפעלת הפקודה הבאה בשרת:

sudo nano /etc/nginx/conf.d/nginx-cloudflare-realip.conf

לאחר מכן, הוסף את השורות הבאות כדי לספר כדי להציג את כתובות ה- IP האמיתיות לביקורים מ- CloudFlare:

set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 172.70.0.0/16;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
#real_ip_header CF-Connecting-IP;
real_ip_header X-Forwarded-For;

לאחר מכן, הקש Ctrl+S כדי לשמור קובץ ו- Ctrl+X כדי לצאת. לבסוף, הפעל את 2 הפקודות שהוזכרו לעיל כדי לבדוק תצורה ולהפעיל מחדש את השירות.

הערה 1: Cloudflare עשויה להוסיף/להסיר כתובות IP בעתיד! ראה דף זה לקבלת המידע העדכני ביותר.
הערה 2: תצורה זו זקוקה לדגם ngx_http_realip_module, המופעל כברירת מחדל באובונטו ודביאן.

שלב 2: חסום כתובות IP או טווח IP ב- Nginx

לאחר שגילית את כתובות ה-IP של התוקף, הפעל את הפקודה הבאה כדי ליצור קובץ תצורה:

sudo nano /etc/nginx/conf.d/block.conf

לאחר מכן, הוסף שורות דומות למטה כדי לומר לחסום כתובות IP וטווח IP מסוימים (החלף כתובות IP למטה עם אלה שקיבלת בשלב האחרון) עבור כל שרתי האינטרנט NGINX במארח זה:

deny 206.189.129.37;
deny 143.110.180.216;
deny 167.172.87.180;
deny 167.99.77.92;
deny 152.42.178.38;
deny 2600:3c03::f03c:91ff:fe69:a353;
deny 139.59.108.0/24;
deny 128.199.0.0/16;

כאן להכחיש 139.59.108.0/24; פירושו לחסום טווח IP מ '139.59.108.0' ל '139.59.108.255'. וכן, 128.199.0.0/16; פירושו טווח IP בין '128.199.0.0' ל- '128.199.255.255'. אתה יכול להחליף אותם בהתאם לטווח ה- IP הרצוי שלך.

לבחירה, תוכל להשתמש בכללים הבאים במקום זאת כדי לאפשר רק IP 1.2.3.4 ו- 2.3.4.5 (להחליף בהתאם) אך לחסום את כל האחרים.

allow 1.2.3.4;
allow 2.3.4.5;
deny all;

בסיום עריכת הקובץ, הקש Ctrl+S כדי לשמור ו- Ctrl+X כדי לצאת. לבסוף, בדוק תצורה והפעל מחדש את השירות כדי להחיל שינויים:

sudo nginx -t
sudo systemctl restart nginx.service

שלב 3: הגבלת הגישה לדף הכניסה לוורדפרס (wp-admin, wp-login.php)

עבור אתר וורדפרס, זו בחירה טובה לחסום את כל האחרים מלבקר בדף wp-admin/wp-login.php, מה שמשאיר רק אותך ואת המשתמשים מכתובות IP שצוינו להיות מסוגלים לגשת.

1. ראשית, התחבר לשרת לינוקס והפעל פקודה לעריכת קובץ התצורה של Nginx עבור האתר שלך:

sudo nano /etc/nginx/sites-available/wordpress

בפקודה עליך להחליף את שם הקובץ וורדפרס בשלך. השתמש ב- ls /etc/nginx/sites-available כדי לרשום את כל הקבצים בספריה זו.

2. כאשר הקבצים נפתחים, גלול מטה והוסף בלוק "location=/wp-login.php{}" עם כללים דומים להלן:

location = /wp-login.php {
    allow 1.2.3.4;
    allow 2.3.4.5;
    deny all;
}

כאן להחליף 1.2.3.4 ו 2.3.4.5 עם כתובות IP אתה רוצה לאפשר להם לגשת לדף ההתחברות. בנוסף, תוכל להוסיף עוד או להסיר קווי הרשאה להוספה/הסרה של כתובות IP.

הערה: הן הבלוקים "location=//wp-login.php {}" והן "location ~ /.php${}" (כלומר כל סיום עם '.php') תואמים לכתובת URL של דף הכניסה לוורדפרס (wp-login.php), אך לראשון יש עדיפות גבוהה יותר.

כלומר, בעת ביקור בדף wp-login.php, יתעלמו מהכללים תחת מיקום ~ /.php$! במקרה זה, הוא עשוי לנסות להוריד קובץ במקום לעבד את דף האינטרנט.

כדי לעקוף זאת, עליך גם להוסיף את הכללים תחת "מיקום ~ /.php${}" , כך שזה ייראה כך:

location = /wp-login.php {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.4-fpm.sock;
    allow 1.2.3.4;
    allow 2.3.4.5;
    deny all;
}

הערה: עליך להחליף את הבלוק include snippets/fastcgi-php.conf; ואת fastcgi_pass unix:/run/php/php8.4-fpm.sock; בהתאם לכללים תחת הבלוק "location ~\.php${}".

בסיום. שמור קובץ (הקש Ctrl+S ולאחר מכן Ctrl+X), בדוק תצורה והפעל מחדש את השירות כדי להחיל שינויים.

sudo nginx -t
sudo systemctl restart nginx.service

טיפים: לאחר ביצוע שינויים בחסימות מיקום, ייתכן שיהיה עליך לנקות את מטמון הדפדפן ולאחר מכן לוודא אם הוא פועל.

עוד על בלוקי המיקום של Nginx

תצורת Nginx כוללת סוגים שונים של בלוקי מיקום. הם כוללים:

  • מיקום /ABC - התאמת קידומת, example.com/abc, example.com/abcde, example.com/abc/123, example.com/abc?123.
  • מיקום=/abc, התאמה מדויקת, example.com/abc, example.com/abc?123, אך לא עבור example.com/abcde, example.com/abc/.
  • מיקום ~ ^/abc$, regex תואם example.com/abc, example.com/abc?123, אך לא עבור example.com/abcde, example.com/abc/.
  • מיקום ~* ^/abc$, דומה למיקום ~ ^/abc$ אך תלוי רישיות. זה גם תואם example.com/ABC.
  • מיקום ^~ /abc, דומה למיקום /abc, אך עדיפות גבוהה יותר וללא regex.

העדיפות מגבוה לנמוך: מיקום = מיקום > ^~ מיקום > ~=מיקום ~* מיקום > /.