nextr 2G を活用するには
nextr 2G を活かせていない
我が家のネットワーク契約は、こしの都ネットワーク(丹南ケーブル) nextr 2G の契約だけど、自宅の端末の管理をきめ細かくしたいので nextr 2G のルータ(G-240W-B GPON) の配下に Buffalo のルータを設置。すべてのネットワーク機器は Buffalo ルータ配下に設置している。このためすべてのトラヒックは、Buffalo ルータ経由となり、ルータの WAN 側は 1G bps なので、2Gbps の最大性能の半分しか使っていない。
改善前の性能
自宅サーバで動かしたブラウザと、Windows で動かしたブラウザで、それぞれを別タイミングで動かすと以下の性能で 1Gbps に近い性能が出る。

しかし、サーバのブラウザとWindowsのブラウザで同時に計測すると、全部が Buffalo のWAN側を通るので、1Gbps の性能になってしまう。(speedtest のリロードボタンの同時押しがなかなかできないので、微妙にタイミングがずれるので500Mbpsを若干越えてるけど)

nextr 2G で WiFi と2つのLANポートに分散
そこで、nextr 2G のルータで活用していなかった WiFi と 2つのLANポート(各1Gbps)で分散を目指した。
nextr 2Gの WiFi は、CATVSTB の インターネット側を 設定。また、自宅サーバに USB 接続の 1Gbps の有線LANを追加し、未使用だった nextr 2G ルータの2つ目の LAN ポートに接続。
これで、サーバのトラヒック(max 1Gbps)と端末のトラヒック(max 1Gbps)に分散して 2Gbps を目指した。

この結果、サーバと端末で同時に speedtest を起動しても 1Gbps に近い性能がでるようになった。
とはいっても、ブラウザで動画を家族それぞれが見たとしても、3人で 100Mbps のトラヒックでさえも出ないけど。
外から自宅サーバが見えない
分散はできるようになったものの、自宅サーバ宛てのメールが届かない。確認したら、Web サーバも外から見えない。外から、Buffalo ルータ経由でアクセスできると思ってたけど。抜き差しする可能性のある USB 有線LANだし、できればnextr 2G ルータの DMZ 設定変更したくないんだけど。もう少し、設定チューニング必要だな。ひとまず USB 有線 LANを抜いておく。
原因としては、パケットが出る際の経路(サーバ⇒nextr 2Gルータ⇒インターネット)、パケットが入る際の経路(インターネット⇒nextr 2Gルータ⇒Buffaloルータ⇒サーバ)の不一致のせい。Gemini に対応案を提案してもらうと、3つの対策を提案してくれた。
- ルータのインターネット接続を Buffalo ルータ経由にする案を提案してくれるが、これじゃトラヒック分散にならない。
- nextr 2Gルータの DMZ の宛先を直接サーバ: 抜き差しする可能性のある 有線LAN だしなぁ。
- PBR(ポリシーベースルーティング)を提案してくれるが、設定は複雑化するとな。
FTTHルータの流量モニタ
以前より、丹南ケーブルへの接続用の FTTH ルータ G-240W-B GPON の munin 用の流量モニタを運用していたけど、WiFi の流量のモニタ機能を追加。これにあわせて、Packet 量でのモニタリングを Byte をモニタするように切り替えた。前も Byte 運用失敗してたけど、再チャレンジ。
でも、運用最初はそれなりに正しそうなグラフなんだけど、数時間動かすと GPON の WiFi を使っているのに流量が表示されなくなる。munin の プラグイン の使い方として、Byte だと通信量のカウンタのオーバーフローしているのかと、色々触ってみるが、改善せず。やむなく パケット単位でのモニタリングに戻す。なんでかなぁ…

光回線ルータの WiFi を稼働させる
自宅ネットワークは、丹南ケーブルの光2G 回線。光のルータの LAN ポートは 1Gbps 回線。自宅ネットワークは、IPアドレス管理をきめ細かく扱っているため、光ルータでは DHCP を切ることができず、家の中で広く WiFi を使えるようにするため、メッシュ機能のルータを設置してあり、若干効率が悪いものの2段ルータ構成となっている。メッシュのルータは WAN側が 1Gbps であり、光2Gbps を有効利用できていない。とはいえ、WiFiの電波の取り合いを避けるため 光ルータの WiFi は切っていたけど、今回 光2G を少しでも有効活用を考えた。
ということで、自宅の動画視聴に活用されている CATB-STB の動画視聴のネットワークを 光2Gルータに WiFi で接続できるように設定。
上記のネットワークモニタの画面の 赤部分が 光ルータの WiFi 回線。つまり赤が自宅TVで、Netflix や YouTube を見ていたトラヒック。水色はメッシュ WiFi ルータのトラヒック。
DNSセカンダリサーバを動かす
UPSの移行などの際に、自宅内ネットワークが止まってしまう問題もあり、raspberry-pi サーバ上にセカンダリDNSを設定してみた。
$ sudo apt install bind9 bind9utils
((( /etc/bind/named.conf.options )))
acl internal-network {
192.168.11.0/24;
};
options {
directory "/var/cache/bind";
forwarders {
192.168.11.<プライマリ>; // internal DNS
};
allow-query { any; };
recursion yes ;
dnssec-validation auto;
listen-on { any; };
listen-on-v6 { none; };
};
((( /etc/bind/named.conf.local )))
zone "<自宅ドメイン>" {
type slave ;
file "db.<自宅ドメイン>.slave";
masters {
192.168.11.<プライマリ>;
};
};
DHCPサーバ側では、出来上がった セカンダリ情報を流すように追加設定。
option domain-name-servers 192.168.11.<プライマリ>, 192.168.11.<セカンダリ>;
VPNトラブル iOS26.1 で回復
iPhone17 に切り替えて設定を移行していたけど、iPhone17 から 自宅 Buffalo ルータへの VPN(L2TP) が接続できない。今まで iPhone12 で iOS26 Beta を入れていても使えていたのに 機種変して iOS 26 の公式版で動かない。
んで、iOS26.1 Beta が早々にでているけど、『「iPhone 17」シリーズでWi-Fi接続が不安定に–一部ユーザーが不具合を報告』の記事の中に”iPhone17 はネットワークに新型チップが導入されていて、そのトラブル対策で 26.1 が公開”という話があった。ということで関連があるかと、早々に Beta インストールの設定を復活させ、iOS26.1 を入れてみたら、VPN が正しく接続できるようになった。
自宅ドメインがGoogleDNSで引けない
自宅サイトのドメイン名が9/18より、Google DNS(8.8.8.8) にて名前解決ができない状態。原因不明(後述 原因はmydns.jpへの水責めの影響)。その他の Public DNS では問題がない(はず)。mydns.jp への Dynamic DNS の情報更新も問題ない(はず)。
状況確認
$ whois tsaitoh.net Domain Name: TSAITOH.NET : Registrant Email: nic-staff@sakura.ad.jp Name Server: NS1.MYDNS.JP Name Server: NS0.MYDNS.JP Name Server: NS2.MYDNS.JP
DNSを管理してもらっている、mydns.jp で確認しても、特に問題がないはずなんだが…
$ nslookup tsaitoh.net 8.8.8.8 ;; Got SERVFAIL reply from 8.8.8.8 ### Google Public DNS Server: 8.8.8.8 Address: 8.8.8.8#53 ** server can't find tsaitoh.net: SERVFAIL $ nslookup tsaitoh.net ns0.mydns.jp ### mydns.jp Server: ns0.mydns.jp Address: 210.197.74.200#53 Name: tsaitoh.net Address: 64.33.3.150 $ nslookup tsaitoh.net 208.67.222.222 ### OpenDNS(Cisco) Server: 208.67.222.222 Address: 208.67.222.222#53 Non-authoritative answer: Name: tsaitoh.net Address: 64.33.3.150 $ nslookup tsaitoh.net 9.9.9.9 ### Quad9(IBM) Server: 9.9.9.9 Address: 9.9.9.9#53 Non-authoritative answer: Name: tsaitoh.net Address: 64.33.3.150 $ nslookup tsaitoh.net 1.1.1.1 ### Cloudflare Server: 1.1.1.1 Address: 1.1.1.1#53 Non-authoritative answer: Name: tsaitoh.net Address: 64.33.3.150
Google DNS から DoS 攻撃(水責め)
mydns.jp の運営の方に問い合わせをしたら、報告をもらえた。
DoS 攻撃が静まれば、復帰するかなぁ…
((メールより一部引用))
原因が判明しました。
現在、GoogleのDNSからDoS攻撃、いわゆる「水責め」を受けているため、こちらのDNSがGoogleとのやり取りを一時的に遮断しています。
なので、1.1.1.1では引けても8.8.8.8では引きにくい、という状況が発生しています。
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 を消す程度。
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
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
};
network トラブル kde-plasma-desktop
自宅ネットワークが動かなくなる。
原因は Ubuntu の記事で KDE Plasma が X11 から Wayland への移行がすすみ安定してきたとのことで、”apt install kde-plasma-desktop”を実行。これがトラブルの始まりだった。
この中でたっぷりパッケージインストールがあったけど、この中で firewalld がインストールされたと共に、iptables-persistent , netfilter-persistent が uninstall された。最終的な症状としては firewalld が DNS をブロック(他のポートもほぼ全部シャットアウト)したようで、自宅ネットワークで名前解決が動かなくなり、自宅全体が ネットワークにつながらない(パケットは流れるけど、名前解決できなきゃ何もできない)
端末側で nslookup server 192.168.xx.xx でサーバに問い合わせをかけても返事がない。nmap 192.168.xx.xx で確認すると、ssh 以外のポートが全滅。iptables -L -n してもちゃんと普通のルールが表示されるし、iptables を消去しても変化なし。この辺でようやく iptables の問題ではないと見えてくる。(でもこの段階で別のFireWallが動いているとはイメージできてなかった)
ということで、
$ sudo apt purge firewalld $ sudo apt install iptables-persistent netfilter-persistent $ sudo netfilter-persistent save # 最初、iptables-persistent も消えているのに気づかず、 # netfilter-persistent save が動かず悩んだ。
設定を復旧するなか途中で LAN (enp2s0) も動かなくなるけど、netplan の設定をやり直して無事回復。(netplanの一言をメモに残しておかないと、IPアドレス固定の設定どこでやったっけ…ということを思い出せない NetworkManager だっけ /etc/network 配下だっけ…と無駄に悩む)
$ cd /etc/netplan $ sudo vi 90-NM-xxxx....xxxx.yaml $ sudo netplan apply
iPhone写真を icloudpd で同期
iPhoneの写真も大量になり、iCloud+ 200GB で保存しているけど、自分のサーバに保存したい。
Gemini に聞いたら、icloudpd を紹介してくれた。
((( インストール ))) $ pip install icloudpd : Successfully installed icloudpd-1.27.4 ((( 実行 ))) $ icloudpd --directory /data --username my@email.address --watch-with-interval 3600
うーむ、認証などの処理がうまくいかない。ひとまず、pip uninstall …



