RHEL9で作る自宅サーバ:Hotlineサーバの構築 ソースからインストールする方法

RHEL9パソコン自宅サーバ

さて、ずっと昔、今でいうSNSのような使い方をされていたHotlineというものがありました。もう今は誰も使っていないだろうけど、サーバだけは維持しています。

今回も、引き続き使えるように構築してみます。

パッケージ化されていないものはコンパイル

マイナーなものはパッケージ化されていないので、Unix版Hotlineのページから、ソースプログラムをダウンロードしてきます。

今回調べてみて、5年前だけどまだ維持されていたのにびっくりです。他の人が引き継いだみたいですね!現行のは2001年版の0.1.41なのでバージョン番号がだいぶ上がっていました。

[root@ace ~]# cd /usr/local/src/
[root@ace src]#
[root@ace src]# wget https://synhxd.sourceforge.net/releases/shxd-0.4.12.tgz
--2024-02-06 14:56:51--  https://synhxd.sourceforge.net/releases/shxd-0.4.12.tgz
synhxd.sourceforge.net (synhxd.sourceforge.net) をDNSに問いあわせています... 2606:4700:4400::6812:256f, 2606:4700:4400::ac40:9691, 172.64.150.145, ...
synhxd.sourceforge.net (synhxd.sourceforge.net)|2606:4700:4400::6812:256f|:443  に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 289865 (283K) [application/x-gzip]
`shxd-0.4.12.tgz' に保存中

shxd-0.4.12.tgz     100%[===================>] 283.07K   422KB/s 時間 0.7s

2024-02-06 14:56:52 (422 KB/s) - `shxd-0.4.12.tgz' へ保存完了 [289865/289865]

[root@ace src]# tar xvfz shxd-0.4.12.tgz
shxd-0.4.12/
:
省略
:
[root@ace src]# chown -R root:root shxd-0.4.12
[root@ace src]#

ファイルを/usr/local/srcに置いて、解凍しました。

ソースプログラムは、基本的に解凍したディレクトリに降りて、

  1. ./configure :環境設定
  2. make :コンパイル
  3. make install :インストール

の手順で行います。インストールの手順はINSTALLファイルに書かれていますので、それも読んでおきます。

[root@ace src]# cd shxd-0.4.12
[root@ace shxd-0.4.12]# ./configure --help
Usage: configure [options] [host]
Options: [defaults in brackets after descriptions]
Configuration:
  --cache-file=FILE       cache test results in FILE
  --help                  print this message
  --no-create             do not create output files
  --quiet, --silent       do not print `checking...' messages
  --version               print the version of autoconf that created configure
Directory and file names:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [/usr/local/shxd]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [same as prefix]
  --bindir=DIR            user executables in DIR [EPREFIX/bin]
  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
  --datadir=DIR           read-only architecture-independent data in DIR
                          [PREFIX/share]
  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
                          [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
  --includedir=DIR        C header files in DIR [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
  --infodir=DIR           info documentation in DIR [PREFIX/info]
  --mandir=DIR            man documentation in DIR [PREFIX/man]
  --srcdir=DIR            find the sources in DIR [configure dir or ..]
  --program-prefix=PREFIX prepend PREFIX to installed program names
  --program-suffix=SUFFIX append SUFFIX to installed program names
  --program-transform-name=PROGRAM
                          run sed PROGRAM on installed program names
Host type:
  --build=BUILD           configure for building on BUILD [BUILD=HOST]
  --host=HOST             configure for HOST [guessed]
  --target=TARGET         configure for TARGET [TARGET=HOST]
Features and packages:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --x-includes=DIR        X include files are in DIR
  --x-libraries=DIR       X library files are in DIR
--enable and --with options recognized:
  --enable-stdarg            Enable the explicit use of stdarg.h
  --enable-warnings          Show compiler warnings
  --disable-hotline-server   Don't compile hotline server
  --enable-tracker-server    compile tracker server
  --enable-socket-linger     enable the SO_LINGER socket option
  --enable-xmalloc-debug     Do some simple malloc debugging
  --enable-htxf-pthread      use pthread instead of fork or clone for htxf
  --enable-htxf-clone        use clone instead of pthread or fork for htxf
  --enable-htxf-preview      enable image preview (needs ImageMagick)
  --enable-hope              enable HOPE
  --enable-cipher            enable cipher
  --enable-cipher-idea       enable idea cipher
  --enable-compress          enable compress
  --enable-network           enable network
  --enable-sql               use mysql logging
  --enable-ipv6              IPv6 support. IPv4 will not work
  --with-socks[=dir]         use socks library in dir
  --with-socks-include=dir   use socks header in dir
[root@ace shxd-0.4.12]#

configureのオプションを見ると、インストール場所が「/usr/local/shxd」になっています。ここに、プログラム本体やデータを入れることになります。

また、INSTALLファイルによると、–enable-htxf-pthreadをつけるのが推奨だそうです。

RHELのお作法は、まだよくわかっていませんが、/opt/shxdのほうが良いのかな?ってことで、–prefix=/opt/shxd をつけて、configureをかけて見ましょう。

[root@ace shxd-0.4.12]# ./configure --prefix=/opt/shxd  --enable-htxf-pthread
creating cache ./config.cache
checking host system type... Invalid configuration `x86_64-unknown-linux-gnu': machine `x86_64-unknown' not recognized
:
省略
:
creating ./config.status
creating ./makefile
creating ./src/Makefile
creating ./src/hfs/Makefile
creating ./src/apple/Makefile
creating include/config.h
[root@ace shxd-0.4.12]#

次にmakeです。

[root@ace shxd-0.4.12]# make
Making all in src...
make[1]: ディレクトリ '/usr/src/shxd-0.4.12/src' に入ります
Making all in hfs...
:
省略
:
gcc -g -DHAVE_CONFIG_H  rcv.o accounts.o chat.o commands.o transactions.o files.o hlserver.o htxf.o hxd_config.o ident.o news.o string_m.o  hxd_main.o hxd_hlwrite.o hxd_tracker.o fd.o version.o xmalloc.o decode.o snprintf.o inet_ntoa_r.o -lpthread hfs/hfs.o apple/alias.o apple/files.o apple/mac_errno.o apple/mac_string.o apple/unicode.o  -o ../run/hxd
make: success -> binary should be in `run'
make[1]: ディレクトリ '/usr/src/shxd-0.4.12/src' から出ます
[root@ace shxd-0.4.12]#

特にエラーもないので、インストールします。

[root@ace shxd-0.4.12]# make install
Making install in src...
make[1]: ディレクトリ '/usr/src/shxd-0.4.12/src' に入ります
make[1]: 'install' に対して行うべき事はありません.
make[1]: ディレクトリ '/usr/src/shxd-0.4.12/src' から出ます
installation: installing into /opt/shxd
cp -f run/hxd /opt/shxd/hxd;
complete.
[root@ace shxd-0.4.12]#

インストールされたディレクトリに移動して、設定変更します。

セキュリティを考慮して環境設定

[root@ace shxd-0.4.12]# cd /opt/shxd/
[root@ace shxd]# ls -al
合計 576
drwxr-xr-x 5 root root     98  2月  6 15:10 .
drwxr-xr-x 3 root root     18  2月  6 15:10 ..
-rw-r--r-- 1 root root    237  2月  6 15:10 README
drwxr-xr-x 4 root root     32  2月  6 15:10 accounts
drwxr-xr-x 3 root root    164  2月  6 15:10 etc
drwxr-xr-x 2 root root    166  2月  6 15:10 exec
-rwxr-xr-x 1 root root 571616  2月  6 15:10 hxd
-rw-r--r-- 1 root root   5319  2月  6 15:10 hxd.conf
-rw-r--r-- 1 root root     22  2月  6 15:10 news
[root@ace shxd]# groupadd -r shxd
[root@ace shxd]# adduser -d /opt/shxd -g shxd -r -s /sbin/nologin shxd
[root@ace shxd]# chown -R shxd:shxd .
[root@ace shxd]# chmod -R o-rwx .
[root@ace shxd]# ls -alR
.:
合計 576
drwxr-x--- 5 shxd shxd     98  2月  6 15:10 .
drwxr-xr-x 3 root root     18  2月  6 15:10 ..
-rw-r----- 1 shxd shxd    237  2月  6 15:10 README
drwxr-x--- 4 shxd shxd     32  2月  6 15:10 accounts
drwxr-x--- 3 shxd shxd    164  2月  6 15:10 etc
drwxr-x--- 2 shxd shxd    166  2月  6 15:10 exec
-rwxr-x--- 1 shxd shxd 571616  2月  6 15:10 hxd
-rw-r----- 1 shxd shxd   5319  2月  6 15:10 hxd.conf
-rw-r----- 1 shxd shxd     22  2月  6 15:10 news
:
省略
:
./exec:
合計 76
drwxr-x--- 2 shxd shxd  166  2月  6 15:10 .
drwxr-x--- 5 shxd shxd   98  2月  6 15:10 ..
-rwxr-x--- 1 shxd shxd 9421  2月  6 15:10 accounts
-rwxr-x--- 1 shxd shxd 6969  2月  6 15:10 find
-rwxr-x--- 1 shxd shxd 4161  2月  6 15:10 help
-rwxr-x--- 1 shxd shxd  304  2月  6 15:10 login
-rwxr-x--- 1 shxd shxd 6435  2月  6 15:10 ls-exec
-rwxr-x--- 1 shxd shxd 5746  2月  6 15:10 mail
-rwxr-x--- 1 shxd shxd 5601  2月  6 15:10 netstat
-rwxr-x--- 1 shxd shxd   10  2月  6 15:10 ping
-rwxr-x--- 1 shxd shxd 1870  2月  6 15:10 seen
-rwxr-x--- 1 shxd shxd  185  2月  6 15:10 uname
-rwxr-x--- 1 shxd shxd  185  2月  6 15:10 uptime
-rwxr-x--- 1 shxd shxd  354  2月  6 15:10 whoami
[root@ace shxd]#

サーバを起動するための専用ユーザ、グループを作成します。

また、サーバ内のデータも、ここに格納しますが、他の人に見られないようにotherに対して読み書き実行権限を外しておきます。

[root@ace shxd]# cat /etc/passwd | grep shxd
shxd:x:991:991::/opt/shxd:/sbin/nologin
[root@ace shxd]#
[root@ace shxd]# cp -p hxd.conf hxd.conf.orig
[root@ace shxd]# vi hxd.conf
[root@ace shxd]# diff hxd.conf hxd.conf.orig
10c10
<    away_time 3600;
---
>    away_time 300;
13c13
<    gid 991;
---
>    gid -1;
16c16
<    uid 991;
---
>    uid -1;
33c33
<    enable-hfs no;
---
>    enable-hfs yes;
48c48
<    enable-cipher no;
---
>    enable-cipher yes;
79,80c79,80
<    individual_downloads 64;
<    individual_uploads 64;
---
>    individual_downloads 2;
>    individual_uploads 2;
132c132
<    log "./files/Drop Box/hotline.log";
---
>    log "./log";
[root@ace shxd]#

hxd.confを編集します。作成したユーザ、グループを指定すれば、デーモンをそのユーザで起動してくれます。これはdnsサーバと同様に、サーバプログラムの脆弱性などにより侵入されても、最低限の権限しか持てないようにするためです。

その他は現行に合わせて、適当に編集です。

[root@ace shxd]# scp -pr ns.zeke.ne.jp:/home/hotline/files .
root@ns.zeke.ne.jp's password:
:
省略
:
[root@ace shxd]#
[root@ace shxd]# ls -al accounts/
合計 0
drwxr-x--- 4 shxd shxd  32  2月  6 15:10 .
drwxr-x--- 6 shxd shxd 132  2月  6 17:10 ..
drwxr-x--- 2 shxd shxd  48  2月  6 15:10 admin
drwxr-x--- 2 shxd shxd  22  2月  6 15:10 guest
[root@ace shxd]# rm -r accounts/*
rm: ディレクトリ 'accounts/admin' 配下に入りますか? y
rm: 通常ファイル 'accounts/admin/UserData' を削除しますか? y
rm: 通常ファイル 'accounts/admin/access' を削除しますか? y
rm: 通常ファイル 'accounts/admin/conf' を削除しますか? y
rm: ディレクトリ 'accounts/admin' を削除しますか? y
rm: ディレクトリ 'accounts/guest' 配下に入りますか? y
rm: 通常ファイル 'accounts/guest/UserData' を削除しますか? y
rm: ディレクトリ 'accounts/guest' を削除しますか? y
[root@ace shxd]#
[root@ace shxd]# ls -al accounts/
合計 0
drwxr-x--- 2 shxd shxd   6  2月  6 21:46 .
drwxr-x--- 6 shxd shxd 132  2月  6 17:10 ..
[root@ace shxd]# scp -pr 192.168.1.4:/home/hotline/accounts/* accounts/
root@192.168.1.4's password:
:
省略
:
[root@ace shxd]# chown -R shxd:shxd .
[root@ace shxd]# chmod -R o-rwx .
[root@ace shxd]# ls -al
合計 588
drwxr-x---  6 shxd shxd    132  2月  6 17:10 .
drwxr-xr-x  3 root root     18  2月  6 15:10 ..
-rw-r-----  1 shxd shxd    237  2月  6 15:10 README
drwxr-x--- 15 shxd shxd    176  2月  6 21:46 accounts
drwxr-x---  3 shxd shxd    164  2月  6 15:10 etc
drwxr-x---  2 shxd shxd    166  2月  6 15:10 exec
drwxr-x--- 38 shxd shxd   4096 12月 22  2003 files
-rwxr-x---  1 shxd shxd 571616  2月  6 15:10 hxd
-rw-r-----  1 shxd shxd   5345  2月  6 15:31 hxd.conf
-rw-r-----  1 shxd shxd   5319  2月  6 15:10 hxd.conf.orig
-rw-r-----  1 shxd shxd     22  2月  6 15:10 news
[root@ace shxd]#

現行から、データファイルなどをコピーしてきます。あらかじめ入っているadminユーザにはパスワードが付いていないので、必ず消しておきます。

コピーが終わったら、もう一度、ユーザと権限を変更しておきます。

設定はちゃんとできたかな?

[root@ace shxd]# ./hxd

軽く動作を確認してみます。

WindowsクライアントからもMacクライアントからも、漢字がちゃんと見えるようですね。これで大丈夫でしょう。

RHELのお作法で、自動起動設定する

[root@ace shxd]# vi shxd.sh
[root@ace shxd]# cat shxd.sh
#!/bin/sh
cd /opt/shxd
./hxd

[root@ace shxd]# chmod 750 shxd.sh
[root@ace shxd]# chown shxd:shxd shxd.sh
[root@ace shxd]# ls -l shxd.sh
-rwxr-x--- 1 shxd shxd 30  2月  6 22:51 shxd.sh
[root@ace shxd]#
[root@ace shxd]# touch /etc/systemd/system/shxd.service
[root@ace shxd]# chmod 664 /etc/systemd/system/shxd.service
[root@ace shxd]# vi /etc/systemd/system/shxd.service
[root@ace shxd]# cat /etc/systemd/system/shxd.service
[Unit]
Description=Hotline server daemon
After=network.target

[Service]
ExecStart=/opt/shxd/shxd.sh
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target

[root@ace shxd]# ls -l /etc/systemd/system/shxd.service
-rw-rw-r-- 1 root root 167  2月  6 22:56 /etc/systemd/system/shxd.service
[root@ace shxd]#

次に、自動起動の設定です。

を参考に作ってみました。

[root@ace shxd]# systemctl daemon-reload
[root@ace shxd]# systemctl enable shxd
Created symlink /etc/systemd/system/multi-user.target.wants/shxd.service → /etc/systemd/system/shxd.service.
[root@ace shxd]# systemctl start shxd
[root@ace shxd]# systemctl status shxd
● shxd.service - Hotline server daemon
     Loaded: loaded (/etc/systemd/system/shxd.service; enabled; preset: disable>
     Active: active (running) since Tue 2024-02-06 22:58:48 JST; 32s ago
   Main PID: 1605 (shxd.sh)
      Tasks: 2 (limit: 23114)
     Memory: 640.0K
        CPU: 3ms
     CGroup: /system.slice/shxd.service
             tq1605 /bin/sh /opt/shxd/shxd.sh
             mq1606 ./hxd

 2月 06 22:58:48 ace.zeke.ne.jp systemd[1]: Started Hotline server daemon.
[root@ace shxd]# systemctl stop shxd
[root@ace shxd]# systemctl status shxd
○ shxd.service - Hotline server daemon
     Loaded: loaded (/etc/systemd/system/shxd.service; enabled; preset: disable>
     Active: inactive (dead) since Tue 2024-02-06 22:59:27 JST; 7s ago
   Duration: 39.167s
    Process: 1605 ExecStart=/opt/shxd/shxd.sh (code=killed, signal=TERM)
   Main PID: 1605 (code=killed, signal=TERM)
        CPU: 3ms

 2月 06 22:58:48 ace.zeke.ne.jp systemd[1]: Started Hotline server daemon.
 2月 06 22:59:27 ace.zeke.ne.jp systemd[1]: Stopping Hotline server daemon...
 2月 06 22:59:27 ace.zeke.ne.jp systemd[1]: shxd.service: Deactivated successfu>
 2月 06 22:59:27 ace.zeke.ne.jp systemd[1]: Stopped Hotline server daemon.
[root@ace shxd]# systemctl start shxd
[root@ace shxd]#

自動起動の登録、起動、停止もちゃんとできるようです。

Firewallの穴あけ

最後に、Firewallに穴を開けておきましょう。まだルータの設定をしていないので、外部からはアクセスできませんが。

[root@ace ~]# ss -natup| grep hxd
tcp   LISTEN 0      5                                0.0.0.0:5501                                  0.0.0.0:*     users:(("hxd",pid=1619,fd=2))
tcp   LISTEN 0      5                                0.0.0.0:5500                                  0.0.0.0:*     users:(("hxd",pid=1619,fd=1))
[root@ace ~]#

まずプログラムがどのポートを使っているのかを確認します。5500と5501のtcpのポートですね。

[root@ace ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: dns ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@ace ~]# firewall-cmd --zone=public --permanent --add-port=5500-5501/tcp
success
[root@ace ~]# firewall-cmd --reload
success
[root@ace ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: dns ssh
  ports: 5500-5501/tcp
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[root@ace ~]#

firewall-cmdコマンドで、設定、確認を行って完了です。

お勧めのKindle本です!

コメント