Server

sambaの外付けHDD間で定期増分バックアップを実行させたい。

Ubuntu上でHDD1→HDD2への自動ミラーリング
#backup.shの作成
sudo vi backup.sh
rsync -avud -delete /mnt/hdd1 /mnt/hdd2
#cronで定期実行(nano選択)
sudo crontab -e
1
#毎日3時に実行
0 3 * * * backup.sh > /var/log/cron.log 2>&1
#テスト実行
sudo bash backup.sh

-a アーカイブモード:ファイル属性を保持
-v 詳細モード:経過表示
-u 更新モード:宛先のファイルが新しい場合はコピーしない
-z 圧縮モード:転送データを圧縮し、帯域幅を節約
-delete :宛先に存在し送信元に存在しないファイルは削除する(完全ミラー)
2>&1:1が標準出力で2がエラー出力。この場合はエラー出力も標準出力にいれて吐き出してと設定している

ZABBIXのインストール復習
・基本は説明書通りにインストール可能
・upkgで必要なデータが入っていない(デモデータ)→tarのファイルからsqlだけ引っ張ってくる
・Agent2はpassiveでまず確認する

とりあえずBINDの設定はできたようなのでメモ。
Windows側からも名前解決できている。
#bindインストール
apt install bind9 bind9utils
# confファイルを編集
vi /etc/bind/named.conf
include "/etc/bind/named.conf.local";
// BIND設定オプションファイル
include "/etc/bind/named.conf.options";
// BINDゾーン情報ファイル
include "/etc/bind/named.conf.default-zones";
# Ubuntuはnamed.conf.localで設定
sudo vi /etc/bind/named.conf.local
zone "saku.XXX" {
type master;
file "/etc/bind/saku.XXX" ;
};
zone "1.23.172.in-addr.arpa" {
type master;
file "/etc/bind/1.23.172.db" ;
};
# オプションの設定
vi /etc/bind/named.conf.options
// SUBNET
acl internal-network {
172.23.1.0/24;
172.23.10.0/24;
};
options {
directory "/var/cache/bind";
forwarders {
8.8.8.8; // Google Public DNS
8.8.4.4; // Google Public DNS Secoundary
};
// ACLの指定
allow-query {
localhost;
internal-network;
};
recursion yes;
forward only;
dnssec-validation auto;
// いったんipv6は許可しない
listen-on-v6 { none; };
// バージョンは教えない
version "I won't tell you my version.";
};
# 正引きファイル
vi /etc/bind/saku.XXX
$TTL 86400
@ IN SOA ns.saku.XXX. root.saku.XXX. (
2024120501 ;Serial
3600 ;Refresh
1000 ;Retry
604800 ;Expire
86400 ;Minimum TTL
);
@ IN NS ns.saku.com.
@ IN A 172.23.1.1 ;DNSサーバーのIP
ns IN A 172.23.1.1
saku-samba IN CNAME saku-Ubuntu1
saku-Ubuntu1 IN A 172.23.1.1
saku-zabbix IN CNAME saku-Ubuntu2
saku-Ubuntu2 IN A 172.23.1.2
# 逆引きファイル
vi /etc/bind/1.23.172.db
$TTL 86400
@ IN SOA ns.saku.XXX. root.saku.XXX. (
2024120501 ;Serial
3600 ;Refresh
1000 ;Retry
604800 ;Expire
86400 ;Minimum TTL
);
@ IN NS ns.saku.XXX.
1 IN PTR ns.saku.XXX.
2 IN PTR saku-Ubuntu2.saku.XXX.
# UFWの許可
ufw allow 53/tcp
ufw allow 53/udp
# 設定の反映
systemctl restart bind9 bind9utls
systemctl status bind9
# 通信確認
dig saku.XXX @127.0.0.1
dig -x 172.23.1.1 @127.0.0.1
# ローカル側のDNS設定
vi /etc/netplan/99-cloud-init.yaml →nameserver変更
もしくは
vi /etc/resolv.conf →DNSserverのIPに変更

CNAMEで別名を作成したら
sudo:unable to resolve host saku-Ubuntu1: Name or service not known
と表示されて実行できなくなった。
どうやらホスト名が解決できなかったことが問題らしい。
vi /etc/hosts
127.0.1.1 hostname.domainname saku-Ubuntu1
と変更したところ実行できた。この部分も変更しておいた方が良いのか?注意。

NTP(chrony)のセットアップ
メイン:ntp.nict.jp
バックアップ:0.jp.pool.ntp.org / 1.jp.pool.ntp.org / 2.jp.pool.ntp.org
jp.pool.ntp.orgは、NTP POOL PROJECTのNTPサーバのこと。
# インストール
apt install chrony
# 有効化
systemctl enable chrony
systemctl start chrony
# confのバックアップ
cp -a /etc/chrony/chrony.conf /etc/chrony/chrony.conf.org
# confの編集、pool部分はコメントアウト
vi /etc/chrony/chrony.conf
# pool ntp.ubuntu.com iburst maxsources 4
# pool 0.ubuntu.pool.ntp.org iburst maxsources 1]
# pool 1.ubuntu.pool.ntp.org iburst maxsources 1
# pool 2.ubuntu.pool.ntp.org iburst maxsources 2
# minpollとmaxpollを指定するのがWANのNTPを指定する際のマナーらしい
# ntpサーバーはメイン1台、バックアップ3台設定しておく
server ntp.nict.jp minpoll 6 maxpoll 8
server 0.jp.pool.ntp.org minpoll 6 maxpoll 8
server 1.jp.pool.ntp.org minpoll 6 maxpoll 8
server 2.jp.pool.ntp.org minpoll 6 maxpoll 8
# 最終行に許可IPを設定
# Allow IPs
deny all
allow 172.23.1.0/24
allow 172.23.10.0/24
# サービスの再起動
systemctl restart chrony
# NTPサーバーとの通信確認
chronycc sources

<server / poll> <NTPサーバのホスト名> と記載することで、上位のNTPサーバを設定できます。
オプションで記載しているminpollとmaxpollは上位のNTPサーバに問い合わせを行う間隔です。
2の階乗秒の間隔で取得しに行きます。(minpoll 6であれば最小64秒間隔、maxpoll 10であれば最大1024秒間隔)
これについては、内部のNTPサーバを参照するのであれば特に気にする必要はありませんが、外部のNTPサーバに問い合わせを行う場合、マナーとして設定しておきましょう。

NTPサーバーの設置と適用が終わったのでTFTPサーバーを立てて、コンフィグとファームウェア置き場を作る。
# TFTPサーバーのインストール
apt install tftpd-hpa
#オプションファイルの編集(読み込み専用になっているため、オプションにCreateを追加)
vi /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure --create"
# サービスの有効化
systemctl enable tftpd-hpa
systemctl restart tftpd-hpa
ystemctl status tftpd-hpa
# ファイアウォールの許可設定
ufw allow 69/udp
# Ciscoからコンフィグのアップロードテスト
copy running-config tftp
> 今回立てたサーバーのIP
> test-running-config
# サーバー側でアップロードされたか確認
ls -a /srv/tftp

cronが正常に動いていないようなので確認する。
実行自体がされていないよう。
"* * * * *"で実行したところfile not found.の表示が出たので、とりあえずディレクトリ変えてみた。
/home/XXX/backup.sh > /usr/local/crontab/backup.sh
bashとshは基本的には同じだが、拡張bashの実行時にshが拾いきれない動きがあるとのこと。可能ならbashで動かすのがいいのかも。

ZABBIX側のUbuntuにNTPクライアントの設定が入れられていなかった。
これでクライアントとしての設定も終了。
# chronyのインストール
apt install chrony
# chronyのコンフィグのバックアップ&編集
cp -a /etc/chrony/chrony.conf /etc/chrony/chrony.conf.org
vi /etc/chrony/chrony.conf
# 参照元を指定(poolの入っているものはコメントアウトして使わない)
pool 172.23.1.2 iburst を追加
# サービスの再起動と有効化
systemctl enable chrony
systemctl restart chrony
systemctl status chrony
chronyc sources
# Cisco側の設定
ntp server 172.23.1.2
show ntp associations
# YAMAHA側の設定
schedule at 1 */* 00:00 * command ntpdate 172.23.1.2

外付けSSDが激安で手に入ったので、ここにSyslogサーバー立ててログ集約する。

SSHが何やっても繋がるようにならない。どうすればいいんだこれ。

Ubuntu IP固定の手順→NICでリンクアップしてないと表示されない。
cp /etc/netplan/50-cloud-init /etc/netplan/99-cloud-init.yaml
vi /etc/netplan/99-cloud-init.yaml
dhcp4: false
dhcp6: false
addresses:
- 172.23.1.3/24
routes:
- to: default
via: 172.23.1.254
nameservers:
addresses:
- 172.23.1.1

Ubuntu24.04LTS SSHの設定(パスワード認証)
# opensshのインストール
apt install openssh-server
# 接続ユーザーの.sshディレクトリのパーミッション変更
chmod 700 /home/ユーザー名/.ssh
# sshd_config(サーバー側)の変更
vi /etc/ssh/sshd_config
PermitRootLogin without-password
PasswordAuthentication yes
PermitEmptyPassword no
# サービスの再起動
systemctl restart sshd
OSの再インストールを行って同じ手順で2回目は成功。ホスト名の未設定っぽい。

外付けHDDのマウントとフォーマット
# 外付けHDDの確認
fdisk -l
# フォーマット
umount -a /dev/sda
mkfs -t ext4 /dev/sda
# UUIDの確認
blkid /dev/sda
# マウントディレクトリの作成
mkdir /mnt/hdd
chmod 744 /mnt/hdd
# マウントの記載
vi /etc/fstab
UUID=<uuid> /mnt/loghdd/rsyslog ntfs defaults 0 0
# 再起動して確認
shutdown -r now
# うまくいかなかったら、以下で調整
mount -a
df -h

SSH接続時にWARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!と表示されてアクセス不可時
SSHで接続する際には接続先毎にローカルに情報が保管されるため、中身が別のサーバになったりしていると騙されてる?って怒られることになる。
ssh-keygen -R 172.23.1.3

DNSスレーブサーバーの設定。
local内に設定したのでこちらも同じ場所に設置中。
# マスターサーバーの設定変更
# named.conf.optionsに以下を追加
notify yes;
also-notify { 172.23.1.2; };
# named.conf.localにゾーンごとに以下を追加
allow-transfer { 172.23.1.2; };
# スレーブサーバーの設定変更
# BINDのインストール
apt install bind9 bind9utils
# named.cconf.optionsの設定
acl internal-network {
172.23.1.0/24;
172.23.10.-/24;
};
options {
listen-on port 53 { 127.0.0.1; 172.23.1.2; };
# 内部からの問い合わせ
allow-query {
localhost;
internal-network;
};
# キャッシュサーバーなので再帰問い合わせ許可(noで使うのは権威サーバー)
recursion yes;
# named.conf.local に追加
# zoneの名前としてドメイン名を指定
zone "saku.XXX" {
# スレーブで操作させるのでslave
type slave;
masters { 172.23.1.1; };
file "slaves/saku.XXX";
allow-transfer { none; };
};
# IPv4逆引き
zone "1.23.172.in-addr.arpa" {
type slave;
masters { 172.23.1.1; };
file "slaves/1.23.172.db";
allow-transfer { none; };
};
};
# スレーブされたゾーンファイルが書き込めないことがある。permission deniedの場合は以下の設定を追加(apparmorの設定変更)
vi /etc/apparmor.d/usr.sbin.named
/var/named/slaves/** rwk,

syslogサーバーの設定(rsyslog)
# ★受信側共通
# インストール
apt install rsyslog
# ファイアウォールの許可
ufw allow 514/tcp
ufw allow 514/udp
# 設定ファイル(/etc/rsyslog.conf)の変更
vi /etc/rsyslog.conf
# MODULES設定
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")
# UDPに限定
$AllowedSender UDP, 127.0.0.1, 172.23.1.0/24, 172.23.10.0/24
# GLOBAL設定
$template recievelog, "/var/log/rsyslog/%HOSTNAME%/%$year%-%$month%-%$day%.log"
*.* ?recievelog
# 保存フォルダの作成
mkdir /var/log/rsyslog
# 権限の変更
chown syslog:syslog /var/log/rsyslog
# サービスの再起動
systemctl restart rsyslog
# ★送信側の設定
# インストール
apt install rsyslog
# ファイアウォールの許可
ufw allow 514/udp
ufw allow 514/udp
# 設定ファイル(/etc/rsyslog.conf)の変更
vi /etc/rsyslog.conf
# MODULES設定
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")
# GLOBAL設定(ログ出力先の指定、全ログ対象)
*.* @172.23.1.2:514
# 最下部に追記
action(type="omfwd" Target="172.23.1.2" Port="514" Protocol="udp")
# サービスの再起動
systemctl restart rsyslog
# ログのテスト送信
logger "test log: syslog delivered!"
#ログの確認
tail /var/log/rsyslog/%HOSTNAME%/日付.log
# rsyslogが正常に動作しているか確認
systemctl status rsyslog
journalctl -xeu rsyslog
# rsyslogでエラーが発生していないか確認
rsyslogd -N 1
# /etc/rsyslog.d/50-default.comfの編集
*.* @172.23.1.2:514
これでもrsyslogのディレクトリ内にホスト名のディレクトリが作成されなかった。
以下の設定を投入したところ作成された。
# ホスト名の変更
vi /etc/hosts
127.0.0.1 saku-Ubuntu1 localhost.localdomain localhost
127.0.1.1 saku-Ubuntu1 hostname.domainname

rsyslogのHDDマウントが失敗しすぎてjournalのログが溢れて容量圧迫。
プロセス停止しようとしたが、syslog.socketがアクティブとなり停止できず、以下のコマンドで停止させられた。
journalctl →HDDマウントのパーミッションエラーが連発
systemctl stop syslog.socket rsyslog.service

ディスク容量の空き具合を確認するコマンド。
# ディスクのパーティション単位の空き容量確認
df -h
# ディレクトリごとの容量確認(var内のディレクトリをMB単位で抽出、KBにするなら-m を-kにする、大きいものから10個)
sudo du -m /var/* | sort -rn | head -10
# ディレクトリごと直下以下も削除する
rm -rf /ディレクトリ名

syslogを外付けHDDに出力しようとしていたが、ずっとPermission Deniedと表示されてエラーが止まらなかったが、UbuntuのアプリケーションセキュリティであるAppArmorに弾かれていたと理解。以下の設定投入。
# AppArmorのアプリごとの設定ファイルを確認
ls -a /etc/apparmor.d
# 該当するファイルを開く(パーティション設定はusr.sbin.XXXの中に入れる)
vi /etc/apparmor.d/usr.sbin.rsyslog
/mnt/loghdd/rsyslog/ r,
/mnt/loghdd/rsyslog/** rwk,

Ubuntu24.04のタイムゾーン変更
# 現在の状態を確認
strings /etc/localtime
TZif2
TZif2
UTC0 →UTCのままになってる
# タイムゾーンの変更
datetimectl set-timezone Asia/Tokyo

Q.すでにデータが入っているディレクトリに、HDDをマウントした場合どのような挙動をする?
A.マウントされたHDDのデータは閲覧できるが、もともとそのディレクトリに入っていたデータは閲覧できなくなる。
今回はデータが入った状態で誤ってマウント→どうしても容量が何やっても減らない→原因はもともとディレクトリに入っていたファイルの容量が大きかった、ということが発生。
ディレクトリパスも、マウントしたものと統合され存在自体が見えなくなってしまうため、データがないことを確認してからマウントしましょう…。

Syslogの出力量が多すぎて、一旦出力制御をしてみた。/etc/systemd/journald.confを編集する。
# journald.conf の編集
vi /etc/systemd/journald.conf
# 1分で300回のログ発生があった場合は破棄する
RateLimitInterval=1m
RateLimitBurst=300
# サービスの再起動
systemctl restart systemd-journald

Ubuntu上でrm -rfでディレクトリごと消しても、容量が戻ってこないことがあった。
一旦すべてのマウントをやり直すことで改善するらしい。
# 対象のサービスをまず止める(今回はrsyslog)
systemctl stop syslog.socket rsyslog.service
# 消す
rm -rf /var/log/syslog
# すべてのマウント状態解除
umount -a
# すべて再マウント
mount
# 容量確認
df -h

Cronのログで以下のものが繰り返し表示され、ログを圧迫していた。
2024-12-13T14:17:01+09:00 saku-Ubuntu1 CRON[6717]: pam_unix(cron:session): session opened for user root(uid=0) by root(uid=0)
2024-12-13T14:17:01+09:00 saku-Ubuntu1 CRON[6717]: pam_unix(cron:session): session closed for user root
2024-12-13T17:05:01+09:00 saku-Ubuntu1 CRON[7512]: pam_unix(cron:session): session closed for user root
2024-12-13T14:25:01+09:00 saku-Ubuntu1 CRON[6753]: pam_unix(cron:session): session opened for user root(uid=0) by root(uid=0)
2024-12-13T14:25:01+09:00 saku-Ubuntu1 CRON[6753]: pam_unix(cron:session): session closed for user root
調べたところ、一応以下の手順で非表示にはできるとのこと。
# /etc/pam.d/common-session-noninteractive の編集
vi /etc/pam.d/common-session-noninteractive
# 以下のように編集
# here are the per-package modules (the "Primary" block)
session [default=1] pam_permit.so
# here's the fallback if no module succeeds
session requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
session required pam_permit.so
# and here are more per-package modules (the "Additional" block)
★この一行を追加
session [success=1 default=ignore] pam_succeed_if.so service in cron quiet use_uid
session required pam_unix.so
おまじないなのか?時間を取って確認が必要。

まだ改善せず表示されていそうな感じがする。

rsyslogのエラーは収束しそうなので、ログローテーションの設定を進めることに。

ログローテーションの設定
デフォルトの設定とサービス別の設定があるらしい。
# デフォルトの設定は以下
vi /etc/logrotate.conf
Weekly → Daily
rotate 4 → 1
# サービスごとの設定はもう一つ下の階層
vi /etc/logrotate.d/rsyslog
Weekly → Daily
rotate 4 → 1

rsyslogのディスククエリエラーの暫定対応
サーバー1台からのみ、以下のエラーがずっと出続けていた。
rsyslogd[40403]: rsyslogd: error starting up disk queue, using pure in-memory mode
rsyslogd[40403]: rsyslogd: action-9-builtin:omfwd queue: error creating disk queue - giving up.
一応キューの部分を対応したところ、今のところエラーが表示されなくなった。
# spoolのディレクトリの下層にrsyslogのディレクトリがあるので移動
cd /var/spool/rsyslog
# この下に書き込みができずスプールされたデータが多数存在していた
ls -a
saku-Ubuntu1.saku.com.00000061
saku-Ubuntu1.saku.com.00000062
saku-Ubuntu1.saku.com.00000063
saku-Ubuntu1.saku.com.00000064
saku-Ubuntu1.saku.com.00000065
saku-Ubuntu1.saku.com.qi →本当はこれだけっぽい?
# 全部消してサービス再起動してみた
rm *
systamctl restart syslog.socket rsyslog.service
もっとLinuxに慣れたら仕組みを理解したい。

ZABBIXのSNMP監視のためのテスト実施
SNMPでの監視を行う場合、マネージャとエージェントでSNMPの通信が取れているかを確認する。
手順は以下の通り。
#必要な機能をインストール
apt install net-snmp net-snmp-utils
#疎通ができているかを確認(バージョンv2c、コミュニティ名はrouter)
snmpwalk -v 2c -c router <監視先IP>

VPN環境(Wireguard)の構築
WireguardをLinuxにインストールし、外部からVPNでリモートアクセスができるようにする。
DDNSの設定
パブリックIPが動的IPなので、DDNS Nowを使用して対応することにした。
- DDNS Nowにアクセス
- 希望のホスト名とパスワードを入力
- マニュアルに沿って、cronで定期的に通信を出すようにしておく(https://ddns.kuku.lu/manual.php#cron )
Wireguardのインストール
今回はProxmox上にCTを作成し、そっちを経由して宅内へ接続する。
-
ProxmoxでCTの作成(今回は????を利用)
-
Wireguardのインストール
#インストール sudo apt install wireguard #秘密鍵と公開鍵の作成→メモ wg genkey | tee /etc/wireguard/$HOSTNAME.private.key | wg pubkey > /etc/wireguard/$HOSTNAME.public.key sudo apt install iptables →これでFW設定する
-
設定ファイルの作成
#ディレクトリの移動 cd /etc/wireguard #設定ファイルの追加と編集 vi /etc/wireguard/wg0.conf →設定ファイル名はインターフェースの名前と同じにすること [Interface] PrivateKey = <サーバーの秘密鍵> Address = 10.0.0.1/24 ListenPort = 51820 PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0@if13(仮想) -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0@if13(仮想) -j MASQUERADE Table = off [Peer] PublicKey = <接続側の公開鍵> AllowedIPs = 10.0.0.2/32
-
設定ファイルへ追加設定
仮想インターフェイスの部分は都度修正してね。#接続したWireguardサーバーを踏み台にして、LAN内端末へ接続できるようにする(削除時は消す) [Interface]に追加 PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0@if13(仮想) -j MASQUERADE; iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0@if13(仮想) -j MASQUERADE; iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -j MASQUERADE #デフォルトではすべての通信をVPN先に向けているため、ローカルでインターネットアクセスを可能にする [Interface]に追加 Table = off #カーネルパラメータを変更し、パケットフォワードができるようにする vi /etc/sysctl.conf net.ipv4.ip_forword=1 のコメントアウトを外して有効化する
-
サービスの再起動
#作成したインターフェースでWireguardを起動する systemctl enable wg-quick@wg0 systemctl start wg-quick@wg0 #ルートが作成されたか確認 ip route
-
システム再起動
うまくいかない場合はシステムごと再起動してしまう。

VPNの構築(Wireguard)ネットワーク設定
内向きの通信になるため、静的NAPTの設定が必要になる。
今回はauひかりと891fjでの構成で設定をリマインド。
auひかりHGWの設定
今回はとりあえずDMZに設定を入れ、中へ通すようにする。
- HGWの設定画面に入る
- DMZホスト設定>ONにし、IPアドレスにホスト側(今回は10.1.1.2)を入れる
- DHCPを無効にしておく
Cisco 891fjの設定
WANから届く特定のポートへの通信を特定のIPへ振り分ける。
#静的NAPTの設定
ip nat inside source static udp <WAN側IP> <WAN側ポート番号> interface <インターフェース名> <Wireguardサーバー側ポート番号>
#今回は
ip nat inside source static udp 172.23.1.11 51281 interface gi8 51280
Android Wireguardの設定
- 空の状態から作成
- 以下のように設定
・名前…適当に
・秘密鍵…作成したクライアントの秘密鍵
・アドレス…wg0.confのpeerに入力したIP(今回は10.0.0.2/32)
・ポート…wg0.confのpeerに入力したポート(今回は51821)
・ピア側公開鍵…作成したサーバーの公開鍵
・ピア側AllowedIP…wg0.confのAllowedIPに入れた許可範囲IP(今回は0.0.0.0/0)
・エンドポイント…固定グローバルIPもしくはホスト名:接続ポート(今回はホスト名:51821) - 接続し、送信と受信がどちらも値が増え、直近のハンドシェイクが更新されていれば成功

Wireguardへアクセスできるクライアントを増やす(Windows)
複数の端末で証明書を作成して、それぞれアクセスできるようにする。
wg0.confの編集
wg genkey と wg pubkeyで追加クライアント用の秘密鍵と公開鍵を準備し、設定ファイルを編集。
#wg0.confを開く
vi /etc/wireguard/wg0.conf
#Peerの設定を追加する(Interfaceは変更しない)
[Peer]
PublicKey = <クライアントの公開鍵>
AllowedIPs = 10.0.0.3/32
クライアント用証明書の作成
Windowsは面倒なのでサーバー上で作ってしまう。
wg genkey | tee /etc/wireguard/<PC名>.private.key | wg pubkey > /etc/wireguard/<PC名>.public.key
Windowsの設定
Wireguardのアプリケーションをインストールして、メモ帳などで以下の設定ファイルを作成する。
#メモ帳などで以下の内容を入力
[Interface]
Address = 10.0.0.3/32
PrivateKey = <クライアントの秘密鍵>
[Peer]
PublicKey = <Wireguardサーバーの公開鍵>
AllowedIPs = 0.0.0.0/0
Endpoint = <ホスト名>:51821
PersistentKeepalive = 25
名称をwg0.confなどに変更し、「ファイルからインポート」を行うと設定を入れられる。
接続の可否はハンドシェイクができたかで判断できる。
IPは前回設定した1つしか使用できないわけではなく、Peerで追加していけば大丈夫のよう。
DNSの設定
この設定だとLAN内の通信だけしか通らないため、コントロールパネル>ネットワーク>wg0を選択し、
DNSを固定(うちの設定だと172.23.1.9と172.23.1.10)、もしくはDHCPに変更しておく。IPも固定とDHCPどっちでもよい。
そうするとインターネットにも出られるようになる。

プロキシサーバーの構築(Squid)
Proxmox上にプロキシサーバーを立てて、フォワードプロキシとして外向き通信で使用する。
IPは172.23.1.13、ポートはデフォルトの3128を使用する。(conf内で3128検索すれば表記出てくる)
Firewalldのインストール
ノード内ファイアウォールとして今回はfirewalldを使用してみる。
#firewalldのインストール
apt install firewalld
#ファイアウォールの設定内容確認
firewall-cmd --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh →ここにsquidを追加したい
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
#firewallを通すサービスとしてsquidを登録
firewall-cmd --add-service=squid --zone=public --permanent
firewall-cmd --add-service=squid --zone=public
Squidのインストールと設定
#Squidのインストール
apt install squid
#設定ファイルのバックアップ
cp -a /etc/squid/squid.conf /etc/squid/squid.conf.org
#設定ファイルの編集
vi /etc/squid/squid.conf
#デフォルトで記載されているlocalnetのネットワークをそのまま使うが、http_accessの記載がないので追加
http_access allow localnet
#DNSの設定も入っていないので追加
dns_nameservers 172.23.1.9 172.23.1.10 →コメントアウトされているのを外す
#LAN内のフォワードを許可する
vi /etc/sysctl.conf
#以下の行のコメントアウトを外す
net.ipv4.ip_forward=1
#サービスの有効化と再起動
systemctl enable squid
systemctl start squid
Windowsでプロキシの設定
-
設定>プロキシの設定>プロキシサーバーを使う
-
プロキシIPをサーバーのもの、ポートは3128にする
-
接続し、インターネットに繋がるか確認する
-
サーバー側で変換されているか確認するには、
tail /var/log/squid/access.log で確認できる

ドキュメント管理サーバーの構築(Paperless-ngx)
資料の置き場が欲しかったので、Paperless-ngxを立ち上げることにする。
練習でDocker上に立てる。
RHEL系のDockerインストール
RHEL系で使用できるdnfとyumを活用する。
今回はRocky Linux 9を使用。
#まずはyum-utilsパッケージのインストールし、Dockerのリポジトリを登録
dnf install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#Dockerのパッケージをインストール
dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#インストール中のGPG鍵が「060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35」になっていることを確認して「y」で進める
Fingerprint: 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35
From : https://download.docker.com/linux/centos/gpg
これでよろしいですか? [y/N]: y
#Docker自動起動の設定
systemctl start docker.service
systemctl enable docker.service
#一般ユーザーの作成(※Paperless-ngxの立ち上げでは一般ユーザーからの起動が必要)
useradd xxx
passwd xxx →パスワード指定
#Dockerグループを作成し、ユーザーを追加する
newgrp docker
usermod -aG docker xxx
#ユーザーが登録されているか確認
cat /etc/passwd
#一般ユーザー側でwgetを使うので、インストールしておく
dnf install wget
この後は作成した一般ユーザーに切り替える。
#Paperless-ngxのインストールを行う
bash -c "$(curl --location --silent --show-error https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/install-paperless-ngx.sh)"
#インストールスクリプトでいくつか指定を求められる
・サイト名
・ポート番号
・ユーザー名とパスワード
・メールアドレス(そのままで大丈夫)
#Docker上でコンテナの作成が進む→結構時間がかかる
完了後、http://<サーバーIP>:8000 でアクセスするとサインイン画面が表示されるので、設定時に入力したIDパスワードでアクセスする。
結構GUIがいい感じ…、元がラズパイだから容量少ないのでどこかで足したい。
活用していきたい!PDF記事とかまとめて!

ストリーミングサーバーを作る(nginxとrtmp)
ほぼ記載内容のままでOK。
ファイアウォールはufwを使用した。
めちゃくちゃ簡単なのに、スライド共有程度なら問題なく配信できている感じ。
(映像などはもちろん厳しい)
ここからチューンアップできたらもっと面白そう。

DNSはどこに向ける?
基本的にはパブリックDNSとかではなく、DNSサーバーのフォワード先とかならISPのDNSを設定しよう。

DifyをローカルのLinux上に構築→RAGを作ってみた
社内文書を参照するAIボットを作れるといいな、と思っていた矢先、Difyがローカルで立てるのは無料ということでやってみた。
・AlmaLinux9(Hyper-V上)
・例としてJリーグの運営規約等を使用
・Google Gemini AIのAPI(1.5 Flash)を使用(1分あたりのリクエスト数(RPM)が15、1分あたりのトークン数(TPM)が100万、1日あたりのリクエスト数(RPD)が1,500以内)
AlmaLinuxで基本設定
-
アップデートをかけておく
dnf -y update
-
IPアドレスを固定する
nmcli connection modify ipv4.addresses <サーバーIP/Prefix> nmcli connection modify ipv4.gateway <ゲートウェイIP> nmcli connection modify ipv4.dns <DNSサーバー> nmcli connection modify ipv4.method manual
-
設定内容を確認
ip a ※Docker内でも仮想NICにIPが振られるが、そのままでいい
AlmaLinuxでDifyをインストール
-
Dockerをインストールするため、レポジトリをインストールしておく
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
-
Dockerのインストールを行う
dnf -y install docker-ce docker-ce-cli
-
Dockerを起動し、自動起動を有効化する
systemctl start docker systemctl enable docker
-
Difyのインストールする際にGitからダウンロードが必要になるため、Gitコマンドをインストールする
dnf -y install git
-
DifyをGitからダウンロードし、インストールを実行
#ディレクトリの移動 cd /usr/local/src #gitでダウンロード git clone https://github.com/langgenius/dify.git #dockerファイルのあるディレクトリへ移動 cd dify/docker #dockerの起動 docker compose up -d
-
コンテナが立ち上がってくるまで待つ
-
コンテナが起動すれば完了
firewalldが有効になっている場合、サービスの登録等も必要なので注意。ufwならHTTP周りのポート開ける。
Gemini AI APIの設定
- https://aistudio.google.com/ にアクセスする
- Get API Keyをクリックし、キー作成画面へ移動
- すでにGoogle Cloudでプロジェクトを作成していれば、そのプロジェクトを選択(選択しないと新規作成になる
- APIキーの作成をクリックし、キーをコピーする
Difyの起動→RAGの作成
- http(s)://<IPアドレス>/install で管理画面へアクセス
- メールアドレス、ID、パスを入れる
- 作成したアカウントでサインイン
- 「ナレッジ」に参照したい文書をアップロードする(PDFなどもOK)
- 基本的にはそのままの設定でOK、取り込む
- 「設定」画面から、モデルプロバイダーを選択→Geminiを選び、先にコピーしていたキーを貼り付ける
- 変更を反映させる
- ボットを作成し、参照先としてアップロードした文書を指定
- あとは聞きたい内容を入れてみる
- 動作しない場合は、チャット画面上部の「モデル」→Gemini 1.5 Flashに変更する
注意事項
・Gemini AIは無料枠を使っているので、頻繁にリクエスト出しすぎるとお金がかかる。
・Google Cloud側で課金時に通知されるようにしている。(CE作成で設定済みだった)
・無料枠は機械学習に使われるので、利用する情報には要注意。
・一回目の構築ではDockerへのアクセスが非常に遅かった。原因はあまりわかっていない。
感想
Hyper-V上なので、かなりリソースを少なくしたがおおよそ問題なく動いていたし、Difyに関する商用利用もどうやらクリアしそうだった。
選択するクラウドサービスによって価格は変わるが、きちんとRAGとして動作するし好感触。
課金覚悟でもう少し掘り下げて、Difyでできる機能を試してみたい。

ブラウザでの初期設定時に「Internal Server Error」と表示された。
以下の設定を行ったところ、改善。
#docker-compose.yamlを編集し、一部の値を変更する
CONSOLE_API_URL=https://api.console.dify.ai
CONSOLE_WEB_URL=https://console.dify.ai
SERVICE_API_URL=https://api.dify.ai
APP_API_URL=https://app.dify.ai
APP_WEB_URL=https://api.app.dify.ai

DifyにGPT-4o-miniでチャットボット作成
どうやらGPT-4o-miniが割と高速でコスパがよく、セキュリティも担保されているようで試してみる。
Open AIのアカウント登録
- https://chatgpt.com/ にアクセス
- 今回はGoogleアカウントで登録
- API Keysから、APIキーを作成(この時点でLLMの設定などはない)
- コピーしておく
Difyへの設定
- 設定から「モデルプロバイダー」を選択
- Open AI→セットアップを選択
- API Keysの部分に、先ほどコピーしたキーを貼り付けて進める
Difyへの登録時にエラーが出た場合
モデルプロバイダーにAPIキーを登録しようとすると、以下のエラーが表示されることがある。
RateLimitError: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the
これは、クレジットに1円もチャージしていないことが原因だった。
その際は、
- https://platform.openai.com/settings/organization/billing/overview にアクセス
- クレジットカード登録とクレジットの追加をする(最低5ドル)
- APIキーを再作成する
- Dify側でも画面をリロードし、再度設定を試みる
これで解決するはず。
チャットボットの作成
- スタジオに移動し、新規からチャットボットを作成する
- ★チャット画面上部の「モデル」を確認し、「gpt-4o-mini」を選択する
- 必要なテキストや文書をナレッジに保存しておき、利用時に選択して参照させる
注意点
最後のチャットボットを動かす際、必ず「gpt-4o-mini」に切り替えてから実行すること。
APIキーの発行時にはどのモデルを使うかは選択しておらず、このチャットからリクエストを送る際に選択することになるので、要注意すること。
かなり課金額が違う(0.5ドルと0.015ドル)。

プロンプトに以下をいれれば、他の返信はしない。
あなたのタスクは、「テレワークセキュリティ注意点」に記載のある内容を引用しながら、ユーザーからの質問に返答することです。
必ず、「テレワークセキュリティ注意点」を参照して回答してください。
「テレワークセキュリティ注意点」に求めている回答に使える情報がない場合は、「すみません、情報がありません。」と回答するようにしてください。

LinuxでMACアドレスの確認(RHEL系)
MACアドレスフィルタに引っ掛かり、ネットワークに繋がらなくなった。
許可登録をするためにMACアドレスを調べる必要があったので、以下の方法で確認した。
※今回はRHEL系。
nmcli connection showで見る(DHCPのみ)
nmcli connection show <インターフェイス名>
DHCP4.OPTION[1] : 01:<MACアドレス> →これ
ip link を使う(ifconfigが使えない)
ip link show <インターフェイス名>
link/ether <MACアドレス> brd ff:ff:ff:ff:ff:ff
ワンライナーで表示する
上記のコマンドが変わっても使える。
cat `find /sys/devices/ -name <インターフェイス名>`/address
<MACアドレス>が表示される
<解説>
・find /sys/devices/ -name <インターフェイス名>を入れると、対象インターフェイスのディレクトリパスを表示する(/sys/devices/pci0000:00/0000:00:XX/net/<インターフェイス名> になる)
・バッククォートの部分が上記のパスに変わり、真後ろに/addressをくっつけることで、対象インターフェイスのaddressファイルをcatで実行することになる
・この中にはMACアドレスが記載されているため、MACアドレスのみが戻ってくる

Difyチャットボット利用のコツ?
Difyでは、RAGとして使用できるナレッジを用意することが可能。
検索する際にいろいろな方法があるが、「ハイブリッド検索」が一番精度が出た。
また、「ウェイト設定」と「Rerankモデル」の2種類があるが、GeminiとかOpenAIは「Rerankモデル」が使えず、使用できるAIが限られる。
「ウェイト設定」だけでもかなり使える!キーワード検索とセマンティックマッチングでバランス調整するともっとブラッシュアップできる。

DifyのHTTPSアクセスがうまくいかない
下記の内容通りに証明書は作成できるが、設定を入れる(HTTPS=True)とネットワーキングエラーが発生する。

Linuxで再起動ができなくなった
自宅環境でいじっていたところ、途中で再起動をかけようとしたのだが、
Failed to set wall message, ignoring: Unit dbus-org.freedesktop.login1.service failed to load properly, please adjust/correct and reload service manager: File exists
Failed to schedule shutdown: Unit dbus-org.freedesktop.login1.service failed to load properly, please adjust/correct and reload service manager: File exists
と表示されて実行できなくなってしまった。
Geminiの回答
とりあえずGeminiに聞いてみたところ、いくつか試せるものを残してくれた。
このエラーメッセージは、Linuxシステムにおけるログイン、セッション、電源管理を担う重要なシステムサービスである dbus-org.freedesktop.login1.service ファイルに問題があることを示しています。根本的な問題は「ファイルが存在する」ことであり、これは設定ファイルの競合や破損を示唆しています。systemdがどのファイルを使用すればよいか分からなくなっている状態です。
エラーの理解
dbus-org.freedesktop.login1.service: これはsystemd-logindデーモンのsystemdサービスファイルです。systemd-logindは、ユーザーログイン、セッション管理、システムのシャットダウン/再起動などの処理を行います。
「正しくロードできませんでした...ファイルが存在します」: これは通常、サービスファイルの重複、サービスファイルの破損、またはsystemdが正しいファイルを正しくロードするのを妨げる設定上の問題があることを意味します。
トラブルシューティング手順
サービスファイルの重複を確認:
最も可能性が高いのは、サービスファイルの重複です。systemdは複数の場所でサービスファイルを検索します。「優先度の高い」ディレクトリにある重複ファイルは、正しいファイルを上書きする可能性があります。
一般的な場所:
/etc/systemd/system/ (ユーザーカスタマイズ)
/usr/lib/systemd/system/ (ディストリビューションのデフォルト)
/usr/local/lib/systemd/system/ (ローカルにインストールされたソフトウェア)
確認コマンド:
Bash
systemctl --user status dbus-org.freedesktop.login1.service
systemctl status dbus-org.freedesktop.login1.service
これらのコマンドは、systemdがサービスファイルをどこで検出しているかを示します。複数の場所が表示される場合は、それが問題です。
重複ファイルを特定して削除 (慎重に!):
バックアップ: 変更を行う前に、変更するファイルをバックアップしてください! これは、何か問題が発生した場合に非常に重要です。問題のファイルを安全な場所にコピーしてください。
正しいファイルを特定: /usr/lib/systemd/system/にあるファイルは通常、ディストリビューションによって提供される正しいファイルです。/etc/systemd/system/にあるファイルは、ユーザーによるオーバーライドまたは設定ミスである可能性があります。カスタマイズしたサービスがある場合は、/etc/systemd/system/が正しい可能性がありますが、可能性は低いです。
重複ファイルを削除: sudo rmを使用して、誤ったファイルを削除します。たとえば、重複ファイルが/etc/systemd/system/にある場合:
Bash
sudo rm /etc/systemd/system/dbus-org.freedesktop.login1.service
正しいファイルを削除していることを確認してください。間違ったファイルを削除すると、システムが壊れる可能性があります。
Systemdのリロード:
重複ファイルを削除した後 (またはサービスファイルを変更した場合)、systemdに設定をリロードするように指示します。
Bash
sudo systemctl daemon-reload
サービスを再起動:
systemd-logindサービスを再起動してみます。
Bash
sudo systemctl restart systemd-logind
状態を確認:
サービスが正しく開始されたことを確認します。
Bash
sudo systemctl status systemd-logind
エラーメッセージがないか確認します。「active (running)」と表示されていれば、実行中です。
再起動 (必要な場合):
変更が成功したと思われる場合は、システムを再起動して、すべてが期待どおりに動作していることを確認します。
Bash
sudo reboot
問題が解決しない場合:
ジャーナルログを確認: システムジャーナルで詳細なエラーメッセージを確認します。
Bash
journalctl -xe | grep dbus-org.freedesktop.login1.service
systemdを再インストール: まれに、systemdパッケージ自体が破損している可能性があります。ディストリビューションのパッケージマネージャー (例: apt、yum、pacman) を使用して再インストールしてみてください。
競合するソフトウェアを確認: 他のソフトウェアがsystemdに干渉している場合があります。最近インストールしたソフトウェアがある場合は、一時的に無効にして問題が解決するかどうかを確認してください。
リカバリーモードで起動: 通常どおりに起動できない場合は、リカバリーモードで起動してみてください。これにより、コマンドプロンプトにアクセスしてトラブルシューティング手順を実行できます。
重要な注意事項:
sudoの使用に注意: sudoを使用すると、root権限が付与されます。実行するコマンドを理解してから実行してください。
バックアップは必須: システム変更を行う前に、特にファイルを削除する前に、バックアップを作成してください!
ディストリビューションのドキュメントを参照: 特定の手順は、Linuxディストリビューションによって若干異なる場合があります。ディストリビューションのドキュメントまたはサポートフォーラムを参照して、詳細なガイダンスを入手してください。
Linuxディストリビューションや最近システムに加えた変更など、詳細な情報を提供していただければ、より具体的なアドバイスができるかもしれません。