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

x11vnc (GUIリモート操作)

別ページでまとめたので、参照して欲しい。

x11vnc設定手順

SSH (CUIリモート操作)

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

$ sudo apt install openssh-server

systemdの登録名は「ssh」なので、起動管理などは、以下で行う。

$ sudo systemctl status ssh

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

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

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

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

$ sudo apt install postfix
(途中表示される設定画面では「設定なし」を選択して進める)
Postfix was not set up.  Start with
  cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf
.  If you need to make changes, edit
/etc/postfix/main.cf (and others) as needed. 

設定ファイルのテンプレートをコピーして編集(追記)する。サーバPC自身(localhost)からと同一LAN内からの送信を受け付けるようにする。ログ配信などのため、サーバPCから外部への送信は、OP25B対策も兼ねてリレーサーバへ転送する。

$ sudo cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf
$ sudo nano /etc/postfix/main.cf
#### 同一LAN内とlocalhostからのみ配送を受け付ける
myhostname = mail.DDNS_NAME.example.jp  ← 「mail+DDNS名」を指定する
mydomain = DDNS_NAME.example.jp  ← DDNS名を指定する
myorigin = $mydomain
mydestination = DDNS_NAME.example.jp, PC_NAME.localdomain, localhost
↑ 「PC_NAME.localdomain」はサーバPCの実名
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 restart postfix

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

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

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

続いて、メール受信サーバである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

メールスプールへmboxファイルを作成/更新できるよう、パーミッションを変更する。

$ sudo chmod 777 /var/mail

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

$ sudo systemctl restart dovecot

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

メールの送受信テストを実行する。mailコマンドはデフォルトでインストールされていないので、事前にインストールしておく。

$ sudo apt install mailutils
(インストール完了後、以下を実行する)
$ mail root
Cc: [Enter]
Subject: TEST [Enter]
テストです。 [Enter]
[Ctrl+D]

root宛てのメールが「/var/mail/USER1」へ配信されている事を確認後、別PCのメールクライアントから受信テストを実施する。

Thunderbirdの設定例

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

最後に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
#     upgrade (when packages are upgraded)
MAILON="upgrade"

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

# When to log the cron-apt results to syslog.
# (when packages is upgraded)
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を提供するインターフェースを指定する。初期設定ファイルでは「INTERFACES」行がないため追記する。

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

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

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

authoritative;
default-lease-time 43200;
max-lease-time 86400;

subnet 192.168.xxx.0 netmask 255.255.255.0 {
  range 192.168.xxx.100 192.168.xxx.200;
  option domain-name-servers 192.168.xxx.210,192.168.xxx.211;
  option domain-name "example.jp";
  option routers 192.168.xxx.254;
  option broadcast-address 192.168.xxx.255;
}

起動時に「Can't create PID file」のエラーが出るので、ユニットファイルを修正する。「ExecStart」内の「exec dhcpd 〜」行の直前へ以下の行を挿入する。

$ sudo nano /lib/systemd/system/isc-dhcp-server.service
    if [ ! -d /run/dhcp-server ]; then mkdir -p /run/dhcp-server ; \
    chown dhcpd /run/dhcp-server ; chmod 775 /run/dhcp-server; fi; \

ユニットファイルをリロードして起動する。

$ sudo systemctl daemon-reload
$ sudo systemctl enable isc-dhcp-server  ← 導入時点で有効になっているはず
$ sudo systemctl start 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

vsftpd (FTPサーバ)

実績のある「vsftpd」を採用する。

$ sudo apt install vsftpd

設定ファイルを編集する。

$ sudo nano /etc/vsftpd.conf
(重要/有効箇所のみ)
# Run standalone?  vsftpd can run either from an inetd or as a standalone
# daemon started from an initscript.
listen=YES

# This directive enables listening on IPv6 sockets. By default, listening
# on the IPv6 "any" address (::) will accept connections from both IPv6
# and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6
# sockets. If you want that (perhaps because you want to listen on specific
# addresses) then you must run two copies of vsftpd with two configuration
# files.
listen_ipv6=NO

# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO

# Uncomment this to allow local users to log in.
local_enable=YES

# Uncomment this to enable any form of FTP write command.
write_enable=YES

# If enabled, vsftpd will display directory listings with the time
# in  your  local  time  zone.  The default is to display GMT. The
# times returned by the MDTM FTP command are also affected by this
# option.
use_localtime=YES

# Activate logging of uploads/downloads.
xferlog_enable=YES

# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES

# You may override where the log file goes if you like. The default is shown
# below.
xferlog_file=/var/log/vsftpd.log

# If you want, you can have your log file in standard ftpd xferlog format.
# Note that the default log file location is /var/log/xferlog in this case.
xferlog_std_format=YES

# ASCII mangling is a horrible feature of the protocol.
ascii_upload_enable=YES
ascii_download_enable=YES

# You may fully customise the login banner string:
ftpd_banner=Welcome to EXAMPLE FTP service.

# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
# (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
# the user does not have write access to the top level directory within the
# chroot)
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
allow_writeable_chroot=YES

# You may activate the "-R" option to the builtin ls. This is disabled by
# default to avoid remote users being able to cause excessive I/O on large
# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
# the presence of the "-R" option, so there is a strong case for enabling it.
ls_recurse_enable=YES

# This option should be the name of a directory which is empty.  Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
# access.
secure_chroot_dir=/var/run/vsftpd/empty

#### 以下オプション設定 ####
# ユーザ毎の設定ファイル格納ディレクトリ
user_config_dir=/etc/vsftpd_user_conf

# ドットファイル表示
force_dot_files=YES
####

データの保管場所を外付けHDD(初期設定参照)とし、ユーザがchrootするディレクトリを指定するため、設定ファイルを作成する。

$ sudo mkdir /etc/vsftpd_user_conf
$ sudo nano /etc/vsftpd_user_conf/USER1
# 「USER1」がchrootするディレクトリ
local_root=/mnt/data_1tb/ftp_root/USER1
$ sudo mkdir -p /mnt/data_1tb/ftp_root/USER1
$ sudo chown USER1:USER1 /mnt/data_1tb/ftp_root/USER1
$ sudo chmod 700 /mnt/data_1tb/ftp_root/USER1

chroot「しない」ユーザリストを作成する。

$ sudo nano /etc/vsftpd.chroot_list
USER99

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

$ sudo systemctl restart vsftpd

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