Apache httpd: ฉันจะปฏิเสธได้อย่างไรทั้งหมดอนุญาตจากซับเน็ต แต่ปฏิเสธจาก IP ภายในซับเน็ตนั้น


26

ฉันใช้ CentOS 5.5 พร้อมกับ Apache Apache httpd-2.2.3

ฉันเปิดใช้งานmod_statusที่ตำแหน่ง / เซิร์ฟเวอร์ - สถานะ ฉันต้องการอนุญาตการเข้าถึงตำแหน่งนี้ด้วยวิธีต่อไปนี้:

  1. ปฏิเสธจากทั้งหมด
  2. อนุญาตจากซับเน็ต 192.168.16.0/24
  3. ปฏิเสธจาก IP 192.168.16.100 ซึ่งอยู่ในเครือข่ายย่อย 192.168.16.0/24

1 & 2 นั้นง่าย อย่างไรก็ตามเนื่องจากฉัน "อนุญาตจาก 192.168.16.0/24" เป็นไปได้ไหมที่ปฏิเสธจาก 192.168.16.100

ฉันพยายามเพิ่มคำสั่งปฏิเสธสำหรับ 192.168.16.100 แต่มันไม่ทำงาน นี่คือการกำหนดค่าที่เกี่ยวข้อง:

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  all
    Deny from  192.168.16.100 # This does not deny access from 192.168.16.100
    Allow from 192.168.16.0/24
</Location>

หรือ:

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  all
    Deny from  192.168.16.100 # This does not deny access from 192.168.16.100
    Allow from 192.168.16.0/24
</Location>

อย่างไรก็ตามสิ่งนี้ไม่ได้ป้องกันการเข้าถึงหน้านี้โดยเฉพาะดังที่แสดงในบันทึกการเข้าถึง:

www.example.org 192.168.16.100 - - [11/Mar/2011:16:01:14 -0800] "GET /server-status HTTP/1.1" 200 9966 "-" "

ตามคู่มือสำหรับmod_authz_host :

อนุญาตให้ปฏิเสธ

ก่อนอื่นคำสั่ง Allow ทั้งหมดจะถูกประเมิน ต้องตรงกันอย่างน้อยหนึ่งรายการหรือคำขอถูกปฏิเสธ ถัดไปคำสั่งปฏิเสธทั้งหมดได้รับการประเมิน หากการแข่งขันใด ๆ คำขอถูกปฏิเสธ

ที่อยู่ IP ตรงกับคำสั่งปฏิเสธดังนั้นคำขอไม่ควรถูกปฏิเสธ?

ตามตารางในหน้า mod_authz_host ที่อยู่ IP นี้ควร "จับคู่ทั้งอนุญาตและปฏิเสธ" ดังนั้นจึงควรใช้กฎ "การควบคุมการจับคู่สุดท้าย: ปฏิเสธ"

    การจับคู่อนุญาต, ปฏิเสธผลลัพธ์ปฏิเสธ, อนุญาตผลลัพธ์
    อนุญาตการแข่งขันเท่านั้นอนุญาตอนุญาตคำขออนุญาต
    จับคู่ปฏิเสธเท่านั้นปฏิเสธคำขอปฏิเสธ
    ไม่มีการจับคู่ค่าเริ่มต้นเป็นคำสั่งที่สอง: ถูกปฏิเสธค่าเริ่มต้นเป็นคำสั่งที่สอง: อนุญาต
    จับคู่ทั้งตัวเลือกอนุญาตและปฏิเสธการจับคู่สุดท้าย: ปฏิเสธตัวควบคุมการจับคู่สุดท้าย: อนุญาต

ปฏิเสธจากทั้งหมด 192.168.16.100 - เนื่องจากคุณใช้ "ทั้งหมด" ที่นี่ฉันคาดว่าคำขอทั้งหมดจะถูกปฏิเสธจากที่อยู่ IP ใด ๆ คิดอย่างอื่นเกิดขึ้นที่นี่
คา

@Michah: Allow from 192.168.16.0/24ฉันยังทำ ตามที่ฉันเข้าใจเอกสาร IP ของผู้ร้องขอใด ๆ ในเครือข่าย 192.168.16.0/24 จะตรงกับคำสั่งอนุญาตนี้อนุญาตให้มีการร้องขอได้
Stefan Lasiewski

ปฏิบัติตามเอกสารที่วางไว้ด้านบน "ขั้นแรกคำสั่งอนุญาตทั้งหมดได้รับการประเมินอย่างน้อยหนึ่งรายการต้องตรงกันหรือคำขอถูกปฏิเสธ" ==> สิ่งนี้ควรตรงกับ "อนุญาตจาก 192.168.16.0/24" ของคุณ แต่ส่วนที่สองของ "ถัดไปคำสั่งปฏิเสธทั้งหมดคือ ประเมินผลหากการแข่งขันใด ๆ คำขอถูกปฏิเสธ "กับ" ปฏิเสธจากทั้งหมด "คำขอจะไม่ตรงกันทุกส่วนที่สองดังนั้นจึงถูกปฏิเสธหรือไม่
คา

คุณควรพิจารณาอย่างจริงจังหากคุณต้องการปฏิเสธว่าที่อยู่ IP สามารถเข้าถึงระบบของคุณหรือจาก httpd เท่านั้น หากอดีตยังคงใช้แนวทางของคุณในการใช้คำสั่ง Apache หากหลังนี้ควรทำในไฟร์วอลล์
Andrew Case

ขอบคุณ ACase ฉันต้องการปฏิเสธการเข้าถึงจาก 192.168.16.100 ในหน้านี้โดยเฉพาะ ฉันต้องการ 192.168.16.100 เพื่อให้สามารถเข้าถึงหน้าอื่น ๆ ทั้งหมดในเว็บเซิร์ฟเวอร์นี้
Stefan Lasiewski

คำตอบ:


35

ฉันยังไม่ได้ทดสอบ แต่ฉันคิดว่าคุณเกือบจะอยู่ที่นั่นแล้ว

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  192.168.16.100
    Allow from 192.168.16.0/24
</Location>

Deny from allไม่จำเป็น ในความเป็นจริงมันจะล้มเหลวเพราะทุกอย่างจะเข้าallกันและถูกปฏิเสธ (และฉันคิดว่า Apache พยายามฉลาดและทำอะไรโง่ ๆ ) ฉันได้พบเสมอของ Apache Order, AllowและDenyสั่งสับสนจึงมักเห็นภาพสิ่งที่อยู่ในตาราง (นำมาจากเอกสาร ):

ตรง | อนุญาต, ปฏิเสธผลลัพธ์ | ปฏิเสธอนุญาตผลลัพธ์
-------------------------------------------------- -----
อนุญาตเฉพาะ | อนุญาต | ได้รับอนุญาต
ปฏิเสธเท่านั้น ถูกปฏิเสธ | ปฏิเสธ
ไม่มีการแข่งขัน | ค่าเริ่มต้น: ถูกปฏิเสธ | ค่าเริ่มต้น: อนุญาต
จับคู่ทั้งคู่ | การแข่งขันนัดสุดท้าย: ถูกปฏิเสธ | นัดสุดท้าย: อนุญาต

ด้วยการตั้งค่าข้างต้น:

  • คำขอจาก 192.168.16.100 ได้รับ "จับคู่ทั้งคู่" และถูกปฏิเสธ
  • คำขอจาก 192.168.16.12 ได้รับ "อนุญาตเท่านั้น" และอนุญาต
  • คำขอจาก 123.123.123.123 ได้รับ "ไม่ตรงกัน" และถูกปฏิเสธ

1

ฉันอาจจะดูที่การเพิ่มกฎ IPTables สำหรับสิ่งนี้เพื่อปฏิเสธโฮสต์เดียวในพอร์ต 80 ปฏิเสธจากทั้งหมดและอนุญาตเครือข่ายย่อย

คุณไม่ควรมีปัญหาในการตั้งค่ากฎการปฏิเสธจากที่อยู่เฉพาะหลังจากที่คุณอนุญาตเครือข่ายย่อย เพียงทำตามลำดับที่


ฉันอัพเดตคำตอบแล้ว ฉันรวมกฎ "ปฏิเสธจาก 192.168.16.100" แต่ยังอนุญาตให้เข้าถึงได้จาก 192.168.16.100
Stefan Lasiewski

ฉันต้องการอนุญาตการเข้าถึงตำแหน่งอื่นทั้งหมดจากโฮสต์นี้ อย่างไรก็ตามฉันต้องการปฏิเสธตำแหน่งที่ตั้งเฉพาะ IPTables ไม่ช่วยฉันที่นี่
Stefan Lasiewski

IPTables จะไม่ปฏิเสธทราฟฟิกขาออกเว้นแต่คุณจะบอก อย่างไรก็ตามคุณสามารถปฏิเสธการรับส่งข้อมูลขาเข้าจากโลกและที่อยู่ที่ระบุ แต่ทั้งหมดอนุญาตเครือข่ายย่อย
Mike

ฉันคิดว่าคุณเข้าใจผิดคำขอของฉัน ฉันต้องการใช้การควบคุมการเข้าถึงนี้กับ / สถานะเซิร์ฟเวอร์เท่านั้นไม่ใช่โฮสต์ทั้งหมด IPtables ไม่สามารถทำได้อย่างง่ายดายเพื่อความรู้ของฉัน
Stefan Lasiewski

-4

คุณใช้ php ได้ไหม หากเป็นเช่นนั้นให้เพิ่มคำสั่ง php เพื่อออก / เปลี่ยนเส้นทางสำหรับที่อยู่ IP หนึ่งที่เฉพาะเจาะจงนั้น

ตัวอย่าง:

$ deny = array ("111.111.111", "222.222.222", "333.333.333");

if (in_array ($ _SERVER ['REMOTE_ADDR'], $ deny))

{header ("location: http://www.google.com/ ");

ออกจาก ();

การอ้างอิง: http://perishablepress.com/press/2007/07/03/how-to-block-ip-addresses-with-php/


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