Apacheのバーチャルホストを設定した時の直IP接続を拒否する方法

Apacheにバーチャルホストの設定をすると複数のドメインでの運用ができるようになります。ただユーザーがドメインではなくIPアドレスを直に指定してApacheにアクセスした場合、バーチャルホストの一番最初に記載されている設定が有効になります。

具体的な例で説明します。1台のWEBサーバーで www.example.com と www.hogehoge.com の2つのサイトを運営していたとします。このWEBサーバーのIPのアドレスが 192.168.1.28 だった場合、ユーザは以下のURLでアクセスができます。

http://www.example.com/index.html
http://www.hogehoge.com/index.html
http://192.168.1.28/index.html

このときのApacheのバーチャルホストの設定が以下であった場合、

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

<VirtualHost *:80>
  ServerName www.hogehoge.com
  :
</VirtualHost>

「http://192.168.1.28/index.html」でアクセスしたリクエストには www.example.com のWEBページが表示されます(バーチャルホストの設定の先に書かれている方が有効になる)。もし www.example.com と www.hogehoge.com がまったく関係のないWEBページで、ユーザーが www.hogehoge.com を見たくてアクセスしたとしたら別のWEBページが表示されてびっくりするかもしれません。またバーチャルホストを設定して複数のWEBページを運営していることがユーザーに知られてしまいます。

ではどうするかと言うと、IPアドレスでアクセスしてきたユーザーには該当するページがないというエラーを表示させるようにします。そもそもIPアドレス直指定でアクセスするユーザーはほとんどいないと思いますが・・。

バーチャルホストの設定の最初に404へのリダイレクトの設定を追加します。以下のような感じです。

<VirtualHost *:80>
    ServerName dummy
    Redirect 404 /
</VirtualHost>

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

<VirtualHost *:80>
  ServerName www.hogehoge.com
  :
</VirtualHost>

これでIPアドレスでアクセスしてきたユーザーにエラー画面を表示させることができます。

なお、このバーチャルホストの設定は ubuntu 18.04 LTS の Apache2(ver.2.4.29)で確認していますが、CentOS の httpd でも動作すると思います。

[広告]

= = = = = = = = = =
2021/3/7追記
2021/4/29加筆
= = = = = = = = = =
https(SSL通信)でも同じかと思い設定してみたのですが

<VirtualHost *:443>
    ServerName dummy
    Redirect 404 /
</VirtualHost>

こうすると今まで表示できていたページが表示できなくなりました。静的ページ(.html)は問題ないようですが動的ページ(.php、.cgi)が表示できません。エラーコード : SSL_ERROR_RX_RECORD_TOO_LONG らしいです。「SSL received a record that exceeded the maximum permissible length.」ともあります。

既存のページが表示されなくなってしまったので、この方法はSSL通信では使えそうにないです。他の解決法がないか調べてみたのですが良さそうなものは見つけられませんでした。

ここで終わるのも申し訳ないので(苦肉の策になりますが)専用のエラーページを設ける方法を書いておきます。

index.htmlというファイル名でエラーページを作成します(エラーページの記載は何でも良いです)。


<!DOCTYPE HTML>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<TITLE>Not Found</TITLE>
</HEAD>
<BODY>
不正なページアクセスです。
</BODY>
</HTML>

これを任意のディレクトリに格納します。今回は /var/www/html/dumy の配下にします。バーチャルホストの設定として以下を追記します。

<VirtualHost *:443>
    DocumentRoot /var/www/html/dumy
    ServerName (IPアドレス):443
</VirtualHost>

この443のバーチャルホスト設定はssl.confの一番下に追記してください。80のバーチャルホスト設定は一番上でしたが443は下です。

「https://IPアドレス」でサイトにアクセスしてみます。ブラウザによっては警告のページが表示されます。これはエラーページのサーバー証明書を用意していないからです。以下はFirefoxの例です。

詳細情報を表示すると SSL_ERROR_BAD_CERT_DOMAIN と記載されています。

これでユーザーがアクセスを諦めてくれれば良いですが無理やり続行(危険性を承知で続行)することも可能です。続行した場合は以下のエラーページが表示されます。

なお左上の赤枠ですが、ここにはファビコンが表示されます。エラーページ用のファビコンも用意したほうが良いでしょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です