Antigravityを使ってWordPress用のAWS EC2インスタンスを移行

何をするか

最近、古くなったWebサーバーから最新の環境へお引っ越しをする機会がありました。今回は、普段使っているAIコーディングアシスタント「Antigravity」を相棒にして、PHP 7の旧サーバーから、AWS EC2上の最新のBitnami WordPress(PHP 8)環境への完全移行を行いました。単にデータを移すだけでなく、「AIと一緒にトラブルシューティングをしながらインフラを再構築する」という新しい移行体験を記事にまとめました。

サーバー移行って何?(1分で分かる概要)

今回直面した最大の動機は「PHP 7のサポート終了(EOL)」です。古いバージョンのまま放置するとセキュリティリスクが高まるため、サーバーまるごと最新環境へ移す必要がありました。手順の概要は以下の通りです:

AWS上に新サーバー構築 → データのエクスポート/インポート → SSL・セキュリティの再設定 → 旧サーバー削除

今回はデータ移行の定番プラグイン「All-in-One WP Migration」を利用しましたが、環境が新しくなることで発生した様々な「摩擦」をAIと一緒に乗り越えることになりました。

最新環境(PHP 8 + Bitnami)にするメリット

最新のサーバー環境にするだけで、以下のような恩恵があります。一言で言うと「速くてめちゃくちゃ堅牢」になります。

  • セキュリティの大幅向上
    最新のPHPパッチが適用されるのはもちろん、Bitnami標準のガチガチなセキュリティ設定(.htaccessのシステムレベルでの無効化など)により、外部からの攻撃耐性が飛躍的に高まります。
  • 処理速度(パフォーマンス)の向上
    PHP 7から8になることでWordPressの動作自体が最適化・高速化され、表示速度の改善が見込めます。
  • 分かりやすいコスト削減
    移行完了後に古いEC2インスタンスを完全削除することで、無駄なクラウド維持費をスパッとカットできます。

手順(Antigravityと進める完全移行劇)

1. 新サーバーへのデータインポートと「タイムアウト」の壁

AWSで新しいBitnami WordPressを立ち上げ、データをインポートしようとしたところ、最初の壁が出現。データ量が大きかったため、なんとインポートが77%でストップしてしまいました。

原因は「PHPの処理時間上限(タイムアウト)」。ここでAntigravityが本領を発揮します。チャットで「止まりました」と伝えただけで、AIが裏側でSSH経由で新サーバーに接続し、php.inimax_execution_time設定を1時間(3600秒)に拡張。その後、無事に100%までインポートが完走しました。

2. 実はここでハマった…「Critical Error」と古いプラグインの悲鳴

これで移行完了!と思いきや、サイトを開くと画面が真っ白になり「There has been a critical error on this website.」の絶望的な文字が。

原因は、旧環境から引き継いでしまった「古いプラグイン」でした。これらが最新のPHP 8の仕様に対応しきれず、裏でエラーを吐き続けていたのです。これもAntigravityがすぐにエラーログを解析し、SSHから直接問題のプラグインフォルダをリネームして強制無効化。一瞬でサイトが復旧しました。

3. Let’s EncryptによるSSL証明書の再設定

続いてHTTPS化です。サーバー(IPアドレス)が変わったことでブラウザから警告が出る状態になっていました。Bitnami専用のbncert-toolコマンドを実行して証明書の再発行を試みましたが、ここでも「wwwあり」ドメインのDNS設定が存在しないというエラーが。

すかさず設定を「wwwなし」単体に切り替えてAIが対話を自動で進行させ、無事に新しいSSL証明書の発行と、定期更新の自動設定(cronジョブ)まで完了させることができました。

4. 最大の罠:超セキュア環境による「ログイン画面」の仕様衝突

最大の難関はセキュリティプラグインでした。以前は専用のログインURLを作るために「Login Rebuilder」プラグインを使っていましたが、新環境では全く機能しません。理由は、Bitnamiの強固なセキュリティ設定でした。「.htaccess」ファイルがシステム根幹で無効化されていたため、プラグインが物理ファイルを作ったりURLを偽装する手法が全ブロックされていたのです。

そこでモダンな「WPS Hide Login」へ切り替えを試みますが、これも404エラーに。最終的に、Antigravityが不要な古いプラグインの残骸を完全にパージし、パーマリンクの空更新を行うことで、Bitnami独自のルーティング設定をうまく機能させ、「新しい安全な専用ログインURL」を完璧にセットアップできました。

おまけ:旧サーバーを落としてスッキリ

新環境が完璧に動くこと、ログイン画面の保護が強力に効いていることを確認したのち、AWS CLIコマンドを使って古いEC2インスタンスをterminate-instancesで完全削除しました。

aws ec2 terminate-instances --instance-ids [古いインスタンスID]

これで、毎月発生していた旧サーバーの無駄な維持費もストップ。移行プロジェクトは無事に完了となりました。

まとめ

今回の移行で痛感したのは、「環境を新しくするということは、過去の古い仕組みとの摩擦が必ず起きる」ということです。特にBitnamiのような高セキュリティ環境では、直感的な操作(プラグインを入れるだけ)が通用しない場面が多々あります。

しかし、AntigravityのようなAIアシスタントがいることで、「エラーが起きた」と伝えるだけで、AIが原因を見抜き、SSHで直接サーバーに潜り込んでコマンドを叩き、設定を書き換えて直してくれる。そんな専属のインフラエンジニアとペアプログラミングをしているかのような、次世代の保守運用を体験できました。システム移行を重荷に感じている方は、ぜひAIを相棒に迎えてみてはいかがでしょうか。

AntigravityににSSL証明書(Let’s Encrypt)の更新を丸投げしてみた

何をするか

Webサイトを運営していると避けて通れないのが「SSL証明書(https化)の有効期限切れ」問題です。
今回、私が管理しているサーバー(AWS/Bitnami環境)でLet’s EncryptのSSL証明書が期限切れになってしまい、サイトが警告表示(保護されていません)になってしまいました。

通常なら「SSHでサーバーに入って、更新コマンドを調べて、Apacheの設定ファイルを書き換えて、再起動して…」と非常に面倒な作業が必要です。
しかし今回は、最強のAIアシスタント「Antigravity」に、SSHのログイン情報だけを渡して「完全AI主導」でSSL証明書の更新と自動化の設定をやってもらいました!

手順(Antigravityによる全自動更新プロセス)

1. Antigravityに「サーバー情報」と「お願い」を伝える

私がAntigravityのチャット画面に入力したのは、基本的に以下の情報だけです。

  • 「xxx.xxx.xxx.xxx のサーバーのSSL証明書が切れたから更新したい」
  • 「SSH接続用の秘密鍵(key.pem)はパソコンのこのフォルダにあるよ」

たったこれだけです。
するとAntigravityは、「承知しました。それでは私のほうでサーバーにログインして現状を調査します」と宣言し、勝手に私のパソコンのターミナル(コマンドライン)を立ち上げて、自動でSSH接続を開始したのです。

2. AIによる環境調査と「Lego」の特定

サーバーに入ったAntigravityは、迷うことなくLinuxコマンド(unamelssystemctl など)を打ち込み、現在の環境を調査し始めました。
数秒後、Antigravityから「このサーバーはBitnami環境であること、そしてLet’s Encryptの更新には『Lego』という専用ツールが使われていることが分かりました」という報告が。私はただ画面を見ているだけです。

3. 証明書の再取得を「AI主導」で実行

環境を把握したAntigravityは、「それでは、Legoツールを使って新しい証明書を取得します。実行してよろしいでしょうか?」とImplementation Plan(実行計画)を提示してくれました。
私が「Approve(承認)」ボタンを押すと、Antigravityは次々とコマンドを打ち込みます。

# AIが自動で叩いたコマンドの一部
sudo /opt/bitnami/letsencrypt/lego --tls --email="hoge@example.com" --domains="example.com" --path="/opt/bitnami/letsencrypt" renew

さらに、新しく取得した証明書をApache(Webサーバー)に適用するためのシンボリックリンクの張り替えまで、手際よくあっという間に完了させてしまいました。

4. Webサーバーの再起動と、今後の「自動更新(cron)」の設定まで

証明書の差し替えが終わると、Antigravityは自動でApacheを再起動し、「ブラウザでサイトを確認してみてください。新しい証明書が適用されているはずです!」と教えてくれました。
確認すると、見事に「保護された通信」が復活!!

また、
「今後また期限が切れないように、Cron(定期実行)で自動更新されるように設定しておきましょうか?」と、根本的な解決策まで自発的に提案・設定してくれたのです。

# AIが自動で設定したCronジョブ
0 0 1 * * sudo /opt/bitnami/letsencrypt/lego ...(略)... renew && sudo /opt/bitnami/ctlscript.sh restart apache

まとめ

これまでのサーバー運用は、エラー画面とGoogle検索のにらめっこでした。
しかし、Antigravityを使えば「鍵を渡して目的を伝えるだけ」
あとはAIが勝手にサーバーに入り込み、環境を調査し、最適なコマンドを打ち込んでミッションを完遂してくれます。

インフラエンジニアがいなくても、AIさえいればサーバーの保守・運用ができてしまう時代が来たことを肌で感じた体験でした。

OpenVPNを使ってクライアントVPNを構築

何をするか

外出先のインターネットからクライアントVPNを使って自宅NWに接続する。

OpenVPNサーバの構築

yum install -y qemu-img

必要なパッケージをインストール

yum –enablerepo=epel install openvpn easy-rsa

作業ディレクトリを作成してコピーして移動。

mkdir /etc/openvpn/easy-rsa
cp /usr/share/easy-rsa/3.0.7/* /etc/openvpn/easy-rsa/ -R
cd /etc/openvpn/easy-rsa

CA(認証局)の初期化。

./easyrsa init-pki

CA(認証局)を作成。

./easyrsa build-ca

CA秘密鍵のパスワードが聞かれるので任意のパスワードを入力。

Enter New CA Key Passphrase: 
Re-Enter New CA Key Passphrase: 

処理が完了すると以下のファイルが作成される。

CA証明書:ca.crt
CA秘密鍵:ca.key

DH(Diffie-Hellman)パラメータの生成。

./easyrsa gen-dh
・DHパラメータ
/etc/openvpn/easy-rsa/pki/dh.pem

サーバ用秘密鍵、証明書の作成
※nonpassオプションをつけるとパスフレーズを省略できる。

./easyrsa build-server-full server_1

クライアント用証明書、秘密鍵の作成
※nonpassオプションをつけるとパスフレーズを省略できる。

./easyrsa build-client-full client_1

CA秘密鍵のパスワードが聞かれるのでパスワードを入力

Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key:

処理が完了すると以下のファイルが作成される。
サーバ用証明書:client_1.crt
サーバ用秘密鍵:client_1.key

OpenVPNのテンプレコンフィグをコピー。

cp /usr/share/doc/openvpn*/sample/sample-config-files/server.conf server_1.conf

メインの設定ファイルを編集。

vi /etc/openvpn/server_1.conf
####
#################################################
# Sample OpenVPN 2.0 config file for            #
# multi-client server.                          #
#                                               #
# This file is for the server side              #
# of a many-clients <-> one-server              #
# OpenVPN configuration.                        #
#                                               #
# OpenVPN also supports                         #
# single-machine <-> single-machine             #
# configurations (See the Examples page         #
# on the web site for more info).               #
#                                               #
# This config should work on Windows            #
# or Linux/BSD systems.  Remember on            #
# Windows to quote pathnames and use            #
# double backslashes, e.g.:                     #
# "C:\\Program Files\\OpenVPN\\config\\foo.key" #
#                                               #
# Comments are preceded with '#' or ';'         #
#################################################

# Which local IP address should OpenVPN
# listen on? (optional)
;local a.b.c.d

# Which TCP/UDP port should OpenVPN listen on?
# If you want to run multiple OpenVPN instances
# on the same machine, use a different port
# number for each one.  You will need to
# open up this port on your firewall.
port 1194

# TCP or UDP server?
;proto tcp
proto udp4

# "dev tun" will create a routed IP tunnel,
# "dev tap" will create an ethernet tunnel.
# Use "dev tap0" if you are ethernet bridging
# and have precreated a tap0 virtual interface
# and bridged it with your ethernet interface.
# If you want to control access policies
# over the VPN, you must create firewall
# rules for the the TUN/TAP interface.
# On non-Windows systems, you can give
# an explicit unit number, such as tun0.
# On Windows, use "dev-node" for this.
# On most systems, the VPN will not function
# unless you partially or fully disable
# the firewall for the TUN/TAP interface.
;dev tap
dev tun

# Windows needs the TAP-Win32 adapter name
# from the Network Connections panel if you
# have more than one.  On XP SP2 or higher,
# you may need to selectively disable the
# Windows firewall for the TAP adapter.
# Non-Windows systems usually don't need this.
;dev-node MyTap

# SSL/TLS root certificate (ca), certificate
# (cert), and private key (key).  Each client
# and the server must have their own cert and
# key file.  The server and all clients will
# use the same ca file.
#
# See the "easy-rsa" directory for a series
# of scripts for generating RSA certificates
# and private keys.  Remember to use
# a unique Common Name for the server
# and each of the client certificates.
#
# Any X509 key management system can be used.
# OpenVPN can also use a PKCS #12 formatted key file
# (see "pkcs12" directive in man page).
#ca ca.crt
ca /etc/openvpn/easy-rsa/pki/ca.crt

#cert server.crt
cert /etc/openvpn/easy-rsa/pki/issued/server_r.crt

#key server.key  # This file should be kept secret
key /etc/openvpn/easy-rsa/pki/private/server_r.key

# Diffie hellman parameters.
# Generate your own with:
#   openssl dhparam -out dh2048.pem 2048
#dh dh2048.pem
dh /etc/openvpn/easy-rsa/pki/dh.pem

# Network topology
# Should be subnet (addressing via IP)
# unless Windows clients v2.0.9 and lower have to
# be supported (then net30, i.e. a /30 per client)
# Defaults to net30 (not recommended)
;topology subnet

# Configure server mode and supply a VPN subnet
# for OpenVPN to draw client addresses from.
# The server will take 10.8.0.1 for itself,
# the rest will be made available to clients.
# Each client will be able to reach the server
# on 10.8.0.1. Comment this line out if you are
# ethernet bridging. See the man page for more info.
server 10.8.0.0 255.255.255.0

# Maintain a record of client <-> virtual IP address
# associations in this file.  If OpenVPN goes down or
# is restarted, reconnecting clients can be assigned
# the same virtual IP address from the pool that was
# previously assigned.
ifconfig-pool-persist ipp.txt

# Configure server mode for ethernet bridging.
# You must first use your OS's bridging capability
# to bridge the TAP interface with the ethernet
# NIC interface.  Then you must manually set the
# IP/netmask on the bridge interface, here we
# assume 10.8.0.4/255.255.255.0.  Finally we
# must set aside an IP range in this subnet
# (start=10.8.0.50 end=10.8.0.100) to allocate
# to connecting clients.  Leave this line commented
# out unless you are ethernet bridging.
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100

# Configure server mode for ethernet bridging
# using a DHCP-proxy, where clients talk
# to the OpenVPN server-side DHCP server
# to receive their IP address allocation
# and DNS server addresses.  You must first use
# your OS's bridging capability to bridge the TAP
# interface with the ethernet NIC interface.
# Note: this mode only works on clients (such as
# Windows), where the client-side TAP adapter is
# bound to a DHCP client.
;server-bridge

# Push routes to the client to allow it
# to reach other private subnets behind
# the server.  Remember that these
# private subnets will also need
# to know to route the OpenVPN client
# address pool (10.8.0.0/255.255.255.0)
# back to the OpenVPN server.
#;push "route 192.168.10.0 255.255.255.0"
#;push "route 192.168.20.0 255.255.255.0"
push "route 192.168.0.0 255.255.255.0"

# To assign specific IP addresses to specific
# clients or if a connecting client has a private
# subnet behind it that should also have VPN access,
# use the subdirectory "ccd" for client-specific
# configuration files (see man page for more info).

# EXAMPLE: Suppose the client
# having the certificate common name "Thelonious"
# also has a small subnet behind his connecting
# machine, such as 192.168.40.128/255.255.255.248.
# First, uncomment out these lines:
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
# Then create a file ccd/Thelonious with this line:
#   iroute 192.168.40.128 255.255.255.248
# This will allow Thelonious' private subnet to
# access the VPN.  This example will only work
# if you are routing, not bridging, i.e. you are
# using "dev tun" and "server" directives.


# EXAMPLE: Suppose you want to give
# Thelonious a fixed VPN IP address of 10.9.0.1.
# First uncomment out these lines:
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
# Then add this line to ccd/Thelonious:
#   ifconfig-push 10.9.0.1 10.9.0.2

# Suppose that you want to enable different
# firewall access policies for different groups
# of clients.  There are two methods:
# (1) Run multiple OpenVPN daemons, one for each
#     group, and firewall the TUN/TAP interface
#     for each group/daemon appropriately.
# (2) (Advanced) Create a script to dynamically
#     modify the firewall in response to access
#     from different clients.  See man
#     page for more info on learn-address script.
;learn-address ./script

# If enabled, this directive will configure
# all clients to redirect their default
# network gateway through the VPN, causing
# all IP traffic such as web browsing and
# and DNS lookups to go through the VPN
# (The OpenVPN server machine may need to NAT
# or bridge the TUN/TAP interface to the internet
# in order for this to work properly).
;push "redirect-gateway def1 bypass-dhcp"

# Certain Windows-specific network settings
# can be pushed to clients, such as DNS
# or WINS server addresses.  CAVEAT:
# http://openvpn.net/faq.html#dhcpcaveats
# The addresses below refer to the public
# DNS servers provided by opendns.com.
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"

# Uncomment this directive to allow different
# clients to be able to "see" each other.
# By default, clients will only see the server.
# To force clients to only see the server, you
# will also need to appropriately firewall the
# server's TUN/TAP interface.
#;client-to-client
client-to-client

# Uncomment this directive if multiple clients
# might connect with the same certificate/key
# files or common names.  This is recommended
# only for testing purposes.  For production use,
# each client should have its own certificate/key
# pair.
#
# IF YOU HAVE NOT GENERATED INDIVIDUAL
# CERTIFICATE/KEY PAIRS FOR EACH CLIENT,
# EACH HAVING ITS OWN UNIQUE "COMMON NAME",
# UNCOMMENT THIS LINE OUT.
;duplicate-cn

# The keepalive directive causes ping-like
# messages to be sent back and forth over
# the link so that each side knows when
# the other side has gone down.
# Ping every 10 seconds, assume that remote
# peer is down if no ping received during
# a 120 second time period.
keepalive 10 120

# For extra security beyond that provided
# by SSL/TLS, create an "HMAC firewall"
# to help block DoS attacks and UDP port flooding.
#
# Generate with:
#   openvpn --genkey --secret ta.key
#
# The server and each client must have
# a copy of this key.
# The second parameter should be '0'
# on the server and '1' on the clients.
tls-auth ta.key 0 # This file is secret

# Select a cryptographic cipher.
# This config item must be copied to
# the client config file as well.
# Note that v2.4 client/server will automatically
# negotiate AES-256-GCM in TLS mode.
# See also the ncp-cipher option in the manpage
cipher aes-256-cbc
#auth sha256

# Enable compression on the VPN link and push the
# option to the client (v2.4+ only, for earlier
# versions see below)
;compress lz4-v2
;push "compress lz4-v2"

# For compression compatible with older clients use comp-lzo
# If you enable it here, you must also
# enable it in the client config file.
#;comp-lzo
comp-lzo

# The maximum number of concurrently connected
# clients we want to allow.
;max-clients 100
max-clients 100

# It's a good idea to reduce the OpenVPN
# daemon's privileges after initialization.
#
# You can uncomment this out on
# non-Windows systems.
#;user nobody
#user nobody
#;group nobody
#group nobody

# The persist options will try to avoid
# accessing certain resources on restart
# that may no longer be accessible because
# of the privilege downgrade.
persist-key
persist-tun

# Output a short status file showing
# current connections, truncated
# and rewritten every minute.
#status openvpn-status.log
status /var/log/openvpn-status.log

# By default, log messages will go to the syslog (or
# on Windows, if running as a service, they will go to
# the "\Program Files\OpenVPN\log" directory).
# Use log or log-append to override this default.
# "log" will truncate the log file on OpenVPN startup,
# while "log-append" will append to it.  Use one
# or the other (but not both).
#;log         openvpn.log
log-append         /var/log/openvpn.log
log   /var/log/openvpn.log

# Set the appropriate level of log
# file verbosity.
#
# 0 is silent, except for fatal errors
# 4 is reasonable for general usage
# 5 and 6 can help to debug connection problems
# 9 is extremely verbose
verb 3

# Silence repeating messages.  At most 20
# sequential messages of the same message
# category will be output to the log.
;mute 20

# Notify the client that when the server restarts so it
# can automatically reconnect.
explicit-exit-notify 1
####

vpnux Clientの設定

vpnux Clientを起動して「プロファイル」→「追加」を押下する。
■一般設定
プロファイル名:任意
VPNサーバ:OpenVPNサーバのグローバルIP
デバイス:TUN
拡張設定:[LZO圧縮を有効にする]をチェック
CA証明書:「ca.crt」を選択
認証:「証明書認証(PKI)を使用」を選択
証明書認証(PKI)/証明書:「client1.crt」を選択
証明書認証(PKI)/秘密鍵:「client1.key」を選択
■詳細設定
追加セキュリティ設定:「TSL-Auth HMAC署名を使用」をチェック
追加セキュリティ設定/共有鍵:「ta.key」を選択

ログからのトラシュー

暗号方式を大文字で記載していた。
cipher AES-256-CBC → cipher aes-256-cbc
Fri May 15 10:44:27 2020 TLS Error: cannot locate HMAC in incoming packet from [AF_INET]61.86.178.47:1194

プロトコルのipv4の指定が抜けていた。
udp → udp4
Fri May 15 10:37:02 2020 Could not determine IPv4/IPv6 protocol. Using AF_INET

CentOS7のサーバ構築でうまくいかない時の共通確認事項

サーバを構築する際にいつも忘れてしまうところ。

・SELINUXの無効化
状態確認
getenforce

永久的に無効化
vi /etc/selinux/config
—-
SELINUX=enforcing
—-

・FWの無効化
状態確認
systemctl status iptables
systemctl status firewalld

停止(再起動すると復活する)
/etc/init.d/iptables stop
systemctl stop firewalld

・それでも無理な場合
サービスの状態確認、エラーの場合は問題箇所も表示される
systemctl status [サービス名]

エラーログ確認
vi /var/log/[ログファイル]
jounalctl

(zabbix)Template OS Linux内のデフォルトのアイテムとその表示例

zabbixサーバって構築した後も監視項目のチューニングとか大変そう、と思っていたのですがデフォルトで存在するテンプレート「Template OS Linux」で一般的な監視項目(アイテム)は既に入っていたので「Template OS Linux」内の監視項目を整理します。

zabbixサーバ、エージェントのバージョンは「3.4.15」

※右側は監視している値の表示例
■General セクション
Host boot time : 2020/4/11 7:21:16
Host local time : 2020/5/13 15:14:21
Host name : ip-172-131-49-55
System information : Linux ip-172-131-49-55 4.4.0-1105-aws #112-Ubuntu SMP Wed Mar 18 05:11:57 UTC 2020 x86_64
System uptime : 32 days, 07:50:10

■Memory セクション
Available memory : 488.09 MB
Free swap space : 436.63 MB
Free swap space in % : 68.79%
Total memory : 990.65 MB
Total swap space : 634.76 MB

■Network interfaces セクション
Incoming network traffic on eth0 : 1.46 Kbps
Outgoing network traffic on eth0 : 2.51 Kbps

■OS セクション
Host boot time : 2020/4/11 7:21:16
Host local time : 2020/5/13 15:19:21
Host name : ip-172-131-49-55
Maximum number of opened files : 99246
Maximum number of processes : 32768
Number of logged in users : 1
System information : Linux ip-172-131-49-55 4.4.0-1105-aws #112-Ubuntu SMP Wed Mar 18 05:11:57 UTC 2020 x86_64
System uptime : 32 days, 07:50:10

■Performance セクション
Context switches per second : 86 sps
CPU idle time : 99.9%
CPU interrupt time : 0%
CPU iowait time : 0%
CPU nice time : 0%
CPU softirq time : 0%
CPU steal time : 0.02%
CPU system time : 0.02%
CPU user time : 0.07%
Interrupts per second : 47 ips
Processor load (1 min average per core) : 0
Processor load (5 min average per core) : 0
Processor load (15 min average per core) : 0

■Processes セクション
Number of processes : 129
Number of running processes :  1

■Security セクション
Checksum of /etc/passwd : 4980275739
Number of logged in users : 1

■Zabbix agent セクション
Agent ping : Up (1)
Host name of zabbix_agentd running : WebServer
Version of zabbix_agent(d) running : 3.4.15

(bind)ルートDNSサーバとキャッシュサーバの関係とnamed.caについて

名前解決の流れを整理

https://www.xxx.jp というWebサイトにアクセスする場合
①クライアントAは「www.xxx.jp」のIPアドレスを知る為に、PCに設定されたDNSキャッシュサーバに名前解決を依頼する。
②名前解決を依頼された検索用DNSサーバはルートDNSサーバに問い合わせをする。
③ルートDNSサーバ自身は「www.xxx.jp」のIPアドレスは知らないが、「.jp」ドメインを管轄しているDNSサーバBのIPアドレスを知っているのでそのアドレスを返す。
④DNSキャッシュサーバはDNSサーバBに対して問い合わせをする。
⑤DNSサーバB自身は「www.xxx.jp」のIPアドレスは知らないが、「xxx.jp」ドメインを管轄しているDNSサーバCのIPアドレスを知っているのでそのアドレスを返す。
⑥DNSキャッシュサーバはDNSサーバCに対して問い合わせをする。
⑦DNSサーバCは「www.xxx.jp」のIPアドレスを知っているのでそのアドレスを返す。
⑧DNSキャッシュサーバはクライアントAに「www.xxx.jp」のIPアドレスを返す。
⑨DNSキャッシュサーバは「www.xxx.jp」のIPアドレスを元に「https://www.xxx.jp」へアクセスする。

DNSキャッシュサーバのパターン

①ISPが運用するDNSキャッシュサーバを使用する場合
一番スタンダードで特に追加の設定は不要。ONUからIPアドレスを自動取得するとISPのDNSキャッシュサーバも一緒に降ってくる。
②インターネット上のDNSキャッシュサーバを使用する場合
PCにインターネット上のDNSキャッシュサーバのアドレスを手動設定する。有名なDNS1サーバでgoogleの8.8.8.8などがある。
③自前でキャッシュサーバを用意する場合
PCに自前で用意したのDNSキャッシュサーバのアドレスを手動設定する。

named.caについて

自前でキャッシュサーバを用意する場合はLinuxのBIND等を使ってDNSキャッシュサーバを構築する必要がある。

名前解決の流れで記載した通り、DNSキャッシュサーバはルートDNSサーバのに問い合わせを行うのでルートDNSサーバの情報を持っている。デフォルトでは「named.ca」という名前のファイルに記載されていたので中身を見てみる。

; <<>> DiG 9.11.3-RedHat-9.11.3-3.fc27 <<>> +bufsize=1200 +norec @a.root-servers.net
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46900
;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 27

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;.                              IN      NS

;; ANSWER SECTION:
.                       518400  IN      NS      a.root-servers.net.
.                       518400  IN      NS      b.root-servers.net.
.                       518400  IN      NS      c.root-servers.net.
.                       518400  IN      NS      d.root-servers.net.
.                       518400  IN      NS      e.root-servers.net.
.                       518400  IN      NS      f.root-servers.net.
.                       518400  IN      NS      g.root-servers.net.
.                       518400  IN      NS      h.root-servers.net.
.                       518400  IN      NS      i.root-servers.net.
.                       518400  IN      NS      j.root-servers.net.
.                       518400  IN      NS      k.root-servers.net.
.                       518400  IN      NS      l.root-servers.net.
.                       518400  IN      NS      m.root-servers.net.

;; ADDITIONAL SECTION:
a.root-servers.net.     518400  IN      A       198.41.0.4
b.root-servers.net.     518400  IN      A       199.9.14.201
c.root-servers.net.     518400  IN      A       192.33.4.12
d.root-servers.net.     518400  IN      A       199.7.91.13
e.root-servers.net.     518400  IN      A       192.203.230.10
f.root-servers.net.     518400  IN      A       192.5.5.241
g.root-servers.net.     518400  IN      A       192.112.36.4
h.root-servers.net.     518400  IN      A       198.97.190.53
i.root-servers.net.     518400  IN      A       192.36.148.17
j.root-servers.net.     518400  IN      A       192.58.128.30
k.root-servers.net.     518400  IN      A       193.0.14.129
l.root-servers.net.     518400  IN      A       199.7.83.42
m.root-servers.net.     518400  IN      A       202.12.27.33
a.root-servers.net.     518400  IN      AAAA    2001:503:ba3e::2:30
b.root-servers.net.     518400  IN      AAAA    2001:500:200::b
c.root-servers.net.     518400  IN      AAAA    2001:500:2::c
d.root-servers.net.     518400  IN      AAAA    2001:500:2d::d
e.root-servers.net.     518400  IN      AAAA    2001:500:a8::e
f.root-servers.net.     518400  IN      AAAA    2001:500:2f::f
g.root-servers.net.     518400  IN      AAAA    2001:500:12::d0d
h.root-servers.net.     518400  IN      AAAA    2001:500:1::53
i.root-servers.net.     518400  IN      AAAA    2001:7fe::53
j.root-servers.net.     518400  IN      AAAA    2001:503:c27::2:30
k.root-servers.net.     518400  IN      AAAA    2001:7fd::1
l.root-servers.net.     518400  IN      AAAA    2001:500:9f::42
m.root-servers.net.     518400  IN      AAAA    2001:dc3::35

;; Query time: 24 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Thu Apr 05 15:57:34 CEST 2018
;; MSG SIZE  rcvd: 811

A~Mまでの13個のルートDNSサーバのアドレスが記載されている。この情報をもとに冒頭に書いた流れの「www.xxx.jp」の名前解決が出来ていることになる。
ちなみにこの情報は変更されることがあるので、自前でキャッシュサーバを用意する場合は定期的に変更確認をしないといつの間にかインターネット上のWebサイトに繋がらなくなることが考えられる。
因みにこのファイルの最新版は下記のリンクに「named.cache」という名前で存在する。
最新版

(vyos)vyosの初期設定

初期ID/PWは「vyos」です。

vyosをインストールするコマンドを入力。

install-system

※以下、[]内の値はデフォルト値です。何も入力せずに[Enter]を押下した場合[]内の値が適用されます。

進めるかどうかの確認なので、そのまま[Enter]

Would you like to continue? (Yes/No) [Yes]:

パーティションの方式を聞かれるので、そのまま[Enter]

Partition (Auto/Union/Parted/Skip) [Auto]:

インストール先のディスクを自動で見つけてくれるので、そのまま[Enter]
[]内には対象のディスクが表示されます。

Install the Image on? []:

進めるかどうかの確認なので、[Yes]を入力。

Continue? (Yes/No) [No]:

vyosが使用するディスクのサイズを聞かれるので、そのまま[Enter]

How big of a root partition should I create? (1000MB - 1074MB) [1074]MB:

設定ファイルの場所を聞かれるので、そのまま[Enter]

Which one should I copy to sda? [/opt/vyos/etc/config/config.boot]:

vyos(管理者)ユーザのパスワード入力と確認。

Enter vyos password:
Retype vyos password:

起動プログラムのインストール先を聞かれるので、そのまま[Enter]

Which drive should GRUB modify the boot partition on? [sda]:

再起動するコマンドを入力。

reboot

(vyos)ノートPCを家庭用ルータにする

何をするか

使わなくなったノートPC上でvyosというネットワークOSを導入して、ノートPCを家庭用ルータとして使用してみます。
やる理由としてはvyosを使ってルータを作ってみたかっただけです。

環境
OS:Win8
ソフト:VMware Workstation 12 Player
↓ざっくり構成(before)

↓ざっくり構成(after)
※無線LANアダプタがあればvyos自体がAPにもなれます。

vyosの機能

vyosは企業などで使われる商用ルータと同等の機能があります。
家庭用ルータとしてはほぼ不要ですが…。
yvso機能wiki

WebキャッシュサーバやIPSecVPNは家庭でも使えるかも。

家庭用ルータに必要な機能を洗い出し

・送信元NAT
自宅のPCがインターネットに出る際に使用
・DHCP
自宅のPCがAPにアクセスした際にローカルアドレスを自動取得する為に使用
・DNS転送
ISP(WAN側)から自動取得したDNSの情報をDHCPクライアントに伝える事が出来ないので、自身がDNSサーバのように振る舞いISPのDNSへクエリを中継するため。

VMware Workstationの設定など

vyosのisoをダウンロードして仮想マシンを作成する
vyosのisoをダウンロード → vyos

仮想マシン、仮想ネットワークエディタの設定。
自動ブリッジではなくVMnetを使用したのは、今後の物理インタフェース追加も考えてインタフェースを明示的に指定する為です。
NATを使用しているのはホスト(ノートPC)に振られているグローバルIPをvyosで使用する為です。

ノートPC内部のイメージはこんな感じ。
USBNICを1つつけてるので物理NICが2つあります。

vyosの設定

初期設定は長くなるので別の記事で書きます

LAN側(eth2)、WAN側(eth3)のインタフェースを認識している事を確認。

vyos@vyos:~$ show interfaces
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth2             -                                 u/u
eth3             -                                 u/u
lo               127.0.0.1/8                       u/u
                 ::1/128

設定モードに移行してLAN側、WAN側それぞれのアドレスを設定。
ONUからのグローバルIP取得はDHCPです。

vyos@vyos:~$ configure
vyos@vyos# set interfaces ethernet eth2 address 192.168.1.254/24
vyos@vyos# set interfaces ethernet eth3 address dhcp

SSHを有効にして今までの設定変更を反映。
これでターミナルソフトからSSH経由で接続できます。

vyos@vyos# set service ssh
vyos@vyos# commit

LAN→WANへの送信元NATのルールを作成。

vyos@vyos# set nat source rule 900 translation address masquerade
vyos@vyos# set nat source rule 900 source address 192.168.1.0/24
vyos@vyos# set nat source rule 900 outbound-interface eth3

DHCPサーバになる為の設定。
アドレスプールは 192.168.1.100-150

vyos@vyos# set service dhcp-server shared-network-name my_pool subnet 192.168.1.0/24
vyos@vyos# set service dhcp-server shared-network-name my_pool subnet 192.168.1.0/24 start 192.168.1.100 stop 192.168.1.150
vyos@vyos# set service dhcp-server shared-network-name my_pool subnet 192.168.1.0/24 default-router 192.168.1.254
vyos@vyos# set service dhcp-server shared-network-name my_pool subnet 192.168.1.0/24 dns-server 192.168.1.254

DNS転送の設定。

vyos@vyos# set service dns forwarding listen-on eth2

設定を保存して再起動。

vyos@vyos# commit
vyos@vyos# save
vyos@vyos# exit
vyos@vyos:~$ reboot

使えそうな確認コマンドなど

コンフィグの確認。

vyos@vyos:~$ show configuration

インターフェースの状態確認。

vyos@vyos:~$ show interfaces

ルーティングテーブルの確認。

vyos@vyos:~$ show ip route

NATルールの確認。

vyos@vyos:~$ show nat source rules

現在の送信元NATの状態を確認。

vyos@vyos:~$ show nat source translations detail

完成版コンフィグ

vyos@vyos:~$ show configuration
interfaces {
    ethernet eth2 {
        address 192.168.1.254/24
        duplex auto
        hw-id 00:0c:29:0a:a4:89
        smp_affinity auto
        speed auto
    }
    ethernet eth3 {
        address dhcp
        duplex auto
        hw-id 00:0c:29:0a:a4:93
        smp_affinity auto
        speed auto
    }
    loopback lo {
    }
}
nat {
    source {
        rule 900 {
            outbound-interface eth3
            source {
                address 192.168.1.0/24
            }
            translation {
                address masquerade
            }
        }
    }
}
service {
    dhcp-server {
        disabled false
        shared-network-name my_pool {
            authoritative disable
            subnet 192.168.1.0/24 {
                default-router 192.168.1.254
                dns-server 192.168.1.254
                lease 86400
                start 192.168.1.100 {
                    stop 192.168.1.150
                }
            }
        }
    }
    dns {
        forwarding {
            cache-size 150
            listen-on eth2
        }
    }
    ssh {
        port 22
    }
}
system {
    config-management {
        commit-revisions 20
    }
    console {
        device ttyS0 {
            speed 9600
        }
    }
    host-name vyos
    login {
        user vyos {
            authentication {
                encrypted-password ****************
                plaintext-password ****************
            }
            level admin
        }
    }
    ntp {
        server 0.pool.ntp.org {
        }
        server 1.pool.ntp.org {
        }
        server 2.pool.ntp.org {
        }
    }
    package {
        auto-sync 1
        repository community {
            components main
            distribution helium
            password ****************
            url http://packages.vyos.net/vyos
            username ""
        }
    }
    syslog {
        global {
            facility all {
                level notice
            }
            facility protocols {
                level debug
            }
        }
    }
    time-zone UTC
}

スループットの測定

回線速度計測サイトを使用して有線接続時の速度テストをしてみた結果。
※干渉をうけにくい有線接続でテスト。
・モデム—自宅のPC
下り:74Mbps  上り:4.5Mbps
・モデム—vyos—自宅のPC
下り:94Mbps  上り:5.6Mbps

無線アダプタを買ってAP設定をすれば高機能無線ルータとして実用的に使えるんじゃないか??
安定稼働するかどうかは分かりませんが。