Apache 2: SetEnvIf“ ช่วง IP”


10

ในการกำหนดค่า Apache ของฉันฉันต้องการตั้งค่าตัวแปรสภาพแวดล้อมถ้าฉันเห็นว่าผู้เข้าชมมาจากช่วง 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 ของฉัน - เพื่อค้นหาสาเหตุที่การเข้าถึงถูกปฏิเสธ

ข้อเสนอแนะใด ๆ ที่ฉันอาจพลาด มี Apache2 MOD ที่สามารถตั้งค่าตัวแปรสภาพแวดล้อมตาม "ช่วงที่อยู่ IP" หรือไม่?

คำตอบ:


4

สิ่งที่คุณได้รับ (SetEnvIfNoCase Remote_Addr "^ abc" env_key = env_value) เป็นสิ่งที่ดีที่สุดที่คุณจะทำได้ง่ายๆ ฉันเคยเห็นรูปแบบการกำหนดค่านี้นำไปใช้กับกลุ่มของเครื่องที่มีการโหลดจำนวนมากโดยไม่มีการลดประสิทธิภาพลงอย่างเห็นได้ชัด ฉันยอมรับการใช้นิพจน์ทั่วไปเมื่อช่วง CIDR เหมาะสมกว่านั้นน่ารำคาญ คุณสามารถเขียนโปรแกรมขนาดเล็กเพื่อสร้างการกำหนดค่าโดยอัตโนมัติจากรายการของช่วง CIDR

หากคุณคุ้นเคยกับ Perl คุณสามารถสร้างตัวจัดการ modperl ซึ่งจะอนุญาต / ปฏิเสธคำขอไม่ว่าคุณจะเลือกแบบไหน modperl ช่วยให้รหัสของคุณให้ทำงานในจุดที่แตกต่างกันทั่วร้องขอ HTTP - การmod_perl 2.0 HTTP เฟสขอวงจร PerlAuthzHandler จะเป็นตัวจัดการที่เหมาะสมที่จะใช้

Lockie


8

โปรดทราบว่าตัวแปรที่ตั้งค่าผ่าน SetEnv ไม่สามารถมองเห็นได้ในการดำเนินการบางอย่าง (ดูเมทริกซ์):

http://www.onlinesmartketer.com/2010/05/27/apache-environment-variables-visibility-with-setenv-setenvif-and-rewriterule-directives/

ทางออกของคุณคือ

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


นี่ควรเป็นคำตอบที่ยอมรับได้! มันเป็นสิ่งที่ดีที่สุด นอกจากนี้ยังทำงานใน. htaccess
Jeroen Vermeulen - MageHost

8

คุณสามารถใช้การจัดรูปแบบ CIDR กับ Apache 2.4 ซึ่งอนุญาต<If>:

<If "%{REMOTE_ADDR} -ipmatch 194.8.74.0/23">
    SetEnv banned = spammer-ip
</If>

ขอบคุณคำตอบของคุณ! โปรดทราบว่ามีข้อผิดพลาดในรุ่น Apache ของฉันดังนั้นฉันต้องใส่ช่วง IP ไว้ในเครื่องหมายคำพูดเดี่ยว: mail-archives.apache.org/mod_mbox/httpd-docs/201406.mbox/ …
Lucas Cimon

0

นี่ไม่ใช่ทางออกจากRegExpไปเป็นช่วง IPแต่ฉันพบสคริปต์ที่ดีที่ Google โฮสต์ไว้เพื่อแปลงช่วง IP เป็น regexp ที่ตรงกัน อาจมีประโยชน์สำหรับคุณบางคนเช่นกัน

ฉันจะแยกทราฟฟิกออกจากช่วงที่อยู่ IP ได้อย่างไร

[Update]

ดูเหมือนว่า Google ได้ลบเครื่องมือที่อยู่ IP (หรืออย่างน้อยลิงก์ที่มีในเว็บไซต์ของพวกเขาเสีย) แต่มีเครื่องมือที่คล้ายกันที่นี่: http://www.analyticsmarket.com/freetools/ipregex

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.