2012-08-27 119 views
21

有没有一种方法来实现IP过滤或IP访问规则,就像我用nginx/apache限制或阻止Heroku上的某些IP一样?如何阻止或过滤Heroku上的IP地址?

注:我知道这可以从我的应用程序(Rails 3.2)很容易地完成,但我不认为这是我的资源在Heroku上最有效的使用。此外,基于Rack的解决方案将比在Rails中实施过滤更好。

回答

7

我添加了'rack-block'作为Rack中间件。在config/initializers中,添加一个新文件:

YourApp::Application.configure do 

    config.middleware.insert_before(Rack::Lock, Rack::Block) do 
    # Add your rules with the rack-block syntax in here 
    end 

end 

工程就像一个魅力。

+2

谢谢,这正是我一直在寻找的。我现在有点关心我的Google搜索技巧。 –

+2

有没有一种方法可以在请求命中dyno前阻止centain地址? –

+0

如何阻止除我想允许的一个IP之外的所有IP地址?对我来说,似乎与机架块我必须列出所有我想阻止的IP地址:( – morgler

13

您应该检查出rack-attack。看起来它和rack-block一样,但是经常被广泛使用和更新。要阻止特定的IP,你可以这样做:

# Block requests from 1.2.3.4 
Rack::Attack.blacklist('block 1.2.3.4') do |req| 
    # Requests are blocked if the return value is truthy 
    '1.2.3.4' == req.ip 
end 
+0

我可以阻止IP范围吗?即1.2.3。*? –

+1

@Stefanos .Ioannou阻止你刚才需要的值,确保你传递给'Rack :: Attack.blacklist'的块返回true。你可以这样做: '(0..255).map {| val | '1.2.3。'+ val.to_s} .include?(req.ip)' – Phil

+2

@Phil我对一个人为的例子很迂腐,但是......;)你可能会用'starts_with更好? ('1.2.3')'那里 - 建立一个由256个字符串组成的数组,然后检查这些ip是否在这些数字之间在计算上,但可能不是你想要做的每一个请求,如果没有必要的。 –