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

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

実行環境

ルーター
Linksys WRT1900ACS
ファームウェア
OpenWrt 22.03.0
パッケージ バージョン
openvpn-openssl 2.5.5-1
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.0
パッケージ バージョン
ddns-scripts 2.8.2-25
luci-app-ddns git-22.193.49501-e0f0502

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

  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 と同等。(注意: -A,-X,-U,-N,-H は含まれない)
-r
ディレクトリを再帰的に処理する
-l
シンボリックリンクをシンボリックリンクとしてコピーする
-p
パーミッションを保持する
-t
更新日時を保持する
-g
グループを保持する
-o
オーナーを保持する (root 権限で実行時のみ)
-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

参考

7 Days to Die サーバーをインストール (Ubuntu 18.04 LTS)

サーバー
Network Presence – VALUE SSD VPS #2E
CPU
2コア + 2コア(追加) → 4コア
メモリー
8GB
OS
Ubuntu Server 18.04.4 LTS 64Bit
パッケージ バージョン
steamcmd 0~20130205-1

steamcmd をインストール

32 bit 用のリポジトリを追加

64 bit の Ubuntu を使っている場合は、steamcmd のパッケージをインストールできないので、以下のコマンドでリポジトリを追加します。

$ sudo add-apt-repository multiverse
$ sudo dpkg --add-architecture i386
$ sudo apt update

steamcmd をインストール

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

$ sudo apt install lib32gcc1 steamcmd

steamcmd を操作するユーザーを作成

以下のコマンドで steamcmd を実行するユーザーを作成します。

$ sudo useradd -r -m -U -s /bin/bash steam

7 Days to Die サーバーをインストール

以下のコマンドで steam ユーザーで steamcmd を起動します。初回の起動時にはアップデートまず開始されます。

$ sudo su - steam
$ steamcmd

しばらくすると、アップデートが終了して “Steam>” で始まる steamcmd のコンソールが開始します。 

匿名ユーザーでログインし、7 Days to Die の専用サーバー (ID:294420) をインストールします。

サーバーのバージョンを指定する場合は “-beta” オプションで指定します。a19.2 をインストールする場合は “-beta alpha19.2” を追加します。無効なバージョンを -beta オプションで指定すると最新版がインストールされます。

Steam> login anonymous
Steam> force_install_dir /home/steam/7dtd/
Steam> app_update 294420 -beta alpha19.2
Steam> quit

以下のエラーメッセージが出た場合は、ディスクの容量が不足しています。

Error! App '294420' state is 0x202 after update job.

設定ファイルを変更

サーバーを起動

以下のコマンドでサーバーを起動します。

$ cd ~/7dtd
$ ./startserver.sh  -configfile=serverconfig.xml

参考

Sourcetree で diff ツールが起動しなくなる問題

mac 版の Sourcetree の外部 diff ツールがいつの間にか開かなくなっていました。

Xcode に付属している FileMerge を外部ツールとして使えるように設定しなおします。

実行環境

OS
macOS Catalina Version 10.15.7
Sourcetree
Version 4.0.2 (236)

症状

ファイルを右クリックして “External Diff” をクリックしても FileMerge が開きません。

対策

Sourcetree の Preferences を開いて、Diff タブを開きます。

Visual Diff Tool で Custom… を選び、Diff Command と Arguments に以下を入力する。

/Applications/Xcode.app/Contents/Applications/FileMerge.app/Contents/MacOS/FileMerge
-left $LOCAL -right $REMOTE

MS Office Home & Business 2019 で必要なアプリだけをインストールする

信じられない事ですが、どうやら Microsoft Office 2019 では、必要なアプリのみを選択してインストールするということができないらしい・・。以前のバージョンであれば、インストールする時に選択できたのですが・・。

一応、不可能ということではなく、Office Deployment Tool という企業向けのツールを使って、XML に設定を書く事でインストールするアプリケーションを選択することが可能です。

今回は Microsoft Office Home & Business 2019 を Outlook と OneNote を除いてインストールしました。

実行環境

OS
Microsoft Windows [Version 10.0.19042.630] 64bit

Office Deployment Tool の準備

Office Deployment Tool をダウンロードして実行します。どこにファイルを解凍するのかを選択します。

解凍先のフォルダを開いて、”configuration-Office365-x64.xml” をエディタで開き、以下の内容に置き換えます。

<Configuration>
  <Add OfficeClientEdition="64" Channel="Monthly">
    <Product ID="HomeBusiness2019Retail">
      <Language ID="en-us" />
      <!-- <Language ID="ja-jp" /> -->
      <ExcludeApp ID="Access" />
      <!-- <ExcludeApp ID="Excel" /> -->
      <ExcludeApp ID="Groove" />
      <ExcludeApp ID="Lync" />
      <ExcludeApp ID="OneDrive" />
      <ExcludeApp ID="OneNote" />
      <ExcludeApp ID="Outlook" />
      <!-- <ExcludeApp ID="PowerPoint" /> -->
      <ExcludeApp ID="Publisher" />
      <ExcludeApp ID="Teams" />
      <!-- <ExcludeApp ID="Word" />	 -->
    </Product>
  </Add>
</Configuration>

<Product ID=”HomeBusiness2019Retail“> の部分は、所持しているライセンスに対応する ID を指定しないとアクティベートできなくなります。 このページで指定可能な ID の一覧が見られます。

<ExcludeApp ID=”Outlook” /> で Outlook を除外しています。Excel、Power Point、Word のみがインストールされるように設定しました。

その他のオプションもあります。

Office をインストール

PowerShell を開き、Office Deployment Tool を解凍したフォルダへ移動します。

以下のコマンドで設定ファイルを指定して Office をインストールします。

.\setup.exe /configure .\configuration-Office365-x64.xml

後はインストールが終わるのを待つだけです。ちなみに、インストール中にインストールしているアプリケーションが表示されています。

Office Deployment Tool を使ってインストールした場合
標準のインストーラーでインストールした場合

すでにインストールしたアプリケーション

すでに不要なアプリケーションをインストールしてしまった場合は、上記の方法で再インストールすれば、不要なアプリケーションは自動的にアンインストールされます。Office を一度丸ごとアンインストールする必要はありません。

参考

CapsLock キーを Ctrl キーに変更する

CapsLock キーが邪魔すぎるので CapsLock キーを Ctrl キーに変更して、ダブル Ctrl キー状態にしてしまいます。

実行環境

OS
Microsoft Windows [Version 10.0.19042.610] 64bit

レジストリの変更

以下の内容をテキストファイルに保存して、拡張子を .reg に変更して実行します。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00

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

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

実行環境

ルーター
Linksys WRT1900ACS
OS
OpenWrt 19.07.3
パッケージ バージョン
msmtp 1.8.7-2

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

一般ユーザーでもメールが送信できるようにするために設定ファイルのパーミッションを変更します。

# chmod 644 /etc/msmtprc

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

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

メール送信を行うスクリプト 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 ./notify-login.sh

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

# ./notify-login.sh

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

/path/to/script/notify-login.sh

テスト

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

注意

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

参考