diary

I like Hatena Star with a text selection.

2020-03-12

iPadから同じネットワークにいるPCにIPではなくドメイン名でHTTPリクエストをしたいのですが、シュッと雑なDNSを立てる方法ってなんかあったりするでしょうか? /etc/hostsに書くレベルのことでいいんですが、iPadはhostsを触らせてくれないみたいなので……

上の質問をruby-jpでしたら、rubydnsというものを教えてもらった。

github.com

example通りに次のようなコードを置くと、DNSサーバーが立った。べんり。

require 'rubydns'

INTERFACES = [
  [:udp, "0.0.0.0", 53],
  [:tcp, "0.0.0.0", 53],
]

IN = Resolv::DNS::Resource::IN

# Use upstream DNS for name resolution.
UPSTREAM = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]])

# Start the RubyDNS server
RubyDNS::run_server(INTERFACES) do
  @logger.debug!

  match(%r{devkibe.la}, IN::A) do |transaction|
    transaction.respond!("192.168.1.3")
  end

  # Default DNS handler
  otherwise do |transaction|
    transaction.passthrough!(UPSTREAM)
  end
end

iPadDNSサーバーを指定する時にポート番号を指定すると(バリデーションエラーも何もなしに)無視するので、53番ポートでDNSサーバーは立てる必要がある。 そうすると当然root権限が必要なわけだけど、どうやらsetcapコマンドを使うと必要な権限だけをコマンドに渡せるらしい。 sudo setcap CAP_NET_BIND_SERVICE+ep $(rbenv which ruby)としてrubyに53番ポートをlistenする権限を与えるとうまくいった。

roguer.info

ただ、結局JavaScriptがうまく読み込めなくてアプリケーションを試すことができなかった。まあアプリケーション側の問題なので、直せば良いだけ。 ただ、iPadだと開発者コンソールがないので何もわからないことが分かった。つらい…