ホーム » コンピュータ (ページ 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 スクリプトは以下となった。

munin でのパケット流量観測に組み込んでみた。

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/

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

Google 検索

My Google   Yahoo

Microsoft

ファンサイト

メタ情報