Apache - ฟังบนโดเมนที่ระบุเท่านั้นไม่ใช่ IP


9

ฉันจะกำหนดค่า Apache เพื่อที่จะปฏิเสธการเชื่อมต่อมาโดยตรงไปยังที่อยู่ IP ( http://xxx.xxx.xxx.xxx ) แทนชื่อ vhost http://example.com ?

การกำหนดค่า VirtualHost ของฉัน:

ServerName example.com

<VirtualHost *:80>

        ServerName example.com

        DocumentRoot /var/www/           
        <Directory /var/www/>                    
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

</VirtualHost>

คำตอบ:


25

คุณไม่สามารถปฏิเสธการเชื่อมต่อได้เนื่องจากชื่อโฮสต์ (หรือ IP) ที่ผู้ใช้พยายามใช้เนื่องจากโฮสต์ HTTP นั้นไม่รู้จักเซิร์ฟเวอร์จนกว่าไคลเอ็นต์จะส่งคำขอ HTTP จริง ๆ ฟัง TCP จะถูกผูกไว้กับที่อยู่ IP เสมอ

การตอบสนองข้อผิดพลาด HTTP จะยอมรับได้แทนหรือไม่

<VirtualHost *:80>
    ServerName catchall
    <Location />
        Order allow,deny
        Deny from all
    </Location>
</VirtualHost>

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/
    <Directory /var/www/>
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
</VirtualHost>

ทีนี้ thin นั้นมี 403 Forbidden สำหรับคำร้องขอที่ไม่ได้มาจากโดเมนซึ่งไม่เลวในสถานการณ์ของฉัน อย่างไรก็ตามฉันต้องการให้เซิร์ฟเวอร์ "ไม่มีอยู่จริง" สำหรับคำขอเหล่านั้น ฉันแน่ใจว่าสิ่งนี้สามารถทำได้อย่างใดอย่างหนึ่งอาจจะไม่ได้อยู่กับ Apache แต่ในระดับระบบ?
Alex

3
@ Alex ไม่มันเป็นไปไม่ได้อย่างสมบูรณ์ ต้องสร้างการเชื่อมต่อ TCP และไคลเอนต์จะต้องส่งคำขอ HTTP (หรือส่วนหัว SNI ของพวกเขาฉันคิดว่า) ก่อนที่จะมีวิธีใด ๆ สำหรับเซิร์ฟเวอร์เพื่อตรวจสอบว่าพวกเขากำลังพยายามที่จะตีชื่อโดเมนหรือที่อยู่ IP ในคำขอ HTTP ของพวกเขา .
Shane Madden

@ShaneMadden เป็นไปไม่ได้โดยสิ้นเชิง? ฉันเข้าใจว่าเซิร์ฟเวอร์จำเป็นต้องรู้ IP ของผู้ใช้ก่อนที่จะสามารถเลือกได้ว่าจะทำอะไรกับมัน แต่เป็นไปไม่ได้เลยที่จะไม่ตอบโต้การโจมตีนี้เมื่อรู้ถึงตัวตนของมัน เซิร์ฟเวอร์ไม่สามารถหยุดการเชื่อมต่อจนกว่าจะหมดเวลาหรือไม่
ช่วยเหลือมือที่

3
@HelpingHand ไม่ใช่ IP ของผู้ใช้ เซิร์ฟเวอร์จำเป็นต้องรู้ส่วนหัวของโฮสต์ที่ผู้ใช้จะส่งในคำขอ HTTP ซึ่งจะไม่มีจนกระทั่งหลังจากการเชื่อมต่อ TCP เสร็จสมบูรณ์
เชนหัวเสีย

1
@HelpingHand ไม่มันไม่สามารถมองเห็นการสื่อสาร HTTP ที่เกิดขึ้นในการเชื่อมต่อได้
Shane Madden

0

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


เป็นไปได้อย่างสมบูรณ์แบบที่จะทำสิ่งนี้ในระดับ apache ดังนั้นนี่จะเกินความเป็นจริง วิธีง่าย ๆ คือเพื่อให้แน่ใจว่า vhost แรกเป็น catchall ซึ่งปฏิเสธการเข้าถึงด้วยวิธีที่เป็นมิตรกับ HTTP
พอลดิกซัน

0

วิธีที่สะอาดในการจัดการสิ่งนี้คือใช้ RewriteRule ดังนี้

<If "%{HTTP_HOST} == 'x.x.x.x'">
  RewriteRule ^.*$ http://www.example.com/$1 [L]
</If>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.