9
8

More than 5 years have passed since last update.

Apache の SetEnvIf で プライベートIPアドレス帯域を指定する方法

Last updated at Posted at 2016-03-16

背景

ログ出力や特定モジュールから内部アクセスは除外したかったが mod_setenvif では CIDR 表記は受け付けなかったため プライベートIPアドレス帯域を正規表現でセットしてみた。

環境

・Apache 2.x

やったこと

プライベートIPのアドレス定義は以下のとおり。

クラス IPアドレス範囲 CIDR表記 サブネットマスク
クラスA 10.0.0.0 ~ 10.255.255.255 10.0.0.0/8 255.0.0.0
クラスB 172.16.0.0 ~ 172.31.255.255 172.16.0.0/12 255.240.0.0
クラスC 192.168.0.0 ~ 192.168.255.255 192.168.0.0/16 255.255.0.0

各クラスのIPアドレス範囲からネットワークアドレスとブロードキャストアドレスを除外すると、ホストとして利用可能なIPアドレス範囲は以下となる。

クラス ホストのIPアドレス範囲 ネットワーク ブロードキャスト
クラスA 10.0.0.1 ~ 10.255.255.254 10.0.0.0 10.255.255.255
クラスB 172.16.0.1 ~ 172.31.255.254 172.16.0.0 172.31.255.255
クラスC 192.168.0.1 ~ 192.168.255.254 192.168.0.0 192.168.255.255

プライベートIPを正規表現で記述してみる

ホストのIPアドレス範囲を正規表現で表すと以下となる。

クラスA ( 10.0.0.1 ~ 10.255.255.254 )

^10\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])$

クラスB ( 172.16.0.1 ~ 172.31.255.254 )

^172\.(1[6-9]|2[0-9]|3[0-1])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

クラスC ( 192.168.0.1 ~ 192.168.255.254 )

^192\.168\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])$

設定例

プライベートIPアドレスなら環境変数 HOGE_IGNORE にIPアドレスをセットする。
ただし 192.168.0.1 のアドレスならば 環境変数 HOGE_IGNORE は立てない。

<IfModule mod_setenvif.c>
  SetEnvIf Remote_Addr "^(192)\.(168)\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])$" HOGE_IGNORE=$1.$2.$3.$4
  SetEnvIf Remote_Addr "^(172)\.(1[6-9]|2[0-9]|3[0-1])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$" HOGE_IGNORE=$1.$2.$3.$4
  SetEnvIf Remote_Addr "^(10)\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])$" HOGE_IGNORE=$1.$2.$3.$4
  SetEnvIf Remote_Addr "^192\.168\.0\.1$" !HOGE_IGNORE
</IfModule>

環境変数のセット用法は以下を参照ください。
引用元:https://httpd.apache.org/docs/2.2/ja/mod/mod_setenvif.html#setenvif

引数 説明
varname 環境変数 varname に 1 がセットされる
!varname (既に varname がセットされてたら)環境変数を消去する
varname=value 環境変数 varname に value の値がセットされる
varname=$1 環境変数 varname に $1..$9 の範囲内で正規表現の丸括弧()で囲まれた部分が置換されてセットされる

間違いや、もっと簡単な方法があるよ。などあればご指摘いただければと思います。

(追記)もっと簡単な方法

そんな細かくIPを指定する必要ない!環境変数さえ立てば良い!
っていう場合は、先頭一致で弾けますね

<IfModule mod_setenvif.c>
  SetEnvIf Remote_Addr "^192.168." HOGE_IGNORE
  SetEnvIf Remote_Addr "^172.(1[6-9]|2[0-9]|3[0-1])." HOGE_IGNORE
  SetEnvIf Remote_Addr "^10." HOGE_IGNORE
  SetEnvIf Remote_Addr "^192.168.0.1$" !HOGE_IGNORE
</IfModule>

以上です

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8