Batasi akses IP langsung ke situs web


13

Saya ingin membatasi akses IP langsung ke situs web saya. Saya menemukan beberapa solusi yang melibatkan .htaccess tetapi tidak ada yang berhasil. Saya juga menemukan satu solusi melalui konfigurasi host virtual apache yang berfungsi dengan baik sampai saya menginstal sertifikat SSL melalui CPanel. Saya sama sekali tidak tahu apa yang diubah dalam file httpd.conf tapi sekarang pengaturan redirect tidak berfungsi bahkan jika saya menghapus sertifikat SSL.

Inilah pengaturan host virtual saya saat ini:

NameVirtualHost 192.168.1.1:80 NameVirtualHost *

<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 dan nama diganti dengan yang generik. Bagian "Redirect 403 /" tidak berfungsi sejak menginstal sertifikat SSL. Saya akan berterima kasih jika seseorang dapat menjelaskan apa yang saya lakukan salah di sini. Terima kasih.


Saya kira Anda tidak perlu menggunakan = ServerName 192.168.1.1
ADM

Mencoba itu juga, tidak memiliki efek apa pun.
Ivan

Apakah VirtualHost dipesan ulang? Apakah yang dengan kesalahan 403 vhost pertama (default) sebelumnya?
Håkan Lindqvist

Tidak, pesanan belum berubah. Masalah dimulai setelah menambahkan sertifikat SSL, artinya yang terakhir hanya ditambahkan. Sekarang jika saya bahkan menghapusnya sepenuhnya itu tidak akan berfungsi lagi sehingga sesuatu yang lain pasti berubah juga tetapi sepertinya tidak bisa mencari tahu apa.
Ivan

berikut adalah solusinya melalui htaccess serverfault.com/a/171260/273980
jsHate

Jawaban:


12

Dan voila, perbaikannya:

<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>

Solusinya adalah cukup mengganti IP dengan nama domain untuk semua pengaturan virtualhost, kecuali untuk yang perlu mengarahkan / membatasi akses IP langsung.


Ini akan menyebabkan masalah dengan klien yang menjalankan IE6 dan IE8. Jika Anda setuju dengan itu, maka ini tidak masalah. Mereka harus memutakhirkan browser kuno mereka.
Vasili Syrakis

6

Jawabannya bisa jauh lebih sederhana.

Cukup salin ini ke bagian bawah httpd.conf (biasanya terletak di / 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>

Maka hanya ketika pengunjung mengakses oleh www.example.com, ia dapat memperoleh akses ke server.


2

Anda tidak dapat menonaktifkan akses IP langsung ke server Anda melalui HTTPS karena nama host untuk virtualhost Anda dienkripsi di dalam sertifikat SSL.

Klien harus terhubung ke alamat IP Anda, mengunduh sertifikat, membaca konten, dan kemudian mereka dapat memverifikasi bahwa nama host sudah benar.

Satu-satunya cara lain adalah dengan memberlakukan SNI , tetapi Anda akan menyebabkan masalah bagi pengguna yang menjelajah dengan versi Internet Explorer yang lebih lama.


1
  1. Mungkin sertifikat Anda dikeluarkan ke example.com, bukan ke 192.168.1.1, atau keduanya; Jadi, pengunjung yang menggunakan https://192.168.1.1harus memiliki kesalahan SSL (karena URL berbeda dari yang sertifikat).
  2. Anda tidak memiliki situs web 'default SSL' <VirtualHost *:443> SSLEngine on </VirtualHost>
  3. Anda harus menggunakan apache dengan dukungan SNI (ada beberapa Persyaratan versi libSSL dan Apache) untuk menggunakan SSL-per-hostname (lihat Menggunakan Beberapa Sertifikat SSL di Apache dengan Satu Alamat IP

0

1
Tidak, itu tidak ada hubungannya dengan masalah saya. Saya ingin memblokir akses situs web bagi mereka yang mengakses IP situs web saya dan bukannya DNS-nya.
Ivan

itu tidak persis itu ....
user155813

1
Tidak, ini memblokir akses situs berdasarkan alamat IP klien. Pertanyaannya adalah mencari cara untuk memblokir akses ke situs menggunakan alamat IP-nya.
DaveTheMinion

0

Untuk menambahkan jawaban lain, mod_security, jika perlu Anda atur, memiliki aturan untuk melarang akses ke server dengan alamat ip.


0

Ini bisa mudah jika Anda tidak meletakkan file Anda di direktori default / var / www / html. Cukup buat direktori lain, katakanlah / web misalnya:

mkdir /web 
mkdir /web/example

salin file Anda dan ubah chown:

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

Kemudian buat host virtual dengan konfigurasi berikut:

<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>

Jangan lupa untuk mengaktifkan host virtual Anda, contoh:

sudo a2ensite example.com.conf

0

Dalam pengaturan Apcahe yang memiliki banyak .conffile, prioritasnya adalah file pertama dimuat dan kemudian yang kedua..juga. Jadi, jika Anda menggunakan Ubuntu, file dimuat dalam urutan leksikografis, jadi .conffile "pertama" yang akan dimuat adalah 000-default.conf( maka 000 namanya ) yang berada di bawah /etc/apache2/sites-available/direktori.

Jadi Untuk mencegah aturan lain diterapkan, kita perlu mendapatkan aturan kita di bagian atas file pertama itu.

dan Anda bisa menambahkan dulu aturan berikut ke file itu.

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

Dicoba dan diuji pada Ubuntu versi Apache 16.4 x64 > 2.4

Jika Anda menjalankan versi Apache yang lebih rendah, coba ganti Require all denieddari kode di atas ke ...

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

-3

Saya menulis kode sederhana ini dalam PHP untuk membatasi akses ip langsung!

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

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

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

cukup tempel ke file php Anda dan nikmatilah!


1
Bisakah Anda menjelaskan kelebihannya dari jawaban yang lain?
030

ini adalah metode paling sederhana yang dapat Anda gunakan untuk membatasi akses ip langsung ke situs web Anda, tanpa mengedit pengaturan apache!
Max Marley
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.