「debian」と一致するもの

WPSDの導入

  • 投稿日:
  • by
  • カテゴリ:

すでにpi starについては導入/運用方法について解説記事が紹介されている.。
一方で自分が愛用しているWPSDについては、公式ページに英文のドキュメントがあるが、手っ取り早く使うにはちょっと敷居が高い。
そこでMMDVMの制御のためWPSDを導入する方法、私の様にpi starを使用していた方々がWPSDを活用できるように、特に自分が試行錯誤したり調べものをしたりした部分を重点的に書き記すことにした。


本稿の想定とか事前準備など
(1)MMDVM
Aliexpressで売っているMMDVM基板。当方では2種類を混在して使用している。
  アンテナ2本のDuplex可能なもの・・・Raspberry Pi 3に載せて使用
  アンテナ1本のSimplex用・・・・・・Raspberry Pi zero-Wに載せて使用
どちらの基盤にもOLEDが搭載されており、pi starでも正常動作し画面が表示されていた。
※1 Raspberry Pi zero-Wにはmicro-USB~Ethernetアダプタを刺して有線で使用している
※2 検証していないが、筐体に入って一体型となったHot-spotはRaspberry Pi zero-WにSimplex用MMDVMを搭載したものと推定してます。内部のPi zero-WにWPSDのイメージを書いたmicro-SD(後述)を挿入すれば移行できる筈。

MMDVM.png

(2)DMR
中華機"Baofeng DR-1801"をダミーロードで運用している。本記事では、DMRからの利用について書く。DMRの設定は別稿を参照。(MMDVM+WPSDは、D-star、Yaesu Fusion、M17、P25等等を利用できるが、本記事では取り上げない。)

(3)アカウント取得
以下のアカウントをそれぞれのリンク先で取得する
  DMR-IDとNXDN-IDはRadio ID Signupから(免許状の画像が必要)
  BrandMeisterはBrandMeister-Signupに(DMR-IDが必要)
  TGIFはTGIF-Registarに(コールサインでDMR-IDが必要)

以上の下準備をWPSDの導入前に済ませておく。
※pi-starを使われていた方は(1)(2)(3)は済と思います。


イメージの準備

準備するもの

(1)miniSDカード 8GB必須とのこと。今回、ドラレコ用の常備品の32GBを適用
(2)USB~miniSDカードアダプタ
(3)SDcardFormatter
(4)Win32Disk Imager(登先生版)*
(5)*.xzを解凍するアプリケーション(LHaForgeなど)*

*(4)(5)はRaspiOSImagerを使うと簡単、Mac/Linuxでも対応可。

これらを事前にPCに導入しておく。

WPSDの公式ページに行き、WPSDのDebian12のイメージである、 "WPSD_RPi-Bookworm_Latest.img.xz"をダウンロードする。

WPSDダウンロード.PNG

ダウンロードしたファイルをWin32DiskImagerで指定し、miniSDに書き込む。

Wifiで接続しようとするときには、ここでwpa_supplicant.confを生成し、ダウンロードする。bootで見えるドライブにwpa_supplicant.confなるファイルを保存する。(Ethernetで接続するときはこの作業は不要。)

wpa.PNG書き込んだminiSDをMMDVMを搭載したRasberry PIに挿入し、電源を入れる。初回は時間がかかるので10分ほど放置した。

pi-starに割り振られたIPアドレスを調べるには、Raspberry PiにHDMIモニターを接続し、さらにキーボードを繋げてコンソールを監視できるのがベストではある。無い場合はルータやLAN内のアドレスをスキャンするソフト/アプリが必要となる。

WPSDにコンソールからログインするにはpi-star同様、
  ユーザ:pi-star
  パスワード:raspberry

WPSDにログインできる。Webブラウザからは、WPSDのIPアドレスを指定してログイン可能。

なお、pi starで初回ログイン時に、ファイルシステムをread onlyから書き込み可能とするコマンド(pistar-rw)を発出したが、WPSDでは必要ない。


初期設定(Cofig画面)

WebブラウザからWPSDにログインするにはコンソールからと同様、
  ユーザ:pi-star
  パスワード:raspberry

としてログインし設定を開始する。

1.PNGCallsign:
DMR-ID:
NXDN-ID

の指定方法はpi-star同様である。

Frequencyは全電波形式のバンドに設定する。
Modem Typeは
  アンテナ2本のMMDVM:MMDVM_HS_Dual_Band for Pi (GPIO)
  アンテナ1本のMMDVM:STM-32-DVM / MMDVM_HS - Raspberry Pi Hat (GPIO)
をそれぞれ選択し、無事に動作している。
Modem Portは/dev/ttyAMA0 (Raspberry Piの基盤にGPIOで接続)を指定。
Baud Rateは115200とする。

次はMMDVMノードをaprs.fiに表示する設定。

2.PNG緯度/軽度はgoogle map上でクリックして得られる座標(度分秒)をWebサイトで小数点に変換するなどしてLatitude(緯度)Longtitude(経度)を書き込む。
※個人的にはAPRS GatewayのスイッチはOFFで良いと思います。

これまたpi-star同様に
Town/Countryには市県+Japanを、URLには通例としてQRZ.comのURLを記載する。

次に使用するMMDVMが使用するモードを指定。DMRを使用するので"DMR Mode"のみスイッチをONにする。
※"DMR2YSF"のクロスモードを使用するときには"DMR2YSF"のスイッチも併せてONにする。

3.PNG

MMDVM上のOLED設定

4.PNGMMDVM Display Type:"OLED Type 3" "/dev/ttyAMA0"
Nextion Display Settings:"G4KLX"

を選択し、MMDVM上のOLEDが動作する。OLED Display Optionsはお好みで。


WPSDの「導入」は以上である。
引き続き、WPSDでDMRネットワークにて「運用」する方法について纏める。

(2024年8月24日 記)

AsterskをRaspberryPiに導入する

  • 投稿日:
  • by
  • カテゴリ:

1.概要

  • コロナ禍を経てリモートワークに向けてのハードやソフトが発展した。さらに、企業ではTeams、個人ではLineを使ったりする。さらには、クラウド上のsipサーバーのサービスもある。となると、敢えて自宅やSOHOでAsteriskでPBXを立てる理由も薄れてきた。さらにはSIPポート(5060)を巡回するポートスキャナが居たりするので無断海外電話される危険がある。が、従来通りAsteriskサーバを立ててみる。
  • これまではapt-get install asteriskで導入できたが、Packageが見つからず、asterisk.orgよりソースコードをダウンロードしてコンパイルした。
  • 当初sipクライアントの設定としたが、外線発信と内線通話ができるものの、外線の着信ができない症状に悩まされたが、zoiper側をiax2に変更することで解決した。
  • confファイルは、extensions.conf, iax.conf, pjsip.conf, pjsip_trunk_hgw.conf, featurees.conf の5つを準備する。残りは、githubに公開されているファイル群で大丈夫な様子だ。

2.想定する環境

  • クライアントに使い慣れた"Zoiper"(Androidとios混在)を使う。
  • NTT東から借りているPR-500Niに接続し、NTT東のひかり電話から発信する。
  • 子機は3~4台。よってPR-500Miに直接接続しないでAsteriskで内線通話する。
    (子機1~2台だったらクライアントにAgePhoneで直接接続したほうが良さそう)
  • RaspberryPi 2B 、Debian (bookworm) 32bit環境 にインストールする。

3.ソースコードのダウンロード

・Asterisk18を https://www.asterisk.org/downloads/ よりダウンロードする。
 (Asterisk20も使用できるようである)

・メールアドレスの入力を促されるので入力。

・今回、ダウンロードされるtar,gzを.usr/local/srcで展開した。

4.必要pakageを予めインストールする。

・apt-get の様に依存するpackageを導入してくれないので、予め導入しておく。
 以下は管理者権限で実行

apt-get install build-essential libedit-dev uuid-dev libxml2-dev -y
apt-get install ncurses-dev libsqlite3-dev sqlite3 -y
apt-get install libssl-dev subversion git -y

今回はこれらを導入した。(過不足あるかも...少々自信なし)

5.ソースコードのコンパイル

以下の手順で進める。これも管理者権限で実行した。

tar xzvf asterisk-18-current.tar.gz
cd /usr/local/src/asterisk-18.19.0/
./configure
make menuselect

menuselectで日本語音声(japanese ...の全部)を選択し、導入する。

make
make install
make samples

と進める。

6.設定ファイルひながたのダウンロード

http://www.voip-info.jp/ から辿れるgithubからconfファイル群を取り寄せる。

git clone https://github.com/takao-t/asterisk-conf

Asterisk13用の様だ。

なお導入後、sip.conf はリネームして無効化しておくこと。

7.今回用意した必要ファイル一式

asterisk18-20230917.zipに纏める。

8.pjsip.confとpjsip_trunk_hgw.confの例

一式ファイルのうち、pjsip.conf にインクルードされるpjsip_trunk_hgw.conf の例を以下に。

まずはpjsip.conf

[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0:5070
local_net = 192.168.0.0/16

[acl]
type=acl
deny=0.0.0.0/0.0.0.0
permit=192.168.0.0/16

#include "pjsip_trunk_hgw.conf"

次にpjsip_trunk_hgw.confの例

;トランク設定
;pjsip.confにtransportを設定しておくこと

;ひかり電話HGW
;
[hikari-hgw]
type = aor
; sip:内線番号@HGWのIPアドレス
contact = sip:4@192.168.0.1
qualify_frequency = 30
authenticate_qualify = no

[hikari-hgw]
type = auth
auth_type = userpass
;内線のユーザ名(4桁数字)
username = 0004
;内線のパスワード
password = Password

[hikari-hgw]
type = identify
endpoint = hikari-hgw
;HGWのIPアドレス
match = 192.168.0.1

[hikari-hgw]
type = registration
transport = transport-udp
outbound_auth = hikari-hgw
; sip:HGWのIPアドレス
server_uri = sip:192.168.0.1
; sip:内線番号@HGWのIPアドレス
client_uri = sip:4@192.168.0.1
retry_interval = 60

[hikari-hgw]
type = endpoint
transport = transport-udp
context = from-hikari-hgw
dtmf_mode = inband
disallow = all
allow = ulaw
direct_media = no
send_pai = yes
inband_progress = yes
; HGWの内線番号
from_user = 4
; HGWのIPアドレス
from_domain = 192.168.0.1
language = ja
outbound_auth = hikari-hgw
aors = hikari-hgw

パスワードは適宜設定のこと。

9.extentions.confの例

extentions.confの例を以下に。

[general]
writeprotect=no
priorityjumping=no

[globals]
ALLMEMBERS=IAX2/201&IAX2/202&IAX2/203&IAX2/204&IAX2/205&IAX2/206&IAX2/207&IAX2/208&IAX2/209

;自局の着信番号を設定する
;[incoming]セクションを参照
;ひかり電話HGWの番号(着信番号:自分の番号)
MYNUMBER1=XXXXXXXX
;FUSION OpenGateの番号(050を取ったもの)
;MYNUMBER2=XXXXXXXX

[default]
;200番台を内線に割り当てています
;グループ着信
exten => 200,1,NoOp(内線代表着信)
exten => 200,n,Dial(${GROUP1},60)
exten => 200,n,Hangup

;内線呼び出し
exten => _20Z,1,NoOp(内線呼出)
;下行のSIPでIAX2と書き改める
exten => _20Z,n,Dial(IAX2/${EXTEN},60)
exten => _20Z,n,Hangup

;300番台は特番で機能に割り当てています
;音声会議
exten => 301,1,NoOp(音声会議)
exten => 301,n,Answer()
exten => 301,n,Confbridge(${EXTEN})
exten => 301,n,Hangup

;PIASTでのページング
;ALSAサウンドを持つLinux機でも使用可能
exten => 309,1,NoOp(ページング)
exten => 309,n,GoTo(paging,s,1)

;700番台はコールパーキング用です
;コールパーキング
exten => 700,1,NoOp(コールパーキング)
exten => 700,n,Park()
;パーキングロットをインクルードしておく
include => parkedcalls

;0発信をひかり電話にする場合の例(03--でダイヤル)
exten => _0.,1,NoOp(ひかり電話0発信)
exten => _0.,n,Set(CALLERID(num)=${MYNUMBER})
exten => _0.,n,Set(CALLERID(name)=${MYNUMBER})
;@hikari-trunkを@hikari-gwとし{EXTEN:1}を{EXTEN}に
exten => _0.,n,Dial(PJSIP/${EXTEN}@hikari-hgw)

;9発信をFUSIONにする場合の例(9+03--でダイヤル)
;exten => _9.,1,NoOp(OpenGate 9発信)
;exten => _9.,n,Set(CALLERID(num)=${MYNUMBER2})
;exten => _9.,n,Set(CALLERID(name)=${MYNUMBER2})
;exten => _9.,n,Dial(SIP/${EXTEN:1}@fusion1)

;外線着信用コンテキスト
[incoming]
;着信番号毎に処理を書くこと

;ひかり電話着信例
exten => ${MYNUMBER1},1,NoOp(うちの代表番号)
exten => ${MYNUMBER1},n,Macro(cidnamecheck)
exten => ${MYNUMBER1},n,Dial(${GROUP1},60)

;FUSION OpenGate着信例
;exten => ${MYNUMBER2},1,NoOp(FUSION着信)
;exten => ${MYNUMBER2},n,Macro(cidnamecheck)
;exten => ${MYNUMBER2},n,Dial(${GROUP1},60)

;ひかり電話HGW用前処理
[from-hikari-hgw]
;exten => s,1,NoOp(ひかり電話着番処理)
;exten => s,n,Set(DESTNUM=${PJSIP_HEADER(read,To)})
;exten => s,n,NoOp(着信To: ${DESTNUM})
;着信番号の桁数が異なる場合には以下の行を調整のこと
;exten => s,n,Set(DESTNUM=${DESTNUM:1:10})
;exten => s,n,NoOp(着信番号: ${DESTNUM})
;exten => s,n,Goto(incoming,${DESTNUM},1)
exten => s,1, Dial(${ALLMEMBERS},12,Tt)
exten => s,n, Hangup

;CID(番号)から名前を取得するマクロ
;AstDBのcidnameに番号と名前を入れておくこと
[macro-cidnamecheck]

exten => s,1,NoOp(CID参照マクロ)
exten => s,n,Set(CIDNAME=${DB(cidname/${CALLERID(num)})})
exten => s,n,GotoIf($["${CIDNAME}" = ""]?noname)
exten => s,n,Set(CALLERID(name)=${CIDNAME})
exten => s,n,Goto(endmacro)
exten => s,n(noname),Set(CALLERID(name)=不明)
exten => s,n(endmacro),MacroExit

;PIASTページング用
[paging]

;リレーをONしてページング実行、ページング前にビープを鳴らす
exten => s,1,NoOp(Paging Start)
;exten => s,n,System(/home/piast/relayon.sh)
exten => s,n,Dial(Console/0,,A(beep))

;ハングアップ後にビープを鳴らす
exten => h,1,NoOp(Paging Hangup)
exten => h,n,System(asterisk -rx 'channel originate Console/0 application Playback beep')
;exten => h,n,System(/home/piast/relayoff.sh)

ダイアルプランは雛形ファイルを踏襲した。

10.iax.confの例

sipではなく、iax2でZoiper子機を収容する。

[general]
;sip(5060)およびpjsip(5070)と重複せぬよう。
bindport=4589
bindaddr=0.0.0.0
iaxcompat=yes
language=ja
bandwidth=medium
disallow=all
allow=ulaw
allow=gsm
allow=speex
jitterbuffer=no
;dropcount=2
;maxjitterbuffer=500
;maxexcessbuffer=80
;minexcessbuffer=10
;jittershrinkrate=1
;tos=lowdelay
;mailboxdetail=yes
calltokenoptional=0.0.0.0/0.0.0.0
minregexpire = 300
maxregexpire = 300

[201]
type=friend
username=201
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=201

[202]
type=friend
username=202
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=202

[203]
type=friend
username=203
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=203

[204]
type=friend
username=204
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=204

[205]
type=friend
username=201
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=205

[206]
type=friend
username=206
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=206

[207]
type=friend
username=207
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=207

[208]
type=friend
username=208
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=208

[209]
type=friend
username=209
secret=Password
host=dynamic
callgroup=1
pickupgroup=1
mailbox=209

各子機のパスワードは各々設定のこと。

11.features.confの例

sipフォンだとファンクションキーに各種動作を定義できるが、今回使うzoperには転送ボタンが定義されていない。そこで、

*7 を押下し保留後、他のAsterisk転送先(自分を除く201~209)とダイアル+会話して繋ぐ

*8 を押下し保留後、他のAsterisk転送先(自分を除く201~209)をダイアルして転送する

の2つを実現する。以下、features.confの例

[general]

[featuremap]
atxfer => *7 ; Attended transfer
blindxfer => *8 ; Blind transfer

として、転送ができるようになった。

12.参考にさせていただいたサイト

厚く御礼を申し上げます。

(2023年9月16日)

Debian 12 (bookworm)へのアップグレード

  • 投稿日:
  • by
  • カテゴリ:

Debian.JPによると、bookwormが無事リリースされたらしい。

debian12.PNG

お盆休みでもあるので、さくらVPSやら、自宅Rpi4などのメンテナンスをしてみる。

前回(buster->bullseye)では、/etc/apt/souces.list をsedでいっきに書き換えたが、公式のガイドによると、

4.3.1. APT のインターネットソースの追加
新規インストールではデフォルトはネットワークの条件によってあなたに近いサーバから自動的にパッケージをダウンロードできる Debian APT CDN サービスを使うように APT を設定します。これは比較的新しいサービスのため、古いインストールでは以前としてメインの Debian インターネットサーバのひとつまたはミラーのひとつを設定しているかもしれません。もしまだ設定を行っていない場合、APT 設定において CDN サービスを使うように切り替えることを推奨します。

とある。(赤線下線は筆者)
そこで、http://ftp.jp.debian.org から取り寄せていたところを、http://deb.debian.org/debian に改めてCDNのゴリヤクにあずかることにする。ということで、/etc/apt/souces.list を以下。

deb http://deb.debian.org/debian bookworm main
#deb-src http://deb.debian.org/debian bookworm main

#updates
deb http://deb.debian.org/debian bookworm-updates main
#deb-src http://deb.debian.org/debian/ bookworm-updates main

#security
deb http://deb.debian.org/debian-security bookworm-security main
#deb-src http://deb.debian.org/debian-security bookworm-security main

あとは、

apt update
apt full-upgrade

の命令を発出すればupdateが開始する。

途中、configファイル関係をどうするか訊いてくるが、これまでのバージョンを使うとする"N"または"n"で応答する。configファイルが書き換わってしまったりすると、設定を元に戻すのに大変な苦労をする。※何回かハマった

(2023/08/18 記)

worningが出るようになったので対処

root@web64:/home/makoto# apt-key list
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
/etc/apt/trusted.gpg
--------------------
pub   rsa2048 2012-06-17 [SC]
      CF8A 1AF5 02A2 AA2D 763B  AE7E 82B1 2992 7FA3 303E
uid           [ unknown] Raspberry Pi Archive Signing Key
sub   rsa2048 2012-06-17 [E]

どうも古い鍵が悪さをしているらしい
apt-keyでtrusted.gpg.d 以下にexportし、keyringから削除する

apt-key export 7FA3303E | gpg --dearmour -o /etc/apt/trusted.gpg.d/RaspberryPiArchive.gpg

apt-key --keyring /etc/apt/trusted.gpg del 7FA3303E

ワーニングが出なくなった。

(2023/09/10 追記)

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BDE6D2B9216EC7A8

新規インストールに上の2行が必要

さくらVPS(Debian Bullseye)をIPv6対応にする

掲題の作業を実施する。
環境としては

・さくらVPS(石狩)2コア、1GBメモリ
・domain:h-sol.jp
・Debian11 Bullseye
・Bind+Postfix+Dovecot+Apache+MariaDB
・fail2ban導入済

という構成。まずは、ipv6の環境を、さくらvpsのコントロールパネルから、サーバ詳細の画面に遷移する。

control-panel-1.png

次に画面の赤丸のグローバルNWの画面に遷移する。

control-panel-2.pngここで参照するのが、それぞれ赤丸をした項目。

IPv6アドレス
ゲートウェイ
(IPv6)DNS

の3つだ。これを、/etc/network/interfacesにipv6の定義を追記する(赤字部分)

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug ens3
iface ens3 inet static
address 153.127.50.48/23
gateway 153.127.50.1
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 210.188.224.10
dns-search vs.sakura.ne.jp
#
iface ens3 inet6 static
address 2401:2500:204:1123:153:127:50:48
netmask 64
gateway fe80::1
accept_ra 0
autoconf 0
privext 0
dns-nameservers 2401:2500::1

とする。

address : IPv6アドレス
(netmask : プレフィックス長 ->これはどこも64らしい)
gateway : IPv6のルータ
(acccept_ra / autoconf / privext : さくらから固定IPv6が割り振られているので0)
dns-nameservers : さくら(石狩)のリージョンによってネームサーバを指定

という設定
(詳細はman 5 interfaces)
ここで再起動して、IPv6設定を有効化する。

次に各サービスへのIPv6記述の追加。
BindではAAAAの項を追加する。

@ IN AAAA 2401:2500:204:1123:153:127:50:48

Fail2banでは、/etc/fail2ban/action.d/iptables-common.localに赤字部分を追記。

[Init]
blocktype = DROP
protocol = all

[Init?family=inet6]
blocktype = DROP
protocol = all

postfixでは、/etc/postfix/main.cfにて

# inet_protocols = ipv4
  ↓
inet_protocols = all

とする。
Apacheはホスト名ベースのVirtualhostを使っているので、特に変更なし。

なお、クライアント側の話であるが
家鯖からcurlで自鯖のアドレスを取得しているが、

curl -s https://h-sol/cgi-bin/checkip2
 →自宅に割り振られたv6アドレスが返ってくる

curl -4 -s https://h-sol/cgi-bin/checkip2
 →敢えてIPv4でアドレスを取得する

というように変更した。

(2022年6月7日記)

Fail2banでalready banと出たときの対処

fail2ban+iptable(debian)の環境。
fail2banからiptableでDROP済(already banned)なのに、繰り返し攻撃してくる。
相手は変造パケットを投げてきているのであろうか。返事をしてしまっている。

1.png

そこで、下記の iptable コマンド;

iptables -A INPUT -s IPAddress -j DROP

をfail2banとは別に発行すると、しつこい攻撃を撃退できることが分かった。
正当な流儀としては、fail2banのaction.dとかを弄るべきであろう。
しかしながらとりあえず(対症療法で)、シェルスクリプト。

#/bin/sh

if [ -e /tmp/banlist.txt ]; then
# echo "/tmp/reban exist"
true
else
echo "create /tmp/banlist.txt"
touch /tmp/banlist.txt
exit 0
fi

REBAN=`tail /var/log/fail2ban.log|grep -m1 already|awk {'print $7'}`

if [ "${REBAN}" = "" ]; then
# echo "ipaddress is null"
exit 0
else
while read LINE
do
if [ "${LINE}" = "${REBAN}" ]; then
# echo "already banned"
exit 0
else
# echo ${REBAN} >> /tmp/banlist.txt
# `iptables -A INPUT -s ${REBAN} -j DROP`
# echo " ${REBAN} is reBANNED !"
true
fi
done < /tmp/banlist.txt
fi

`iptables -A INPUT -s ${REBAN} -j DROP`
echo ${REBAN} >> /tmp/banlist.txt
echo "${REBAN} is reBANNED !"

exit 0

crontabにて、5分に1回、回している。

2.png

無事撃退できた模様。

→後日談としてiptable-all-portで遮断すれば良さそうだ。

(2022/05/14 記)

----
追記

fail2banのactionに着目した。
デフォルトのTCPで拒否しているところ、UDPやICMPも含む、全プロトコルをDROPさせる、"all"の設定にしてみた。scriptが不要か悩む。

# cat /etc/fail2ban/action.d/iptables-common.local
[Init]
blocktype = DROP
protocol = all
#

しばらくscriptを併用して様子をうかがう。

(2022/05/17)

---
さらに追記

fail2banで"protocol=all"としただけでは撃退できない。
シェルスクリプトが効いて、遮断した様子。

fail2ban_sh.png

本スクリプトでiptableコマンドの送出が必要のようだ。
(iptableのchain INPUTで当該IPアドレスをDROP追加するルール。)

(2022/05/18)


さらに追記

jail.d/*.confの設定で、

banaction = iptables-allports

を追加した。シェルスクリプトを回す必要は無くなった。

sshd.conf

[sshd]
mode = aggressive
enabled = true
backend = %(sshd_backend)s
logpath = %(sshd_log)s
findtime = 600
maxretry = 3
bantime = 2d
banaction = iptables-allports

postfix.conf

[postfix]
mode = aggressive
enabled = true
backend = %(postfix_backend)s
logpath = %(postfix_log)s
findtime = 3600
maxretry = 3
bantime = 2d
banaction = iptables-allports

dovecot.conf

[dovecot]
mode = aggressive
enabled = true
backend = %(dovecot_backend)s
logpath = %(dovecot_log)s
findtime = 600
maxretry = 5
bantime = 2d
banaction = iptables-allports

今回新たに追加のrecidive.conf

[recidive]
enabled = true
bantime = 3mo
findtime = 9d
maxretry = 10
banaction = iptables-allports

すべてのポートで拒否とした。

crontabのエントリからスクリプトを除外した。

(2022/05/27)

dovecot-saslが内蔵なのにcyrus-saslを何故installする理由

  • 投稿日:
  • by
  • カテゴリ:

postfixを再導入するところでハマった。

状況としては。FreeBSDのportsから、cyrus-saslを有効にしないでcompileした。

postconf -a
dovecot

と、dovecot-saslが使えるようだ。
しかし/usr/local/etc/postfix/main.cfにて

smtpd_sasl_auth_enable = yes
smtp_sasl_type = dovecot

としても、「cyrus-saslが無い!」と怒られる。


postconfして判った。
暗黙の了解(=main.cfで定義してなくてもデフォルトでセットされているパラメータ)でcyrus-saslがセットされていたのだ。

dovecot-sasl1.pngよって、pkgとしては、「postfix-sasl cyrus-sasl-saslauthd」にdovecotを入れるのが正解。これはdebian(raspi-os含む)も同様。
備忘録に記録していた記事を忘れていた。

注)/usr/local/etc/postfix/main.conf にて、relay_hostにsmtp-authを送る場合には、"smtp_sasl_auth_enable = yes"を追加する。

(2022年3月28日)

letsencryptのcertbot再導入(Debian,Apache)

  • 投稿日:
  • by
  • カテゴリ:

letsencryptのcertbotにて、初期設定するところのメールアドレスをunregistしてしまい、鍵の更新(certbot renew)ができなくなてしまった。そこで、改めてletsencrypt(=certbot)の再導入をおこなった。

環境は以下の通り;

・raspberry pi(8MB) + 500G-SSD
・raspi-os(64bit) bullseye
・ApacheでVirtualHostにより複数ドメインを扱う

事前準備としては以下の通り。

(1)/etc/letsencrypt/ をバックアップから復元する。
(2)certbot delete で取得済のドメイン証明書を順次消去する。
(3)apt remove certbot とした後、apt autoremoveで依存ファイルを消去する。
(4)/etc/apache2/site-enable/*.confで、port:443のconfからssl関連を編集。
(5)/etc/init.d/apache2 stop する。
(6)apache2ctl configtestして、/etc/apache2/site-enable/*.confをチェック。
(7))/etc/init.d/apache2 startし、port:80の各VirtualHostが見えることを確認。

次にcertbotの入れ直し。apacheのモジュールを追加する

apt-get install certbot python3-certbot-apache

続いてletsencryptの導入。

certbot certonly -d ドメイン名

メールアドレスとか聞いてくるので入れる。ウマくいけば、ssl証明書が

/etc/letsencrypt/live/ドメイン名/

から辿れるシンボリックリンクに作成される。apacheのモジュールを入れないときは、該当のVirtualHostのDocumentRootを訊いてくるので、入力する。
下記は設定画面。

なお、

最後に/etc/apache2/site-enabled/*.confでport:443の最後のほうに、

SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/ドメイン名/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ドメイン名/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

を追加する。
Includeの行は当初コメントアウトしていたが、生成されていた/etc/letsencrypt/options-ssl-apache.confを眺めてみると、セキュリティ上必要そうなので、有効化した。

www-ssl-20220311.png

なお、以前は

certbot -d ドメイン名

とすれば、VirtualHostのconfファイルに対して自動的に証明書のパスを足してくれていたが、今回は動かなかった。

certbot --apache

という呪文を唱えてもconfファイルの書き換えができない。viで直接VirtualHostのconfファイルをコピペした。暫定的な不具合なのか、certbotの機能が低下してしまったのかは不明。

(2022/02/23 記、2022/03/11修正追記)

fail2banの設定見直し

  • 投稿日:
  • by
  • カテゴリ:

/var/log/mail.logを見ていると、あるIPアドレスからAuthの警告が出ている。saslの穴を探っているようだ。
前回記事でのインストール方法を見直すこととした。

環境は

さくらVPS(石狩)
debian
postfix + dovecot
fail2ban + iptables

の構成。fail2banは、0.11.2

# fail2ban-client -V
0.11.2
#

まずは、/etc/fail2ban/jail.d/postfix.conf なるファイルを準備、導入。
/etc/fail2ban/jail.localなるファイルを置いて/etc/fail2ban/jail.confをoverrideする機構であるが、/etc/fail2ban/jail.d/ 以下のファイルもIncludeされるので、サービスごとにconfファイルを置くことにした。

[postfix]
mode = aggressive
enabled = true
backend = %(postfix_backend)s
logpath = %(postfix_log)s
findtime = 600
maxretry = 3
bantime = 2d

modeについては/etc/fail2ban/filters.d/postfix.confで定義されているfilterのルールで何を使うかを定義する。"aggressive"だと、(次郎系らーめんでいうところの)「トッピング全部乗せ」のオーダになる。sasl-authだけ気になるのであれば、mode = auth とか。他にも、rblとかddosなどのパラメータを選択可能。
backend は変数の中に、/etc/fail2ban/filters.d/postfix.conf を指すようになってるようだ。fullpathで書いても動いた。backend についても同様。/var/log/mail.log になっている。

さて同様にsshdについても/etc/fail2ban/jail.d/sshd.confを作る。

[sshd]
mode = aggressive
enabled = true
backend = %(sshd_backend)s
logpath = %(sshd_log)s
findtime = 600
maxretry = 3
bantime = 2d

さらに/etc/fail2ban/jail.d/dovecot.conf

[dovecot]
mode = aggressive
enabled = true
backend = %(dovecot_backend)s
logpath = %(dovecot_log)s
findtime = 600
maxretry = 5
bantime = 2d

デフォルトの状態だと、tcpを定義portでrefuseするが、iptableでBANしてもしつこくsshdにattackしてくるのが居る。応急的にiptableでDROPするよう、とりあえず、手動で以下を発出。

# iptables -A INPUT -s 142.93.164.94 -j DROP

ここから、本格的にiptableでDROPとするやりかた。
fail2banのaction書き換えを別途調査したら見つかった。
/etc/ffail2ban/action.d/iptables-common.confに

[INCLUDES]

after = iptables-blocktype.local
iptables-common.local
# iptables-blocktype.local is obsolete

とある。
そこで、/etc/fail2ban/action.d/iptables-common.local なるファイルを作り、

[Init]
blocktype = DROP

と定義する。

ここでfail2banを再起動。

systemctl reload fail2ban

とした。が、ルールが一部更新されなかったので、

/etc/init.d/fail2ban stop
rm /var/lib/fail2ban/fail2ban.sqlite3
/etc/init.d/fail2ban start

で、サービスを止めて、BANのlistをクリアし、再スタートした。

root@ik1-423-43544:~# fail2ban-client status
Status
|- Number of jail: 3
`- Jail list: dovecot, postfix, sshd
root@ik1-423-43544:~# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 142.93.164.94
root@ik1-423-43544:~# fail2ban-client status postfix
Status for the jail: postfix
|- Filter
| |- Currently failed: 1
| |- Total failed: 2
| `- File list: /var/log/mail.log
`- Actions
|- Currently banned: 5
|- Total banned: 5
`- Banned IP list: 174.138.10.169 193.56.29.119 5.34.207.52 5.34.207.58 77.247.110.151
root@ik1-423-43544:~# fail2ban-client status dovecot
Status for the jail: dovecot
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/mail.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
root@ik1-423-43544:~#

動作しているのを確認した。

# iptables -L

で。iptable で弾いている様子が確認できる。

f2b.png

iptableでDROP定義に変わった。

あと、

less /var/log/fail2ban.log

でfail2banの動作環境を監視すると、findtimeとかbantime、maxretryの調整に役立つ。

(追記 2022/02/07)

さくら(石狩 Debian)のVPSにあるPostfix + dovecot。MUA(OutlookとかiPhoneとかAndroid)からアクセスできる。送受信とも問題ない。

しかし、自宅内FreeBSDのpostfixから、port:587にて石狩サーバでメールを中継しようとすると、

status=deferred (SASL authentication failed; cannot authenticate to server mail.h-sol.jp[153.127.50.48]: no mechanism available)

というエラーを吐いてリレー動作に入ってくれない。

no_mech.jpgこれまで、nifty回線ゆえport:25はブロックされている。仕方なく、ISPのsmtp.nifty.com:587に投げていた。一方で、石狩のmail.h-sol.jp:587が所望の動きをしてくれない。

ここから色々と試行錯誤;
・saslをdovecotからcyrusへ → 効果なし
・cyrusでPAM以外を試行 → 接続できず
・smtps(port:465) → 接続できず
・mynetworksに自宅IPアドレス入れる → 変化なし
・自宅機のsmtp_sasl_password_maps を100回見直す → 無駄に終わる
・smtp_sasl_mechanism_filter = plain, login を挿入 → 挙動変わらず

結局のところ、簡単なtypo!自宅(FreeBSD)Postfix+dovecotにて、

(誤)smtpd_sasl_security_options = noanonymous
→デフォルトで設定(=あえて設定する必要はない)
(正)smtp_sasl_security_options = noanonymous
→デフォルトはnoplaintext, noanonymous。noplaintextを有効とするため"= noanonymous"とする設定が必要。

smtpd_sasl_security_options は自鯖が接続元からメールを受け、これを処理する設定である。
一方で外に向かうメールは、smtp_sasl_security_optionsにて設定される。本来"smtp_"であるところ"smtpd_"と定義してしまったため、SASL-Authでplaintextが使えなくなり、「saslのmechanismが無い」と怒っていたのだ。
面倒なことに、smtp,smtpdとも存在するオプションであるので、main.confの書式としてエラーが出ない。

何と!2日間悩み続けた......

FAQとしてcyrus-saslを入れないといけない!というWebページが多かったが、cyrusは導入済であったので、原因ではなかった。
肝心な結論;

smtp_sasl_security_options = noanonymous

が効いていないかも、という点に辿り着けなかった。

さてこれで、nifty以外のISPに乗り換えられそうだ。

※FreeBSDのpostfix+dovecotに関しても同様の挙動。

2021年10月25日 記

(補足)参考までにヘッダー

X-MSK: HYD=0.608022005
Return-Path: <makoto-h@sub.h-sol.jp>
X-Original-To: makoto@h-sol.jp
Delivered-To: makoto@h-sol.jp
Received: from rpi3x.smbdom.local (p0731950-vcngn.ibrk.nt.ngn.ppp.ocn.ne.jp [222.158.89.45])
by mail.h-sol.jp (Postfix) with ESMTPSA id 5532F6009B
for <makoto@h-sol.jp>; Mon, 25 Oct 2021 14:03:39 +0900 (JST)
Received: from AOPEN (aopen.smbdom.local [192.168.0.69])
by rpi3x.smbdom.local (Postfix) with ESMTPSA id CE14D89C8F
for <makoto@h-sol.jp>; Mon, 25 Oct 2021 14:03:38 +0900 (JST)
From: "Horie Makoto" <makoto-h@sub.h-sol.jp>
To: <makoto@h-sol.jp>
Subject: test
Date: Mon, 25 Oct 2021 14:03:37 +0900
Message-ID: <026b01d7c95d$ab92b8e0$02b82aa0$@sub.h-sol.jp>
MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary="----=_NextPart_000_026C_01D7C9A9.1B7B7250"
X-Mailer: Microsoft Outlook 15.0
Thread-Index: AdfJXR59/wkOQQq+R8ytjuJRn1M9Qg==
Content-Language: ja

こんなところにハマってしまった方々に参考となれば。

シェルスクリプトのechoの挙動でつまづく

1.Debian(Raspi-os aarch64)の挙動

debian-echo.jpg

  • echoの" "内の\nは改行として出力される。
  • echoの -e オプションは認識されない。

さらに実験。

debian-echo-2.jpg

  • shにbuiltinされたechoと/usr/bin/echoがあって、
    manのechoは/usr/bin/echoのようで、-eオプションが効く。
    単にshからechoを呼ぶと、builtinのechoとなり挙動が違う。

2.FreeBSDの挙動

FreeBSD-echo.jpg

  • echoの" "内の\nは改行として出力されない。
  • echoの -e オプションを付けると\nが改行として出力される。
  • echoのmanには-eオプションの記載なし、-nのみ。
    なのに-eオプションが有効だ。
  • /usr/bin/echoは無い。
    which echoと聞くと、built-in command と返事が返ってくる。

3.両者で動作する書き方

echo "Context-type: text/html"
echo
echo

書き換えた。根拠は無いのだが、正しい書き方のような感じがしている。

2021年9月17日