Apache - hanya mendengarkan domain tertentu, bukan IP

9

Bagaimana saya bisa mengkonfigurasi apache sehingga ia menolak koneksi yang datang langsung ke alamat IP ( http://xxx.xxx.xxx.xxx ) alih-alih nama vhost http://example.com ?

Konfigurasi VirtualHost saya:

ServerName example.com

<VirtualHost *:80>

        ServerName example.com

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

</VirtualHost>
Alex
sumber

Jawaban:

25

Anda tidak dapat menolaknya koneksi, karena nama host (atau IP) yang coba digunakan oleh pengguna karena host HTTP mereka tidak diketahui server sampai klien benar-benar mengirim permintaan HTTP. Pendengar TCP selalu terikat ke alamat IP.

Apakah respons kesalahan HTTP dapat diterima sebagai gantinya?

<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>
Shane Madden
sumber
Yah, thin menampilkan 403 Forbidden untuk permintaan yang tidak datang dari domain, yang tidak buruk dalam situasi saya. Namun, saya ingin server menjadi "tidak ada" untuk permintaan tersebut. Saya yakin ini bisa dilakukan entah bagaimana, mungkin tidak dengan apache tetapi pada tingkat sistem?
Alex
3
@ Alex Tidak, itu benar-benar mustahil. Koneksi TCP harus dibuat dan klien harus mengirim permintaan HTTP mereka (atau header SNI mereka, saya kira) sebelum ada cara bagi server untuk menentukan apakah mereka mencoba mengenai nama domain atau alamat IP dalam permintaan HTTP mereka .
Shane Madden
@ShaneMadden Sepenuhnya tidak mungkin? Saya mengerti bahwa server perlu mengetahui IP pengguna sebelum dapat memilih apa yang harus dilakukan dengan itu, tetapi benar-benar mustahil untuk tidak menanggapi hit ini setelah mengetahui identitasnya? Tidak bisakah server hanya menggantung koneksi sampai waktu habis?
HelpingHand
3
@HelpingHand Bukan IP pengguna. Server perlu mengetahui header host yang akan dikirim pengguna dalam permintaan HTTP, yang tidak dimilikinya sampai setelah koneksi TCP dibuat sepenuhnya.
Shane Madden
1
@HelpingHand Tidak, itu tidak memiliki visibilitas ke komunikasi HTTP yang terjadi di koneksi.
Shane Madden
0

Anda harus pergi ke lapisan bawah itu hanya terlintas di benak saya di rantai firewall memiliki pemeriksaan validasi untuk PERMINTAAN HOST & apa yang Anda miliki dengan Apache ini akan memungkinkan paket untuk diabaikan atau dihapus

Chaddy
sumber
Ini sangat mungkin untuk melakukan ini di tingkat apache, jadi ini akan berlebihan. Metode sederhana adalah memastikan vhost pertama adalah catchall yang menolak akses dengan cara HTTP friendly.
Paul Dixon
0

Cara bersih untuk menangani ini adalah dengan RewriteRule sebagai berikut

<If "%{HTTP_HOST} == 'x.x.x.x'">
  RewriteRule ^.*$ http://www.example.com/$1 [L]
</If>
Chuck Replogle
sumber