月: 2021年3月
MONTHLY ARCHIVE
背景
raspberry piのサーバーを変更したので、それまでサーバー用として使用してraspberry piを別用途で再利用しようとした。 ただ、OSがwheezyと旧かったのでOSも一新しようとした。raspberry pi 4でHDD起動ができたので、HDD起動しようとした(それまでは HDDは/varの配下用にしていた)。 トライしたが失敗した。 いろいろ調べると、2Bのv1.2以上、3A+、3B、3B+、4Bでないと無理な様で、手持ちのものはver1.1であった。
※v1.2のものもあった(涙)2021/3/23
それで、SHDCカードでブートだけ行い、それ以降はHDDを使うようにした(/var から進化)。
参考にしたサイト
このサイト https://jyn.jp/raspberrypi-usb-boot/ が非常に有効だった。 ほとんど、そのままでできた。
そのままではできなかった部分は、「データをコピー (rsync)」のところで、/ を /mntにコピーする様になっていたので、 /の下にmntがあるため再帰的にmntが作られ止まらなくなってしまった。 また、/sys の配下が多数エラーになってしまった。
最終的には、それらの部分を除外して実行し、それらの部分はディレクトリ作成だけ行った。
実際のコマンドイメージ(rsync部分だけ)
sudo rsync -aHAX --progress /bin /mnt
sudo rsync -aHAX --progress /dev /mnt
sudo rsync -aHAX --progress /home /mnt
sudo rsync -aHAX --progress /opt /mnt
sudo rsync -aHAX --progress /bin /mnt
sudo rsync -aHAX --progress /root /mnt
sudo rsync -aHAX --progress /bin /mnt
sudo rsync -aHAX --progress /sbin /mnt
sudo rsync -aHAX --progress /usr /mnt
sudo rsync -aHAX --progress /boot /mnt
sudo rsync -aHAX --progress /etc /mnt
sudo rsync -aHAX --progress /lib /mnt
sudo rsync -aHAX --progress /srv /mnt
sudo rsync -aHAX --progress /var /mnt
### 下記は不要かも #####
sudo mkdir /mnt/lost+found
sudo mkdir /mnt/media
sudo mkdir /mnt/proc
sudo mkdir /mnt/sys
sudo mkdir /mnt/sys/block
sudo mkdir /mnt/sys/bus
sudo mkdir /mnt/sys/class
sudo mkdir /mnt/sys/dev
sudo mkdir /mnt/sys/devices
sudo mkdir /mnt/sys/firmware
sudo mkdir /mnt/sys/fs
sudo mkdir /mnt/sys/kernel
sudo mkdir /mnt/sys/module
sudo mkdir /mnt/sys/power
WordPressを運用しているとどこにアクセスが多いか気になる。一方、スパムが多い。 それで、アクセスログ解析を行いたいが、関係ないアクセスログも多い。 そこで、アクセスログの削減を行うとともに、アクセスのトップ10をメール通知する様にした。
前提条件
- apacheをweb serverとして使っている
- lan内メールサーバーが構築済み
- (raspberry pi OS : ubuntuやdebianでも同じと思う)
ログ削減
lan内からのアクセスやcssファイル等の読み込みはログに残さないようにする。
/etc/apache2/sites-enabled/000-default.conf 及び /etc/apache2/sites-enabled/default-ssl.conf のCustomlog 部分を以下の様に編集する。
# CustomLog ${APACHE_LOG_DIR}/access.log combined
SetEnvIf Remote_Addr 127.0.0.1 nolog
SetEnvIf Remote_Addr 192.168.0. nolog
SetEnvIf Remote_Addr 192.168.2. nolog
SetEnvIf Request_URI "\.(gif|jpg|png|css|js|ico)$" nolog
CustomLog ${APACHE_LOG_DIR}/access.log combined env=!nolog
もし、JPG等大文字のものがログに現れた場合は、SetEnvIF部分をSetEnvIfNoCaseに換える。
注:スペルミスがありましたので修正しました(no_log => nolog) 2021/03/20
再起動
sudo systemctl restart apache2
top10作成及びメール文作成用のシェルの準備
以下のシェルスクリプト(mytools/webtop10.sh)を作成
#!/bin/bash
echo from: wp_server@ktanimoto.net
echo to: wp_server@ktanimoto.net
echo subject: raspi web server accecc top10
echo Content-Type: text/plain;charset="UTF-8"
echo
echo ------ access IP top 10 ----------
cat /var/log/apache2/access.log |cut -f 1 -d ' ' | sort |uniq -c|sort -nr|head -10
echo
echo ----- access page top10 -----------
cat /var/log/apache2/access.log |cut -f 7 -d ' ' | sort |uniq -c|sort -nr|head -10
echo
echo ------- actual access top 10 -----------
cat /var/log/apache2/access.log |grep 200 |cut -f 7 -d ' ' | sort |uniq -c|sort -nr|head -10
echo
cronの設定
rootが所有者になる様にしてcron設定ファイルを作成する(webtop10とここではする)
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/home/pi
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,$
# | | | | |
# * * * * * user-name command to be executed
50 7 * * * pi /home/pi/mytools/webtop10.sh | sendmail -i -t
あるraspberry piにpostfixとdovecotで簡易的なメールサーバーを構築した。 それで、別のraspberry piマシンからも定期連絡等のメールを送れるようにする。
手法
メールを送るだけなので軽量な方法で行う。 簡単な調査だと、ssmtpを使うのが簡単そうであり、これをインストールして実現する。
インストールと設定
メールサーバーとポート番号の指定を、sudo nano /etc/ssmtp/ssmtp.conf にて行う
mailhub=192.168.0.232:587
メール送信テスト
以下のテスト用ファイルを作成する。 testmail.txt とする。
from: pi@localhost
to: receiver_name@mydomain
subject: hello-test-from-ssmtp
Content-Type: text/plain;charset="UTF-8"
this is test mail by ssmtp
次のコマンドでテストする。
cat testmail.txt | sendmail -i -t
メーラーで受信を確認。受信できていた。
あとは、シェル作成とcron設定
(2021/03/19 追記)
以下のファイル myhealth.sh を作成する
echo from: pi@localhost
echo to: wp_server@ktanimoto.net
echo subject: dns vpn daily report
echo Content-Type: text/plain;charset="UTF-8"
echo
date
echo
echo ------ memory usage -------
free -h
echo
echo ----- device usage --------
df -h
echo
/etc/cron.d/myhealth をsudo nanoで作成する(rootが所有者になるようにする)
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/home/pi
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,$
# | | | | |
# * * * * * user-name command to be executed
15 */12 * * * pi bash /home/pi/mytools/myhealth.sh | sendmail -i -t
最後の行でbashの後に空白がなかったので追加(2021/3/20)
ufwを設定する際/var/log/ufw.logに大量に現れるログの抑制するのに、毎回手間取るので、設定値をメモとして残しておく
To Action From
-- ------ ----
22 ALLOW Anywhere # ssh
3389 ALLOW Anywhere # xrdp
# for ftp
20 ALLOW Anywhere # ftp
21 ALLOW Anywhere # ftp
aaaaa:bbbbb/tcp ALLOW Anywhere # ftp
(aaaaa, bbbbbはvsftpdの設定による)
# against bunch of ufw.log
224.0.0.1 ALLOW 192.168.2.1 # ufw log
224.0.0.1 ALLOW 192.168.0.0/24 # ufw log
224.0.0.251 ALLOW Anywhere # ufw log
# for no secure web server
80 allow Anywhere # http
# for web server
443/tcp ALLOW Anywhere # https
# for smtp/dovecot mail server
110 ALLOW Anywhere # pop3
587 ALLOW Anywhere # smtp
993 ALLOW Anywhere # smtps
# for dnsmasq
53 ALLOW Anywhere # dns
# for vpn server
1293 ALLOW Anywhere # ipsec
500/udp ALLOW Anywhere # ISAKMP
4500/udp ALLOW Anywhere # IPSec NAT Traversal
1701/udp ALLOW Anywhere # l2tp
ICMPv6のログが残るのでこれも消す(2021/3/20)
Mar 20 21:22:23 raspberrypi kernel: [466373.695815] [UFW BLOCK] IN=eth0 OUT= MAC=33:33:00:00:00:01:00:19:66:cb:8b:11:86:dd SRC=0000:0000:0000:0000:0000:0000:0000:0000 DST=ff02:0000:0000:0000:0000:0000:0000:0001 LEN=68 TC=0 HOPLIMIT=64 FLOWLBL=0 PROTO=ICMPv6 TYPE=130 CODE=0
上記のようなログがufw.logに多量に出てくる。いろいろ検索したところ
https://ubuntuforums.org/showthread.php?t=2247250 で、解決策があった。
/etc/ufw/before6.rules の下記の下に、
# MLD query
-A ufw6-before-input -p icmpv6 --icmpv6-type 130 -s fe80::/10 -j ACCEPT
下記のコードを追加する。
# MLD query
-A ufw6-before-input -p icmpv6 --icmpv6-type 130 -s fe80::/10 -j ACCEPT
-A ufw6-before-input -p icmpv6 --icmpv6-type 130 -s 0000:0000:0000:0000:0000:0000:0000:0000/64 -j ACCEPT
# above line was inserted by K.tanimoto on 2021/3/20
その後、 sudo systemctl restart ufw で再起動する。
なお、0000が並んでいる部分は、src= の部分を記述する。
raspberry piでサーバー運用しているので稼働状況をメールで自動的にメールで送らせるようにする。
前提条件
OS : raspberry pi OS (buster)
mail server: postfix+dovecot (これでないといけないというわけではない)
範囲 : LAN内でのみ使用 (securityは考えない)
方針
- LAN内でのみ使用
- postfixでサポートのsendmailインターフェースを使う
(mutt でトライしたがうまく動かせず断念) - 簡単のためシェルを使う
- メールのsubjectにはアルファベットを使う。
- 計測するデータは、cpuの温度、メモリー使用状況、SSD使用容量、smart状況
メール送信用コマンド
mytools/health.sh | sendmail -i -t
mytools/health.shが計測用シェル兼sendmailへのインターフェース部
シェルの中身
#!/bin/bash
echo from: sender_name@domain_name
echo to: receiver_name@domain_name
echo subject: raspi server status report
echo Content-Type: text/plain;charset="UTF-8"
echo
echo ------ date and time ----------
date
echo
echo ----- cpu temparature -----------
vcgencmd measure_temp
echo
echo ------- memory usage -----------
free -h
echo
echo -------- device usage ---------
df -h
echo
echo ------- SSD smart data ----------
smartctl -d sat -A /dev/sda
sender_name, receiver_name, domain_name, /dev/sdaは実際の値に調整する。
ユーザー追加
sudo useradd sender_name -s /sbin/nologin
sudo passwd sender_name
sudo mkdir /home/sender_name
sudo chown sender_name:sender_name /home/sender_name
下2行の必要性がよくわからないが、/var/log/mail.errに出てくるエラーを消すためにいろいろしていて、その結果上記の様にしたところメール送信ができたため。
cronの設定
次の様な内容のファイル(例えばhealthcheck)を作成し、/etc/cron.dに配置する。
なお、オーナーをrootにしておかないとcronがエラーになったのでrootにする。
超参考となったサイト:https://www.server-memo.net/tips/etc-crontab.html
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
HOME=/home/pi
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,$
# | | | | |
# * * * * * user-name command to be executed
7 10 * * * root /home/pi/mytools/health.sh | sendmail -i -t
7 22 * * * root /home/pi/mytools/health.sh | sendmail -i -t
sudoがcronの中で使おうとすると、"TTY onknown"となったのでsudoを使わないようにするsmartctlをcronの中で使えるようにする。従ってユーザーもrootとする。
最後は、メーラ側の設定を行いおしまい
WEBサーバーの異常をメールで知るためにLan内専用のメールサーバーを構築する事にした。
いろんなサイトを参考にしたが、"Job for dovecot.socket failed." が発生して手こずったので記録として残す。
環境・前提条件
OS : Raspberry pi OS (Buster)
SSL : letsencrypt
protocol : とりあえずエラーにならなかったもの
lan内に限るので、認証やsslは取り合えず行わない。また、当面メールボックスで行う
参考にしたサイト
Job for dovecot.socket failed. が発生することが多く、最終的に下記サイトを参考にした。
'https://qiita.com/bzy/items/6edc8cfe48cba3eacb18'
パラーメタの説明は、下記サイトが参考になる
' https://w.atwiki.jp/sanosoft/pages/155.html '
ユーザーの追加
sudo useradd user-name -s /sbin/nologin
sudo passwd user-name
パスワードを入れ間違えたときは
sudo passwd -d user-name でパスワード消去して登録しなおす
sudo mkdir /home/user-name
sudo chown user-name:user-name /home/user-name
postfixのインストール
ほとんど設定は上記サイトに従った。それゆえ詳細は上記サイトの方が詳しいです。
なお、aptでのインストール中の質問に対しては、 'http://memorandum.cloud/2020/09/22/メールサーバー構築postfixdovecot-raspberry-pi%EF%BC%88ラズベリーパイ/' を参考にした。
sudo apt install postfix
sudo nano /etc/postfix/main.cf
myhostname = mydomain.com
mydomain = mydomain.com
mydestination = $myhostname, localhost.$mydomain, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.0.0/24
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4
ポート番号を25から587に変更する
sudo nano /etc/postfix/master.cf
dovecotのインストール
sudo apt install dovecot-pop3d
sudo nano /etc/dovecot/dovecot.conf
disable_plaintext_auth = no
# Enable installed protocols
protocols=pop3
listen = *
sudo nano /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
auth_mechanisms = plain
sudo nano /etc/dovecot/conf.d/10-mail.conf
mail_location = mbox:~/mail:INBOX=/var/mail/%u
sudo nano /etc/dovecot/conf.d/10-master.conf
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
service pop3-login {
inet_listener pop3 {
port = 110
}
inet_listener pop3s {
# port = 995
# ssl = yes
}
}
sudo nano /etc/dovecot/conf.d/15-mailboxes.conf
# NOTE: Assumes "namespace inbox" has been defined in 10-mail.conf.
namespace inbox {
inbox = yes # <- この部分を追加
再起動
sudo systemctl restart postfix
sudo systemctl restart dovecot
一応、これでようやく動いた (いろいろ行ったので一部記入もれあるかも)