ホーム » コンピュータ (ページ 2)
「コンピュータ」カテゴリーアーカイブ
dmarc=fail p=none の受け取り拒否
自宅メールサーバでは、Postfix + Postgrey + amavisd + OpenDMARC + Spamassassin で運用しているが、
From 偽装は OpenDMARC で reject などができるようになった。
しかしながら、spammer は dmarc=fail 判定されても相手にメールが届くようにするため、ポリシー p=none のドメイン名探し、そのドメイン名を From にして、しつこく何度も送ってくる。
特定ドメインの dmarc=fail, p=none は受け取り拒否
しかたがないので、Postfix の OpenDMARC判定後に Postfix の header_checks の機能で p=none で送られてきたドメインは REJECT するようにしてみた。
((( /etc/postfix/main.cf )))
header_checks = regexp:/etc/postfix/header_checks
((( /etc/postfix/header_checks )))
/^Authentication-Results:.*dmarc=fail.*p=none.*header\.from=monex\.com/ \
REJECT DMARC authentication failed for specific domain.
spammerは怪しいドメインを次々みつけてくる
header_checks で運用してたけど、spammer は次々と怪しいドメイン(p=noneのドメイン)を見つけてきて、すり抜けてくるメールを送ってくる。このままじゃ、header_checks ファイルを日々更新することになりそう。
しかたがないので、dmarc=fail, p=none は SpamAssassin で Spam スコアを上げて、迷惑メールに確実に落とすことを目標にしたほうが良さそう。
((( /etc/spamassassin/local.cf の末尾に追記 ))) # DMARC失敗 (p=none) を検知するルール header LOCAL_DMARC_FAIL_NONE Authentication-Results =~ /dmarc=fail \(p=none/ describe LOCAL_DMARC_FAIL_NONE DMARC validation failed with p=none score LOCAL_DMARC_FAIL_NONE 3.5 # (参考) DMARC失敗 (p=quarantine) の場合もスコアを上げたい場合 header LOCAL_DMARC_FAIL_QUAR Authentication-Results =~ /dmarc=fail \(p=quarantine/ describe LOCAL_DMARC_FAIL_QUAR DMARC validation failed with p=quarantine score LOCAL_DMARC_FAIL_QUAR 5.0
Gemini for Home アップグレード
Gemini for Home の早期アップグレードが届いたことだし適用してみる。
完成度としては今ひとつという噂もあるけど。

2026-04-13追記
「OK google, テレビを消す!」と命令すると「テレビとチューナーどちらを消しますか?」と、チューナーがテレビの属性となっているので、余計な質問が増えた。連動設定してあるから、どっちを消してもちゃんと消えるけどさ。
DMARCレポートの修正
最近、dmarc のメールが届かないと思ってたら、中で使っている munpack がインストールされていない。インストールしようにも apt で見つからない。Ubuntu/debian のパッケージから消えたようだ。Gemini に代替品を聞いたら ripmime を紹介される。
((( ripmime をインストール ))) $ sudo apt install ripmime ((( 修正 ))) # 標準入力のメールから添付ファイルを抽出 - system( "/usr/bin/munpack -q -C $tmpdir > /dev/null 2>&1" ) ; + system( "/usr/bin/ripmime -q -i - -d $tmpdir > /dev/null 2>&1" ) ;
ついでに、DMARC のポリシーを p=quarantine から p=reject に変更しておいた。
spam が google などのクラウドばっかり
自宅サーバへの spam は、spamassasin などでかなり除去できるようにしてあるけど、それでも相変わらず届いている。送り元の IP アドレスを調べて 完全拒否などもしているけど、それでも届くのか。
送り元の確認
あらためて、送り元を確認したら、google クラウドサーバとか amazon クラウド。IPアドレスでは消せないなぁ。
$ cd ~/Maildir/.Junk/cur
$ grep "Received: from" * \
| grep -v 127. \
| awk -F [][] '{print $2}' \ [,]を区切り文字として真ん中を取り出す
| sort | uniq -c | sort -r
6 202.238.198.26
1 54.169.135.62
1 52.76.242.183
1 35.236.54.228
1 35.236.40.141
1 35.226.131.57
1 34.96.185.118
1 34.176.225.88
1 34.163.22.216
1 34.155.225.82
:

OpenDMARC fail で消せばいい
メール確認してたら、OpenDMARC が fail 返しているじゃん。こんなの Reject されてると思ってたけど、
“Authentication-Results: OpenDMARC; dmarc=fail (p=reject dis=none) header.from=monex.co.jp”
opendmarc.conf を確認したら、デフォルトのままで reject してなかった。ということで reject するように設定変更。
((( /etc/opendmarc.conf ))) # 認証に失敗したメールを拒否するように変更 RejectFailures true $ sudo systemctl restart opendmarc
職場からのメールは、fukui-nct.ac.jp 発信のメールが、fukui.kosen-ac.jp で届くので、dmarc=fail で失敗判定なんだけど (p=none) なので、普通に届く。
んで、自宅ドメインは…. p=quarantine 「隔離」設定になってるな。そろそろ reject「拒否」にしてもいいかも。
squidからtinyproxyに移行
Squid が遅い
Poicy Routing を導入して proxy 経由のアクセスを別ポートにすることができたけど、squid で動かしている中で、speed test を実行すると、何もなしで 1Gbps 近くでるものの、Proxy 経由にすると squid の性能が低いためか、10Mbps 程度しかでない。
tinyproxy をインストール
あまりにも遅いので、Squid 以外の Proxy サーバを探す。proxy による caching 効果は最近はほとんどないので、proxy パケットを捌くだけのものを調べると HAproxy が高性能らしいけど、reverse proxy 用途で設定がややこしそう。tinyproxy も候補にあがったので、こちらを導入
((( tinyproxy をインストール ))) $ sudo apt remove squid $ sudo apt install tinyproxy ((( /etc/tinyproxy/tinyproxy.conf ))) User tinyproxy Group tinyproxy Port 3128 # squid 互換の proxy ポート Bind 192.168.1.51 # outgoing ポートを 専用ポートにする Timeout 600 DefaultErrorFile "/usr/share/tinyproxy/default.html" StatFile "/usr/share/tinyproxy/stats.html" LogFile "/var/log/tinyproxy/tinyproxy.log" LogLevel Info PidFile "/run/tinyproxy/tinyproxy.pid" MaxClients 100 Allow 127.0.0.1 Allow ::1 Allow 192.168.11.0/24 ViaProxyName "tinyproxy"
policy-routing で Squid を別ポートに振分け
自宅のプロバイダ接続のルータは、上流2.5Gbps だけど、DHCPなどの設定の自由度が低いため、内側に WiFi ルータを置いた2段構成。ただし、上流ルータの LAN ポートが 1Gbps なので、2.5Gbps を活かせていない。
自宅サーバを使わない catvstb は、上流ルータの WiFi ポートを指定することで、内側 WiFi を使わないようにして、少しはトラヒックを分割した。
でも、さらなるトラヒックを活かすべく、内側ルータ内のサーバに2本目の LAN ポートを設け、内側 WiFi ルータを経由せずに上流ルータにつながるようにして、Squid の Proxy サーバのトラヒックだけこちらに流したい。
policy-routing の設定
設定の要点を Gemini に伝え、現状の netplan の設定を伝えて、policy routing の設定を提示してもらった。

---
network:
version: 2
renderer: NetworkManager
ethernets:
enp2s0:
match:
macaddress: "4C:CC:6A:F9:B0:84"
addresses: [192.168.11.3/24]
nameservers:
addresses: [192.168.11.3]
routes:
- to: default
via: 192.168.11.1
metric: 100 # メインの優先度を高く設定
enxc8a362ed15ee:
match:
macaddress: "c8:a3:62:ed:15:ee"
addresses: [192.168.1.51/24]
routes:
# メインのルーティングテーブルにはデフォルトゲートウェイを書かない
# 代わりに、Squid専用の「テーブル200」の中にだけゲートウェイを作る
- to: default
via: 192.168.1.254 # 上流ルーター
table: 200
routing-policy:
# 192.168.1.51 を「出発地」とするパケットだけをテーブル200へ飛ばす
- from: 192.168.1.51
table: 200
適用して、問題がなさそうなので、squid に以下の設定を追加。
((( /etc/squid/conf.d/policy-routing.conf ))) tcp_outgoing_address 192.168.1.51
動作を確認
Proxy ナシの Chrome と Proxy アリの Firefox を起動して、YouTube を閲覧中。catvstb でも 上流ルータをそのまま使って YouTube を視聴中。CATVSTB=赤、SquidProxy=青、通常パケット=水色でトラヒックが分散されている。自宅外からWebサーバが閲覧できることも確認できた。満足…

HTTP3+QUIC 対応で FireWall に udp/443 を追加しただけ
HTTP3+QUIC だと、QUIC 用に UDP/443 を使うらしい。
サーバの設定は後で見直すとして、ひとまず FireWall + 自宅ルータの DMZ 設定で、UDP/443 を追加してみた。
んで、apache2 で HTTP3+QUICK を探すと、標準モジュールでは対応していないとな。さすがに apache を手作業インストールで運用する気はおこらんなぁ…
Rust 版 switchbot-cli のインストール
Switchbot を使っていて、HomeAssistant などで活用しているけど、スイッチ動作を登録するとき、照明だと、リモコン信号でON/OFFを切り替えるため、点灯状態によっては、ON を押しても照明としては消えたりすることもでてくる。
このため、Homebridge では、電源ボタンではなく、全点灯=ON, 常夜灯=OFF で登録している。こういう細かい制御となるとサーバで管理した方が楽なので、コマンドライン側から Switchbot を使いたい。
Switchbot を扱っていて、調べてみると Rust 版があるらしい。以前 nodejs 版も入れたけど、monit からの google-home-player (nodejs版)の呼び出しで、色々トラブルで動かなかったりするので、Rust 版を試したい。
Rust 版 switchbot-cli をインストール
“cargo install switchbot-cli” でインストールができるというが、エラーでコンパイルに失敗。Rust の最新版が必要みたい。最新版の rustc-1.88, cargo-1.88 などを入れて、rustup コマンドで環境を登録。最終的に switchbot-cli を root でインストール。
((( rustc-1.88 などのインストール ))) $ sudo apt install rustc-1.88 cargo-1.88 rustup ((( rustup に 1.88 使用を明言 ))) $ sudo rustup override set 1.88 ((( root 権限で switchbot-cli をインストール ))) $ sudo cargo install switchbot-cli --root /usr/lib/cargo $ cd /usr/local/bin $ sudo ln -sf /usr/lib/cargo/bin/switchbot .
switchbot-cli の使い方
switchbot コマンドを使ってみる。
((( switchbot-cli に TOKEN, SECRET を登録 )))
$ switchbot
Token> xxxxxx
Secret> xxxx
: 学習リモコン (remote with screen, ID:xxxxx)
2: CO2センサー (MeterPro(CO2), ID:xxxxx)
3: CO2センサー・子供部屋 (MeterPro(CO2), ID:xxxxx)
4: switchbot-hub3 (Hub 3, ID:xxxxx)
:
18: リビングの照明 (Light, ID:xx-xxxxxxxxxxx-xxxxxxxx)
((( 使ってみる )))
$ switchbot xx-xxxxxxxxxxx-xxxxxxxx turnOff # デバイスID で操作。
$ switchbot 18 turnOn # 前述のデバイスの連番 18 でもいいみたい
$ switchbot 18 help
turnOn
every home appliance can be turned on by default
turnOff
every home appliance can be turned off by default
customize/{user-defined button name}
all user-defined buttons must be configured with commandType=customize
brightnessUp
brightness up
brightnessDown
brightness down
customize/{user-defined button name}
all user-defined buttons must be configured with commandType=customize
$ switchbot --alias リビングの照明=xx-xxxxxxxxxxx-xxxxxxxx
$ switchbot リビングの照明 turnOn
$ switchbot --alias switchbot-hub3=xxxxxxxx
$ switchbot switchbot-hub3 status
humidity: 49
version: "V2.0-1.6-1.6"
moveDetected: false
temperature: 19.1
onlineStatus: "online"
lightLevel: 1
$ switchbot switchbot-hub3 status.temperature
19.5
monit による外出/帰宅検出
HomeAssistant による外出/帰宅検出を試しているけど、オートメーションではなかなか面倒な雰囲気。
gemini に簡単な ping 監視を提案してもらったら、monit を紹介してくれた。
monit インストール
pre-script で install コマンドでの -Z オプションが原因でインストールに失敗してたけど、pre-install のスクリプトを強制的に直してインストール。
monit で外出/帰宅検出

((( /etc/monit/conf.d/iphone.conf )))
# count 10 = 5min # /etc/monit/monitrc set daemon 30
check host iphone with address iphone
if failed ping count 10 then exec "/etc/monit/script.d/iphone17.sh off"
else if succeeded then exec "/etc/monit/script.d/iphone.sh on"
((( /etc/monit/script.d/iphone.sh )))
MONIT_SUMMARY="/usr/bin/monit -B summary"
case "$1" in
on )
/usr/local/bin/google-home-player.sh "帰宅しました"
/usr/bin/touch /var/lib/monit/status/iphone
;;
off )
/usr/local/bin/google-home-player.sh "外出しました"
/usr/bin/rm -f /var/lib/monit/status/iphone
;;
* )
;;
esac
google-home-player が動かない
目的の処理は呼び出されているが、google-home-player.sh が動かない。普通にコマンドラインであればきちんと発声してくれるのに、monit の script で動かすときだけ発声しない。
色々実験すると、google-home-player.sh の中でパイプを処理する際の標準入力の所有権のトラブルが想定される。そこで、Gemini が提案してくれた、cat を挟む方式を試す。…. 効果なし
((( google-home-player.sh の末尾 )))
if [ $# -gt 0 ]; then
# コマンドライン引数を google home で喋らせる。
- echo "$@" | exec $GHP_TALKJS $GHP_ARGS
+ echo "$@" | /usr/bin/cat | exec $GHP_TALKJS $GHP_ARGS
else
# 標準入力を google home で喋らせる。
- exec $GHP_TALKJS $GHP_ARGS
+ /usr/bin/cat | exec $GHP_TALKJS $GHP_ARGS
fi
コマンド実行のプロセス環境の問題なので、最後の手段、発声処理を batch コマンドで実行させてみる。…効果なし
google-home-player.sh にて、nodejs を呼び出す際に、exec を付けているが、これが原因なのか?
AI系に色々と確認させたけど、Copilot が google-home-player を呼び出す際の js スクリプトに 発声終了の確認せずにプロセスが終わって、発生が止まっている可能性を指摘してきた。提案してくれたスクリプトの修正をして、試す。




