投げ銭

★当サイトへの投げ銭(PayPal)★

LINK


(無償、寄付歓迎) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

人気の投稿(1ヶ月間)

Ad

Ad

投げ銭

★当サイトへの投げ銭(PayPal)★

2018年11月19日月曜日

【Linux CentOS 7】(ベースコンテナの作成)Dockerコンテナにdnsmasqを導入しhostsファイルの仕組みを整える方法

(警告)
ここで作成しているDockerコンテナは、信頼のおけるローカルネットワークのみで動作するホストで運用するものとして構築している。
ホスト上のいずれかのネットワークインターフェイスがインターネットに直接接している場合、このコンテナの運用はセキュリティの観点から非常に危険なので動作させてはいけない。
(インターネットに直に接している場合、Dockerのデフォルトではiptablesを書き換えて外部からのアクセスを許してしまうことになってしまうため厳禁である。)


コンテナの/etc/hostsを編集しても、コンテナのstopアンドstartで、データが初期化されてしまう。
そのため、dnsmasqを活用して、hostsファイルに似た仕組みを構成した。



ここで使用するコンテナは、(2)「【Linux CentOS 7】Dockerコンテナ(CentOS7公式)にsshd、rsyslog、Postfix、crondを導入した【Docker-ce 18.06.1.ce】」で構成したものである。

これは、もともと(1)「【Linux CentOS 7】Dockerコンテナへssh接続する方法や、コンテナのイメージ化、削除、起動方法などについて【Docker-ce 18.06.1.ce】」をベースにしたものである。

もし、rsyslog、Postfix、crondなどが不要であれば、(1)のコンテナから作業を継続しても良い。

いずれも下記のように、--privileged を与えて起動する。



■設定を行うコンテナの起動

○Dockerホストにおいてこのコンテナを起動させた。

(インターネットに直に接している場合、Dockerのデフォルトではiptablesを書き換えて外部からのアクセスを許してしまうことになってしまうため厳禁である。)
# docker run --privileged -d -p 222:22 --name centos7-ssh centos:centos7 /sbin/init


○そして、コンテナにSSH接続を行った。

192.168.100.3は、Dockerホストである。
$ ssh -p 222 root@192.168.100.3
[root@923d1942dcbb ~]#

以下は、コンテナ内での作業となる。



■dnsmasqとテストツールのインストール

○dnsmasqのインストール

[root@923d1942dcbb ~]# yum install dnsmasq
Installed:
  dnsmasq.x86_64 0:2.76-5.el7                                                 
Complete!

○有効化

[root@923d1942dcbb ~]# systemctl enable dnsmasq
Created symlink from /etc/systemd/system/multi-user.target.wants/dnsmasq.service to /usr/lib/systemd/system/dnsmasq.service.
○起動

[root@923d1942dcbb ~]# systemctl start dnsmasq


○状態の確認

[root@923d1942dcbb ~]# systemctl status dnsmasq
dnsmasq.service - DNS caching server.
   Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2018-11-18 21:32:42 UTC; 6s ago
 Main PID: 876 (dnsmasq)
   CGroup: /docker/923d1942dcbb471c99fe1295b36836368fbccddfae4eb6c2ac7979cdcc5ff123/system.slice/dnsmasq.service
           └─876 /usr/sbin/dnsmasq -k
           ‣ 876 /usr/sbin/dnsmasq -k
Nov 18 21:32:42 923d1942dcbb systemd[1]: Started DNS caching server..
Nov 18 21:32:42 923d1942dcbb systemd[1]: Starting DNS caching server....
Nov 18 21:32:42 923d1942dcbb dnsmasq[876]: started, version 2.76 cachesize 150
Nov 18 21:32:42 923d1942dcbb dnsmasq[876]: compile time options: IPv6 GNU-ge...y
Nov 18 21:32:42 923d1942dcbb dnsmasq[876]: reading /etc/resolv.conf
Nov 18 21:32:42 923d1942dcbb dnsmasq[876]: using nameserver 192.168.100.1#53
Nov 18 21:32:42 923d1942dcbb dnsmasq[876]: read /etc/hosts - 7 addresses
Hint: Some lines were ellipsized, use -l to show in full.

○ツールのインストール(digコマンドが使えるようになる)

[root@923d1942dcbb ~]# yum install bind-utils
Installed:
  bind-utils.x86_64 32:9.9.4-61.el7_5.1                                       
Dependency Installed:
  GeoIP.x86_64 0:1.5.0-11.el7        bind-libs.x86_64 32:9.9.4-61.el7_5.1     
Complete!


■dnsmasqの設定

コンテナは、/etc/hostsファイルを編集しても、再起動すると消えてしまう。
そのため、このhostsファイルの役割を、dnsmasqに担わせる設定を行った。


○オリジナルファイルを退避させた。

[root@923d1942dcbb ~]# mv /etc/dnsmasq.conf /etc/dnsmasq.conf.org


○独自の設定を行った。

★dnsmasqの設定は「【Linux CentOS 6.7 64bit】dnsmasqでドメイン名に応じて問い合わせ先を自動切替することなど【dnsmasq】」を参考にした。

[root@923d1942dcbb ~]# vi /etc/dnsmasq.conf
domain-needed
bogus-priv
no-resolv
no-poll
#server=/local.example.co.jp/192.168.0.5
#server=/co.jp/com/209.244.0.3
#server=9.9.9.9
server=8.8.8.8
server=8.8.4.4
#server=208.67.220.220
local=/localdomain/
#address=/pc01.example.com/192.168.123.45
no-hosts
addn-hosts=/etc/dnsmasq_static_hosts.conf
expand-hosts

○dnsmasq用の静的hostsファイルを作成した。

[root@923d1942dcbb ~]# vi /etc/dnsmasq_static_hosts.conf
127.0.0.1 localhost
127.0.0.1 outgoing.postfix

○dnsmasqの再起動

[root@923d1942dcbb ~]# systemctl restart dnsmasq


○動作テスト

dnsmasq用の静的hostsファイルに登録済の名前を解決した。
[root@923d1942dcbb ~]# dig @127.0.0.1 outgoing.postfix
; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> @127.0.0.1 outgoing.postfix
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54525
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;outgoing.postfix. IN A
;; ANSWER SECTION:
outgoing.postfix. 0 IN A 127.0.0.1

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Nov 18 21:57:00 UTC 2018
;; MSG SIZE  rcvd: 61
登録したとおり、127.0.0.1が得られた。


上位のDNSサーバに問い合わせた。
[root@923d1942dcbb ~]# dig @127.0.0.1 google.com   

; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7_5.1 <<>> @127.0.0.1 google.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16879
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:google.com. 58 IN A 216.*.*.*
;; Query time: 14 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Nov 18 21:55:12 UTC 2018
;; MSG SIZE  rcvd: 55


これでDNSサーバーが127.0.0.1で動作しているので、
コンテナが名前解決用サーバーとしてこれを使うように設定する。

コンテナの作成時に、--dnsオプションで指定する必要があるので、
一旦コンテナをコミットしてイメージ化し、オプションを含めて、コンテナを作成する。

下記に示す。



■DNSオプションを付けてコンテナを再作成する

○一旦コンテナを終了した。

[root@923d1942dcbb ~]# poweroff


以下の作業は、Dockerホストで行う。

○状態の確認
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                       PORTS                              NAMES

923d1942dcbb        image-centos7-ssh2    "/sbin/init"        2 days ago          Exited (130) 8 seconds ago                                      centos7-ssh

コンテナは終了した。


○コンテナをコミットしてイメージ化した。

コンテナ名はcentos7-sshで動作していた。イメージ名はcentos7-basic1とした。
[root@localhost ~]# docker commit centos7-ssh centos7-basic1
sha256:d63ba5e1370ad5535466b7b4bcfcb55e91ff971df572d03e8ebda1ef170ef417

○作成したイメージの確認

[root@localhost ~]# docker image list
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
centos7-basic1                     latest              d63ba5e1370a        10 seconds ago      569MB

○作成したイメージからコンテナを動作させた。

(インターネットに直に接している場合、Dockerのデフォルトではiptablesを書き換えて外部からのアクセスを許してしまうことになってしまうため厳禁である。)
[root@localhost ~]# docker run --privileged -d -p 222:22 --dns=127.0.0.1 --name centos7-test centos7-basic1 /sbin/init
WARNING: Localhost DNS setting (--dns=127.0.0.1) may fail in containers.
fdd3310372de70801cf6af3c6b95b6e0d325d2a6f1c1782a4bbc319a71c84f19
警告が出ているが、ここで指定している127.0.0.1はホスト上での意味はなくて、コンテナを指しているので問題ない。


○コンテナにSSH接続した。

192.168.100.3は、Dockerホストである。
このコンテナは、「【Linux CentOS 7】Dockerコンテナへssh接続する方法や、コンテナのイメージ化、削除、起動方法などについて【Docker-ce 18.06.1.ce】」をベースにしている。

$ ssh -p 222 root@192.168.100.3
[root@fdd3310372de ~]#

○既に設定済みのdnsmasqに登録したホスト名を名前解決できるか試した。

[root@fdd3310372de ~]# ping outgoing.postfix
PING outgoing.postfix (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.040 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.073 ms
^C
--- outgoing.postfix ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.040/0.056/0.073/0.018 ms
名前解決ができた。




<参考>
・Configure container DNS
< https://docs.docker.com/v17.09/engine/userguide/networking/default_network/configure-dns/ > 2018年11月19日

・コンテナの DNS を設定
< http://docs.docker.jp/engine/userguide/networking/default_network/donfigure-dns.html > 2018年11月19日

・2018/07/24(25?)のChrome68に備えて既存カスタムドメインのGitHub Pagesを常時SSL化 + digの使い方覚書
< https://qiita.com/beta_chelsea/items/ea8c890d9c9eb634d3c1 > 2018年11月19日

・いつからか、メールが送信できなくなっていたので暫定対処した
< https://risaiku.net/archives/4430/ > 2018年11月19日

投げ銭

★当サイトへの投げ銭(PayPal)★

Ad

Ad