2

少数のIPアドレスといくつかのIPサブネットを除いて、Rails3アプリケーションへのアクセスをブロックする正しい方法を模索してきました。

これを行う方法を探している間、私はこの質問/回答を見つけました。推奨されるコードは次のとおりです。

アプリケーションコントローラー

before_filter :protect

def protect
  @ips = ['127.0.0.1', '203.123.10.1'] #And so on ...]
  if not @ips.include? request.remote_ip
     # Check for your subnet stuff here, for example
     # if not request.remote_ip.include?('127.0,0')
     render :text => "You are unauthorized"
     return
  end
end

これは機能するので、テキストメッセージだけでなく、静的ページにリダイレクトするように変更しました。

ただし、私がやりたいのは、Railsアプリケーションサーバーと同じサブネット上のローカルIPからのアクセスを許可することです。サブネットは単純192.168.1.0/24です。

受け入れられたIPにサブネットを追加する最も簡単でクリーンな方法は何ですか?

4

1 に答える 1

4

特定の IP アドレスが addressと maskでfoo指定されたネットワーク内にあるかどうかをテストするには、ネットワーク アドレスとテスト対象のアドレスの両方にマスクを適用し、結果が等しいかどうかを確認します。最初に IP アドレスとマスクを整数に変換する必要があります。のマスクは に設定された 24 ビットで、その後に-に設定された 8 ビットが続きます。netmaskfoo & mask == net & mask/24100xFFFFFF00255.255.255.0

before_filter :protect

def protect
  @ips = ['127.0.0.1', '192.168.1.0/24'] #And so on ...]
  allowed = false
  # Convert remote IP to an integer.
  bremote_ip = request.remote_ip.split('.').map(&:to_i).pack('C*').unpack('N').first
  @ips.each do |ipstring|
    ip, mask = ipstring.split '/'
    # Convert tested IP to an integer.
    bip = ip.split('.').map(&:to_i).pack('C*').unpack('N').first
    # Convert mask to an integer, and assume /32 if not specified.
    mask = mask ? mask.to_i : 32
    bmask = ((1 << mask) - 1) << (32 - mask)
    if bip & bmask == bremote_ip & bmask
      allowed = true
      break
    end
  end

  if not allowed
     render :text => "You are unauthorized"
     return
  end
end
于 2012-07-24T18:29:43.053 に答える