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

完了しました!

snmptrapsnmpwalkコマンドを使えるようにしておいたほうが何かと便利なので、「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.logcache.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.cfsmtp_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のコンテナ化が完了となる。

2021年1月11日月曜日

Squid入門

プロキシサーバーといえばデファクトスタンダードともいえるSquid。このSquidの基本的な設定について記載する。

プロキシサーバーとして動作する設定ではあるが、本記事の内容だけでは、パフォーマンス面やセキュリティ面において考慮不足となる事項が多数ある点に注意すること。

Squidのバージョン

今回設定したSquidのバージョンは以下の通り。
# squid -v
------------------------------
Squid Cache: Version 3.5.20

設定ファイル「squid.conf

Squidの設定ファイルである、/etc/squid/squid.confファイルをコメント付きで以下に記載する。細かな説明は後述する。
# cat /etc/squid/squid.conf
------------------------------
# 接続クライアントのネットワークを指定
acl localnet src 192.168.33.0/24
acl localnet src 192.168.11.0/24

# 許可するポートを指定
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

# /etc/squid/blacklistファイルに拒否するドメインを記載
acl blacklist dstdomain "/etc/squid/blacklist"

http_access deny blacklist

http_access deny !Safe_ports    # Safe_portsで指定したポート以外を拒否
http_access deny CONNECT !SSL_ports # SSL_portsで指定したポート以外を拒否

# キャッシュマネージャーへのアクセスはlocalhostのみ許可
http_access allow localhost manager
http_access deny manager

# 接続クライアントの許可設定
http_access allow localnet      # localnetで指定したネットワークを許可
http_access allow localhost     # localhostを許可
http_access deny all            # すべてを拒否

# 待ち受けポートを8080に指定
http_port 8080

# キャッシュの設定
cache_mem 256 MB
cache_dir ufs /var/spool/squid 200 16 256

# coredump出力先を設定
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

# エラーページにバージョンを表示させない
httpd_suppress_version_string on

squid.confの詳細説明

acl

その名の通りACL (Access Control List)を設定する。ここで作成したACLをhttp_access文で指定し、アクセス制御を行う。

今回は以下を設定している。
  • localnet:squidを利用するクライアントのネットワークアドレス
  • SSL_ports:httpsで利用するポート
  • Safe_ports:httpで利用するポート
  • CONNECT:httpsで利用するメソッド
  • blacklist:アクセスを拒否するドメインを指定する。/etc/squid/blacklistファイルにテキストで羅列する

http_access

実際のアクセス制御を設定する。今回は以下を設定している。
  1. blacklistに記載されたドメインへのアクセスは拒否
  2. Safe_ports以外のポートを利用したアクセス要求は拒否
  3. SSL_ports以外のポートでCONNECTメソッドを利用するアクセス要求は拒否
  4. キャッシュマネージャー(※)へのアクセスはlocalhostのみ許可
  5. squidへのアクセスはlocalnetとlocalhostのみ許可
  6. 上記に該当しない通信はすべて拒否
※キャッシュマネージャー:Squidの統計情報を表示するCGIユーティリティ

http_accessは上から順番に評価されていくので、複雑な設定をする際は評価順を考慮すること。

http_port

Squidが待ち受けるポート番号を指定する。今回は8080で設定。

cache_mem / cache_dir

cache_memはキャッシュとして使用するメモリ量を指定する(デフォルト256MB)。

cache_dirは、キャッシュとして使用するディスク量を指定する。cache_dir文において、「ufs」を指定しているが、ufsとはSquidで使用されるファイルフォーマットとなる。ufsを指定した際の構文は以下の通りとなる。
cache_dir ufs Directory-Name Mbytes L1 L2

Mbytesは確保するファイル容量となる。L1、L2はキャッシュディレクトリに作成するディレクトリの分割数を示す。L1=16、L2=256がデフォルトであり、特に変更する必要はないだろう。

なお、Squidのキャッシュディレクトリを作成する際は、以下コマンドを実行する。
# squid -z

coredump_dir

coredumpを出力する際のディレクトリを指定する。

refresh_pattern

キャッシュの更新期間に関する設定を行う。構文は以下の通り。
refresh_pattern [-i] regex min percent max [options]

今回、squid.confでは以下の通り設定している。
#キャッシュ更新間隔の設定
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

例えば、ftpサイトのキャッシュは、最低1440分(1日)保持、最大10080分(7日)保持される。1日~7日の間は、対象ファイルの「鮮度」を計算して、キャッシュ要否を判断する。鮮度の計算は以下となり、この計算結果が20%を下回った場合はデータはまだ新しいものと判断し、キャッシュされたデータを読み込む動作をする。

 鮮度 = キャッシュ経過時間 / 対象ファイルの作成日からの経過時間

httpd_suppress_version_string

Squidのエラーページのフッターにsquidのバージョン表示をさせない設定となる。一般的に使用しているソフトウェアのバージョン情報は利用者に開示しないことがセオリーとなるので、設定しておいた方がよいだろう。

▼変更前
Fri, 29 Dec 2017 12:47:20 GMTにt3023ce72 (squid/3.5.20)が生成しました。

▼変更後
Fri, 29 Dec 2017 12:45:04 GMTにt3023ce72 (squid)が生成しました。

Squidのキャッシュを無効化をする方法

近年では、動的に更新されるWebページが多く存在しており、そのようなサイトではキャッシュされた情報が影響して表示がうまくできなくなる場合がある。また、特にインターネット回線速度も十分にあるような環境においては、キャッシュを無効化することも選択肢のひとつとなるだろう。

Squidにてキャッシュを無効化するには、squid.confに以下2行を追加すればよい。
acl NOCACHE src all
cache deny NOCACHE

設定の反映方法

以下コマンドでSquidをreloadすることで設定が反映される。
# systemctl reload squid

参考

・Squid configuration directive cache_dir
http://www.squid-cache.org/Doc/config/cache_dir/

・Squid configuration directive cache_mem
http://www.squid-cache.org/Doc/config/cache_mem/

・Squid configuration directive refresh_pattern
http://www.squid-cache.org/Doc/config/refresh_pattern/

更新履歴

  • 2018/1/4 新規作成
  • 2021/1/11 キャッシュ無効化設定を追記。また、全体的に記事を整形
2021年1月9日土曜日

VyOSバージョンアップ手順

OSSのネットワークアプライアンスである「VyOS」は、バージョン1.3以降は、Rolling releaseによる提供となっており、最新のコードでビルドされたISOイメージが毎日作成され、ダウンロードすることができる。

VyOSは、リリースされたISOイメージを用いて簡単にバージョンアップすることができる。インターネットへの接続可否によって、手順は2パターンに分けることができる。

  1. インターネットに接続できる場合は、直接ISOイメージのURLを指定してバージョンアップ
  2. インターネットに接続できない場合は、ISOイメージをVyOSにアップロードしてバージョンアップ

上記2パターンのVyOSのバージョンアップ手順を以下に記載する。

環境

  • VyOS (バージョンアップ前) : 1.3-rolling-202005031216
  • VyOS (バージョンアップ後) : 1.3-rolling-202012311144

① 直接ISOイメージのURLを指定してバージョンアップ

1. VyOSのISOイメージのURLを確認

VyOSのISOイメージは、以下URLからダウンロードできる。

最新のISOイメージは、vyos-rolling-latest.isoとなる。日付を指定したい場合は、vyos-1.3-rolling-YYYYMMDDhhmm-amd64.isoというファイル名となっているので、任意の日付のファイルのURLを確認しておく。

# 最新版URL
https://downloads.vyos.io/rolling/current/amd64/vyos-rolling-latest.iso

# 日付指定した場合のURL
https://downloads.vyos.io/rolling/current/amd64/vyos-1.3-rolling-202012311144-amd64.iso

2. バージョンアップ前確認

バージョンアップ前に、現在のVyOSのバージョンを確認しておく。

$ show version
Version:          VyOS 1.3-rolling-202005031216
Release Train:    equuleus
~(以下略)~

バージョンアップ作業では再起動が必須となるため、VyOSをVRRPで冗長化している場合は、必ずBACKUPとなっていることを確認してから作業を進めること。もし、MASTERになっている場合は、Priorityを一時的に小さく設定してBACKUPに変更したのち作業を実施する。

$ show vrrp
Name      Interface      VRID  State    Last Transition
--------  -----------  ------  -------  -----------------
vrrpgrp1  eth0             10  MASTER   5d23h20m3s
vrrpgrp2  eth1             10  MASTER   5d23h20m3s

# configure
# set high-availability vrrp group vrrpgrp1 priority 90
# set high-availability vrrp group vrrpgrp2 priority 90
# commit
# save
# exit

$ show vrrp
Name      Interface      VRID  State    Last Transition
--------  -----------  ------  -------  -----------------
vrrpgrp1  eth0             10  BACKUP   13s
vrrpgrp2  eth1             10  BACKUP   13s

バージョンアップ前後での設定値比較のため、設定コマンドリストをバックアップしておく。

$ set terminal length 0
$ show configuration commands

以上でバージョンアップ前の準備は整った。

3. バージョンアップ

バージョンアップ前に保持しているイメージを確認する。

$ show system image
The system currently has the following image(s) installed:

   1: 1.3-rolling-202005031216 (default boot)

先ほど確認したISOイメージのURLを指定して、VyOSのイメージを追加する。対話式でいくつか確認事項が表示される (★箇所) が、すべてデフォルトで問題ないため空白のままエンターを押して進める。

$ add system image https://downloads.vyos.io/rolling/current/amd64/vyos-1.3-rolling-202012311144-amd64.iso
Trying to fetch ISO file from https://downloads.vyos.io/rolling/current/amd64/vyos-1.3-rolling-202012311144-amd64.iso
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  350M  100  350M    0     0  1742k      0  0:03:25  0:03:25 --:--:-- 2041k
ISO download succeeded.
Checking for digital signature file...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (22) The requested URL returned error: 404 Not Found
Unable to fetch digital signature file.
Do you want to continue without signature check? (yes/no) [yes] ★空白のままエンター
Checking MD5 checksums of files on the ISO image...OK.
Done!
What would you like to name this image? [1.3-rolling-202012311144]: ★空白のままエンター
OK.  This image will be named: 1.3-rolling-202012311144
Installing "1.3-rolling-202012311144" image.
Copying new release files...
Would you like to save the current configuration
directory and config file? (Yes/No) [Yes]: ★空白のままエンター
Copying current configuration...
Would you like to save the SSH host keys from your
current configuration? (Yes/No) [Yes]: ★空白のままエンター
Copying SSH keys...
Running post-install script...
Setting up grub configuration...
Done.

再度、保持しているイメージを確認する。新しいバージョンのイメージが追加され、かつdefault bootと記載がされていれば問題ない。

$ show system image
The system currently has the following image(s) installed:

   1: 1.3-rolling-202012311144 (default boot)
   2: 1.3-rolling-202005031216

4. 再起動

新しいバージョンのイメージにてVyOSを起動させるため、再起動を行う。

$ reboot
Are you sure you want to reboot this system? [y/N] y ★yを入力

5. バージョンアップ後確認

再起動後に、VyOSのバージョンを確認する。特に問題なければ、新しいバージョンで表示がされるはずだ。

$ show version
Version:          VyOS 1.3-rolling-202012311144
Release Train:    equuleus
~(以下略)~

バージョンアップ後の設定コマンドリストを取得し、Diffツールを用いて設定に差異がないことを確認する。

$ set terminal length 0
$ show configuration commands

6. 不要なISOイメージを削除

最後に登録されているVyOSの旧イメージを削除する。

$ delete system image 1.3-rolling-202005031216
Are you sure you want to delete the
"1.3-rolling-202005031216" image? (Yes/No) [No]: yes ★yesを入力
Deleting the "1.3-rolling-202005031216" image...
Done

削除後に、VyOSのイメージが最新バージョンのみになっていることを確認する。

$ show system image
The system currently has the following image(s) installed:

   1: 1.3-rolling-202012311144 (default boot) (running image)

以上で、インターネットを経由した場合のVyOSのバージョンアップ作業は完了となる。

② ISOイメージをVyOSにアップロードしてバージョンアップ

1. VyOSのISOイメージをダウンロード

VyOSのISOイメージは、以下URLからダウンロードできる。最新のISOイメージは、vyos-rolling-latest.isoとなる。日付を指定したい場合は、vyos-1.3-rolling-YYYYMMDDhhmm-amd64.isoというファイル名となっているので、任意の日付のファイルをダウンロードする。

2. VyOSの/tmpにISOイメージをアップロード

ダウンロードしたISOイメージをISOイメージのままVyOSにアップロードする。VyOSはSSHで接続できるので、SFTPを使ってアップロードする。

今回はTera Termの「ファイル」→「SSH SCP…」を使って、/tmpにISOイメージをアップロードした。

アップロード後、ISOイメージが存在することを確認しておく。

$ ls -l /tmp
total 358416
-rw-r--r-- 1 root vyattacfg     10930 Dec  6 12:58 config.boot.3358
drwx------ 3 root root             60 Dec  6 12:58 systemd-private-335a704032554d4fb9138006c2c091b6-haveged.service-h3EkPg
drwx------ 3 root root             60 Dec  6 12:58 systemd-private-335a704032554d4fb9138006c2c091b6-ntp.service-RXj5lG
drwx------ 2 root root             40 Dec  6 12:58 vmware-root_828-2990678620
-rw-r--r-- 1 vyos users     367001600 Jan  1 10:52 vyos-1.3-rolling-202012311144-amd64.iso ★
-rw-rw-r-- 1 root vyattacfg         2 Dec  6 12:58 vyos-config-status

3. バージョンアップ前確認

バージョンアップ前に、現在のVyOSのバージョンを確認しておく。

$ show version
Version:          VyOS 1.3-rolling-202005031216
Release Train:    equuleus
~(以下略)~

バージョンアップ作業では再起動が必須となるため、VyOSをVRRPで冗長化している場合は、必ずBACKUPとなっていることを確認してから作業を進めること。もし、MASTERになっている場合は、Priorityを一時的に小さく設定してBACKUPに変更したのち作業を実施する。

$ show vrrp
Name      Interface      VRID  State    Last Transition
--------  -----------  ------  -------  -----------------
vrrpgrp1  eth0             10  MASTER   5d23h20m3s
vrrpgrp2  eth1             10  MASTER   5d23h20m3s

# configure
# set high-availability vrrp group vrrpgrp1 priority 90
# set high-availability vrrp group vrrpgrp2 priority 90
# commit
# save
# exit

$ show vrrp
Name      Interface      VRID  State    Last Transition
--------  -----------  ------  -------  -----------------
vrrpgrp1  eth0             10  BACKUP   13s
vrrpgrp2  eth1             10  BACKUP   13s

バージョンアップ前後での設定値比較のため、設定コマンドリストをバックアップしておく。

$ set terminal length 0
$ show configuration commands

以上でバージョンアップ前の準備は整った。

4. バージョンアップ

バージョンアップ前に保持しているイメージを確認する。

$ show system image
The system currently has the following image(s) installed:

   1: 1.3-rolling-202005031216 (default boot)

先ほどアップロードしたISOイメージのフルパスを指定して、VyOSのイメージを追加する。対話式でいくつか確認事項が表示される (★箇所) が、すべてデフォルトで問題ないため空白のままエンターを押して進める。

$ add system image /tmp/vyos-1.3-rolling-202012311144-amd64.iso
Checking MD5 checksums of files on the ISO image...OK.
Done!
What would you like to name this image? [1.3-rolling-202012311144]: ★空白のままエンター
OK.  This image will be named: 1.3-rolling-202012311144
Installing "1.3-rolling-202012311144" image.
Copying new release files...
Would you like to save the current configuration
directory and config file? (Yes/No) [Yes]: ★空白のままエンター
Copying current configuration...
Would you like to save the SSH host keys from your
current configuration? (Yes/No) [Yes]: ★空白のままエンター
Copying SSH keys...
Running post-install script...
Setting up grub configuration...
Done.

再度、保持しているイメージを確認する。新しいバージョンのイメージが追加され、かつdefault bootと記載がされていれば問題ない。

$ show system image
The system currently has the following image(s) installed:

   1: 1.3-rolling-202012311144 (default boot)
   2: 1.3-rolling-202005031216

5. 再起動

新しいバージョンのイメージにてVyOSを起動させるため、再起動を行う。

$ reboot
Are you sure you want to reboot this system? [y/N] y ★yを入力

6. バージョンアップ後確認

再起動後に、VyOSのバージョンを確認する。特に問題なければ、新しいバージョンで表示がされるはずだ。

$ show version
Version:          VyOS 1.3-rolling-202012311144
Release Train:    equuleus
~(以下略)~

バージョンアップ後の設定コマンドリストを取得し、Diffツールを用いて設定に差異がないことを確認する。

$ set terminal length 0
$ show configuration commands

7. 不要なISOイメージを削除

最後にファイルのクリーニングを行う。先ほど/tmpにアップロードしてISOイメージを削除する。

$ rm /tmp/vyos-1.3-rolling-202012311144-amd64.iso
$ ls -l /tmp
total 4
drwx------ 3 root root      60 Jan  1 16:17 systemd-private-cfd87e485d334522829573e58529d7e4-haveged.service-HzBlOU
drwx------ 3 root root      60 Jan  1 16:17 systemd-private-cfd87e485d334522829573e58529d7e4-ntp.service-ZdcxTv
drwx------ 2 root root      40 Jan  1 16:17 vmware-root_770-2990678653
-rw-rw-r-- 1 root vyattacfg  2 Jan  1 16:17 vyos-config-status

登録されているVyOSの旧イメージを削除する。

$ delete system image 1.3-rolling-202005031216
Are you sure you want to delete the
"1.3-rolling-202005031216" image? (Yes/No) [No]: yes ★yesを入力
Deleting the "1.3-rolling-202005031216" image...
Done

削除後に、VyOSのイメージが最新バージョンのみになっていることを確認する。

$ show system image
The system currently has the following image(s) installed:

   1: 1.3-rolling-202012311144 (default boot) (running image)

以上で、インターネットを経由しない場合のVyOSのバージョンアップ作業は完了となる。

参考

USBの1000BASE-TのNIC (RTL8153, AX88179) をESXiの物理NICとして認識させる方法

USB3.0になってから、転送速度が4Gbps (= 500MB/s)となっており、ギガビット以上の転送速度となっている。そのため、USB3.0対応の1000BASE-TのNICが数多く発売されている。

以前、USB NICを直接仮想マシンで認識させて使用する方法を記事にした。

今回は、USB NICを仮想マシンにパススルーするのではなく、「USB Network Native Driver for ESXi」をインストールすることで、直接ESXi本体の物理NICとして認識させる方法を記載する。

環境

認識させる対象のESXiのバージョンは以下の通り。

  • ESXi 7.0 (Nested ESXi環境)

接続するUSB NICは、以下2つの異なるチップセットを持つ製品を使って確認した。

▼チップセット : Realtek社の「RTL8153
 

▼チップセット : ASIX社の「AX88179

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

2021年1月時点での最新のESXiのバージョンは7.0 Update 1となるが、実はESXiは7.0以降からは、特に追加インストール不要でRTL8153のチップセットを持つUSB NICを認識してくれる。

以下、実機でのNIC認識状況となる。見ての通り、cdceというドライバでNICを認識していることがわかる。

[root@t1071esx7:~] esxcfg-nics -l
Name    PCI          Driver      Link Speed      Duplex MAC Address       MTU    Description
vusb0   Pseudo       cdce        Up   100Mbps    Full   a0:ce:c8:0a:2c:e3 1500   Realtek USB 101001000 LAN

オンボードNICがRealtekしかないPC等では、今までESXiのインストールを先に進めることができなかったが、ESXi 7.0以降ではUSB NICを接続しておけば、とりあえずインストールを完了させることができる
※以下はNICが1つも存在しない場合に出力される「No Network Adapters」のESXiインストール失敗画面となる。

ESXiへのUSB NIC認識手順

1. USBの認識状況を確認

USB NICが正常に認識しているか確認してみる。RTL8153 Gigabit Ethernet AdapterAX88179 Gigabit Ethernetが表示されており、認識は問題ないことが確認できる。

[root@t1017esx7:~] lsusb
Bus 001 Device 001: ID 0e0f:8001 VMware, Inc. Root Hub
Bus 002 Device 001: ID 0e0f:8002 VMware, Inc. Root Hub
Bus 001 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 001 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 002: ID 0bda:8153 Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter ★
Bus 002 Device 003: ID 0b95:1790 ASIX Electronics Corp. AX88179 Gigabit Ethernet ★

2. USB NICドライバをダウンロード

以下URLからUSB NICドライバをダウンロードする。

ESXiのバージョンに応じたドライバがダウンロードできるので、同意文にチェックを付けて必要なドライバをダウンロードしよう。

  • ESXi 6.7 : ESXi670-VMKUSB-NIC-FLING-39203948-offline_bundle-16780994.zip
  • ESXi 7.0 : ESXi700-VMKUSB-NIC-FLING-39035884-component-16770668.zip
  • ESXi 7.0 Update1 : ESXi701-VMKUSB-NIC-FLING-40599856-component-17078334.zip

3. ドライバをインストール

Tera Termの「ファイル」→「SSH SCP…」を使用して、/tmpなどにドライバのファイルをアップロードする。アップロードするファイルのサイズは500KB以下なので、容量も気にする必要はない。

その後、以下コマンドでインストールを行う。

esxcli software vib install -d <zipファイルのフルパス>

実行結果は以下の通り。Reboot Required: trueとなっているため、再起動が必要となる。

[root@t1017esx7:~] esxcli software vib install -d /tmp/ESXi700-VMKUSB-NIC-FLING-39035884-component-16770668.zip
Installation Result
   Message: The update completed successfully, but the system needs to be rebooted for the changes to be effective.
   Reboot Required: true
   VIBs Installed: VMW_bootbank_vmkusb-nic-fling_2.1-6vmw.700.1.0.39035884
   VIBs Removed:
   VIBs Skipped:

4. ESXiを再起動

ESXi上の仮想マシンを停止させ、再起動させる。

5. 再起動後のUSB NIC認識確認

再起動後のUSB NICを確認してみる。まず、VMware Host Clientで確認すると、vusb0及びvusb1というNICがuetherというドライバにて追加されていることがわかる。

コマンドでも確認してみる。Realtek USB 101001000 LAN及びASIX Elec. Corp. AX88179というNICが表示されており、問題なくUSB NICを認識させることに成功した。

[root@t1017esx7:~] esxcfg-nics -l
Name    PCI          Driver      Link Speed      Duplex MAC Address       MTU    Description
vmnic0  0000:0b:00.0 nvmxnet3    Up   10000Mbps  Full   00:0c:29:7b:12:ea 1500   VMware Inc. vmxnet3 Virtual Ethernet Controller
vusb0   Pseudo       uether      Up   1000Mbps   Full   a0:ce:c8:0a:2c:e3 1500   Realtek USB 101001000 LAN
vusb1   Pseudo       uether      Up   1000Mbps   Full   00:00:7a:cd:54:59 1500   ASIX Elec. Corp. AX88179

更新履歴

  • 2019/7/10 新規作成
  • 2021/1/7 ESXi 7.0の環境に合わせて内容を更新
2021年1月2日土曜日

HP ENVY 4520のプリンターの印刷設定が保護違反で表示されない問題 (例外コード 0xe06d7363)

以前使っていたプリンターのノズルが詰まってしまい、いくらクリーニングしても印刷がかすれてしまう状況になってしまった。プリンターは年賀状の印刷時以外はほとんど使うこともなく特にこだわりもないので、かなり古いモデル (2015年販売) となる中古の「HP ENVY 4520」を購入した。インク付きで7,000円だった。

しかし、いざ印刷しようとすると、HP ENVY 4520のプリンターの印刷設定画面が保護違反で開けない問題が発生した。表示されているメッセージは以下の通りとなる。

C:\WINDOWS\splwow64.exe
関数アドレス 0x00007FFEA7FF3B29 保護違反が発生しました。(例外コード 0xe06d7363)
プロパティページの数ページまたはすべてのページが表示されない可能性があります。

上記メッセージや例外コードをもとに検索すると、ドライバをアンインストールして再インストールせよといった情報が出てくるが、ドライバを何度インストールしなおしても事象は改善しない

Windows UpdateによるWindows 10のバージョンアップにドライバが追従できていないことが原因のようで、アップデート済みのWindows 10のノートPC2台の両方で本事象が発生した。逆に言えば、古いWindows 10であれば正常に動作することを確認した

しかし、いろいろ試したところアップデート済みのWindows 10においても、本事象を解消できる手順を確立できたので、以下に記載する。

環境

  • Windows OS : Windows 10 バージョン1909
  • プリンタ : HP ENVY 4520

解消手順

1. HPのサイトよりドライバをダウンロード&インストール

もし、ドライバを未インストールの場合は、以下HPサイトより「HP ENVY 4520シリーズ基本ドライバー - ITプロフェッショナル向けのみ」をダウンロードしインストールしておく

2. プリンタのIPアドレスを確認&固定IPアドレスに設定

DHCPの場合、プリンタのIPアドレスが変更となった際に印刷に失敗する可能性があるため、IPアドレスの固定を行う。HP ENVY 4520は、本体の液晶画面またはWebの管理画面のどちらかを使って設定できる。以下はWeb管理画面の設定例となる。

3. Windowsにプリンタを手動で追加

Windowsメニュー→「設定」→「デバイス」→「プリンターとスキャナー」を選択する。

「プリンターまたはスキャナーを追加します」を選択するとプリンタの検索が始まる。しばらく待つと「プリンターが一覧にない場合」という表示がされるので選択すると、「プリンターの追加」画面が表示される。

「その他のオプションでプリンターを検索」画面では、「TCP/IPアドレスまたはホスト名を使ってプリンターを追加する」を選択する。

「ホスト名またはIPアドレスを入力します」画面では、以下の通り入力する。

  • デバイスの種類 : TCP/IPデバイス
  • ホスト名またはIPアドバイス : プリンターのIPアドレス
  • ポート名 : 自動入力

「どのバージョンのドライバーを使用しますか?」画面では、「現在のドライバーを置き換える」を選択する。

「プリンター名を入力してください」画面では、デフォルトのまま「次へ」を選択する。

「HP ENVY 4520 seriesが正しく追加されました」画面では、そのまま「完了」を選択する。

4. 印刷設定画面の表示確認

この状態で、追加されたHP ENVY 4520 seriesの「管理」を選択する。

以下の通りエラーなく印刷設定の画面が表示されるようになれば、対処完了となる。

人気の投稿