Apache httpd:すべてを拒否し、サブネットを許可するが、そのサブネット内のIPを拒否するにはどうすればよいですか?


26

在庫のApache httpd-2.2.3でCentOS 5.5を実行しています。

ロケーション/ server-statusでmod_statusを有効にしました。次の方法で、この単一の場所へのアクセスを許可したいと思います。

  1. すべてから拒否
  2. サブネット192.168.16.0/24から許可
  3. 192.168.16.0/24サブネット内のIP 192.168.16.100から拒否します。

1と2は簡単です。ただし、「192.168.16.0/24から許可する」ので、192.168.16.100から拒否することはできますか?

192.168.16.100のDenyステートメントを追加しようとしましたが、機能しません。関連する構成は次のとおりです。

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  all
    Deny from  192.168.16.100 # This does not deny access from 192.168.16.100
    Allow from 192.168.16.0/24
</Location>

または:

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  all
    Deny from  192.168.16.100 # This does not deny access from 192.168.16.100
    Allow from 192.168.16.0/24
</Location>

ただし、アクセスログに示されているように、これによってこの特定のページへのアクセスが妨げられることはありません。

www.example.org 192.168.16.100 - - [11/Mar/2011:16:01:14 -0800] "GET /server-status HTTP/1.1" 200 9966 "-" "

mod_authz_hostのマニュアルによると:

許可、拒否

最初に、すべてのAllowディレクティブが評価されます。少なくとも1つが一致する必要があります。一致しない場合、要求は拒否されます。次に、すべてのDenyディレクティブが評価されます。一致する場合、要求は拒否されます

IPアドレスはDenyディレクティブと一致するため、要求を拒否するべきではありませんか?

mod_authz_hostページの表によると、このIPアドレスは「許可と拒否の両方に一致」する必要があるため、「最終一致制御:拒否」ルールが適用されます。

    一致を許可、結果を拒否、拒否、結果を許可
    一致のみ許可リクエスト許可リクエスト許可
    一致のみ拒否リクエスト拒否リクエスト拒否
    一致なしデフォルトの2番目のディレクティブ:拒否デフォルトの2番目のディレクティブ:許可
    許可と拒否の両方に一致する最終一致コントロール:拒否される最終一致コントロール:許可される

すべての192.168.16.100からの拒否-ここで「すべて」を使用しているため、すべての要求がすべてのIPアドレスから拒否されると予想されます。ここで何か他のことが起こっていると思います。
ミカ

@Michah:私もやっていAllow from 192.168.16.0/24ます。ドキュメントを理解すると、192.168.16.0 / 24ネットワークのリクエスターIPはこのAllowステートメントと一致し、リクエストは許可されます。
ステファンLasiewski

上記で貼り付けられたドキュメントに従います。「まず、すべてのAllowディレクティブが評価されます。少なくとも1つが一致するか、要求が拒否されます」==>これは「Allow from 192.168.16.0/24」と一致するはずですが、「Next、all Deny directives are評価されます。一致する場合、要求は拒否されます」「すべてから拒否」を使用すると、すべての要求がその2番目の部分と一致しないため、拒否されませんか?
ミカ

IPアドレスがシステムへの完全なアクセスを拒否するか、httpdからのみアクセスを拒否するかを本当に考慮する必要があります。前者がapacheディレクティブを使用するアプローチを続ける場合。後者の場合、これはファイアウォールで行う必要があります。
アンドリューケース

ACaseに感謝します。192.168.16.100からこの特定のページへのアクセスのみを拒否します。192.168.16.100がこのWebサーバー上の他のすべてのページにアクセスできるようにします。
ステファンLasiewski

回答:


35

私はテストしていませんが、あなたはほとんどそこにいると思います。

<Location /server-status>
    SetHandler server-status
    Order Allow,Deny
    Deny from  192.168.16.100
    Allow from 192.168.16.0/24
</Location>

Deny from all必要ありません。実際、すべてが一致するためall失敗し、拒否されます(Apacheは賢く、愚かなことをしようとしていると思います)。私はいつもApacheのOrderものAllowDenyディレクティブが紛らわしいことを発見したので、常にテーブルで物事を視覚化します(docsから取得):

マッチ| 結果を許可、拒否| 拒否、結果を許可
-------------------------------------------------- -----
許可のみ| 許可| 許可された
拒否のみ| 拒否されました| 拒否されました
一致しない| デフォルト:拒否| デフォルト:許可
両方に一致する| 最終試合:拒否| 最終試合:許可された

上記の設定で:

  • 192.168.16.100からのリクエストは「両方に一致」するため、拒否されます。
  • 192.168.16.12からの要求は「許可のみ」になり、許可されます。
  • 123.123.123.123からのリクエストは「一致なし」になり、拒否されます。

1

ポート80の単一ホストを拒否し、すべてを拒否し、サブネットを許可するために、おそらくこれにIPTablesルールを追加することも考えます。

サブネットを許可した後、特定のアドレスから拒否ルールを設定しても問題ありません。その順番でそれをしてください。


回答を更新しました。私は「拒否192.168.16.100から」ルールを含めますが、アクセスはまだ192.168.16.100から許される
ステファンLasiewski

このホストから他のすべての場所へのアクセスを許可したい。ただし、特定の場所を拒否します。ここではIPTablesは役に立ちません。
ステファンLasiewski

IPTablesは、特に指定しない限り、送信トラフィックを特に拒否しません。ただし、世界からの着信トラフィックと特定のアドレスを拒否できますが、すべてサブネットを許可します。
マイク

私の要求を誤解していると思います。このアクセス制御は、ホスト全体ではなく、/ server-statusのみに適用したいです。私の知る限り、IPtablesではこれを簡単に行うことはできません。
ステファンLasiewski

-4

phpを使用できますか?その場合は、その1つの特定のIPアドレスの終了/リダイレクトにphpステートメントを追加します

例:

$ deny = array( "111.111.111"、 "222.222.222"、 "333.333.333");

if(in_array($ _SERVER ['REMOTE_ADDR']、$ deny))

{header( "location:http : //www.google.com/ ");

出口();

参照:http : //perishablepress.com/press/2007/07/03/how-to-block-ip-addresses-with-php/


2
これは、ウェブサーバーがホストするすべてのページに存在する必要があります。このソリューションは非現実的であり、ウェブサーバーへのアクセスをフィルタリングする場所ではありません。
アンドリューケース
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.