จำกัด การเข้าถึง IP โดยตรงไปยังเว็บไซต์


13

ฉันต้องการ จำกัด การเข้าถึง IP โดยตรงในเว็บไซต์ของฉัน ฉันพบวิธีแก้ไขปัญหาหลายอย่างที่เกี่ยวข้องกับ. htaccess แต่ไม่มีอะไรทำงาน ฉันได้พบวิธีหนึ่งผ่าน apache virtual hosts config ซึ่งทำงานได้ดีจนกระทั่งฉันติดตั้งใบรับรอง SSL ผ่าน CPanel ฉันไม่รู้จริงๆว่ามีอะไรเปลี่ยนแปลงในไฟล์ httpd.conf แต่ตอนนี้การตั้งค่าการเปลี่ยนเส้นทางไม่ทำงานแม้ว่าฉันจะถอนการติดตั้งใบรับรอง SSL

นี่คือการตั้งค่าโฮสต์เสมือนปัจจุบันของฉัน:

NameVirtualHost 192.168.1.1:80 ชื่อ VirtualHost *

<VirtualHost 192.168.1.1:80>
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /home/rotate/public_html
    ServerAdmin me@mysite.com
    UseCanonicalName Off

    ## User rotate # Needed for Cpanel::ApacheConf
    UserDir disabled
    UserDir enabled rotate
    ScriptAlias /cgi-bin/ /home/rotate/public_html/cgi-bin/
</VirtualHost>

<VirtualHost 192.168.1.1:80>
    ServerName 192.168.1.1
    Redirect 403 /
    ErrorDocument 403 "Sorry, direct IP access not allowed."
    DocumentRoot /usr/local/apache/htdocs
    ServerAdmin me@mysite.com
    UseCanonicalName Off
    UserDir disabled
</VirtualHost>

<VirtualHost *>
    ServerName server.mysite.com
    DocumentRoot /usr/local/apache/htdocs
    ServerAdmin me@mysite.com
    UserDir disabled
</VirtualHost>

NameVirtualHost 192.168.1.1:443
<VirtualHost 192.168.1.1:443>
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /home/rotate/public_html
    ServerAdmin me@mysite.com
    UseCanonicalName Off

    UserDir disabled
    UserDir enabled rotate

    ScriptAlias /cgi-bin/ /home/rotate/public_html/cgi-bin/
    SSLEngine on
    #SSL stuff here
</VirtualHost>

IP และชื่อถูกแทนที่ด้วยชื่อสามัญ ส่วน "การเปลี่ยนเส้นทาง 403 /" ไม่ทำงานเนื่องจากติดตั้งใบรับรอง SSL ฉันจะขอบคุณถ้ามีใครสามารถทำให้กระจ่างในสิ่งที่ฉันทำผิดที่นี่ ขอบคุณ


ฉันเดาว่าคุณไม่จำเป็นต้องใช้ = ServerName 192.168.1.1
ADM

พยายามเช่นกันไม่มีผลใด ๆ
Ivan

VirtualHosts ถูกจัดลำดับใหม่หรือไม่? เป็นคนที่มีข้อผิดพลาด 403 เป็น vhost แรก (ค่าเริ่มต้น) มาก่อนหรือไม่
Håkan Lindqvist

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

นี่คือวิธีการแก้ปัญหาผ่าน htaccess serverfault.com/a/171260/273980
jsHate

คำตอบ:


12

และ voila การแก้ไข:

<VirtualHost mysite.com:80>
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /home/rotate/public_html
    ServerAdmin me@mysite.com
    UseCanonicalName Off
</VirtualHost>

NameVirtualHost mysite.com:80
<VirtualHost 192.168.1.1:80>
    ServerName 192.168.1.1
    Redirect 403 /
    ErrorDocument 403 "Sorry, direct IP access not allowed."
    DocumentRoot /usr/local/apache/htdocs
    ServerAdmin me@mysite.com
    UseCanonicalName Off
    UserDir disabled
</VirtualHost>

<VirtualHost *>
    ServerName server.mysite.com
    DocumentRoot /usr/local/apache/htdocs
    ServerAdmin me@mysite.com
    UserDir disabled
</VirtualHost>

NameVirtualHost mysite.com:443
<VirtualHost mysite.com:443>
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /home/rotate/public_html
    ServerAdmin me@mysite.com
    UseCanonicalName Off
</VirtualHost>

วิธีการแก้ปัญหาคือเพียงแค่แทนที่ IP ด้วยชื่อโดเมนสำหรับการตั้งค่า virtualhost ทั้งหมดยกเว้นสำหรับการเปลี่ยนเส้นทาง / จำกัด การเข้าถึง IP โดยตรง


สิ่งนี้จะทำให้เกิดปัญหากับไคลเอนต์ที่ใช้ IE6 และ IE8 หากคุณโอเคกับสิ่งนี้ก็ถือว่าใช้ได้ พวกเขาควรอัพเกรดเบราว์เซอร์โบราณของพวกเขาอยู่แล้ว
Vasili Syrakis

6

คำตอบนั้นง่ายกว่ามาก

เพียงคัดลอกสิ่งนี้ลงที่ด้านล่างของ httpd.conf (โดยปกติจะอยู่ที่ / etc / httpd / conf)

<VirtualHost *:80>
ServerName localhost
Redirect 403 /
UseCanonicalName Off
UserDir disabled
</VirtualHost>

<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /var/www/html
</VirtualHost>

จากนั้นเฉพาะเมื่อผู้เยี่ยมชมเข้าถึงโดย www.example.com เขาสามารถเข้าถึงเซิร์ฟเวอร์ได้


2

คุณไม่สามารถปิดใช้งานการเข้าถึง IP โดยตรงไปยังเซิร์ฟเวอร์ของคุณผ่าน HTTPS เนื่องจากชื่อโฮสต์สำหรับ virtualhost ของคุณถูกเข้ารหัสภายในใบรับรอง SSL

ลูกค้าต้องเชื่อมต่อกับที่อยู่ IP ของคุณดาวน์โหลดใบรับรองอ่านเนื้อหาจากนั้นพวกเขาสามารถตรวจสอบว่าชื่อโฮสต์นั้นถูกต้อง

วิธีอื่นคือการบังคับใช้SNIแต่คุณจะทำให้เกิดปัญหากับผู้ใช้ที่กำลังเรียกดูด้วย Internet Explorer รุ่นเก่า


1
  1. อาจมีการออกใบรับรองของคุณไปที่ example.com ไม่ใช่ 192.168.1.1 หรือทั้งสองอย่าง ดังนั้นผู้เข้าชมที่ใช้https://192.168.1.1ควรมีข้อผิดพลาด SSL (เนื่องจาก URL แตกต่างจากใบรับรอง)
  2. คุณไม่มีเว็บไซต์ 'SSL เริ่มต้น' <VirtualHost *:443> SSLEngine on </VirtualHost>
  3. คุณควรใช้ apache พร้อมการรองรับ SNI (มีข้อกำหนด libSSL และ Apache บางรุ่น) เพื่อใช้ SSL-per-hostname (ดูการใช้ใบรับรอง SSL หลายรายการใน Apache พร้อมที่อยู่ IP เดียว

0

ฉันเชื่อว่านี่คือสิ่งที่คุณต้องการ

http://www.htaccess-guide.com/deny-visitors-by-ip-address/


1
ไม่ไม่เกี่ยวข้องกับปัญหาของฉัน ฉันต้องการปิดกั้นการเข้าถึงเว็บไซต์สำหรับผู้ที่เข้าถึง IP ของเว็บไซต์แทนที่จะเป็น DNS
Ivan

นั่นทำสิ่งนั้นอย่างแน่นอน ....
155813

1
ไม่นี่เป็นการปิดกั้นการเข้าถึงเว็บไซต์โดยที่อยู่ IP ของลูกค้า คำถามกำลังมองหาวิธีในการบล็อกการเข้าถึงเว็บไซต์โดยใช้ที่อยู่ IP ของมัน
DaveTheMinion

0

หากต้องการเพิ่มคำตอบอื่น mod_security หากเป็นสิ่งที่คุ้มค่าสำหรับคุณในการตั้งค่ามีกฎห้ามไม่ให้เข้าถึงเซิร์ฟเวอร์ด้วยที่อยู่ IP


0

ซึ่งอาจเป็นเรื่องง่ายหากคุณไม่ใส่ไฟล์ในไดเรกทอรี / var / www / html ที่เป็นค่าเริ่มต้น เพียงสร้างไดเรกทอรีอื่นให้พูด / เว็บเช่น:

mkdir /web 
mkdir /web/example

คัดลอกไฟล์ของคุณและเปลี่ยน chown:

sudo chown -R www-data:www-data /web

จากนั้นสร้างโฮสต์เสมือนด้วยการกำหนดค่าต่อไปนี้:

<Directory /web/example>
  Require all granted
</Directory>

<VirtualHost *:80>

    DocumentRoot /web/example
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@example.com

    # Force SSL, you can remove this line
    Redirect permanent / https://example.com/

    ServerAdmin webmaster@example.com

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

# If you use SSL
<IfModule mod_ssl.c>
    <VirtualHost *:443>
        DocumentRoot /web/example
        ServerName example.com
        ServerAlias www.example.com
        ServerAdmin webmaster@example.com

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # adapt this to your paths
        SSLEngine on
        SSLCertificateFile /etc/ssl/example/example_com.crt
        SSLCertificateKeyFile /etc/ssl/example/example.key
        SSLCertificateChainFile /etc/ssl/example/example_com.ca-bundle

    </VirtualHost>
</IfModule>

อย่าลืมเปิดใช้งานโฮสต์เสมือนของคุณตัวอย่าง:

sudo a2ensite example.com.conf

0

ในการตั้งค่า Apcahe ที่มีหลาย.confไฟล์ลำดับความสำคัญไปที่ไฟล์แรกที่โหลดแล้วตามด้วย .. ดังนั้นหากคุณอยู่บน Ubuntu ไฟล์จะถูกโหลดตามลำดับพจนานุกรมดังนั้น.confไฟล์"แรก" ที่จะถูกโหลดจะเป็นไฟล์000-default.conf( จึงมีชื่อ 000 ชื่อ ) ที่อยู่ภายใต้/etc/apache2/sites-available/ไดเรกทอรี

ดังนั้นเพื่อป้องกันกฎอื่น ๆ จากการใช้เราจำเป็นต้องได้รับกฎของเราไปที่ด้านบนของไฟล์แรก

และคุณสามารถเพิ่มกฎต่อไปนี้ลงในไฟล์นั้นได้

<VirtualHost *:80>
    ServerName default
    DocumentRoot /var/www/html
    #This part here, is crucial.
    <Location />
        Require all denied
    </Location>
</VirtualHost>

ทดลองและทดสอบกับ Ubuntu 16.4 x64 รุ่น Apache > 2.4

หากคุณใช้ Apache เวอร์ชันต่ำกว่าให้ลองเปลี่ยนRequire all deniedจากรหัสด้านบนเป็น ...

<Location />
    Order deny,allow
    Deny from all
</Location>

-3

ฉันเขียนโค้ดง่าย ๆ นี้ใน PHP เพื่อ จำกัด การเข้าถึงไอพีโดยตรง!

$servername =  $_SERVER['SERVER_NAME'];
if($servername == 'your-domain.com'){

}elseif($servername == 'your-domain-with-www.com'){

}else{
    die("Direct ip access not allowed!");
}

เพียงวางลงในไฟล์ php ของคุณแล้วสนุกได้เลย!


1
คุณช่วยอธิบายข้อดีของคำตอบนี้ได้มากกว่าคำตอบอื่น ๆ หรือไม่?
030

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