Apache - IP değil, yalnızca belirli bir alanda dinleme


9

Apache'yi , http://example.com vhost adı yerine doğrudan IP adresine ( http://xxx.xxx.xxx.xxx ) gelen bağlantıları reddedecek şekilde nasıl yapılandırabilirim ?

VirtualHost yapılandırmam:

ServerName example.com

<VirtualHost *:80>

        ServerName example.com

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

</VirtualHost>

Yanıtlar:


25

Kullanıcının HTTP ana bilgisayarı olarak kullanmaya çalıştığı ana bilgisayar adı (veya IP), istemci gerçekten bir HTTP isteği gönderene kadar sunucu tarafından bilinmediğinden, bağlantıları reddedemezsiniz. TCP dinleyicisi her zaman IP adresine bağlıdır.

Bunun yerine bir HTTP hata yanıtı kabul edilebilir mi?

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

İnce, alan adından gelmeyen talepler için 403 Yasaktır, bu da benim durumumda kötü değil. Ancak, sunucu bu istekleri için "olmayan" olmasını istiyorum. Eminim bu bir şekilde yapılabilir, belki apache ile değil sistem seviyesinde?
Alex

3
@Alex Hayır, tamamen imkansız. Sunucunun HTTP isteklerinde etki alanı adını mı yoksa IP adresini mi vurmaya çalıştığını belirlemesi için TCP bağlantısı kurulmalı ve istemci HTTP isteklerini (veya SNI üstbilgilerini, sanırım) göndermelidir. .
Shane Madden

@ShaneMadden Tamamen imkansız mı? Sunucunun ne yapacağını seçmeden önce kullanıcının IP'sini bilmesi gerektiğini anlıyorum, ancak kimliğini bildikten sonra bu isabete cevap vermemek tamamen imkansız mı? Sunucu zaman aşımına kadar bağlantıyı kesemez mi?
HelpingHand

3
@YardımHand Kullanıcının IP adresi değil. Sunucunun, kullanıcının TCP bağlantısı tamamen sağlanana kadar sahip olmadığı HTTP isteğinde göndereceği ana bilgisayar üstbilgisini bilmesi gerekir.
Shane Madden

1
@HelpingHand Hayır, bağlantılarda gerçekleşen HTTP iletişimine ilişkin görünürlüğü yoktur.
Shane Madden

0

Alt katmana gitmeniz gerekiyor, sadece güvenlik duvarı zincirinde REQUEST HOST için bir doğrulama kontrolüne sahip olduğum ve Apache ile sahip olduğunuz paketin göz ardı edilmesine veya bırakılmasına izin verecek


Bunu apache düzeyinde yapmak mükemmel bir şekilde mümkündür, bu yüzden bu aşırıya kaçar. Basit bir yöntem, ilk vhost'un HTTP dostu bir şekilde erişimi reddeden bir catchall olmasını sağlamak olacaktır.
Paul Dixon

0

Bunu işlemek için temiz bir yol aşağıdaki gibi bir RewriteRule ile

<If "%{HTTP_HOST} == 'x.x.x.x'">
  RewriteRule ^.*$ http://www.example.com/$1 [L]
</If>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.