各種サーバ/ツールの導入手順をまとめました。尚、外部からアクセスするためには、ダイナミックDNS(以下、DDNS)サービスが利用可能な事と、ルータのポート開放を正しく行っておく必要があります。
別ページでまとめたので、参照して欲しい。
Ubuntuでは、SSHサーバのパッケージ名は「openssh-server」となる。
$ sudo apt install openssh-server
systemdの登録名は「ssh」なので、起動管理などは、以下で行う。
$ sudo systemctl status ssh
設定ファイル「/etc/ssh/sshd_config」を必要に応じて変更する。デフォルト設定でrootのログインはパスワード認証禁止になっているのでこのままでも運用可能だが、セキュリティー対策として接続ポートを変更する場合は、以下の項目を変更する。
port 22 ← 任意のポートへ変更する
「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のメールクライアントから受信テストを実施する。
メール受信できれば動作確認完了。
最後にLogwatchをインストールする。
$ sudo apt install logwatch
「/etc/cron.daily」へ「00logwatch」が設置され、1日1回root宛にメール送信される。
テスト送信する場合は以下を実行する(1日経たないとメールは作成されない)。
$ sudo logwatch --output mail
パッケージの更新確認を自動化するため「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」オプションを削除する
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 (以降、DDNS)サービスを提供している「MyDNS.JP」へ登録する。MyDNS.JPはIPv6へ対応しているが、現時点ではIPv4環境を前提とする。
MyDNS.JP
https://www.mydns.jp/
IPアドレスの通知方法として、代表的なDDNSクライアントであるDiCE (CUI版)を試したが、64bit環境では動作しないため、導入は断念。
定期的(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」へ保存される。
方法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」を採用する。
$ 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」を採用する。
SoftEther VPN プロジェクト
http://ja.softether.org/
公式サイトから「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管理ツールで設定する。
公式サイトから「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