#背景
ログ出力や特定モジュールから内部アクセスは除外したかったが 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>
以上です