クリエイター:メタボ兔

ウェブやアプリの開発者で利用する色な技術やサーバーや開発環境の設定について共有する場

5.DNSサーバーを先に試して:実装開始

今回は計画した内容でDNSサーバーを試してみました。実際のDNS用で「andyshinn/dnsmasq」と仮サーバーの確認用で「httpd:2.4」のイメージを利用してみます。

ネットワークの設定

新しくVPNを作ってIPを固定で指定します。versionは3でdocker-compose.ymlを作成します。

version: "3"

networks:
  local-server-net:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.16.0.0/24

ペースはbridgeで作成しました。

仮サーバーを追記

ページさえ表示されれば良いので設定は殆どしない感じにします。

version: "3"
services:
  web:
    image: httpd:2.4
    container_name: web
    restart: always
    logging:
      options:
        max-size: 5m
        max-file: "5"
    networks:
      local-server-net:
        ipv4_address: 172.16.0.2
networks:
  local-server-net:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.16.0.0/24

一応、簡単に作ったところで「あっ!Dockerのインストール」、Mac用のDockerについて異常遅い話(参考)で「edge」をインストールします。

ダウンロード場所:https://docs.docker.com/docker-for-mac/edge-release-notes/

docs.docker.com

では、Build&実装してみます。作成した「docker-compose.yml」があるディレクトに移動して以下のコンマンドを実行します。

$ docker-compose up -d --build
Creating network "test_local-server-net" with driver "bridge"
Pulling web (httpd:2.4)...
2.4: Pulling from library/httpd
bc51dd8edc1b: Pull complete
dca5bc65e18f: Pull complete
ccac3445152a: Pull complete
8515f2015fbc: Pull complete
e35494488b8c: Pull complete
Digest: sha256:b783a610e75380aa152dd855a18368ea2f3becb5129d0541e2ec8b662cbd8afb
Status: Downloaded newer image for httpd:2.4
Creating web ... done
$ docker-compose ps
Name       Command        State   Ports 
----------------------------------------
web    httpd-foreground   Up      80/tcp

http://172.16.0.2」でブラウザで見ても反応がないですね。やはり「reverse proxy server」がないといけないのか。。。80ポートを公開してみます。

version: "3"
services:
  web:
    image: httpd:2.4
    container_name: web
    ports:
      - 80:80
    restart: always
    logging:
      options:
        max-size: 5m
        max-file: "5"
    networks:
      local-server-net:
        ipv4_address: 172.16.0.2
networks:
  local-server-net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.16.0.0/24

もう一度buildしましょう!!

$ docker-compose --compatibility up -d --build --force-recreate
Recreating web ... done

http://127.0.0.1」画面が出ました。

DNSサーバーの設定

dns/dnsmasq.confを作成します。

# Do not use /etc/hosts as nameserver
no-resolv

# Use this file as a hosts file
addn-hosts=/etc/hosts-dnsmasq

# Upstream DNS Server
server=192.168.11.1

# Log all dns queries
log-queries

dns/hosts-dnsmasqを作成します。 - 「server=192.168.11.1」:PC本体(host)の既存DNSサーバー、これを正しく設定しないとDNSサーバーに登録しても上手く動かなかった。

127.0.0.1  local

docker-compose.ymlに設定を追記します。

version: "3"
services:
  web:
    image: httpd:2.4
    container_name: web
    ports:
      - 80:80
    restart: always
    logging:
      options:
        max-size: 5m
        max-file: "5"
    networks:
      local-server-net:
        ipv4_address: 172.16.0.2

  dns:
    image: andyshinn/dnsmasq
    container_name: dns
    ports:
      - "53:53/udp"
      - "53:53/tcp"
    volumes:
      - ./dns/dnsmasq.conf:/etc/dnsmasq.conf
      - ./dns/hosts-dnsmasq:/etc/hosts-dnsmasq
    restart: always
    cap_add:
      - NET_ADMIN
    networks:
      local-server-net:
        ipv4_address: 172.16.0.4

networks:
  local-server-net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.16.0.0/24

テストしてみましょう!!

$dig @127.0.0.1 local

; <<>> DiG 9.10.6 <<>> @127.0.0.1 local
; (1 server found)
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5779
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;local.               IN  A

;; ANSWER SECTION:
local.            0   IN  A   127.0.0.1

;; Query time: 3 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Feb 07 18:42:36 JST 2020
;; MSG SIZE  rcvd: 50

DNSの設定(iOSのみ)

iOS(Mac)でのみ調査しました。Widnows系は別途調査して頂きたいです。

% mkdir /etc/resolver/
% sudo vi /etc/resolver/localnet.intra
search      local
nameserver  127.0.0.1

追記 2020.02.10 上記の方法では対応できなかったので、以下の内容を追加しました。

% networksetup -listnetworkserviceorder
% networksetup -setdnsservers "Apple USB Ethernet Adapter" 127.0.0.1 既存DNサーバー
% sudo killall -HUP mDNSResponder
  • Apple USB Ethernet Adapter」:networkserviceorderの名前

じゃブラウザーで確認しましょう!!

f:id:FattyRabbit:20201229185324p:plain

ご存知だと思いますが、Chromeでは「http://」から入力してください。