【问题标题】:Different Rails route if IP not in list?如果 IP 不在列表中,不同的 Rails 路由?
【发布时间】:2012-04-13 15:23:07
【问题描述】:

我有一个 Rails 3.2.2 应用程序,它是一个简单的公司内部网,但是虽然那里没有任何私人信息,但如果它对外界来说相当安全,那可能是最好的。

但是,我们确实有一些人在没有设置 VPN 的情况下经常在家工作。

目前,我有一个防火墙规则,可以阻止除我们团队/分支机构静态 IP 地址列表之外的所有人。这样做的问题是,当团队成员从家里访问该站点时,该站点永远不会加载,因为防火墙拒绝了它们。我想做的是在应用程序中提供一个简单的页面,解释为什么他们没有“完全”访问权限。

防火墙正在为多个应用程序提供服务,所以我不能将拒绝访问页面放在那里

我已经阅读了一些关于 SO 的问题,例如 Get real IP address in local Rails development environment,其中显示了如何获取他们的 IP 地址,但我不确定如何基于此更改默认路由。

【问题讨论】:

  • 查看路线限制。您可以访问路由中的请求。
  • 如果我遗漏了什么,请见谅,但是如果您的服务器拒绝来自不在白名单上的所有 IP 的请求,那么这些请求怎么会到达 Rails 应用程序?
  • @Dae 一旦启用这条新路由,我将允许所有 IP 通过防火墙。
  • 我明白了。在那种情况下,“防火墙正在为多个应用程序提供服务,所以我无法以任何方式更改特定于该应用程序的内容” 说起来有点令人困惑:)
  • 啊抱歉,我的意思是“防火墙正在为多个应用程序提供服务,所以我不能把拒绝访问页面放在那里”

标签: ruby ruby-on-rails-3 routes ip firewall


【解决方案1】:

为了扩展 Robin 的白名单方法,这是我使用多个部分列入白名单的 ip 的解决方案

class WhitelistConstraint
   def initialize
     @ips =  ["127.0", "10.0.0.0/1"]

   end

   def matches?(request)
    !@ips.select{|req| request.remote_ip.include?(req) }.empty?
   end
end

【讨论】:

  • 看来10.0.0.0 没有通过。
【解决方案2】:

Dae 在 cmets 中提出了一个很好的观点,但你知道吗:

http://guides.rubyonrails.org/routing.html#advanced-constraints

class BlacklistConstraint
   def initialize
     @ips = Blacklist.retrieve_ips
   end

   def matches?(request)
    @ips.include?(request.remote_ip)
   end
end

YourApp::Application.routes.draw do
  match "*path" => "blacklist#index", :constraints => BlacklistConstraint.new
end

【讨论】:

  • 添加此路由后,我将禁用防火墙规则。
  • 此高级约束对白名单的工作方式是否相同?
  • 你可以在matches? 方法中做任何你想做的事情。你可以在初始化器中有Whitelist.retrieve_ips,然后在matches?中调用!@ips.include?(request.remote_ip)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多