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の「管理」を選択する。

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

人気の投稿