①やりたいこと
Rails6の本番環境でrails sをしたときにBlocked hostエラーが発生しました。
②エラー内容 
今回の対処法は以下の記事を参考にさせていただきました!
https://qiita.com/kodai_0122/items/67c6d390f18698950440
③原因
DNSリバインディング攻撃を防止する ActionDispatch::HostAuthorization middleware によるものらしい、、(Rails6から追加された機能です)
④解決策 3つありますが、基本的には一つ目の解決方法でOKです。筆者も一つ目で解決しました。
- Rails.application.config.hosts に接続先として許可する Host を追加する
development 環境では、 default で Rails.application.config.hosts に下記の Host が登録されています。
これ以外の Host 名として接続しようとすると、ブロックされるため、必要な Host 名を追加します。
Rails.application.config.hosts = [
IPAddr.new("0.0.0.0/0"), # All IPv4 addresses.
IPAddr.new("::/0"), # All IPv6 addresses.
"localhost" # The localhost reserved domain.
]
追加方法は development 環境であれば、 config/environment/deveropment.rbに下記のように記述します。
Rails.application.configure do
config.hosts << "d4e14c8c945545778d2fc824d6ee6181.vfs.cloud9.ap-northeast-1.amazonaws.com"
end
2. Rails.application.config.hosts の設定を clear する
Rails.application.config.hosts は、空の場合は Host ヘッダーのチェックが行われないため、ブロックされなくなります。
development 環境以外の環境 (たとえば production ) では、 Rails.application.config.hosts は default で空のため、チェックは行われません。
development 環境で Host ヘッダーのチェックを行わないようにするには、 config/environments/development.rb に下記のように記述します。
Rails.application.configure do
config.hosts.clear
end
なお、アプリケーションの前段に Host ヘッダーを識別して振り分けを行う LB 等がない場合は、DNSリバインディング攻撃が防止できなくなるため、 development 環境以外では Rails.application.config.hosts を適切に設定されることをおすすめします。
3. ActionDispatch::HostAuthorization middleware を使わないようにする
アプリケーションの前段に Host ヘッダーを識別して振り分けを行う LB 等があり、アプリケーション自体でDNSリバインディング攻撃を防止する必要がない場合は、 ActionDispatch::HostAuthorization middleware 自体をロードされないように設定します。
config/application.rb に下記のように記述します。
module HogeApp
class Application < Rails::Application
onfig.middleware.delete ActionDispatch::HostAuthorization
end
end
開発環境 mac OS バージョン11.6
Rails 6.1.4.4
Ruby 3.0.0
MYSQL 0.5
エディタ
Cloud9