2021年1月30日土曜日

CentOS 8 + Zabbix 5.0の環境にSNMPTTを導入してSNMP Trap監視をできるようにする

以前以下記事で、CentOS 7.3+MIRACLE ZBX 3.0構成で、SNMPTTを導入してSNMP Trapを監視できるよう構成した。

Zabbix 5.0がリリースされたので、CentOS 8.1環境に対して同様にSNMPTTを導入してみた。若干手順が異なる箇所があったため、再度SNMPTT導入手順を記載することにする。

環境

  • OS : CentOS 8.1
  • Zabbix : 5.0

SNMPTTのインストール

導入パッケージが多岐にわたるので、SNMPTTはdnfを使ってインストールする。

SNMPTTはperlで動作するソフトウェアとなるため、事前にperlをインストールしておく。

# dnf install perl -y

EPELパッケージを使えるようepel-releaseをインストールする。

# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm を取得中
警告: /var/tmp/rpm-tmp.oYBDaD: ヘッダー V4 RSA/SHA256 Signature、鍵 ID 2f86d6a1: NOKEY
Verifying...                          ################################# [100%]
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:epel-release-8-10.el8            ################################# [100%]

続いてSNMPTTを導入するのだが、CentOS 8では単純にdnfでインストールすることができない。ここの情報を参考にさせていただき、CentOS 7向けのレポジトリのSNMPTTのパッケージをインストールして対応する。

CentOS 7向けのSNMPTTはバージョンが更新されている可能性があるため、まずはcurlを使ってリポジトリに存在するSNMPTTのバージョンを確認する。

# curl -s https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/s/ | sed -e 's/<[^>]*>//g' | grep snmptt
 snmptt-1.4.2-1.el7.noarch.rpm                                   2020-07-23 21:36  129K

確認したrpm名から2021年1月時点のSNMPTTのパッケージ名はsnmptt-1.4.2-1.el7.noarch.rpmとなり、リポジトリのURLは以下となる。

https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/s/snmptt-1.4.2-1.el7.noarch.rpm

上記rrpmパッケージのURLを直接指定して、SNMPTTをインストールする。

# dnf --enablerepo=PowerTools -y install https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/s/snmptt-1.4.2-1.el7.noarch.rpm
CentOS-8 - PowerTools                           3.5 MB/s | 2.0 MB     00:00
Extra Packages for Enterprise Linux Modular 8 - 556 kB/s | 537 kB     00:00
Extra Packages for Enterprise Linux 8 - x86_64  2.2 MB/s | 8.8 MB     00:04
snmptt-1.4.2-1.el7.noarch.rpm                   115 kB/s | 129 kB     00:01
依存関係が解決しました。
================================================================================
 パッケージ           Arch   バージョン                      リポジトリー サイズ
================================================================================
インストール:
 snmptt               noarch 1.4.2-1.el7                     @commandline 129 k
依存関係のインストール:
 mariadb-connector-c  x86_64 3.1.11-2.el8_3                  AppStream    200 k
 mariadb-connector-c-config
                      noarch 3.1.11-2.el8_3                  AppStream     15 k
 net-snmp             x86_64 1:5.8-18.el8_3.1                AppStream    354 k
 net-snmp-agent-libs  x86_64 1:5.8-18.el8_3.1                AppStream    747 k
 perl-Digest-HMAC     noarch 1.03-17.module_el8.3.0+416+dee7bcef
                                                             AppStream     20 k
 perl-Socket6         x86_64 0.28-6.el8                      AppStream     36 k
 lm_sensors-libs      x86_64 3.4.0-21.20180522git70f7e08.el8 BaseOS        59 k
 net-snmp-libs        x86_64 1:5.8-18.el8_3.1                BaseOS       824 k
 perl-Digest-SHA1     x86_64 2.13-23.el8                     PowerTools    57 k
 perl-IO-stringy      noarch 2.111-9.el8                     PowerTools    71 k
 perl-Config-IniFiles noarch 3.000002-3.el8                  epel          67 k
 perl-Crypt-DES       x86_64 2.07-19.1.el8                   epel          26 k
 perl-Net-SNMP        noarch 6.0.1-25.el8.1                  epel         107 k

トランザクションの概要
================================================================================
インストール  14 パッケージ

~(中略)~

インストール済み:
  snmptt-1.4.2-1.el7.noarch
  mariadb-connector-c-3.1.11-2.el8_3.x86_64
  mariadb-connector-c-config-3.1.11-2.el8_3.noarch
  net-snmp-1:5.8-18.el8_3.1.x86_64
  net-snmp-agent-libs-1:5.8-18.el8_3.1.x86_64
  perl-Digest-HMAC-1.03-17.module_el8.3.0+416+dee7bcef.noarch
  perl-Socket6-0.28-6.el8.x86_64
  lm_sensors-libs-3.4.0-21.20180522git70f7e08.el8.x86_64
  net-snmp-libs-1:5.8-18.el8_3.1.x86_64
  perl-Digest-SHA1-2.13-23.el8.x86_64
  perl-IO-stringy-2.111-9.el8.noarch
  perl-Config-IniFiles-3.000002-3.el8.noarch
  perl-Crypt-DES-2.07-19.1.el8.x86_64
  perl-Net-SNMP-6.0.1-25.el8.1.noarch

完了しました!

snmptrapやsnmpwalkコマンドを使えるようにしておいたほうが何かと便利なので、「net-snmp-utils」もインストールしておく(SNMPTTの動作に必須ではない)。

# dnf install -y net-snmp-utils

Zabbixの設定

SNMP Trapを受信した際のログを出力するファイルと保存先ディレクトリを事前に作成する。今回は「/var/log/snmptrap/snmptrap.log」をログ出力先として設定する。

# mkdir /var/log/snmptrap
# touch /var/log/snmptrap/snmptrap.log
# chown -R snmptt:snmptt /var/log/snmptrap/

「/etc/zabbix/zabbix_server.conf 」の以下個所を確認・修正する。

SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
StartSNMPTrapper=1

設定反映のため、サービス再起動を行う。

# systemctl restart zabbix-server

snmptrapdの設定

「/etc/sysconfig/snmptrapd」に以下を追記する。

OPTIONS="-On -Lsd -p /var/run/snmptrapd.pid -M /usr/share/snmp/mibs:/usr/share/snmp/venders -m all"

「/etc/snmp/snmptrapd.conf」に以下を追記する。

authCommunity   log,execute,net public
traphandle default /usr/sbin/snmptthandler

上記設定後、snmptrapdを起動させる。

# systemctl start snmptrapd
# systemctl enable snmptrapd

SNMPTTの設定

「/etc/snmp/snmptt.ini」の以下個所を確認・修正する。

mode = daemon
date_format = %Y/%m/%d
time_format = %H:%M:%S
date_time_format = %Y/%m/%d %H:%M:%S
log_file = /var/log/snmptrap/snmptrap.log
syslog_enable = 0

「/etc/snmp/snmptt.conf」に以下を追記する。

EVENT general .* "General event" Normal
FORMAT ZBXTRAP $aA $*

SNMPTTを起動させる。

# systemctl start snmptt
# systemctl enable snmptt

監視テスト

この段階で一度監視テストとして、Zabbixサーバ自身にて、snmptrapコマンドにてSNMP Trap受信確認を実施してみよう。

# snmptrap -v2c -c public 127.0.0.1 "" .1.3.6.1.6.3.1.1.5.1 coldStart s "Start"

「/var/log/messages」と「/var/log/snmptrap/snmptrap.log」にログが出力されていればOK。

# tail /var/log/messages
May 21 07:56:20 t1024cent snmptrapd[3164]: 2020-05-21 07:56:20 localhost [UDP: [127.0.0.1]:58945->[127.0.0.1]:162]:#012.1.3.6.1.2.1.1.3.0 = Timeticks: (32052165) 3 days, 17:02:01.65#011.1.3.6.1.6.3.1.1.4.1.0 = OID: .1.3.6.1.6.3.1.1.5.1#011.1.3.6.1.6.3.1.1.5.1 = STRING: "Start"
# tail /var/log/snmptrap/snmptrap.log
2020/05/21 07:56:20 .1.3.6.1.6.3.1.1.5.1 Normal "General event" localhost - ZBXTRAP 127.0.0.1 Start

OIDだけでは障害内容の判別が難しいので、本来はMIBの登録も必要となる。手順は以前のものと変更はないため、過去記事を参照いただきたい。

Zabbixの受信設定

ZabbixのGUIにて、SNMP Trap受信の設定を行う。

テンプレートの作成

  • テンプレート名:Template SNMP Trap
  • グループ:Templates

アイテムの作成

  • 名前:SNMP Trap log
  • タイプ:SNMP トラップ
  • キー:snmptrap[]
  • データ型:ログ
  • ヒストリ保存期間:90d
  • ログの時間の形式:yyyy/MM/dd hh:mm:ss
  • アプリケーションの作成:SNMP Trap
  • 有効:チェック

トリガーの作成

  • 名前:SNMP Trap from {HOST.NAME} : {ITEM.LASTVALUE1}
  • 深刻度:軽度の障害 ※任意の深刻度で設定する
  • 条件式:{Template SNMP Trap:snmptrap[].strlen()}>0
  • 障害イベント生成モード:複数
  • 有効:チェック

ホストにSNMP用のインタフェースを作成

テンプレート適用前に、適用対象のホストに対してSNMP用のインタフェースを作成する。今回は「Zabbix server」に対して、127.0.0.1でインタフェースを追加する。

ホストにテンプレートを適用

適用対象のホストに対して、「Template SNMP Trap」のテンプレートを適用する。

再度監視テストを実施

再度snmptrapコマンドにてSNMP Trap受信確認を実施してみる。ダッシュボードにて正常に障害が検知できればOKとなる。

参考


更新履歴

  • 2020/5/21 新規作成
  • 2021/1/30 SNMPTTのバージョン更新に対応できるよう、SNMPTTのインストール手順を更新

DockerでSquidをコンテナ化してプロキシサーバを構築する

自宅サーバコンテナ化対応として、今回はプロキシ機能であるSquidのコンテナ化を行う。

環境

今回のDocker環境構築時のソフトウエアバージョンを以下に記載する。

  • DockerホストOS : CentOS 8.2
  • Docer : 19.03.14
  • コンテナ用OSイメージ : centos:latest

Dockerホストとコンテナ間では、サービス提供に必要なポートの紐づけと、ログファイルを出力させるディレクトリの紐づけを行う。以下に簡単に図示しておく。

Squidコンテナ化手順

1. Dockerのインストール

Dockerのインストールは別記事を参照。CentOS 7にDockerをインストールする内容となっているが、CentOS 8も同様の手順でインストールできる。

Dockerインストール後、Dockerfile等を配置するディレクトリを作成し、以後はそのディレクトリ内にすべてのファイルを配置する。

2. Squid用の設定ファイルを準備

Squidの設定手順は、過去記事にて記載しているので、そちらを参照いただきたい。

コンテナにする場合も同様の設定を行えばよい。あらかじめ、以下の通り設定ファイルを作成しておく。

squid.conf

※★箇所は各環境に合わせて変更すること。

acl localnet src 192.168.33.0/24 #★プロキシ利用を許可するIPアドレス
acl localnet src 192.168.11.0/24 #★プロキシ利用を許可するIPアドレス
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT
acl NOCACHE src all

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localnet
http_access allow localhost
http_access deny all
http_port 8080 #★プロキシを提供するポート番号

cache deny NOCACHE #★キャッシュ無効
cache_dir ufs /var/spool/squid 100 16 256
coredump_dir /var/spool/squid
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320
shutdown_lifetime 5 seconds # 停止時の待機時間をDockerのタイムアウト(10s)以下に設定

3. Dockerホストにログ出力先を作成

今回はコンテナのSquidが出力したaccess.logとcache.logをDockerホストのディレクトリ出力するよう構成するため、以下の通りあらかじめログ出力先のディレクトリを作成しておく。

mkdir -p /var/log/docker/centos-squid
chmod 777 /var/log/docker/*

4. Dockerfileを作成

コンテナの構成情報はDockerfileに記述する。いくつか記述内容にポイントがあるので以下表にまとめる。

命令 記述内容 説明
FROM centos コンテナのベースとなるイメージはCentOSを使用する。
ENV TZ タイムゾーンを日本標準時 (Asia/Tokyo) にする。
ENV http_proxy, https_proxy プロキシ環境の場合は、プロキシサーバを指定する。
RUN dnf, mkdir, chown 必要なパッケージのインストールを行う。Squidのみインストールすれば問題ない。
COPY - 事前に作成したsquid.confの設定ファイルを /etc/squid/にコピーする。
RUN /usr/sbin/squid -N -z squidコマンドを使用して、キャッシュファイルを作成する。
EXPOSE 8080 Squidで指定した8080番ポートを記述する。
CMD ["/usr/sbin/squid", "-N", "-f", "/etc/squid/squid.conf"] /usr/sbin/squid -NにてSquidを実行する。フォアグラウンドで起動させるため、-Nオプション (No daemon mode) を付与している。[]で囲まずに記述すると/bin/sh -cが付与されてプロセスが実行されてしまうので、通常は必ず[]にてコマンドを囲むこと。

実際のDockerfileは以下の通りとなった。

FROM centos

ENV TZ=Asia/Tokyo \
    http_proxy=http://192.168.33.23:8080 \
    https_proxy=http://192.168.33.23:8080
RUN dnf install squid -y

COPY squid.conf /etc/squid/
RUN /usr/sbin/squid -N -z

EXPOSE 8080
CMD ["/usr/sbin/squid", "-N", "-f", "/etc/squid/squid.conf"]

5. コンテナイメージを作成

作成したDockerfileを使って、docker buildコマンドにてコンテナイメージを作成する。

# docker build -t centos-squid:1 .

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos-squid        1                   398945a07be3        4 days ago          306MB

6. コンテナを起動

コンテナ起動時には、以下オプションの設定を行う。

設定内容 説明
--name コンテナの名称を設定。今回は「centos-squid」という名前にする。
-p Dockerホストの通信ポートとコンテナの通信ポートを紐づけを行う。<ホストポート>:<コンテナポート>の書式で記載する。今回はコンテナ側で8080番ポートを使用し、ホスト側も同様に8080番ポートに指定することとし、8080:8080で指定する。
-v Dockerホストのディレクトリ/ファイルとコンテナのディレクトリ/ファイルの紐づけを行う。<ホストディレクトリ/ファイル>:<コンテナディレクトリ/ファイル>の書式で記載する。今回はホストの/var/log/docker/centos-squid/ディレクトリにコンテナの/var/log/squidを紐づけることで、ログを出力させる。

上記をふまえ、以下の通りdocker runコマンドでコンテナの起動を行う。

# docker run -d -p 8080:8080 --name "centos-squid" -v /var/log/docker/centos-squid:/var/log/squid centos-squid:1

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                          NAMES
facb736671ae        centos-squid:1      "/usr/sbin/squid -N …"   12 hours ago        Up 12 hours         0.0.0.0:8080->8080/tcp                         centos-squid

7. logrotate設定

ホストに出力させたログをローテーションさせるため、logrotateの設定を行う。logrotateは/etc/logrotate.d/に以下のような設定ファイルを置けば自動でローテーションが実行されるようになる。

# cat /etc/logrotate.d/docker-log
/var/log/docker/*/maillog
/var/log/docker/*/*.log
{
    rotate 7
    daily
    copytruncate
    dateext
    su root root
}

詳細な説明は、以前の記事を参照いただきたい。

以上でSquidのコンテナ化が完了となる。

2021年1月23日土曜日

DockerでUnboundをコンテナ化してDNSサーバを構築する

自宅サーバコンテナ化対応として、今回はDNS機能であるUnboundのコンテナ化を行う。

環境

今回のDocker環境構築時のソフトウエアバージョンを以下に記載する。

  • DockerホストOS : CentOS 8.2
  • Docer : 19.03.14
  • コンテナ用OSイメージ : centos:latest

Dockerホストとコンテナ間では、サービス提供に必要なポートの紐づけと、ログファイルを出力させるディレクトリの紐づけを行う。以下に簡単に図示しておく。

Unboundコンテナ化手順

1. Dockerのインストール

Dockerのインストールは別記事を参照。CentOS 7にDockerをインストールする内容となっているが、CentOS 8も同様の手順でインストールできる。

Dockerインストール後、Dockerfile等を配置するディレクトリを作成し、以後はそのディレクトリ内にすべてのファイルを配置する。

2. Unbound用の設定ファイルを準備

Unboundの設定手順は、過去記事にて記載しているので、そちらを参照いただきたい。

コンテナにする場合も同様の設定を行えばよい。あらかじめ、以下の通り設定ファイルを作成しておく。

unbound.conf

※★箇所は各環境に合わせて変更すること。

server:
        verbosity: 2
        statistics-interval: 0
        statistics-cumulative: no
        extended-statistics: yes
        num-threads: 4
        interface: 0.0.0.0
        interface-automatic: yes
        outgoing-port-permit: 32768-60999
        outgoing-port-avoid: 0-32767
        so-reuseport: yes
        ip-transparent: yes
        max-udp-size: 3072
        access-control: 0.0.0.0/0 refuse
        access-control: 127.0.0.0/8 allow
        access-control: 192.168.33.0/24 allow #★DNS問い合わせ可能なIPアドレスを指定
        access-control: 192.168.11.0/24 allow #★DNS問い合わせ可能なIPアドレスを指定
        access-control: ::0/0 refuse
        access-control: ::1 allow
        access-control: ::ffff:127.0.0.1 allow
        chroot: ""
        username: "unbound"
        directory: "/etc/unbound"

        logfile: "/var/log/unbound/unbound.log"
        use-syslog: no
        log-time-ascii: yes
        pidfile: "/var/run/unbound/unbound.pid"
        harden-glue: yes
        harden-dnssec-stripped: yes
        harden-below-nxdomain: yes
        harden-referral-path: yes
        qname-minimisation: yes
        aggressive-nsec: yes
        unwanted-reply-threshold: 10000000
        prefetch: yes
        prefetch-key: yes
        rrset-roundrobin: yes
        minimal-responses: yes
        module-config: "ipsecmod validator iterator"
        trust-anchor-signaling: yes
        root-key-sentinel: yes
        trusted-keys-file: /etc/unbound/keys.d/*.key
        auto-trust-anchor-file: "/var/lib/unbound/root.key"
        val-clean-additional: yes
        val-permissive-mode: no
        serve-expired: yes
        val-log-level: 1
        include: /etc/unbound/local.d/*.conf
        ipsecmod-enabled: no
        ipsecmod-hook:/usr/libexec/ipsec/_unbound-hook
include: /etc/unbound/conf.d/*.conf
forward-zone:
        name: "."
        forward-addr: 8.8.8.8 #★上位DNSサーバを指定
        forward-addr: 8.8.4.4 #★上位DNSサーバを指定
auth-zone:
        name: "."
        for-downstream: no
        for-upstream: yes
        fallback-enabled: yes
        master: b.root-servers.net
        master: c.root-servers.net
        master: e.root-servers.net
        master: f.root-servers.net
        master: g.root-servers.net
        master: k.root-servers.net

3. Dockerホストにログ出力先を作成

今回はコンテナのUnboundが出力したunbound.logをDockerホストのディレクトリ出力するよう構成するため、以下の通りあらかじめログ出力先のディレクトリを作成しておく。

mkdir -p /var/log/docker/centos-unbound
chmod 777 /var/log/docker/*

4. Dockerfileを作成

コンテナの構成情報はDockerfileに記述する。いくつか記述内容にポイントがあるので以下表にまとめる。

命令 記述内容 説明
FROM centos コンテナのベースとなるイメージはCentOSを使用する。
ENV TZ タイムゾーンを日本標準時 (Asia/Tokyo) にする。
ENV http_proxy, https_proxy プロキシ環境の場合は、プロキシサーバを指定する。
RUN dnf, mkdir, chown 必要なパッケージのインストールを行う。Unboundのみインストールすれば問題ない。また、Dockerホストのボリュームのマウントポイントとなるため、ログ出力先ディレクトリの作成と権限設定を実施しておく。
COPY - 事前に作成したunbound.confの設定ファイルを /etc/unbound/にコピーする。
EXPOSE 53 53/udp DNSの53番ポートを記述する。DNSはTCPとUDP両方にてサービス提供するため、TCPとUDPの両方を記載する。
CMD ["/usr/sbin/unbound", "-d"] /usr/sbin/unbound -dにてUnboundを実行する。フォアグラウンドで起動させるため、-dオプションを付与している。[]で囲まずに記述すると/bin/sh -cが付与されてプロセスが実行されてしまうので、通常は必ず[]にてコマンドを囲むこと。

実際のDockerfileは以下の通りとなった。

FROM centos

ENV TZ=Asia/Tokyo \
    http_proxy=http://192.168.33.23:8080 \
    https_proxy=http://192.168.33.23:8080
RUN dnf install unbound -y && \
    mkdir /var/log/unbound && \
    chown unbound:unbound /var/log/unbound
COPY unbound.conf /etc/unbound/

EXPOSE 53 53/udp
CMD ["/usr/sbin/unbound", "-d"]

5. コンテナイメージを作成

作成したDockerfileを使って、docker buildコマンドにてコンテナイメージを作成する。

# docker build -t centos-unbound:1 .

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos-unbound      1                   c86b12252ec1        4 days ago          255MB

6. コンテナを起動

コンテナ起動時には、以下オプションの設定を行う。

設定内容 説明
--name コンテナの名称を設定。今回は「centos-unbound」という名前にする。
-p Dockerホストの通信ポートとコンテナの通信ポートを紐づけを行う。<ホストポート>:<コンテナポート>の書式で記載する。今回はコンテナ側でDNSの53番ポートを使用するが、ホスト側を53番ポートに指定するとlisten udp 0.0.0.0:53: bind: address already in useというエラーが発生したことから、意図的に10053番ポートに設定することとし、10053:53で指定する。なお、TCPだけでなくUDPも指定するため、-pオプションは2つ指定している。
-v Dockerホストのディレクトリ/ファイルとコンテナのディレクトリ/ファイルの紐づけを行う。<ホストディレクトリ/ファイル>:<コンテナディレクトリ/ファイル>の書式で記載する。今回はホストの/var/log/docker/centos-unbound/ディレクトリにコンテナの/var/log/unboundを紐づけることで、ログを出力させる。

上記をふまえ、以下の通りdocker runコマンドでコンテナの起動を行う。

# docker run -d -p 10053:53 -p 10053:53/udp --name "centos-unbound" -v /var/log/docker/centos-unbound:/var/log/unbound centos-unbound:1

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                          NAMES
af2136d296aa        centos-unbound:1    "/bin/sh -c '/usr/sb…"   3 seconds ago       Up 2 seconds        0.0.0.0:10053->53/tcp, 0.0.0.0:10053->53/udp   centos-unbound

7. logrotate設定

ホストに出力させたログをローテーションさせるため、logrotateの設定を行う。logrotateは/etc/logrotate.d/に以下のような設定ファイルを置けば自動でローテーションが実行されるようになる。

# cat /etc/logrotate.d/docker-log
/var/log/docker/*/maillog
/var/log/docker/*/*.log
{
    rotate 7
    daily
    copytruncate
    dateext
    su root root
}

詳細な説明は、以前の記事を参照いただきたい。

以上でUnboundのコンテナ化が完了となる。

2021年1月17日日曜日

ESXi7.0ではRealtekのNICドライバが認識できないので注意!ただし、RealtekのUSB NICは認識する

2020年4月にESXi 7.0がリリースされた。現状、無償ライセンスでESXi 6.7を使っていたので、バージョンアップをしようと確認していたのだが、残念ながらESXi 7.0ではESXi 6.7で利用できていたRealtekのNICドライバである「Net55-r8168」を導入することができない。

※ESXi 6.7でRealtekのNICドライバを導入する手順は以下記事を参照。

ESXi 7.0以降ではRealtek RTL8153のUSB NICを標準で認識する

実はESXiは7.0以降からは、特に追加インストール不要でRTL8153のチップセットを持つUSB NICを認識してくれる。オンボードでRealtekのNICしかなくESXiのインストールができない場合でも、USB NICを接続することでインストールを進めることができる。

詳細は以下記事を参照いただきたい。

ESXi 7.0にNet55-r8168のドライバをインストールした際の失敗メッセージ

インストール済みのESXi 7.0にNet55-r8168のドライバをインストールした際のエラーメッセージは以下の通り。「Realtek_bootbank_net55-r8168_8.045a-napi」はESXi 7.0で廃止された「vmkapi_2_2_0_0」と依存関係のあるドライバであり、インストールができない旨が表示されている。
[root@localhost:~] esxcli software vib install --dry-run -d /net55-r8168-8.045a-napi-offline_bundle.zip
 [DependencyError]
 VIB Realtek_bootbank_net55-r8168_8.045a-napi requires vmkapi_2_2_0_0, but the requirement cannot be satisfied within the ImageProfile.
 VIB Realtek_bootbank_net55-r8168_8.045a-napi requires com.vmware.driverAPI-9.2.2.0, but the requirement cannot be satisfied within the ImageProfile.
 Please refer to the log file for more details.

VMwareのKBによると、、、

本事象はVMwareのKBにも記載がされている。
KBには以下の通り記載があるとおり、現時点(2020年4月時点)では解決策はなく、新しいドライバが提供されることを待つことしかないようだ。
Resolution
  • If you are using OEM/partner-supplied ISO images, upgrade bundles or addons, it is not recommended to attempt upgrading to ESXi 7.0 at this time.
  • If you have installed any custom VIB content/packages after installing the standard VMware ESXi image, it is not recommended to attempt upgrading to ESXi 7.0 at this time.
  • VMware is working with our partners to update the OEM/partner-supplied ISO images and upgrade bundles, including the drivers needed to complete those upgrades. At a later date, VMware and our partners will release new custom images that use compatible drivers. These will allow upgrades from 6.5 and 6.7 ESXi installations using OEM/partner images.

更新履歴

  • 2020/4/20 新規作成
  • 2021/1/17 Realtek RTL8153のUSB NICを標準で認識する旨を追記し、タイトルを更新

2021年1月16日土曜日

DockerでPostfixをコンテナ化してメールサーバを構築する

自宅のプロキシ/DNS/メールサーバをPacemakerによる冗長構成から、ロードバランサ (ZEVENET) + Dockerコンテナ構成への移行を進めている。

ロードバランサは導入済みなので、最終形として、プロキシ、DNS、メールのそれぞれの機能をDockerのコンテナ化を行うことを計画しており、今回はその第一弾として、メール機能であるPostfixのコンテナ化を行う。

最終形として、プロキシ、DNS、メールのそれぞれの機能をDockerのコンテナ化を行うことを計画しており、今回はその第一弾として、メール機能であるPostfixのコンテナ化を行う。

環境

今回のDocker環境構築時のソフトウエアバージョンを以下に記載する。

  • DockerホストOS : CentOS 8.2
  • Docer : 19.03.14
  • コンテナ用OSイメージ : centos:latest

Dockerホストとコンテナ間では、サービス提供に必要なポートの紐づけと、ログファイルを出力させるディレクトリの紐づけを行う。以下に簡単に図示しておく。

Postfixコンテナ化手順

1. Dockerのインストール

Dockerのインストールは別記事を参照。CentOS 7にDockerをインストールする内容となっているが、CentOS 8も同様の手順でインストールできる。

Dockerインストール後、Dockerfile等を配置するディレクトリを作成し、以後はそのディレクトリ内にすべてのファイルを配置する。

2. Postfix用の設定ファイルを準備

通常の家庭用のインターネットプロバイダを使っている場合、SMTP (TCP/25ポート) を使って外部へのメール送信はできないようになっている。この仕様をOP25B (Outbound Port 25 Blocking)と呼ぶが、PostfixでOP25Bに対応した設定をすることでメール送信が可能となる。OP25B環境におけるPostfixの設定は以下にて記事にしているで参照いただきたい。

コンテナにする場合も同様の設定を行えばよい。あらかじめ、以下の通り2つの設定ファイルを作成しておく。

main.cf

※★箇所は各環境に合わせて変更すること。

compatibility_level = 2
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost
unknown_local_recipient_reject_code = 550
mynetworks = 127.0.0.0/8, 192.168.0.0/16 #★
relayhost = [<メールサーバのFQDN>]:587 #★
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

debug_peer_level = 2
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix/samples
readme_directory = /usr/share/doc/postfix/README_FILES
smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
smtpd_tls_security_level = may
smtp_tls_CApath = /etc/pki/tls/certs
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
smtp_tls_security_level = may
meta_directory = /etc/postfix
shlib_directory = /usr/lib64/postfix
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/smtp_password
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain,login

smtp_password

※★箇所は各環境に合わせて変更すること。

[<メールサーバのFQDN>]:587 <ユーザ名>:<パスワード> #★

3. rsyslogとPostfix起動用のスクリプト (ラッパースクリプト) を作成

Postfixはログ出力にrsyslogの機能を使うため、rsyslogの起動とPostfixの起動という複数のプロセス起動を行う必要がある。複数のプロセス起動を行う場合の作法としては、ラッパースクリプトを作成して実行させるといった手法が定番のようだ。

今回は、以下の内容でstartup.shというスクリプトを作成した。メインとなるプロセス (今回はPostfix) の起動コマンドはexecを付与してPID 1で動作させるようにしている。

#!/bin/bash

/usr/sbin/rsyslogd
exec /usr/sbin/postfix start-fg

4. Dockerホストにログ出力先を作成

今回はコンテナのPostfixが出力したmaillogをDockerホストのディレクトリ出力するよう構成するため、以下の通りあらかじめログ出力先のディレクトリを作成しておく。

mkdir -p /var/log/docker/centos-postfix
chmod 777 /var/log/docker/*

5. Dockerfileを作成

コンテナの構成情報はDockerfileに記述する。いくつか記述内容にポイントがあるので以下表にまとめる。

命令 記述内容 説明
FROM centos コンテナのベースとなるイメージはCentOSを使用する。
ENV TZ タイムゾーンを日本標準時 (Asia/Tokyo) にする。
ENV http_proxy, https_proxy プロキシ環境の場合は、プロキシサーバを指定する。
RUN dnf 必要なパッケージのインストールを行う。Postfixのログはsyslogを使用して出力されるため、rsyslogを追加インストールする点に注意。
RUN sed, mkdir コンテナ環境であってもログを出力できるようにするため、/etc/rsyslog.confの設定ファイルを修正する。maillogの出力先を/var/log/postfix/maillogに変更し、ログの出力をjournald経由ではなくシステムソケットに変更している。また、Dockerホストのボリュームのマウントポイントとなるため、ログ出力先ディレクトリの作成しておく。
COPY - 事前に作成したmain.cfとsmtp_passwordの設定ファイルを /etc/postfix/にコピーする。
COPY - プロセス起動用のstartup.shを/にコピーする。
RUN chmod, postmap, postalias 各種設定ファイルの権限設定とPostfixで必要となるDBファイルの作成を行う。
EXPOSE 25 SMTPの25番ポートを記述する。
CMD ["/startup.sh"] startup.shを起動する。[]で囲まずに記述すると/bin/sh -cが付与されてプロセスが実行されてしまうので、通常は必ず[]にてコマンドを囲むこと。

実際のDockerfileは以下の通りとなった。

FROM centos

ENV TZ=Asia/Tokyo \
    http_proxy=http://192.168.33.23:8080 \
    https_proxy=http://192.168.33.23:8080
RUN dnf install postfix cyrus-sasl cyrus-sasl-plain mailx rsyslog -y && \
    sed -i -e 's#/var/log/maillog#/var/log/postfix/maillog#g' \
           -e 's/SysSock.Use="off"/SysSock.Use="on"/g' \
           -e 's/^\(module(load="imjournal"\)/#\1/g' \
           -e 's/^\([ ]*StateFile="imjournal.state\)"/#\1/g' \
           /etc/rsyslog.conf && \
    mkdir /var/log/postfix


COPY main.cf smtp_password /etc/postfix/
COPY startup.sh /
RUN chmod 600 /etc/postfix/smtp_password && \
    postmap /etc/postfix/smtp_password && \
    postalias /etc/aliases && \
    chmod +x /startup.sh

EXPOSE 25
CMD ["/startup.sh"]

6. コンテナイメージを作成

作成したDockerfileを使って、docker buildコマンドにてコンテナイメージを作成する。

# docker build -t centos-postfix:1 .

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos-postfix      1                   9e3991eb23a8        36 hours ago        296MB

7. コンテナを起動

コンテナ起動時には、以下オプションの設定を行う。

設定内容 説明
--name コンテナの名称を設定。今回は「centos-postfix」という名前にする。
-p Dockerホストの通信ポートとコンテナの通信ポートを紐づけを行う。<ホストポート>:<コンテナポート>の書式で記載する。今回はSMTPのポート番号である25番ポートを紐づけるので、25:25で指定する。
-v Dockerホストのディレクトリ/ファイルとコンテナのディレクトリ/ファイルの紐づけを行う。<ホストディレクトリ/ファイル>:<コンテナディレクトリ/ファイル>の書式で記載する。今回はホストの/var/log/docker/centos-postfix/ディレクトリにコンテナの/var/log/postfixを紐づけることで、maillogログを出力させる。

上記をふまえ、以下の通りdocker runコマンドでコンテナの起動を行う。

# docker run -d -p 25:25 --name "centos-postfix" \
-v /var/log/docker/centos-postfix:/var/log/postfix \
centos-postfix:1

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                          NAMES
f6bb3910351a        centos-postfix:1    "/startup.sh"            28 minutes ago      Up 28 minutes       0.0.0.0:25->25/tcp                             centos-postfix

8. logrotate設定

ホストに出力させたログをローテーションさせるため、logrotateの設定を行う。logrotateは/etc/logrotate.d/に設定ファイルを置けば自動で実行されるようになる。

logrotateの設定のポイントは2つ。

logrotateは元のファイルをリネームして、新規空ファイルを作成するという動作を行うが、この際にログ出力元となるプロセスのリロード等の処理が必要となる。しかし、ホスト側のログローテーション実行とコンテナ側のプロセスのリロードの同期ができないため、copytruncateオプションを付与する。copytruncateオプションを付与すると、元のファイルはリネームではなくコピーしたのち、ログファイルの内容を空にする方式でローテーションが実行される。
※本方式はタイミングによっては、ローテーション中に書き込まれたログがロストする可能性があるので注意。

また、logrotateの仕様により、ログ出力先のディレクトリの権限が777となっている場合、以下メッセージでローテーションが失敗する。このような場合でもログローテーションを実行できるようsu root rootを付与する。

error: skipping "/var/log/docker/centos-postfix/maillog" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.

上記をふまえ、以下のようにdocker-logというファイル名で設定ファイルを作成し、/etc/logrotate.d/に配置した。

# cat /etc/logrotate.d/docker-log
/var/log/docker/*/maillog
/var/log/docker/*/*.log
{
    rotate 7
    daily
    copytruncate
    dateext
    su root root
}

1日経過すると以下の通りログがローテーションされることが確認できた。

# ls -lh /var/log/docker/centos-postfix/
/var/log/docker/centos-postfix/:
-rw-r--r--. 1 root root 263K 12月 20 07:06 maillog
-rw-r--r--. 1 root root 1.2M 12月 20 03:17 maillog-20201220

以上でPostfixのコンテナ化が完了となる。

人気の投稿