各種サーバ/ツールの導入手順をまとめました。尚、外部からアクセスするためには、ダイナミックDNS(以下、DDNS)サービスが利用可能な事と、ルータのポート開放を正しく行っておく必要があります。

x11vnc (GUIリモート操作)

別ページで解説した。

x11vnc導入手順

SSH (CUIリモート操作)

Ubuntuでは、SSHサーバのパッケージ名は「openssh-server」だが、サービス名は「ssh」なので注意する。

$ sudo apt install openssh-server
$ sudo systemctl enable ssh
$ sudo systemctl status ssh

設定ファイル「/etc/ssh/sshd_config」を必要に応じて変更する。デフォルト設定でrootのログインはパスワード認証禁止になっているのでこのままでも運用可能だが、セキュリティー対策として接続ポートを変更する場合は、以下の項目を変更する。

port 22  ← 任意のポートへ変更する

Nextcloud (オンラインストレージ)

別ページで解説した。

Nextcloud導入手順

Postfix (メール送信)/Dovecot (メール受信)/Logwatch (ログ通知)

Postfixの導入

「Logwatch」をaptでインストールすると、依存パッケージとしてPostfixもインストールされるが、個別にremoveできなくなるので、先にPostfixを導入しておく。

$ sudo apt install postfix
(途中表示される設定画面では「設定なし」を選択して進める)

設定ファイルのテンプレートは「/etc/postfix/main.cf.proto」にあり、これをコピー/リネーム(main.cf)しても良いが、今回は最低限の設定とするため、以下の内容で新規に設定ファイルを作成した。

要点として、サーバーPC自身(localhost)からと同一LAN内からの送信を受け付けるようにし、ログ配信などで必要な外部への送信は、OP25B対策も兼ねてリレーサーバへ転送する事とする。

$ sudo nano /etc/postfix/main.cf
#### 同一LAN内とlocalhostからのみ配送を受け付ける
compatibility_level = 3.8
smtpd_banner = General SMTP Server  ← 固定文字列を指定しておく
myhostname = HOST_NAME.DDNS_NAME.example.jp  ← 「HOST_NAME」はDDNS側へ登録したMX/Aレコード
mydomain = DDNS_NAME.example.jp  ← DDNS名
myorigin = PC_NAME.localdomain  ← サーバPCの実名
mydestination = $myhostname, $myorigin, localhost  ← 配信を受け付けるメールサーバ名
mynetworks = 192.168.xxx.0/24, 127.0.0.0/8  ← サーバPCと同一ネットワークを指定する
inet_interfaces = all
inet_protocols = ipv4
mail_spool_directory = /var/mail
alias_maps = hash:/etc/aliases
####

#### OP25B対策
# 以下はMyDNSで提供されるリレーサーバ(SMTP認証なしで接続可能/登録ユーザのみ利用可能)
relayhost = [auth.gate-on.net]:587
#
# 以下はASAHIネットで提供されるメールサーバ(SMTP認証が必要/契約ユーザのみ利用可能)
#relayhost = [mail.asahi-net.or.jp]:25
#smtp_sasl_auth_enable = yes
#smtp_sasl_password_maps = hash:/etc/postfix/auth_info
#smtp_sasl_security_options = noanonymous
#smtp_sasl_mechanism_filter = plain, login, digest-md5, cram-md5
#
# 以下はASAHIネットで提供されるリレーサーバ(SMTP認証なしで接続可能/契約ユーザのみ利用可能)
#relayhost = [op25b.asahi-net.or.jp]:25
####

SMTP認証が必要なサーバへリレーする場合は、上記該当箇所のコメント(#)を外して、認証情報を記入したファイルを以下の内容で作成する。

$ sudo nano /etc/postfix/auth_info
[mail.asahi-net.or.jp]:25 USERNAME:PASSWORD  ← 契約情報を指定する

認証情報をDB化する。

$ sudo postmap /etc/postfix/auth_info

インストール時にsystemdへ登録されているので、起動して設定を反映する。

$ sudo systemctl start postfix

root宛のメールを一般ユーザへ転送するため以下を実行する。

$ sudo nano /etc/aliases
postmaster:	root
root:		USER1  ← 転送する一般ユーザ名を指定する

# 外部へ送信する場合
#root:		USER2@example.net  ← 転送するメールアドレスを指定する
$ sudo newaliases

Dovecotの導入

続いて、メール受信サーバであるdovecotをインストールする。プロトコルはPOP3が利用できれば良いので「dovecot-pop3d」をインストールする。

$ sudo apt install dovecot-pop3d

プレーンテキストでの認証を可能とするため、設定ファイルへ以下を追記する。

$ sudo nano /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
auth_mechanisms = plain login

インストール時にsystemdへ登録されて自動起動しているので、再起動で設定を反映する。

$ sudo systemctl restart dovecot

ここまでの設定で、メールが送信/受信できるようになった。

mailコマンドをインストールして、メールの送信テストを行う。

$ sudo apt install bsd-mailx
$ mail root (root宛のメールがUSER1へ転送されるかのテスト)
Subject: TEST [Enter]
root宛のメール送信テスト [Ctrl-D]
Cc: [Enter]

外部アドレスへの送信テストは以下の通り。

$ mail USER2@example.net -r USER1@HOST_NAME.DDNS_NAME.example.jp
Subject: TEST [Enter]
外部アドレスへの送信テスト [Ctrl-D]
Cc: [Enter]

メール配信テストで、エラーのためメール送信されない場合、以下のコマンドで確認/メンテンナンスを実行する。

メールキューの確認
$ sudo postqueue -p

メールキューの削除
$ sudo postsuper -d キューID

メールキューの全削除
$ sudo postsuper -d ALL

別PCのメールクライアントから受信テストを実施する。

Thunderbirdの設定例

メール受信できれば動作確認完了。

Logwatchの導入

最後にLogwatchをインストールする。

$ sudo apt install logwatch

「/etc/cron.daily」へ「00logwatch」が設置され、1日1回root宛にメール送信される。

テスト送信する場合は以下を実行する(1日経たないとメールは作成されない)。

$ sudo logwatch --output mail

CRON-APT (パッケージの更新確認)

パッケージの更新確認を自動化するため「CRON-APT」を採用する。

$ sudo apt install cron-apt

「/etc/cron.d/cron-apt」で午前4時に自動実行される。

設定ファイルへ以下を追記する。

$ sudo nano /etc/cron-apt/config
# When to send email about the cron-apt results.
# Value:
#   error   (send mail on error runs)
#   upgrade (when packages are upgraded)
#   changes (mail when change in output from an action)
#   output  (send mail when output is generated)
#   always  (always send mail)
#   never   (never send mail)
#           (else never send mail)
MAILON="upgrade"

# The email address to send mail to.
MAILTO="root"

# When to log the cron-apt results to syslog.
# Value:
#   error   (syslog on error runs)
#   upgrade (when packages is upgraded)
#   changes (syslog when change in output from an action)
#   output  (syslog when output is generated)
#   always  (always syslog)
#   never   (never syslog)
#           (else never syslog)
SYSLOGON="upgrade"

デフォルト設定ではパッケージのダウンロードだけ実行されるが、アップグレードも実行する場合は、以下のファイルを修正する。

$ sudo nano /etc/cron-apt/action.d/3-download
dist-upgrade -y -o APT::Get::Show-Upgraded=true  ←「-d」オプションを削除する

DHCP (DHCPサーバ)

Ubuntuでは、DHCPサーバのパッケージ名は「isc-dhcp-server」となる。

$ sudo apt install isc-dhcp-server

DHCPを提供するインターフェースを指定する。

$ sudo nano /etc/default/isc-dhcp-server
INTERFACESv4="enp1s0"  ← インターフェース名は「ip a」で確認する

設定ファイルへ以下を追記し、重複箇所をコメントアウトする。

$ sudo nano /etc/dhcp/dhcpd.conf
ddns-update-style none;

authoritative;
default-lease-time 43200;  ← デフォルトリース時間 12時間
max-lease-time 86400;  ← 最大リース時間 24時間

subnet 192.168.xxx.0 netmask 255.255.255.0 {
  range 192.168.xxx.100 192.168.xxx.200;  ← 割り当て範囲
  option domain-name-servers 8.8.8.8,192.168.xxx.254;  ← 複数のDNSサーバを指定する場合は「,」で区切る
  option domain-name "example.localdomain";
  option routers 192.168.xxx.254;
  option broadcast-address 192.168.xxx.255;
}

リスタートして設定を反映させる。

$ sudo systemctl restart isc-dhcp-server

ダイナミックDNSの利用

外部公開するサーバを運用するため、日本語でダイナミックDNS (以降、DDNS)サービスを提供している「MyDNS.JP」へ登録する。MyDNS.JPはIPv6へ対応しているが、現時点ではIPv4環境を前提とする。

MyDNS.JP
https://www.mydns.jp/

IPアドレスの通知方法として、代表的なDDNSクライアントであるDiCE (CUI版)を試したが、64bit環境では動作しないため、導入は断念。

方法1

定期的(15分に一度)にMyDNS.JPへIPアドレスを通知するコマンドを、crontabで登録する。MyDNS.JP公式サイトで紹介されている方法と少し異なるが、基本的な考え方は同一である。以下では、実行結果を保管しない(結果的にメール送信もされない)ようコマンドを記述した。

$ sudo crontab -e
# MyDNS.JPへIPアドレスを通知する。
*/15 * * * * curl -u マスターID:パスワード https://ipv4.mydns.jp/login.html >/dev/null

編集した内容は「/var/spool/cron/crontabs/root」へ保存される。

方法2

方法1でも問題ないが、IPアドレスが変わっていなくても15分毎に通知が行われるのは、DDNSサーバへ負荷が掛かりそうで心配だ。そこで、MyDNS.JP専用の通知スクリプトを作成し、IPアドレスの監視と通知を自動化した。動作要件は以下のとおり。

Python3.10.xから、base64モジュールのencodestring()メソッドが非推奨(廃止)になったため、新版では該当部分を修正してある。旧版も公開しておくので、自環境に合った方を利用してほしい。

ライセンス: GPL (GNU General Public License)

作成した通知スクリプトはMyDNS.JP専用だが、通知部分を修正すれば他のDDNSサービスでも対応可能なはずだ。以下、利用手順を示す。

「ddnsclient.zip」を作業ディレクトリで解凍後、「mydns.py」内のコメントを参考にして初期設定値を編集する。

「現在のIPアドレスを取得するためのURL」はリリース時点でコメント内のものが利用可能だが、他にも「最初に表示されるIPアドレスが自宅ルータのグローバルアドレス」というレイアウトになっている確認ページであれば利用可能なので、各自で試してみて欲しい。

とは言え、本来は自前で確認ページを用意する方が望ましいため、以下の手順で確認ページを作成/設置する。

$ nano check_ip.php
<?php echo $_SERVER["REMOTE_ADDR"]; ?>

用意したページへアクセスして、自宅ルータのグローバルIPアドレスが表示されている事を確認後、以下の手順で通知スクリプトを設置する。

$ sudo mkdir /opt/ddnsclient  ← 設置先のディレクトリを作成する
$ sudo cp 作業ディレクトリ/mydns.py /opt/ddnsclient
$ sudo chmod 700 /opt/ddnsclient/mydns.py  ← 実行権限の付加とroot以外はアクセス拒否

以下の手順で動作テストを行う。

$ sudo /opt/ddnsclient/mydns.py -v
[sudo] USER1 のパスワード:  ← パスワードを入力する
20xx/04/10 01:23:45: Notified.  ← 起動通知
20xx/04/10 01:24:45: Registered IP address = 10.1.1.1  ← 起動通知しても1分くらいではDNSへ反映されない
20xx/04/10 01:24:45: Current IP address    = 123.xxx.12.34
20xx/04/10 01:24:45: IP address changed!  ← IPアドレスの変化を検出した
20xx/04/10 01:24:45: Notified.  ← 通知された
^C  ← [Ctrl+C]で停止

動作確認できたので、本番用に「IP_CHECK_INTERVAL = 10」などへ変更しから、systemd用ユニットファイルを作成する。

$ sudo nano /etc/systemd/system/ddnsclient.service
[Unit]
Description=DDNS Client for MyDNS.JP
After=network-online.target

[Service]
Type=simple
ExecStart=/opt/ddnsclient/mydns.py
ExecStop=/bin/kill -TERM $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target 

systemdへ登録して起動する。

$ sudo systemctl daemon-reload
$ sudo systemctl enable ddnsclient
$ sudo systemctl start ddnsclient

SoftEther VPN (VPN接続)

フリーで利用でき、高機能な「SoftEther VPN」を採用する。

SoftEther VPN プロジェクト
http://ja.softether.org/

VPNサーバ

公式サイトから「SoftEther VPN Server」「Linux」「Intel x64 / AMD64 (64bit)」で検索して、作業ディレクトリへDLする。

※古いバージョンだとビルドに失敗するため「Ver 4.28, Build 9669, beta」以降のバージョンを利用する。

ビルドを実行するために必要なパッケージを導入する。

$ sudo apt install gcc make

DLしたファイルを展開し、ビルドを実行する。

$ cd 作業ディレクトリ
$ tar xvf softether-vpnserver-xxxx-linux-x64-64bit.tar.gz
$ cd softether-vpnserver-xxxx-linux-x64-64bit/vpnserver
$ make
$ cd ../
$ sudo chown -R root:root vpnserver
$ sudo mv vpnserver /opt

設定ファイル「vpn_server.config」が用意できる場合は「/opt/vpnserver」へコピーしておく。

systemd用ユニットファイルを作成する。

$ sudo nano /etc/systemd/system/vpnserver.service
[Unit]
Description=SoftEther VPN Server
After=network-online.target

[Service]
Type=forking  ← 「Type」は必ず「forking」を指定する(これ以外だと起動できない)
ExecStart=/opt/vpnserver/vpnserver start
ExecStop=/opt/vpnserver/vpnserver stop
KillMode=control-group
Restart=on-failure

[Install]
WantedBy=multi-user.target

systemdへ登録して起動する。

$ sudo systemctl daemon-reload
$ sudo systemctl enable vpnserver
$ sudo systemctl start vpnserver

設定ファイルがない場合は、コマンドライン管理ユーティリティの「vpncmd」やWindows版GUI管理ツールで設定する。

VPNクライアント

公式サイトから「SoftEther VPN Client」「Linux」「Intel x64 / AMD64 (64bit)」で検索して、作業ディレクトリへDLする。

※古いバージョンだとビルドに失敗するため「Ver 4.28, Build 9669, beta」以降のバージョンを利用する。

DLしたファイルを展開し、ビルドを実行する。

$ cd 作業ディレクトリ
$ tar xvf softether-vpnclient-xxxx-linux-x64-64bit.tar.gz
$ cd softether-vpnclient-xxxx-linux-x64-64bit/vpnclient
$ make
$ cd ../
$ sudo chown -R root:root vpnclient
$ sudo mv vpnclient /opt

一度、vpnclientを端末から起動して、vpncmdを使ってリモート設定を有効にする。

$ sudo /opt/vpnclient/vpnclient start
$ sudo /opt/vpnclient/vpncmd 
(snip)
vpncmd プログラムを使って以下のことができます。

1. VPN Server または VPN Bridge の管理
2. VPN Client の管理
3. VPN Tools コマンドの使用 (証明書作成や通信速度測定)

1 - 3 を選択: 2

接続先の VPN Client が動作しているコンピュータの IP アドレスまたはホスト名を指定してください。
何も入力せずに Enter を押すと、localhost (このコンピュータ) に接続します。
接続先のホスト名または IP アドレス: [Enter]

VPN Client "localhost" に接続しました。

VPN Client>RemoteEnable  ← 全て小文字でも良い
RemoteEnable コマンド - VPN Client サービスのリモート管理の許可
コマンドは正常に終了しました。

VPN Client>exit

以降は、Windows版のリモート管理ツールを利用して、リモートから仮想LANカードの追加【注】と仮想HUBへの接続設定が可能になる。

【注】「nic1」を指定すれば、仮想デバイス「vpn_nic1」が作成される。

一旦、vpnclientを終了する。

$ sudo /opt/vpnclient/vpnclient stop

設定ファイル「vpn_client.config」が用意できる場合は「/opt/vpnclient」へコピーしておく。

仮想LANカードへIPアドレスを設定するため、起動用シェルスクリプトを作成する。

$ sudo nano /opt/vpnclient/start_vpnclient.sh
#!/bin/sh
/opt/vpnclient/vpnclient start
sleep 3
ip a add 192.168.yyy.1/24 dev vpn_nic1
$ sudo chmod +x /opt/vpnclient/start_vpnclient.sh

systemd用ユニットファイルを作成する。

$ sudo nano /etc/systemd/system/vpnclient.service
[Unit]
Description=SoftEther VPN Client
After=network-online.target

[Service]
Type=forking  ← 「Type」は必ず「forking」を指定する(これ以外だと起動できない)
ExecStart=/opt/vpnclient/start_vpnclient.sh
ExecStop=/opt/vpnclient/vpnclient stop
KillMode=control-group
Restart=on-failure

[Install]
WantedBy=multi-user.target

systemdへ登録して起動する。

$ sudo systemctl daemon-reload
$ sudo systemctl enable vpnclient
$ sudo systemctl start vpnclient