如何在Rails上禁用“无法从…渲染控制台”


141

我正在使用Ubuntu / vagrant作为开发环境。我在Rails控制台上收到这些消息:

Started GET "/assets/home-fcec5b5a277ac7c20cc9f45a209a3bcd.js?body=1" for 10.0.2.2 at 2015-04-02 15:48:31 +0000
Cannot render console from 10.0.2.2! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255

是否可以禁用那些“无法渲染...”消息或以任何方式允许它们?

Answers:


182

您需要在Web Console配置中将10.0.2.2网络空间列入白名单。

因此,您需要这样的东西:

class Application < Rails::Application
  config.web_console.whitelisted_ips = '10.0.2.2'
end

在这里阅读更多信息。

正如pguardiario指出那样,这config/environments/development.rb不是config/application.rb您想进入的,而是仅应用于您的开发环境。


6
我认为您只想要第二行config/environments/development.rb,@ ydaetskcoR
Ehtesh Choudhury

2
对于流浪尤其是,这样的事情也可能是好,因为分配的右侧:ENV.fetch('SSH_CLIENT', '127.0.0.1').split(' ').first。通常,这可能是10.0.2.2,但是它应该反映出任何活动的网络配置(实际上是否处于活动状态-当然,您想要或不想要的是哪个)。
林德斯

2
这里发生了两种不同的事情。首先是当Rails在无所事事的盒子中运行时,Web控制台正在本地计算机上呈现。这由控制config.web_console.whitelisted_ips。第二个是您在日志中看到的错误消息。这由控制config.web_console.whiny_requests。最终,这就是我面临的问题,导致白名单Ip错误是因为Rails试图将控制台呈现为默认机制来处理另一个错误。因此,修复另一个错误或更改默认值也将有所帮助。
kapad

通常,您不想对事物进行硬编码。看我的回答
x-yuri

我可以将所有IP地址列入白名单吗?
亚伦·弗兰克

82

您可以将单个IP或整个网络列入白名单。

假设您要与共享控制台192.168.0.100。你可以这样做:

class Application < Rails::Application
  config.web_console.whitelisted_ips = '192.168.0.100'
end

如果要将整个专用网络列入白名单,可以执行以下操作:

class Application < Rails::Application
  config.web_console.whitelisted_ips = '192.168.0.0/16'
end

如果您不想再看到此消息,请将此选项设置为false:

class Application < Rails::Application
  config.web_console.whiny_requests = false
end

小心您想要的东西,因为您可能会得到所有

这可能是只为开发目的,所以你可能更愿意将其下config/environments/development.rb的替代config/application.rb


我使用“系统偏好”>“共享”下的OS X“计算机名称”功能,并将Webrick源IP绑定到字母名称(例如,myname.local:3000),但是,当我尝试将Webrick列入白名单时,Webrick不会启动。有什么建议?
日本,2016年

41

将IP硬编码到配置文件中是不好的。那其他开发者呢?如果IP改变怎么办?

尽可能不将与Docker相关的配置泄漏到rails应用程序中。这就是为什么您应该在config/environments/development.rb文件中使用env vars的原因:

class Application < Rails::Application
  # Check if we use Docker to allow docker ip through web-console
  if ENV['DOCKERIZED'] == 'true'
    config.web_console.whitelisted_ips = ENV['DOCKER_HOST_IP']
  end
end

您应该在 .env文件中,而不是在版本控制中进行跟踪。

在其中,docker-compose.yml您可以使用以下命令从该文件中注入env var env_file

app:
  build: .
  ports:
   - "3000:3000"
  volumes:
    - .:/app
  links:
    - db
  environment:
    - DOCKERIZED=true
  env_file:
    - ".env"

根据评论中收到的Feebdack,我们还可以构建一个没有环境变量的解决方案:

class Application < Rails::Application
  # Check if we use Docker to allow docker ip through web-console
  if File.file?('/.dockerenv') == true
    host_ip = `/sbin/ip route|awk '/default/ { print $3 }'`.strip
    config.web_console.whitelisted_ips << host_ip
  end
end

我会将解决方案留给env var进行学习。


未设置我的DOCKER_HOST_IP环境变量。知道自2月22日以来发生了什么变化吗?
dennis-tra

您应该自己在环境文件中指定它。

1
@BrianKung我相信这是可以的:.env不应将其签入版本控制,任何人都可以在自己的环境中覆盖它。码头工人信息无论如何都会泄漏到应用程序中,我们只是在这里最大程度地减少了损害:)
Pak

1
太好了,我也从您的答案中了解了env_fileenvironment选项docker-compose.yml。👍–
布莱恩·功

6
无需创建DOCKERIZED-env变量。Docker创建一个/.dockerenv-file,您可以检查该文件: File.file?('/.dockerenv') => true并且您位于容器中。
jottr

20

您内部的自动发现 config/development.rb

config.web_console.whitelisted_ips = Socket.ip_address_list.reduce([]) do |res, addrinfo|
    addrinfo.ipv4? ? res << IPAddr.new(addrinfo.ip_address).mask(24) : res
end

当然可能需要添加

require 'socket'
require 'ipaddr'

在您的文件中。


2
最好的答案-刚好于其余的
乔诺(Jono)

当我在Docker容器中运行Rails时,这对我来说似乎非常有效
FireDragon

就个人而言,我希望选择+地图组合的可读性:config.web_console.whitelisted_ips = Socket.ip_address_list.select(&:ipv4?).map{ |addrinfo| IPAddr.new(addrinfo.ip_address).mask(24) }
亚历克西斯(Alexis)

1
还有,为什么这比config.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']@kwerle的答案要简单呢?
亚历克西斯(Alexis)

我也想知道 为什么这比简单的配置更好?
安华

14

欢迎使用我的任何私人网络上的任何人。

我在Docker容器中运行,并且不在乎它本周要使用哪个网络。

config / environments / development.rb添加行

config.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']

7

对于开发环境:检测是否为docker,然后确定IP地址并将其列入白名单

# config/environments/development.rb
require 'socket'
require 'ipaddr'

Rails.application.configure do
  ...

  # When inside a docker container
  if File.file?('/.dockerenv')
    # Whitelist docker ip for web console
    # Cannot render console from 172.27.0.1! Allowed networks: 127.0.0.1
    Socket.ip_address_list.each do |addrinfo|
      next unless addrinfo.ipv4?
      next if addrinfo.ip_address == "127.0.0.1" # Already whitelisted

      ip = IPAddr.new(addrinfo.ip_address).mask(24)

      Logger.new(STDOUT).info "Adding #{ip.inspect} to config.web_console.whitelisted_ips"

      config.web_console.whitelisted_ips << ip
    end
  end
end

对我来说,这将打印以下内容,并且警告消失away

Adding 172.27.0.0 to config.web_console.whitelisted_ips
Adding 172.18.0.0 to config.web_console.whitelisted_ips

我的解决方案是结合


1
谢谢您的回答!对我来说,这段代码返回了:undefined method <<' for nil:NilClass (NoMethodError)。因此,我创建了一个名为的变量whitelisted_ips = [ ],在循环中添加ips并在循环之后使用了该变量:config.web_console.whitelisted_ips = whitelisted_ips然后它对我有用!那谢谢啦!
Pedro Paiva

3

如果您使用的是Docker,那么您既不想引入新的ENV变量,也不想硬编码您的特定IP地址。

相反,您可能想使用来检查您是否在Docker中/proc/1/cgroup,并允许您的主机IP(用于web_consolebetter_errors)。加到你的config/environments/development.rb

  # https://stackoverflow.com/a/20012536/4862360
  if File.read('/proc/1/cgroup').include?('docker')
    # https://stackoverflow.com/a/24716645/4862360
    host_ip = `/sbin/ip route|awk '/default/ { print $3 }'`.strip

    BetterErrors::Middleware.allow_ip!(host_ip) if defined?(BetterErrors::Middleware)
    config.web_console.whitelisted_ips << host_ip
  end

2
class Application < Rails::Application
  config.web_console.whitelisted_ips = %w( 0.0.0.0/0 ::/0 )
end

是否将所有IP列入白名单?您将此代码放在哪里?
亚伦·弗兰克


1

如果你(在主机上)在本地运行您的网站,一般的作品出来,因为127.0.0.1总是被允许。但是,如果要将网站放入容器中(而不是在生产环境中,在本地),则可能要将其添加到config/environments/development.rb

require 'socket'
require 'ipaddr'
Rails.application.configure do
  ...
  config.web_console.permissions = Socket.getifaddrs
    .select { |ifa| ifa.addr.ipv4_private? }
    .map { |ifa| IPAddr.new(ifa.addr.ip_address + '/' + ifa.netmask.ip_address) }
  ...
end

PS大多数时候,您都希望它发牢骚(不想做config.web_console.whiny_requests = false)。因为这可能意味着您正在web-console生产中(不应该这样做)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.