web-dev-qa-db-ja.com

htaccessを使用してIP範囲をブロックする

Htaccessを使用してIP範囲全体をブロックする良い方法を探しています。

私が抱えている問題は、禁止する必要があるブロックが100個のIP範囲であることです。プログラマーの観点からは、簡単に実行できるはずですが、htaccessに100行を追加せずに実行できず、他の手法を試してもうまくいきませんでした。

ブロックする必要があるIPアドレスの範囲はHUAWEIクラウド用です:159.138.100。*-159.138.199。*

基本的に159.138.1の鋭いアイスポットで十分にブロックできます。

私は成功せずに以下を試しました:

Order Allow,Deny
Deny from 159.138.1
Allow from all

私も試しました:

Order Allow,Deny
Deny from 159.138.1*
Allow from all

.htaccessを使用してこのiprangeを効果的にブロックするにはどうすればよいですか?

3
LPChip

IP範囲は、.- htaccessで CIDR表記 を使用して指定されます。あなたが使用できる最も簡単なルールは

Deny from 159.138.0.0/16

少しブロックしすぎます:

CIDR Range      159.138.0.0/16
Netmask         255.255.0.0
Wildcard Bits   0.0.255.255
First IP        159.138.0.0
Last IP         159.138.255.255
Total Host      65536

159.138.100.0159.138.199.255の正確な範囲をブロックするには、いくつかのルールが必要です。

Deny from 159.138.100.0/22
Deny from 159.138.104.0/21
Deny from 159.138.112.0/20
Deny from 159.138.128.0/18
Deny from 159.138.192.0/21

出典: CIDR計算機へのIP範囲

使用しているIP範囲をどこで取得したかわかりません。 このサイトにはHuawaiクラウドサービスの74のCIDR範囲がリストされています

4
Deny from 159.138.1

部分的なIPアドレスを指定できますが、これまではバイト単位です。だから、あなたは書くことができます:

Deny from 159.138

これは、CIDR表記を使用した159.138.0.0/16と同じです-「少しブロックしすぎる」(前述のとおり)。

それに失敗すると、@ Stephenが彼の回答で述べているように、複数のCIDR範囲を使用することがおそらく進むべき道です。


159.138.100.*-159.138.199.*

ただし、これは、IPアドレスの比較的単純な正規表現の一致に役立ちます。例えば:

SetEnvIf Remote_Addr ^159\.138\.1\d\d BLOCKIT
Deny from env=BLOCKIT

SetEnvIfディレクティブは、リモートIPアドレスが指定された正規表現と一致する場合にBLOCKIT環境変数を設定します。そして、この環境変数が設定されている場合、Denyディレクティブがトリガーされます。 \dは、0〜9の任意の数字に一致する省略文字クラスです。

基本的に159.138.1でブロックできます。

そのため、正規表現を^159\.138\.1に簡略化できます(つまり、末尾の\d\dを削除します)。ただし、これにより11個の追加のIPアドレスがブロックされます。

彼らが使用しているApacheのバージョンがわからないが、彼らは物事を最新に保つ会社です。だから私は彼らが最新バージョンの1つを持っていることを期待しています。

その場合、Apache 2.4を使用する可能性がはるかに高くなります。 「問題」は、Denyが実際にはApache 2.2ディレクティブであることです。これは、Apache 2.4でも引き続き利用できます-後方互換性のためだけに(そして別のモジュールに移動されました)-以前は非推奨です(将来のバージョンでは完全に削除される予定です)。

さらに複雑なのは、システム全体で古いOrderDenyAllowディレクティブのすべてのインスタンスを新しいRequireディレクティブに実際に更新する必要があることです。予期しない競合が発生する可能性があります(一方が必ずしも他方をオーバーライドするわけではないため)。

参照:
https://httpd.Apache.org/docs/2.4/mod/mod_access_compat.html

たとえば、@ Stephenの回答から複数のDeny CIDRディレクティブを変換してApache 2.4 Requireを使用すると、次のようになります。

<RequireAll>
    Require all granted
    Require not ip 159.138.100.0/22
    Require not ip 159.138.104.0/21
    Require not ip 159.138.112.0/20
    Require not ip 159.138.128.0/18
    Require not ip 159.138.192.0/21
</RequireAll>

(少し直感的には、negatedディレクティブ(例:Require not ...)自体はアクセスを許可または拒否できないため、上記を囲む必要があります。 <RequireAll>ディレクティブを含むRequire all grantedディレクティブ内)

または、Apache 2.4以降の式を使用して、正規表現を使用してIPアドレスを照合することもできます(上記と同様)。例えば:

<If "%{REMOTE_ADDR} =~ /^159\.138\.1\d\d/">
    Require all denied
</If>

または、CIDR表記を使用して「過度に一般的な」IP範囲に一致させます。

<If "-R '159.138.0.0/16'">
    Require all denied
</If>

参照:

2
MrWhite