Apache-IPではなく特定のドメインでのみリッスン


9

仮想ホスト名http://example.comではなくIPアドレス(http://xxx.xxx.xxx.xxx)への直接接続を拒否するようにApacheを構成するにはどうすればよいですか?

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

HTTPホストとしてユーザーが使用しようとしているホスト名(またはIP)は、クライアントが実際に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>

まあ、シンはドメインから来ていないリクエストに対して403 Forbiddenを引き起こしますが、これは私の状況では悪くありません。ただし、私はそれらの要求に対してサーバーが「存在しない」ことを望みます。これはどういうわけか、おそらくApacheではなくシステムレベルで実行できると思いますか?
Alex

3
@アレックスいいえ、それは完全に不可能です。サーバーがHTTPリクエストでドメイン名とIPアドレスのどちらをヒットさせようとしているのかをサーバーが判断する前に、TCP接続を確立し、クライアントがHTTPリクエスト(またはSNIヘッダー)を送信する必要があります。 。
シェーンマッデン

@ShaneMadden完全に不可能ですか?サーバーがユーザーのIPを知る必要があることを理解していますが、それが何であるかを選択する前に、サーバーがユーザーのIPを知っていると、このヒットに応答しないことはまったく不可能ですか?サーバーはタイムアウトまで接続をハングアップできないのですか?
HelpingHand

3
@HelpingHandユーザーのIPではありません。サーバーは、ユーザーがHTTPリクエストで送信するホストヘッダーを知る必要があります。これは、TCP接続が完全に確立されるまでは持っていません。
シェーンマッデン

1
@HelpingHandいいえ、接続で発生するHTTP通信を確認できません。
シェーンマッデン

0

あなたは下位層に行く必要があります。それは、REQUEST HOSTとApacheで持っているものの検証チェックを持っているファイアウォールチェーンで私の頭に浮かぶだけです。これにより、パッケージを無視または削除できます。


Apacheレベルでこれを行うことは完全に可能ですので、これはやり過ぎです。簡単な方法は、最初の仮想ホストがHTTPフレンドリーな方法でアクセスを拒否するキャッチオールであることを確認することです。
ポールディクソン2015年

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.