Cách vô hiệu hóa Bảng điều khiển không thể kết xuất của bảng điều khiển từ trên phạm vi trên đường ray


141

Tôi đang sử dụng Ubuntu / vagrant làm môi trường phát triển của mình. Tôi nhận được những tin nhắn này trên bảng điều khiển 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

Có thể tắt những tin nhắn "không thể kết xuất ..." hoặc cho phép chúng theo bất kỳ cách nào không?

Câu trả lời:


182

Bạn cần lập danh sách trắng không gian mạng 10.0.2.2 trong cấu hình Bảng điều khiển Web.

Vì vậy, bạn sẽ muốn một cái gì đó như thế này:

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

Đọc ở đây để biết thêm thông tin.

Như được chỉ ra bởi pguardiario , điều này muốn đi vào config/environments/development.rbchứ không phải config/application.rbnó chỉ được áp dụng trong môi trường phát triển của bạn.


6
Tôi nghĩ bạn chỉ muốn dòng thứ hai bên trong config/environments/development.rb, @ydaetskcoR
Ehtesh Choudhury

2
Đối với Vagrant nói riêng, một cái gì đó như thế này cũng có thể là tốt như bên phải của nhiệm vụ : ENV.fetch('SSH_CLIENT', '127.0.0.1').split(' ').first. Nói chung, điều này có thể sẽ là 10.0.2.2, nhưng nó sẽ phản ánh bất kỳ cấu hình mạng nào đang hoạt động (thực sự hay không, thực sự - điều này tất nhiên có thể hoặc không thể là những gì bạn muốn).
buộc

2
Có hai điều khác nhau xảy ra ở đây. đầu tiên là bảng điều khiển web được hiển thị trên máy cục bộ của bạn khi đường ray đang chạy trong một hộp mơ hồ. Điều này được kiểm soát bởi config.web_console.whitelisted_ips. Thứ hai là các thông báo lỗi mà bạn đang thấy trong nhật ký của mình. Điều này được kiểm soát bởi config.web_console.whiny_requests. Cuối cùng, và đây là vấn đề mà tôi gặp phải, lỗi Ip trong danh sách trắng đã xảy ra do đường ray đang cố kết xuất bàn điều khiển như một cơ chế mặc định để xử lý một lỗi khác. Vì vậy, hoặc sửa lỗi khác, hoặc thay đổi mặc định cũng sẽ giúp.
kapad

Bạn thường không muốn mã hóa mọi thứ. Xem câu trả lời của tôi .
x-yuri

Tôi có thể đưa danh sách trắng tất cả các địa chỉ IP không?
Aaron Franke

82

Bạn có thể lập danh sách trắng các IP đơn hoặc toàn bộ mạng.

Nói rằng bạn muốn chia sẻ bảng điều khiển của bạn với 192.168.0.100. Bạn có thể làm được việc này:

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

Nếu bạn muốn lập danh sách trắng toàn bộ mạng riêng, bạn có thể làm:

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

Nếu bạn không muốn xem tin nhắn này nữa, hãy đặt tùy chọn này thành false:

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

Hãy cẩn thận với những gì bạn muốn, vì bạn có thể nhận được tất cả

Điều này có lẽ chỉ dành cho mục đích phát triển vì vậy bạn có thể thích đặt nó bên dưới config/environments/development.rbthay vì config/application.rb.


Tôi sử dụng tính năng "tên máy tính" của OS X trong System Prefs> Sharing và liên kết IP nguồn Webrick với một tên theo thứ tự chữ cái (ví dụ: myname.local: 3000), tuy nhiên, Webrick sẽ không khởi động khi tôi cố gắng đưa vào danh sách trắng này. Bất kỳ đề xuất?
nipponese

41

Mã hóa IP thành tập tin cấu hình không tốt. Còn các nhà phát triển khác thì sao? Nếu ip thay đổi thì sao?

Cấu hình liên quan đến Docker không nên rò rỉ vào ứng dụng rails bất cứ khi nào có thể. Đó là lý do tại sao bạn nên sử dụng env vars trong config/environments/development.rbtệp:

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

Bạn nên đặt các lọ env chính xác trong một .envtệp, không được theo dõi trong kiểm soát phiên bản.

Trong docker-compose.ymlbạn có thể tiêm env vars từ tệp này với env_file:

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

Dựa trên các thông tin nhận được trong các nhận xét, chúng tôi cũng có thể xây dựng một giải pháp mà không cần các biến môi trường:

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

Tôi sẽ để lại các giải pháp với env var cho mục đích học tập.


DOCKER_HOST_IP env var của tôi không được đặt. Bất cứ ý tưởng những gì có thể đã thay đổi kể từ feb 22?
dennis-tra

Bạn nên tự xác định nó trong tập tin môi trường của bạn.
Pak

1
@BrianKung Tôi tin rằng nó ổn: .envkhông nên kiểm tra phiên bản kiểm soát, bất kỳ ai cũng có thể ghi đè lên nó trong môi trường của chính nó. Thông tin về docker bị rò rỉ dù sao vào ứng dụng, chúng tôi chỉ giảm thiểu thiệt hại ở đây :)
Pak

1
Hoàn hảo, tôi cũng đã học về env_fileenvironmentcác tùy chọn docker-compose.ymltừ câu trả lời của bạn, quá. 👍
Brian Kung

6
Không cần tạo DOCKERIZEDbiến -env. Docker tạo một /.dockerenv-file, mà bạn có thể kiểm tra: File.file?('/.dockerenv') => truevà bạn đang ở trong một container.
jottr

20

Tự động phát hiện trong bạn 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

Tất nhiên có thể cần phải thêm

require 'socket'
require 'ipaddr'

Trong tập tin của bạn.


2
Câu trả lời hay nhất - chỉ mới hơn phần còn lại
Jono

điều này dường như hoạt động rất tốt đối với tôi khi tôi đang chạy Rails trong một container Docker
FireDragon

Cá nhân, tôi thích khả năng đọc của kết hợp chọn + bản đồ:config.web_console.whitelisted_ips = Socket.ip_address_list.select(&:ipv4?).map{ |addrinfo| IPAddr.new(addrinfo.ip_address).mask(24) }
Alexis

1
Ngoài ra, tại sao điều này tốt hơn đơn giản config.web_console.whitelisted_ips = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']từ câu trả lời của @ kwerle ?
Alexis

Tôi cũng muốn biết. Tại sao điều này tốt hơn so với cấu hình đơn giản?
Anwar

14

Bất cứ ai trên bất kỳ mạng riêng của tôi đều được chào đón.

Tôi chạy trong một container docker và tôi không quan tâm nó muốn sử dụng mạng nào trong tuần này.

cấu hình / môi trường / Development.rb thêm dòng

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

7

Đối với môi trường phát triển: Phát hiện nếu đó là docker, sau đó xác định địa chỉ IP và đưa vào danh sách trắng

# 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

Đối với tôi điều này in ra sau đây và cảnh báo biến mất

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

Giải pháp của tôi là kết hợp


1
Cảm ơn bạn vì câu trả lời! Đối với tôi mã này được trả lại : undefined method <<' for nil:NilClass (NoMethodError). Vì vậy, tôi đã tạo ra một biến được gọi whitelisted_ips = [ ], sử dụng nó trong vòng lặp thêm ips và sau vòng lặp: config.web_console.whitelisted_ips = whitelisted_ipsvà sau đó nó hoạt động với tôi! Vì vậy, cảm ơn!
Pedro Paiva

3

Nếu bạn đang sử dụng Docker, rất có thể bạn không muốn giới thiệu các biến ENV mới cũng như không mã hóa địa chỉ IP cụ thể của mình.

Thay vào đó, bạn có thể muốn kiểm tra xem bạn có đang sử dụng Docker /proc/1/cgrouphay không và cho phép IP máy chủ của bạn (cả cho web_consolebetter_errors). Thêm vào của bạnconfig/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

Có danh sách trắng này tất cả các IP? Nơi nào bạn đặt mã này?
Aaron Franke


1

Nếu bạn chạy trang web của bạn tại địa phương (trên máy chủ) nó thường làm việc ra, kể từ khi 127.0.0.1được luôn được phép . Nhưng nếu bạn định đặt trang web của mình vào một thùng chứa (không sản xuất tại địa phương), bạn có thể muốn thêm trang này vào 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 Hầu hết thời gian bạn muốn nó rên rỉ (không muốn làm config.web_console.whiny_requests = false). Bởi vì điều đó có thể có nghĩa là bạn đang chạy web-consoletrong sản xuất (điều mà bạn không nên làm).


0

Nếu bạn muốn ngừng xem thông báo lỗi này, bạn có thể thêm dòng này trong Development.rb

config.web_console.whiny_requests = false
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.