VMware ESXi から LXD へ乗り換え

VMware が ESXi のフリーライセンスの提供を終了することになったので、LXD に乗り換えることにしました。

サーバー
HPE ProLiant MicroServer Gen10 Plus
CPU
4コア
メモリー
32GB
OS
Ubuntu Server 24.04 LTS 64Bit

LXD をインストール

以下のコマンドで LXD をインストールします。ほとんどの質問には Enter キーだけを押してデフォルトを適用します。

sudo snap install lxd
sudo lxd init

Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]: 
Name of the new storage pool [default=default]:
Name of the storage backend to use (btrfs, dir, lvm, zfs, ceph) [default=zfs]:
Create a new ZFS pool? (yes/no) [default=yes]:
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]:
Size in GiB of the new loop device (1GiB minimum) [default=30GiB]: 800GiB
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]:
What should the new bridge be called? [default=lxdbr0]:
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
Would you like the LXD server to be available over the network? (yes/no) [default=no]: yes
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]:
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:

ファイアウォールの設定

LXD が持っている自前のファイアウォールが Ubuntu のファイアウォールと干渉するので無効にする。

lxc network set lxdbr0 ipv4.firewall false
lxc network set lxdbr0 ipv6.firewall false

ufw コマンドで LXD のブリッジネットワークのルーティングを許可する。

# allow the guest to get an IP from the LXD host
sudo ufw allow in on lxdbr0 to any port 67 proto udp
sudo ufw allow in on lxdbr0 to any port 547 proto udp

# allow the guest to resolve host names from the LXD host
sudo ufw allow in on lxdbr0 to any port 53

# allow the guest to have access to outbound connections
CIDR4="$(lxc network get lxdbr0 ipv4.address | sed 's|\.[0-9]\+/|.0/|')"
CIDR6="$(lxc network get lxdbr0 ipv6.address | sed 's|:[0-9]\+/|:/|')"
sudo ufw route allow in on lxdbr0 from "${CIDR4}"
sudo ufw route allow in on lxdbr0 from "${CIDR6}"

一通り設定が終わったら再起動をして再起動後も LXD が動作していることを確認します。

Web インターフェースの設定

http://192.168.1.101:8443 にブラウザからアクセスして指示に従ってクライアント用の証明書の作成を行います。インストール時にポートを変更している場合は設定したポートでアクセスします。

証明書の設定が完了して Web インターフェースにアクセスできるようになったら、 Settings タブで “core.trust_password” を設定します。このパスワードはインポート作業が終了したら削除します。

ESXi から Windows 仮想マシンをインポート

必要なファイルを準備

以下のコマンドで virt-2v2 をインストールし、必要なファイルを取得します。

sudo apt install virt-v2v
sudo mkdir /usr/share/virtio-win
cd /usr/share/virtio-win
sudo wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso

以下のコマンドで rhsrvany を取得します。

mkdir ~/tmp
cd ~/tmp
sudo apt install rpm2cpio
wget -nd -O srvany.rpm https://kojipkgs.fedoraproject.org//packages/mingw-srvany/1.1/4.fc38/noarch/mingw32-srvany-1.1-4.fc38.noarch.rpm

rpm2cpio srvany.rpm | cpio -idmv
sudo mkdir /usr/share/virt-tools
sudo mv ./usr/i686-w64-mingw32/sys-root/mingw/bin/*exe /usr/share/virt-tools/

以下のコマンドで Windows 仮想マシンを LXD にインポートできる形式にコンバートします。Linux 仮想マシンも同じコマンドでコンバートできます。

mkdir ./os
sudo virt-v2v --block-driver virtio-scsi -o local -of raw -os ./os -i vmx ./test-vm.vmx

[   0.0] Setting up the source: -i vmx ./test-vm.vmx
[   1.0] Opening the source
[  13.5] Inspecting the source
[  15.1] Checking for sufficient free disk space in the guest
[  15.1] Converting Windows 10 Pro to run on KVM
virt-v2v: This guest has virtio drivers installed.
[  24.7] Mapping filesystem data to avoid copying unused and blank areas
[  25.6] Closing the overlay
[  25.7] Assigning disks to buses
[  25.7] Checking if the guest needs BIOS or UEFI to boot
virt-v2v: This guest requires UEFI on the target to boot.
[  25.7] Setting up the destination: -o disk -os ./os
[  26.8] Copying disk 1/1
  100% [****************************************]
[ 275.0] Creating output metadata
[ 275.0] Finishing off

DLX へインポート

マイグレーションツール bin.linux.lxd-migrate.x86_64 をダウンロードして実行パーミッションを付与します。

cd ~/tmp
wget https://github.com/canonical/lxd/releases/latest/download/bin.linux.lxd-migrate.x86_64
chmod u+x ./bin.linux.lxd-migrate.x86_64

マイグレーションツールを実行して仮想マシンをインポートします。

sudo ./bin.linux.lxd-migrate.x86_64

Please provide LXD server URL: https://192.168.1.101:8443
Certificate fingerprint: xxxxxxxxxxxxxxxxxxxxxxxxxxxx
ok (y/n)? y
1) Use a certificate token
2) Use an existing TLS authentication certificate
3) Generate a temporary TLS authentication certificate
Please pick an authentication mechanism above: 3
Your temporary certificate is:
-----BEGIN CERTIFICATE-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END CERTIFICATE-----
It is recommended to have this certificate be manually added to LXD through `lxc config trust add` on the target server.
Alternatively you could use a pre-defined trust password to add it remotely (use of a trust password can be a security issue).
Would you like to use a trust password? [default=no]: yes
Trust password: [core.trust_password に設定したパスワード]
Remote LXD server:
  Hostname: lxd-server
  Version: 5.21.1
Would you like to create a container (1) or virtual-machine (2)?: 2
Name of the new instance: test-vm
Please provide the path to a disk, partition, or image file: /path/to/disk/image/test-vm-sda (コンバートしたディスクファイルを指定する)
Does the VM support UEFI Secure Boot? [default=no]:
Instance to be created:
  Name: test-vm
  Project: default
  Type: virtual-machine
  Source: /path/to/disk/image/test-vm-sda
  Config:
    security.secureboot: "false"
Additional overrides can be applied at this stage:
1) Begin the migration with the above configuration
2) Override profile list
3) Set additional configuration options
4) Change instance storage pool or volume size
5) Change instance network
Please pick one of the options above [default=1]: 3
Please specify config keys and values (key=value ...): limits.cpu=2
Instance to be created:
  Name: test-vm
  Project: default
  Type: virtual-machine
  Source: /path/to/disk/image/test-vm-sda
  Config:
    limits.cpu: "2"
    security.secureboot: "false"
Additional overrides can be applied at this stage:
1) Begin the migration with the above configuration
2) Override profile list
3) Set additional configuration options
4) Change instance storage pool or volume size
5) Change instance network
Please pick one of the options above [default=1]: 3
Please specify config keys and values (key=value ...): limits.memory=4GB
Instance to be created:
  Name: test-vm
  Project: default
  Type: virtual-machine
  Source: /path/to/disk/image/test-vm-sda
  Config:
    limits.cpu: "2"
    limits.memory: 4GB
    security.secureboot: "false"
Additional overrides can be applied at this stage:
1) Begin the migration with the above configuration
2) Override profile list
3) Set additional configuration options
4) Change instance storage pool or volume size
5) Change instance network
Please pick one of the options above [default=1]: 4
Please provide the storage pool to use: default
Do you want to change the storage size? [default=no]:
Instance to be created:
  Name: test-vm
  Project: default
  Type: virtual-machine
  Source: /path/to/disk/image/test-vm-sda
  Storage pool: default
  Config:
    limits.cpu: "2"
    limits.memory: 4GB
    security.secureboot: "false"
Additional overrides can be applied at this stage:
1) Begin the migration with the above configuration
2) Override profile list
3) Set additional configuration options
4) Change instance storage pool or volume size
5) Change instance network
Please pick one of the options above [default=1]: 5
Please specify the network to use for the instance: lxdbr0
Instance to be created:
  Name: test-vm
  Project: default
  Type: virtual-machine
  Source: /path/to/disk/image/test-vm-sda
  Storage pool: default
  Network name: lxdbr0
  Config:
    limits.cpu: "2"
    limits.memory: 4GB
    security.secureboot: "false"
Additional overrides can be applied at this stage:
1) Begin the migration with the above configuration
2) Override profile list
3) Set additional configuration options
4) Change instance storage pool or volume size
5) Change instance network
Please pick one of the options above [default=1]: 1
Transferring instance: test-vm: 1.03GB (257.25MB/s)
Instance test-vm successfully created

Web インターフェース上からインポートした仮想マシンを起動して動作を確認します。

ネットワーク接続を変更

lxdbr0 を使用してネットワークに接続すると NAT 経由の接続になりますが、以下のコマンドでブリッジ接続に変更できます。

lxc config device remove test-vm eth0  
lxc config device add test-vm eth0 nic nictype=macvlan parent=eno1

仮想マシンをホスト起動時に自動起動

lxc config set test-vm boot.autostart true

トラブルシュート

起動時に failed to load Boot0001 “UEFI QEMU QEMU HARDDISK” エラー

元の仮想マシンが UEFI ではなくレガシー BIOS 設定だった場合に発生しました。以下のコマンドでレガシー BIOS 設定に変更することで起動できました。

lxc config set micro-dyn-onl security.secureboot false
lxc config set micro-dyn-onl security.csm true

参考

海外在住者の JGC 規約変更 (2000マイル引き落とし) 2023年

JAL JGC の規約に変更があり、海外在住者は毎年2000マイルの支払いをする必要が生じるとの連絡がありました。しかし JAL に問い合わせると回避策があるそうなのでご紹介します。

JAL からのお知らせ

2023年の1月にメールでお知らせが来ていました。

JAL からのお知らせメール

リンク先のページには以下の記述があります。

JGC 規約変更

CLUB-A カード は JAL カードの一種で2000マイルの支払いは必要ないと思うのですが、確信が持てなかったので JAL のカスタマーサポートへ電話してみました。

JAL カスタマーサポートの回答

このまま放置すると毎年2000マイルの支払いが追加で必要になるとのこと。ただし 現在の CLUB-A カードを JGC カードへ切り替えればマイルの支払いは必要ないということでした。

他に以下の情報も教えてもらえました。

  • 2000マイルの引き落としは毎年4月1日
  • 2000マイルが引き落とせなかった場合は JGC 資格剥奪となる

ということで、質問した電話でそのまま CLUB-A カードを JGC カードへ切り替える書類の郵送をお願いしました。

申し込み書類

2週間ほどで “JALグローバルクラブ会員申込書(JALカード会員用)” と “JALカード海外住所変更届” という書類が日本から郵送されてきました。初回の申し込みと同じように返信用の封筒も入っていました。ありがたいですね。

注意事項を読んで記入し返信用封筒で返送しました。

カード到着

申込書の送付から1ヶ月程度で新しいカードが EMS で送られてきました。

この JGC のロゴが入ったカードに変更することで2000マイルの支払いは必要なくなります。

規約だけ読むとよくわかりませんが持っているカードを見ればわかりやすいですね。

切り替えがまだの方はお早めに。😀

OpenWrt で UPnP を使用する

ポート開放に UPnP を使用しないといけない状況になったので、OpenWrt のルーターに miniupnpd をインストールして、特定の IP にのみ UPnP の利用を許可するようにしました。

実行環境

ルーター
Linksys WRT1900ACS
ファームウェア
OpenWrt 22.03.2
パッケージ バージョン
miniupnpd-nftables 2022-08-31-68c8ec50-1

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

  1. ルーターの Web コンソールへアクセス
  2. メニューの System -> Software をクリック
  3. “Update lists…” をクリック
  4. Filter に “miniupnpd” と入力
  5. リストから “miniupnpd-nftables” をインストール

設定を編集

以下がインストール時に作成される設定ファイルです。/etc/config/upnpd

config upnpd config
        option enabled          0
        option enable_natpmp    1
        option enable_upnp      1
        option secure_mode      1
        option log_output       0
        option download         1024
        option upload           512
#by default, looked up dynamically from ubus
#       option external_iface   wan
        option internal_iface   lan
        option port             5000
        option upnp_lease_file  /var/run/miniupnpd.leases
        option igdv1            1

config perm_rule
        option action           allow
        option ext_ports        1024-65535
        option int_addr         0.0.0.0/0       # Does not override secure_mode
        option int_ports        1024-65535
        option comment          "Allow high ports"

config perm_rule
        option action           deny
        option ext_ports        0-65535
        option int_addr         0.0.0.0/0
        option int_ports        0-65535
        option comment          "Default deny"

option enabled を変更して UPnP を有効にします。

config upnpd config
        option enabled          1

このままではルーターに接続されたすべてのデバイスが UPnP を使用できてしまうので、最初の perm_rule セクションを以下の様に変更します。この場合 192.168.1.101 にのみ UPnP の使用を許可しています。

config perm_rule
        option action           allow
        option ext_ports        1024-65535
        option int_addr         192.168.1.101/32
        option int_ports        1024-65535
        option comment          "Allow high ports"

設定ファイルを変更後、以下のコマンドで miniupnpd を有効化します。

/etc/init.d/miniupnpd restart
/etc/init.d/miniupnpd enable

/etc/init.d/miniupnpd restart 実行時に以下のエラーがでましたが、その後の再起動では表示されなくなりました。

Automatically including '/usr/share/nftables.d/table-post/20-miniupnpd.nft'
Automatically including '/usr/share/nftables.d/chain-post/dstnat/20-miniupnpd.nft'
Automatically including '/usr/share/nftables.d/chain-post/forward/20-miniupnpd.nft'
Automatically including '/usr/share/nftables.d/chain-post/srcnat/20-miniupnpd.nft'

Include '/usr/share/miniupnpd/firewall.include' failed with exit code -9

動作しているか確認

ルーターのポート 5000 にアクセスして確認します。例: http://192.168.1.1:5000/rootDesc.xml

miniupnpd が動作していれば XML ファイルを閲覧できます。

UPnPCJ という UPnP を使用してポートを開放するツールのポート開放テスト機能を使用してテストします。

UPnPCJ を使用したテスト結果

参考

マイナンバーカードを受領した日に返納してもマイナポイントはもらえるのか?

久しぶりに日本へ帰国して住民票を入れ直しマイナンバーカードの申請をしました。

住民票を入れてからマイナンバーカードの申請書が届いて実際にカードを受領するまでに7週間かかり、オーストラリアへの帰国ギリギリになってしまいました。

マイナンバーカードを受領した日にマイナポイントの受取を申請し、受領日に住民票を海外へ移すとどうなるか試してみました。

住民票を海外へ移すとマイナンバーカードは返納する必要があります。返納といってもカードに返納した旨が記録されるだけで、マイナンバーカード自体はそのまま所有者が保管することになります。

結論から言うと、受領日に返納してもマイナポイント 20,000 ポイントは受け取ることができました。

経緯

  • 1日目 10:00 – マイナンバーカード受け取り
  • 1日目 11:00 〜 12:00 – スマホでマイナポイント受取申請
  • 1日目 16:00 – 市役所で海外への転出を申請。市役所側ではまだマイナンバーカードの受取が記録されておらず未所持者として記録されていたので、今日受け取ったばかりだと伝える。転出予定日は1週間後に指定。
  • 1日目 16:45 – まだマイナカードを使用してマイナポータルへログインできる事を確認。返納手続き後すぐにカードの証明証が失効するわけではないらしい。
  • 2日目 08:45 – マイナポイント 15,000 ポイントの受け取りを確認 (健康保険証 + 公金受取口座)
  • 2日目 10:00 – PayPay チャージで 5,000 ポイント受取を確認
  • 転出予定日 + 5日目: マイナカードを使用してマイナポータルへログインできない事を確認。カードの証明証が失効しているらしい。

結論

受領日に返納してもマイナポイント 20,000 ポイントは受け取ることができます。マイナカードの利用者証明用電子証明書は転出予定日までは失効しないらしく、転出予定日までは問題なくマイナポイントとマイナポータルのアプリで使用できました。

アプリ画面

1日目 健康保険証と公金受取口座登録直後 (マイナポイントアプリ)
1日目 健康保険証と公金受取口座登録直後 (マイナポータルアプリ)
2日目 健康保険証と公金受取口座登録分のポイントを獲得 (マイナポータルアプリ)
転出予定日+5日目 電子証明書の失効 (マイナポイントアプリ)
転出予定日+5日目 電子証明書の失効 (マイナポータルアプリ)

OpenWrt に SSH でログインした時にメールで通知する

予期していない SSH ログインを検知するために、 SSH でユーザーがログインした時にメールで通知を行うようにしました。

実行環境

ルーター
Linksys WRT1900ACS
OS
OpenWrt 22.03.2
パッケージ バージョン
msmtp 1.8.19-1

msmtp をインストール

ルーターからメールを送信するために SMPT クライアントをインストールします。

Postfix のような完全な MTA をインストールすることもできますが、ソフトウェアのサイズが大きい、定期的なディスクアクセスが発生する等の OpenWrt で使うには不向きな点があります。このため、SMPT クライアントから外部のメールサーバーを経由してメールを送信します。

以下のコマンドで msmtp をインストールします。

# opkg update
# opkg install msmtp

ファイル /etc/msmtprc を編集して以下の行を追加、変更します。パスワードを平文で設定ファイルに書くことになるので、 msmtp のために新しく送信専用のフリーメールアドレスを取得しました。

host           smtp.gmail.com
port           587
from           username@gmail.com
auth           on
user           username
password       PASSWORD

gmail を使う場合は以下のような設定ファイルになります。PASSWORD は記号を含まない英数字が無難です。

# Example for a system wide configuration file

# A system wide configuration file is optional.
# If it exists, it usually defines a default account.
# This allows msmtp to be used like /usr/sbin/sendmail.
account default

# The SMTP smarthost
host smtp.gmail.com

# Use TLS on port 465
port 587
tls on
tls_starttls off

# Construct envelope-from addresses of the form "user@oursite.example"
from username@gmail.com

auth on
user username
password PASSWORD

# Syslog logging with facility LOG_MAIL instead of the default LOG_USER
syslog LOG_MAIL

さくらメールの場合の例は以下です。

# Example for a system wide configuration file

# A system wide configuration file is optional.
# If it exists, it usually defines a default account.
# This allows msmtp to be used like /usr/sbin/sendmail.
account default

# The SMTP smarthost
host example.sakura.ne.jp

# Use TLS on port 465
port 587
tls on
tls_starttls on

auth on
user router-admin@hogepiyo.com
password myPasswordHere

# Construct envelope-from addresses of the form "user@oursite.example"
from router-admin@hogepiyo.com

# Syslog logging with facility LOG_MAIL instead of the default LOG_USER
syslog LOG_MAIL

msmtp は sendmail コマンドと互換性があるので、シンボリックリンクを設置して sendmail コマンドとしても使えるようにします。

# ln -s /usr/bin/msmtp /usr/sbin/sendmail

以下のコマンドでメール送信のテストをします。”Sender’s Name <username@gmail.com>” と recipient@gmail.com で送信元と受信先を指定します。

# echo -e "Subject: Test mail\n\nThis is a test mail." | sendmail -f "Sender's Name <username@gmail.com>" recipient@gmail.com

メール送信スクリプトを設置

メール送信を行うスクリプト /root/notify-login.sh を以下の内容で作成します。HOST_NAME、RECIPIENT、SENDER を変更して下さい。

#!/bin/sh

HOST_NAME="hogepiyo.com"
RECIPIENT="recipient@gmail.com"
SENDER="OpenWrt <username@gmail.com>"

SOURCE_IP=`echo $SSH_CONNECTION | cut -d " " -f 1`

MESSAGE="To: $RECIPIENT
Subject: '$USER' has logged in '$HOST_NAME'
From: $SENDER

'$USER' has logged in successfully from '$SOURCE_IP' on $HOST_NAME.
Login Time: `date +\"%Y-%m-%d %T %Z\"`

`env`
"

echo "$MESSAGE" | sendmail -t &

パーミッションを変更して実行可能にします。

# chmod 755 /root/notify-login.sh

作成したスクリプトを実行してメールが送信されることを確認します。

# /root/notify-login.sh

/etc/profile ファイルに以下の行を追加して、ログイン時にメールが送信されるようにします。

/root/notify-login.sh

バックアップ設定

/etc/sysupgrade.conf に以下の行を追加してバックアップファイルに作成したスクリプトを含める用に設定します。

/root/

テスト

SSH で再ログインしてメールが送信されることを確認します。

注意

SSH のポートフォワーディングのみを利用する接続ではメールが送信されません。

参考

OpenWrt に OpenVPN サーバーをインストール

OpenWrt のルーターに OpenVPN サーバーをインストールして、ルーターのネットワークへ外部からアクセスできるようにしました。

実行環境

ルーター
Linksys WRT1900ACS
ファームウェア
OpenWrt 22.03.2
パッケージ バージョン
openvpn-openssl 2.5.7-3
openvpn-easy-rsa 3.0.8-4

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

ルーターへ SSH でアクセスし以下のコマンドを実行しパッケージをインストールします。

opkg update
opkg install openvpn-openssl openvpn-easy-rsa

パラメータを設定

以下のコマンドでパラメータを設定します。

OVPN_DIR="/etc/openvpn"
OVPN_PKI="/etc/easy-rsa/pki"
OVPN_PORT="1194"
OVPN_PROTO="udp"
OVPN_POOL="192.168.8.0 255.255.255.0"
OVPN_DNS="${OVPN_POOL%.* *}.1"
OVPN_DOMAIN="$(uci get dhcp.@dnsmasq[0].domain)"
OVPN_SERV="vpn.hogepiyo.com"

PKI と RSA キーの作成

以下のコマンドでパラメータを設定します。

export EASYRSA_PKI="${OVPN_PKI}"
export EASYRSA_REQ_CN="ovpnca"
export EASYRSA_BATCH="1"
export EASYRSA_CERT_EXPIRE="3650" # Increases the client cert expiry from the default of 825 days to match the CA expiry
export EASYRSA_KEY_SIZE="4096" # Increase key length 

以下のコマンドで PKI とサーバー用の鍵を作成します。

# Remove and re-initialize PKI directory
easyrsa init-pki
 
# Generate DH parameters
easyrsa gen-dh
 
# Create a new CA
easyrsa build-ca nopass
 
# Generate server keys and certificate
easyrsa build-server-full server nopass
openvpn --genkey tls-crypt-v2-server ${EASYRSA_PKI}/private/server.pem

以下のコマンドでクライアント用の鍵を作成します。CLIENT_NAMES にスペース区切りでクライアントキーの名前を入力します。

CLIENT_NAMES='client1 client2 client3 client4 client5'
for cn in $CLIENT_NAMES ; do
  easyrsa build-client-full "${cn}" nopass
  openvpn --tls-crypt-v2 ${EASYRSA_PKI}/private/server.pem \
    --genkey tls-crypt-v2-client "${EASYRSA_PKI}/private/${cn}.pem"
done

ファイアウォールの設定

以下のコマンドでファイアウォールの設定を行い OpenVPN への接続を許可します。

uci rename firewall.@zone[0]="lan"
uci rename firewall.@zone[1]="wan"
uci del_list firewall.lan.device="tun+"
uci add_list firewall.lan.device="tun+"
uci -q delete firewall.ovpn
uci set firewall.ovpn="rule"
uci set firewall.ovpn.name="Allow-OpenVPN"
uci set firewall.ovpn.src="wan"
uci set firewall.ovpn.dest_port="${OVPN_PORT}"
uci set firewall.ovpn.proto="${OVPN_PROTO}"
uci set firewall.ovpn.target="ACCEPT"
uci commit firewall
/etc/init.d/firewall restart

OpenVPN 設定ファイルの作成

以下のコマンドで OpenVPN のサーバー用とクライアント用の設定ファイルを作成します。

umask go=
OVPN_DH="$(cat ${OVPN_PKI}/dh.pem)"
OVPN_CA="$(openssl x509 -in ${OVPN_PKI}/ca.crt)"
ls ${OVPN_PKI}/issued \
| sed -e "s/\.\w*$//" \
| while read -r OVPN_ID
do
OVPN_TC="$(cat ${OVPN_PKI}/private/${OVPN_ID}.pem)"
OVPN_KEY="$(cat ${OVPN_PKI}/private/${OVPN_ID}.key)"
OVPN_CERT="$(openssl x509 -in ${OVPN_PKI}/issued/${OVPN_ID}.crt)"
OVPN_EKU="$(echo "${OVPN_CERT}" | openssl x509 -noout -purpose)"
case ${OVPN_EKU} in
(*"SSL server : Yes"*)
OVPN_CONF="${OVPN_DIR}/${OVPN_ID}.conf"
cat << EOF > ${OVPN_CONF} ;;
user nobody
group nogroup
dev tun
port ${OVPN_PORT}
proto ${OVPN_PROTO}
server ${OVPN_POOL}
topology subnet
client-to-client
keepalive 10 60
persist-tun
persist-key
push "dhcp-option DNS ${OVPN_DNS}"
push "dhcp-option DOMAIN ${OVPN_DOMAIN}"
push "redirect-gateway def1"
push "persist-tun"
push "persist-key"
<dh>
${OVPN_DH}
</dh>
EOF
(*"SSL client : Yes"*)
OVPN_CONF="${OVPN_DIR}/${OVPN_ID}.ovpn"
cat << EOF > ${OVPN_CONF} ;;
user nobody
group nogroup
dev tun
nobind
client
remote ${OVPN_SERV} ${OVPN_PORT} ${OVPN_PROTO}
auth-nocache
remote-cert-tls server
EOF
esac
cat << EOF >> ${OVPN_CONF}
<tls-crypt-v2>
${OVPN_TC}
</tls-crypt-v2>
<key>
${OVPN_KEY}
</key>
<cert>
${OVPN_CERT}
</cert>
<ca>
${OVPN_CA}
</ca>
EOF
done
/etc/init.d/openvpn restart
ls ${OVPN_DIR}/*.ovpn ${OVPN_DIR}/*.conf

設定ファイルをクライアントに適用

ルーターの Web コンソールへアクセスし、System -> Backup / Flash Firmware をクリックし Generate archive ボタンで全ての設定ファイルをダウンロードします。

ダウンロードした圧縮ファイルを解凍し、/etc/openvpn/ 内の *.ovpn ファイルをノートPCやスマホへコピーして接続テストを行います。

参考

OpenWrt に DDNS クライアントをインストール

OpenWrt のルーターに DDNS クライアントをインストールして、Namecheap で取得したドメインの IP アドレスをルーターの WAN IP で自動更新するようにしました。

実行環境

ルーター
Linksys WRT1900ACS
ファームウェア
OpenWrt 22.03.2
パッケージ バージョン
ddns-scripts 2.8.2-25
luci-app-ddns git-22.339.34822-6da87df

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

  1. ルーターの Web コンソールにアクセスし、System -> Software をクリック
  2. Actions: Update lists… をクリック
  3. Filter に “ddns-scripts” を入力し、ddns-scripts と luci-app-ddns をインストール
  4. ページをリロード

パラメータを設定

  1. ルーターの Web コンソールから、Service -> Dynamic DNS をクリック
  2. “myddns_ipv4” の Edit をクリック
  3. DDNS Service provider を namecheap.com に変更し、Switch Service をクリック
  4. 以下の項目を設定し Save をクリック
    • Lookup Hostname: ホスト名を含めたドメイン (例: dyn.hogepiyo.com)
    • Domain: ドメイン (例: hogepiyo.com)
    • Username: ホスト名 (例: dyn)
    • Password: namecheap のコンソールに表示されているパスワード (例: cbd37628761928dbd37628761928dcef)
  5. Save & Apply をクリック
  6. “myddns_ipv4” の Reload をクリック

参考

OpenWrt に OpenVPN サーバーをインストール

OpenWrt のルーターに OpenVPN サーバーをインストールして、プライベート VPN サーバーを作成しました。

実行環境

ルーター
Linksys WRT1900ACS
OS
OpenWrt 21.02.1
パッケージ バージョン
openvpn-openssl 2.5.3-3
openvpn-easy-rsa 3.0.8-3

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

ルーターに SSH でアクセスしてパッケージをインストールします。

opkg update
opkg install openvpn-openssl openvpn-easy-rsa

パラメータを設定

パラメータを設定します。サーバーのアドレスを設定し、ポート番号等を標準から変更する場合はここで変更します。

OVPN_SERV="hogepiyo.com"
OVPN_DIR="/etc/openvpn"
OVPN_PKI="/etc/easy-rsa/pki"
OVPN_PORT="1194"
OVPN_PROTO="udp"
OVPN_POOL="192.168.8.0 255.255.255.0"
OVPN_DNS="${OVPN_POOL%.* *}.1"
OVPN_DOMAIN="$(uci get dhcp.@dnsmasq[0].domain)"

PKI と鍵の作成

easyrsa コマンドで PKI とサーバーとクライアントの鍵を作成します。まずパラメータを設定します。

EASYRSA_KEY_SIZE のデフォルトは2048ですが、以下のように鍵長を長くすることもできます。ただし鍵の生成に時間がかかります。

export EASYRSA_PKI="${OVPN_PKI}"
export EASYRSA_REQ_CN="ovpnca"
export EASYRSA_BATCH="1"
export EASYRSA_KEY_SIZE="4096"

PKI フォルダを初期化します。

easyrsa init-pki

DH パラメータを生成します。

easyrsa gen-dh

CA を作成します。

easyrsa build-ca nopass

サーバー用の鍵を作成します。

easyrsa build-server-full server nopass
openvpn --genkey tls-crypt-v2-server ${EASYRSA_PKI}/private/server.pem

クライアント用の鍵を作成します。2つのコマンドの “client” 部分を変更して繰り返し実行し必要な数のクライアント用の鍵を作成します。

easyrsa build-client-full client nopass
openvpn --tls-crypt-v2 ${EASYRSA_PKI}/private/server.pem --genkey tls-crypt-v2-client ${EASYRSA_PKI}/private/client.pem

ファイアフォールの設定

OpenVPN のネットワークを lan へ加え、wan から OpenVPN サーバーへのアクセスを許可します。

uci rename firewall.@zone[0]="lan"
uci rename firewall.@zone[1]="wan"
uci del_list firewall.lan.device="tun+"
uci add_list firewall.lan.device="tun+"
uci -q delete firewall.ovpn
uci set firewall.ovpn="rule"
uci set firewall.ovpn.name="Allow-OpenVPN"
uci set firewall.ovpn.src="wan"
uci set firewall.ovpn.dest_port="${OVPN_PORT}"
uci set firewall.ovpn.proto="${OVPN_PROTO}"
uci set firewall.ovpn.target="ACCEPT"
uci commit firewall
/etc/init.d/firewall restart

OpenVPN サーバーの設定とクライアント設定ファイルの作成

以下の長いコマンドを実行して、サーバー用の設定ファイルとクライアント用の設定ファイルを作成します。作成されたサーバー用の設定ファイルは *.conf として、クライアント用は *.ovpn として ${OVPN_DIR} 以下に作成されます。

umask go=
OVPN_DH="$(cat ${OVPN_PKI}/dh.pem)"
OVPN_CA="$(openssl x509 -in ${OVPN_PKI}/ca.crt)"
ls ${OVPN_PKI}/issued \
| sed -e "s/\.\w*$//" \
| while read -r OVPN_ID
do
OVPN_TC="$(cat ${OVPN_PKI}/private/${OVPN_ID}.pem)"
OVPN_KEY="$(cat ${OVPN_PKI}/private/${OVPN_ID}.key)"
OVPN_CERT="$(openssl x509 -in ${OVPN_PKI}/issued/${OVPN_ID}.crt)"
OVPN_EKU="$(echo "${OVPN_CERT}" | openssl x509 -noout -purpose)"
case ${OVPN_EKU} in
(*"SSL server : Yes"*)
OVPN_CONF="${OVPN_DIR}/${OVPN_ID}.conf"
cat << EOF > ${OVPN_CONF} ;;
user nobody
group nogroup
dev tun
port ${OVPN_PORT}
proto ${OVPN_PROTO}
server ${OVPN_POOL}
topology subnet
client-to-client
keepalive 10 60
persist-tun
persist-key
push "dhcp-option DNS ${OVPN_DNS}"
push "dhcp-option DOMAIN ${OVPN_DOMAIN}"
push "redirect-gateway def1"
push "persist-tun"
push "persist-key"
<dh>
${OVPN_DH}
</dh>
EOF
(*"SSL client : Yes"*)
OVPN_CONF="${OVPN_DIR}/${OVPN_ID}.ovpn"
cat << EOF > ${OVPN_CONF} ;;
user nobody
group nogroup
dev tun
nobind
client
remote ${OVPN_SERV} ${OVPN_PORT} ${OVPN_PROTO}
auth-nocache
remote-cert-tls server
EOF
esac
cat << EOF >> ${OVPN_CONF}
<tls-crypt-v2>
${OVPN_TC}
</tls-crypt-v2>
<key>
${OVPN_KEY}
</key>
<cert>
${OVPN_CERT}
</cert>
<ca>
${OVPN_CA}
</ca>
EOF
done

OpenVPN サーバーを再起動します。

/etc/init.d/openvpn restart

作成したクライアント用の設定ファイルを確認します。このファイルをダウンロードしてクライアント端末にインポートして接続確認を行います。

ls ${OVPN_DIR}/*.ovpn

参考

diff コマンド

コマンド概要

ファイルを比較し差異を表示する。

コマンドオプション

-q
差異があるファイルのみを表示
-r
サブディレクトリを再起的に処理
-N
存在しないファイルを空ファイルとして比較処理

コマンドサンプル

2つのディレクトリに差異がないかを確認

ファイルサーバーの引っ越しのために全てのファイルを古い NAS から新しい NAS へコピーしました。コピーした後にコピーされていないファイルがないかを確認しました。

diff -qrN /Volumes/SOURCE_DIR/ /Volumes/DEST_DIR/

参考

rsync コマンド

コマンド概要

ディレクトリの内容を丸ごとコピーする。

コマンドオプション

-a
アーカイブモード。-rlptgoD と同等。(注意: -H, -A, -X は含まれない)
-r
ディレクトリを再帰的に処理する
-l
シンボリックリンクをシンボリックリンクとしてコピーする
-p
パーミッションを保持する
-t
更新日時を保持する
-g
グループを保持する
-o
オーナーを保持する (root 権限で実行時のみ)
-H, –hard-links-
ハードリンクを維持する
-A, –acls
ACLs (Access Control List) を維持する。-p が暗黙的に有効になる。
-X, –xattrs
リモート側の拡張属性 (extended attributes) をローカル側の拡張属性と一致させる
-D
–devices –specials と同等
–devices
デバイスファイルを保持する (root 権限で実行時のみ)
–specials
スペシャルファイルを保持する
-h
表示される数値に単位を付与して読みやすくする
–delete
コピー先に存在するがコピー元には存在しないファイルを削除する
–info=progress2
全コピー作業の総合的な進捗のみを出力する (バージョン 3.1.0 以降)

コマンドサンプル

ファイルサーバーの引っ越し

ファイルサーバーの引っ越しのために全てのファイルを古い NAS から新しい NAS へコピーしました。

rsync -ah --delete --info=progress2 /Volumes/SOURCE_DIR/ /Volumes/DEST_DIR

macOS でディスク間でファイルをコピー

macOS の rsync のバージョンが古いため、いくつかのオプションが使用できません。

sudo rsync -ahH --progress --delete /Volumes/SOURCE_DIR/ /Volumes/DEST_DIR

参考