ホーム » コンピュータ (ページ 5)
「コンピュータ」カテゴリーアーカイブ
Buffalo ルータの情報
Home Assistant を使っていたら、UPnP の機能でルータのパケット情報を取得しているらしい。ではどうやって取得するのか?
SSDPでUPnPデバイスを探す
Gemini に「UPnPの機能で Buffalo のルータの通信速度などの情報を調べるには?」と聞いたら、「SSDP(Simple Service Discovery Protocol)を使用してネットワーク上のUPnP対応デバイスを検索します。これは、マルチキャストアドレス239.255.255.250のUDPポート1900にM-SEARCHリクエストを送信することで行います。」とのアドバイスがもらえた。
「取得するプログラムを提案して」と聞いたら、以下の Python コードを教えてくれた。
import socket
import time
# SSDPマルチキャストアドレスとポート
SSDP_ADDR = '239.255.255.250'
SSDP_PORT = 1900
# M-SEARCHリクエストの作成
# ST: Service Type、ここではルーター(WANIPConnection)を指定
# MX: Maximum wait time in seconds
msearch_request = '\r\n'.join([
'M-SEARCH * HTTP/1.1',
'HOST: {}:{}'.format(SSDP_ADDR, SSDP_PORT),
'MAN: "ssdp:discover"',
'ST: urn:schemas-upnp-org:service:WANIPConnection:1',
'MX: 3',
'',
''
])
# ソケットの作成
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(5) # 応答を待機する時間(秒)
print("M-SEARCHリクエストを送信中...")
try:
# リクエストの送信
sock.sendto(msearch_request.encode('utf-8'), (SSDP_ADDR, SSDP_PORT))
while True:
try:
# 応答の受信
data, addr = sock.recvfrom(1024)
print("-" * 20)
print("デバイスを発見しました!")
print("IPアドレス:", addr[0])
print("ポート:", addr[1])
print("\n応答内容:")
print(data.decode('utf-8'))
except socket.timeout:
print("-" * 20)
print("タイムアウトしました。すべての応答を受信したか、デバイスが見つかりませんでした。")
break
except Exception as e:
print("エラーが発生しました:", e)
finally:
sock.close()
SSDPの返答から詳細取得
実行したら、以下の情報が得られた。これより、/getedesc.xml などで 49355 ポートに問い合わせすればいいみたい。
M-SEARCHリクエストを送信中... -------------------- デバイスを発見しました! IPアドレス: 192.168.xx.1 ポート: 1900 応答内容: HTTP/1.1 200 OK CACHE-CONTROL: max-age=1800 DATE: Tue, 09 Sep 2025 13:57:21 GMT EXT: LOCATION: http://192.168.xx.1:49355/gatedesc.xml SERVER: Linux/3.14.77 UPnP/1.0 Intel_SDK_for_UPnP_devices/1.2 ST: urn:schemas-upnp-org:service:WANIPConnection:1 USN: (略)
- http://192.168.xx.1:49355/gatedesc.xml
- http://192.168.xx.1:49355/gateinfoSCPD.xml – 情報量少ない
- http://192.168.xx.1:49355/gateicfgSCPD.xml
- http://192.168.xx.1:49355/gateconnSCPD.xml
送受信パケット量を取得
いろいろと試す中、送受信パケットを取得する lua スクリプトを Gemini に作らせたら、下記のようになった。
-- socket.http ライブラリをロードします。
-- 'luasocket'パッケージが必要です。
local http = require("socket.http")
local ltn12 = require("ltn12")
-- UPnPサービス情報
local url = "http://192.168.xx.1:49355/upnp/control/WANCommonIFC1"
-- リクエスト情報を格納するテーブル
local requests = {
{
action = "GetTotalBytesReceived",
tag = "<NewTotalBytesReceived>",
label = "受信"
},
{
action = "GetTotalBytesSent",
tag = "<NewTotalBytesSent>",
label = "送信"
}
}
-- データを取得する関数
local function get_upnp_data(req_info)
local soap_data = string.format([[<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:%s xmlns:u="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1">
</u:%s>
</s:Body>
</s:Envelope>]], req_info.action, req_info.action)
local headers = {
["Content-Type"] = "text/xml; charset=\"utf-8\"",
["SOAPAction"] = '"urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#' .. req_info.action .. '"'
}
print(req_info.label .. "データを取得中...")
local response_body = {}
local res, status_code = http.request{
url = url,
method = "POST",
headers = headers,
source = ltn12.source.string(soap_data),
sink = ltn12.sink.table(response_body),
timeout = 10
}
if status_code and (status_code == 200 or status_code == "200 OK") then
local response_text = table.concat(response_body)
local start_tag = req_info.tag
local end_tag = string.gsub(start_tag, "<", "</")
local _, _, bytes_string = string.find(response_text, start_tag .. "(.*)" .. end_tag)
if bytes_string then
local total_bytes = tonumber(bytes_string)
local megabytes = total_bytes / 1024 / 1024
print(string.format("合計%sバイト数: %d", req_info.label, total_bytes))
print(string.format("合計%sメガバイト数: %.2f MB", req_info.label, megabytes))
else
print(req_info.label .. "データが見つかりませんでした。")
print("応答内容:\n" .. response_text)
end
else
print(req_info.label .. "データの取得に失敗しました。")
print("ステータスコード: " .. (status_code or "不明"))
print("応答内容:\n" .. table.concat(response_body))
end
print("----------------------------------------")
end
-- 各リクエストを実行
for _, req_info in ipairs(requests) do
get_upnp_data(req_info)
end
SSDPとそのあとの処理をまとめた lua スクリプトは以下となった。
Gemini中心のコーディング
でも、今回のプラグイン作成は、Gemini で作らせた。オレがやったのは生成されたプログラムをテストして、プログラム作ってとか、Lua で作ってとか、データ抽出では厳密なXML解析せず正規表現で作って…とか、munin のプラグインに直してとか、命令するばかりで、エディタで悩みながらコード書きはしなかった。エディタ使ったのは、コードの確認・コメント加筆・余計な動作検証の print を消す程度。
Home Assistant のインストール
Google Home mini などでの音声操作は、Google Home に Switchbot を連携させて、使えるようになって十分に便利になったけど、調べて出てきた Home Assistant も試してみたくなった。
Docker をインストール
普通に、Ubuntu の Docker をインストールする手順にてインストール。
Docker に Home Assistant をインストール
参考にしている記事などでは、homebridge なども Docker でインストールしているけど、我が家は homebridge が既に動いているので Home Assistant だけを docker で動かせばいい。これにあわせ、docker-compose.yml を作成。Docker 内の設定ファイルが保存される /config は、/var/lib/homeassistant にマウントさせる。
((( /etc/homeassistant/docker-compose.yml )))
version: '2'
services:
homeassistant:
container_name: homeassistant
image: "ghcr.io/home-assistant/home-assistant:stable"
volumes:
- /var/lib/homeassistant://config
- /etc/localtime:/etc/localtime:ro
restart: unless-stopped
privileged: true
network_mode: host
$ cd /etc/homeassistant $ sudo docker-compose up -d $ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES xxxxxxxxxxxx ghcr.io/home-assistant/home-assistant:stable "/init" 15 minutes ago Up 15 minutes homeassistant
設定がうまくいったら、http://localhost:8123 を開いて、ユーザ登録などを行う。
設定ができた後は色々と設定して、最終的に以下のような画面となった。
homebridge-gshが有償化
自宅の homebridge の制御を google home mini から行うために homebridge-gsh を使っていた。便利に “OK,google” で便利に使っていたけど、エラーがでるようになってきた。homebridge-gsh の導入した当初のページには、「無償だけど有償登録をお願い」みたいに書いてあったけど、2025年5月から、有償サービスに移行していたようだ。
プラグインの再設定を試みたけど、エラーが出るのでよくよく見たら、Trial Expired … ってしっかり表示されていらぁ。
月額 US$2.00 or 年額 US$22.00 を PayPal or カードで支払いとな。こんだけ便利に使ってるのにケチケチ野郎は導入に悩む。Gemini に聞いてみたところ Home Assistant を導入する方法が紹介された。
でも、よくよく考えたら、メインの機器は Switchbot の配下だし、ぐだぐだ考えずに Google Home アプリで、Switchbot を連携でいいじゃん。
SPF, DMARC の確認をしてみよう
最近になって、spam が増えて、文面も日本狙いで、しかもついつい押してしまいそうなものばかり。
SPF 確認の設定
$ sudo apt install postfix-policyd-spf-python
postfixの設定
((( /etc/postfix/main.cf )))
smtpd_recipient_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
check_policy_service inet:127.0.0.1:10023 # postgrey
check_policy_service unix:private/policy-spf # postfix-policyd-spf-python
最後に postfix の再起動
$ sudo systemctl postfix
postgreyの起動方法の変更
メール受信チェックの postgrey を使っているけど、inet 起動になっている。でも一般的には socket 起動が普通のようなので変更するか。
((( /etc/default/postgrey )))
#POSTGREY_OPTS="--inet=127.0.0.1:10023"
POSTGREY_OPTS="--unix=/var/lib/postgrey/postgrey.sock"
((( /etc/postfix/main.cf )))
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_policy_service unix:/var/lib/postgrey/postgrey.sock
check_policy_service unix:private/policy-spf
smtpd_relay_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_policy_service unix:/var/lib/postgrey/postgrey.sock
OpenDMARC確認の設定
apt install opendmarc 設定に失敗中
(追記)
上記のように、SPFや postgrey などの設定を見直したけど、SPF, Postgrey, DKIM 全部通ったメールが届いてる。はぁ….
Thuderbird の spamfilter が迷惑フォルダに落としてくれているけど。
Authentication-Results: XXXXXXXX;
dkim=pass (1024-bit key; unprotected) header.d=qlaahl.com
header.i=sbi_news_alert@qlaahl.com header.a=rsa-sha256
header.s=default header.b=mQJjBRHe;
dkim-atps=neutral
X-Greylist: delayed 601 seconds by postgrey-1.37 at XXXXXXXX;
Sun, 07 Sep 2025 09:53:47 JST
Received-SPF: Pass (mailfrom) identity=mailfrom;
client-ip=34.142.162.76; helo=qlaahl.com;
envelope-from=sbi_news_alert@qlaahl.com; receiver=tsaitoh.net
(追記09/18) DKIM通過の迷惑メール減った
DKIM, SPFを通過してくる迷惑メールが増えたけど、送信元がブラックリストに載り出したのか、迷惑メールも来なくなったな。
自宅サーバへのdkim-passのspam
最近、自宅サーバに届く spam だけど、どれも dkim=pass のメールばかり。
DKIM さえも信用できなくなってるのか?
spam の分析
調べてみると、発信元は全部異なるドメイン名なんだけど、どの spam もサーバ自体は google cloud で、ドメイン名は tucowsdomains.com となっている。
((( spam のメールヘッダ ))) Received: from flvvzqx.com (flvvzqx.com [34.64.222.184]) : $ whois 34.64.222.184 : NetRange: 34.64.0.0 - 34.64.255.255 CIDR: 34.64.0.0/16 NetName: GOOGLE-CLOUD NetHandle: NET-34-64-0-0-2 Parent: GOOGL-2 (NET-34-64-0-0-1) NetType: Reallocated : $ whois flvvzqx.com Domain Name: FLVVZQX.COM Registry Domain ID: 2923522407_DOMAIN_COM-VRSN Registrar WHOIS Server: whois.tucows.com Registrar URL: http://www.tucows.com :
DNSBL の更新
以前、メールが届かないトラブルがあったとき、メールの送信元の確認で使っている DNS Blackhole list のサーバが、実はサポートがいい加減とか、メンテナンスされてないといったことがあり、bl.spamcop.net だけで運用していた。
今回、spam が増えたことだし Gemini に相談したら、zen.spamhaus.org を教えてくれた。もっと候補を挙げて…と調べて教えてた multi.uribl.com なども追加してみたけど、運用実験したら、自分の au.com , mineo.jp のメールもブロックしちゃう。
ということで、最終的には zen.spamhaus.org , bl.spamcom.net に留めた。
((( /etc/postfix/main.cf )))
smtpd_client_restrictions = permit_mynetworks,
check_client_access regexp:/etc/postfix/smtpd_client_regexp
+ reject_rbl_client zen.spamhaus.org,
reject_rbl_client bl.spamcop.net,
reject_unknown_client_hostname,
permit
sshで多段loginでブラウザ起動
sshトンネル
リモートのFireWallの内側から自宅サーバにsshトンネルを必要に応じて掘るようにしている。
リモート$ ssh -R トンネルポート:localhost:22 自宅サーバ ping -i 30 -c 60 localhost
これにより、自宅サーバからリモートに接続する際には、slogin で接続できる。
自宅サーバ$ slogin -p トンネルポート localhost
トンネル経由でブラウザ起動
サーバのメンテナンス程度なら前述の slogin で便利に作業できるけど、リモートの FireWall の内側のWebサーバに接続したいことも出てくる。
こういう場合は、多段 login を使うけど、ssh, slogin の組み合わせが面倒なのでメモ。
自宅WindowsWSL$ ssh -t -X 自宅サーバ ssh -t -p トンネルポート -X localhost google-chrome
WP-WebAuthnで指紋認証login
WordPress の Two-Factor プラグインの多要素認証を使っているけど、メールで飛ばすワンタイムパスワードのコピペが面倒。最近は passkey などで指紋認証などが便利だし、プラグインを漁ってみた。
その中で、WP-WebAuthn が出てきた。現バージョンで検証されていない…とか表示されたけど、ひとまず動きそう。しかも、Two-Factor とも併用ができる。
WP-WebAuthn のインストール
gmp , mbstring が必要と書いてあったので、gmp を追加。(mbstringはインストール済み)
$ sudo apt install php8.4-gmp php8.4-mbstring
プラグインの WP-WebAuthn の設定では、特に変更なしで「変更を保存」
次にユーザのプロフィール画面を開き、「登録された WebAuthn 認証機能」にて「新しい認証の登録」を選び登録。
ログインの際には、以下のような画面で login できた。
homebridge-gsh の再設定
homebridge で制御している家電だけど、Google Nest mini から制御するために homebridge-gsh プラグインを経由して、”OK, google”で様々な操作ができる。….といいながら、制御でエラーが連発するようになってきたので、homebridge-gsh を最初から設定しなおし。前回も同様の再設定しているけど、homebridge-gsh を有償登録していないからかな。
ネットの記事を見ていると、Google Home などに AI(Gemini) を導入するのがすすんでいるようだけど、それに反して、Google Assistant ではトラブルが増えているとの情報から、Nest mini とかでエラーが出るようになると、Google Assistant に絡んだものかと疑ってしまうけど、再設定したらひとまず、うまく使えているかな。
forwarders 設定ミス
娘のスマホで AQUOS を購入ということで、メモ用にリンクを確認するが、SHARP でググったリンク https://corporate.jp.sharp を参照できない。最初は、 jp.sharp というドメイン名に驚くが、ググってみると .sharp とかの 新gTLD が使えるらしい。
自宅内上流ルータに DNS の問い合わせはできない
nslookup www.jp.sharp 8.8.8.8 は動くけど、nslookup www.jp.sharp は、返答が返ってこない。forwarders に書いてある DNS に問い合わせるけど、自宅内の上流ルータ 192.168.1.254 は nslookup 自体を拒否される。Buffalo の家庭用ルータなら、DNSにルータの IPアドレスを指定するのが普通なので、上流ルータの 192.168.1.254 を設定していたけど、これが間違いの元のようだ。
ということで、自宅上流ルータがもらっている丹南ケーブルの DNS 202.88.193.82, 202.127.80.3 を forwarders に記載して、正常動作するようになった。
((( /etc/bind/named.conf.options )))
forwarders {
// Google public DNS
8.8.8.8;
8.8.4.4;
// router
- 192.168.1.254; // 家庭内上流ルータのIPアドレス
+ 202.88.193.82; // ルータがもらう 丹南ケーブルの DNS
+ 202.127.80.3; // 丹南のセカンダリ DNS
};
あースマホの機種変 AQUOS sense9
あーのスマホ Xperia 10 v が、WiFi などは問題なく使えているが、キャリア 5G がつながらなくなった。SIM は認識されているけどつながらない。当初は SIM カードの接触不良などを疑ったが、パパ SIM に差し替えても繋がらないし、キャリア接続の機能部分が死んだみたい。
代替え機も考えたけど2年つかっているのもあるし、機種変とした。本人が、高価な機種には興味がないようなので、Amazon おすすめや、YouTube の2025年ミドルレンジ・スマホで色々と紹介動画も参考に、最終的に「AQUOS sense9 SH-M29B ブラック 6.1型 8GB/256GB SIMフリー」を選定。
https://jp.sharp/k-tai/products/aquos-sense9/

#今後の機種変の目安ということで、記事としてメモ








