yukuro’s blog

ぽえむ日記

父が家にいるときだけインターネットに繋がらなくなる

はじめに

最近、以下のような記事が話題になっていました。

qiita.com

年末年始の時期になって自分の身の回りにも似たような事象があったので綴ります。

現象

  • 自分が使用しているPCがインターネットに繋がらないことがある
    • どうもIPv4のアドレスが取れていないようで、YoutubeAmazonは繋がるがそれ以外のサイトは繋がらない
  • 年末年始になってから起きるようになった
    • 年末年始で何か変わったことと言えば、父の仕事が休みになり一日中家にいるようになった

調査

Windows イベントビューアー で調べる

Windowsの検索窓に「eventvwr」と入れると、イベントビューアーが起動できます。

今回はIPv4のアドレスが掴めてないようだったので、DHCP Client*1のイベントを見てみることにしました。

すると、以下のようなイベントが見つかりました

これを参照すると、何故か自分のPCが192.168.2.12を掴んでしまい、それをルーターDHCPサーバー(192.168.1.1)に問い合わせた挙句にIPアドレスのリリースを拒否されているようでした。

nmapでDHCPサーバーを特定する

問題は「なぜかPCのインターネットが繋がらない」から「なぜか192.168.2.0/24のIPアドレスを掴んでいる」にレベルアップしました。

恐らく192.168.2.0/24内でDHCPサーバーが稼働していると思われ、少なくとも自分はそのようなDHCPサーバーを建てた覚えはないので潰しておきたいです。

nmapのdhcp-discoverを使用するとネットワーク内のDHCPサーバーの在りかを確かめることができます。

nmap.org

以下が実行した結果です

nmap -sU -p 67 --script=dhcp-discover 192.168.2.0/24
Starting Nmap 7.80 ( https://nmap.org ) at 2024-01-04 00:37 ???? (?W???)
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 192.168.2.10
Host is up (0.0010s latency).

PORT   STATE SERVICE
67/udp open  dhcps
| dhcp-discover:
|   DHCP Message Type: DHCPACK
|   Server Identifier: 192.168.2.10
|_  Subnet Mask: 255.255.255.0
MAC Address: 00:23:18:F4:BF:00 (Toshiba)

Nmap scan report for 192.168.2.11
Host is up (0.0011s latency).

PORT   STATE  SERVICE
67/udp closed dhcps
MAC Address: 00:09:B0:F0:00:A4 (Onkyo)

Nmap scan report for 192.168.2.16
Host is up (0.019s latency).

PORT   STATE  SERVICE
67/udp closed dhcps
MAC Address: 9C:53:22:0A:0A:BC (Unknown)

Skipping UDP Scan against 192.168.2.12 because Windows does not support scanning your own machine (localhost) this way.
Nmap scan report for 192.168.2.12
Host is up.

PORT   STATE   SERVICE
67/udp unknown dhcps

Nmap done: 256 IP addresses (4 hosts up) scanned in 6.03 seconds

これを参照すると192.168.2.10でMACアドレス00:23:18:F4:BF:00の機器がDHCPサーバーを建ててるらしいです。

東芝製品の調査

先ほどの調査から、ベンダーはToshibaなので安直に家の中にある東芝製品を調べます。

我が家では東芝製品は実にテレビぐらいなので、ネット上に落ちている説明書とにらめっこしながらMACアドレスを調べます。

その結果、見事先ほどのMACアドレスと同一のものを特定することが出来ました。

原因

原因は父が使用しているテレビでした。

使用していたのは15年程前に発売された機種で、そのうち「LANハードディスク機能」とやらが自前でDHCPサーバーを建てる設定になっていました。

年末年始になり、日中テレビを見る機会が増えたため、併せて機能が有効化されて今回のような事象に至ったようでした。

幸い、現在はテレビとは名ばかりのChromecast with Google TV*2専用機となっているため、「LANハードディスク機能」をオフにして解決しました。

おわりに

インターネットに繋がらなくなる現象は解決できました。

ただ、IPセグメント越しにIPアドレスを拾ってきたり、自PC以外の機器(iPhoneとか)は何ともなかったため「もしかして...おま環?」と思いながら調査してました。

おま環だったら申し訳ないです。。

*1:アプリケーションとサービスログ > Microsoft > Windows > DHCP-Clientにあります

*2:https://store.google.com/jp/product/chromecast_google_tv?hl=ja

TsukuCTF2023 Writeup

TsukuCTF2023

TsukuCTF23に参加してOSINT問ばかり解いていました。以下はWriteupです

castle

  • Googleレンズで検索したところ、太陽公園の白鳥城であることが判明
  • 広場のような箇所を指定して回答

eruption

location_for_what

airport

  • 以前行ったことのある伊丹空港っぽいと思って入力したらまさかの正解でした

green_bridge

  • Googleレンズで検索したところ、「もみじ谷大橋」付近であることが判明
  • そこに至る一本道を適当に推測して回答

perfume

mab

tsukushi_estate

travel_with_tsukushi

kiZOU

  • 画像右側のガラスに「au style NAHA」と記載されているのを発見
  • 入っているビル(?)はパレットくもじというそうで、「パレットくもじ シーサー」とか調べた
  • シーサー下の文章にフォーカスしている画像がなかったので、頑張って拡大して人物名を回答

big_statue

  • 書いてある中国語(?)を手書き漢字などを駆使して検索
  • インスタアカウントに像が写っている投稿( https://www.instagram.com/p/CtOTvh8sRP-/ )を発見
  • Upper Serangoonにあるらしいので「Lexus Durian King - Upper Serangoon」で調べて出てきた場所を回答

TrainWindow

CtrlAltPrtSc

  • 電卓は恐らくブラフで、その背景に何があるかを当てる問題(だと思う)
  • 上部分にYoutubeのロゴらしき箇所があったので回答

laser

Yuki

  • 温泉街なのに橋が目の前にあるなんてと思い、Googleレンズで橋付近を検索したところ https://4travel.jp/travelogue/11811657 がヒット
  • 記事から定山渓ビューホテルだとわかるので回答

tsukushi_no_kuni

free_rider

river

  • Googleレンズで検索すると鹿児島県の中洲通という場所だとわかる
  • ストリートビューで中洲通沿いを調べていって回答

broken display

  • 左端にある照明(?)を含めてGoogleレンズで検索すると https://nishi2.jp/205234/ がヒット
  • 記事中に「西宮」「ガーデンズ」とあるので検索して回答

stickers

  • 画像奥のバンに「熱海」の文字があるので「熱海 東屋」で画像検索
  • 画像を見ると「熱海七湯 河原湯」がそれっぽかったので回答

grass_court

fiction

終わりに

わからない問題もありましたがOSINT問はやはり楽しいなと再確認しました。

OSINT問以外でも答えられるように精進します...

Sensecap Indicator D1Sに書き込んでみる

はじめに

SenseCAP Indicator D1S — スイッチサイエンス

ESP32およびRP2040のデュアルMCUを備えた4インチのタッチスクリーン液晶です。Wi-Fi/BLE通信やGroveコネクタにより各種センサーや周辺機器に接続でき、またESP32およびRP2040のオープンソース・エコシステムにより多くのアプリケーションに対応できます。3種の環境センサーが搭載され、環境モニターにも最適です。

構成

公式WikiによるとESP32とRP240の両方が使用されている

wiki.seeedstudio.com

SoCによって司るコンポーネントが異なり、それぞれに書き込む必要がある

  • ESP32
    • 4インチスクリーン
    • Wifi
    • BLE
    • ボタン
  • RP2040
    • tVOCセンサ(I2C経由)
    • CO2センサ(I2C経由)
    • Grove(I2C)
    • Micro SD
    • Grove(ADC)
    • ブザー

ESP32への書き込み

wiki.seeedstudio.com

基本的にはWikiの通りに進めればよいのだが、注意点が記されている

Understanding the Need for Patching: LVGL, operates within the SenseCAP ESP32 SDK at a clock frequency of 120 MHz. However, to prevent encountering the "FLASH and PSRAM Mode configuration are not supported" error, it's crucial to apply a specific patch.

This patch is designed to optimize the RGB LCD's performance using the PSRAM Octal 120 MHz feature. It's specifically intended for use with the release/v5.0 branch of ESP-IDF. Please avoid using a version higher than v5.0.

特に「It's specifically intended for use with the release/v5.0 branch」とあるが、ESP-IDFのrelease/v5.0ブランチは常に更新され続けているため、最新のブランチを持ってきてもうまく行かない

そのため、v5.0.1用のofflineインストーラーを使用する必要がある

github.com

これを用いれば何も問題なくgit applyすることでパッチを適用できる

RP2040への書き込み

wiki.seeedstudio.com

こちらは先ほどとは打って変わってWikiの指示通りにすればすんなり書き込めた

COMポートの選択

ESP32とRP2040、どちらも別々の書き込み口を持っているので当然ながらCOMポートも別になる。自分がWindows機で試したところ、以下のように表示された

  • USB シリアル デバイス (COM4)
    • RP2040の場合、こちらを使用
  • USB-SERIAL CH340 (COM5)
    • ESP32の場合、こちらを使用

おわりに・感想

M5Stackのような非常にリッチな環境とは異なり、組込み系をやってる感を得られる

次はLVGLを用いた画面の構成・RP2040とESP32間の通信をやってみる

docker-composeでValheim + Grafanaなゲームサーバーを作る

docker-composeでValheimのゲームサーバー + Grafanaによる監視を構成したのでメモ

Valheimとは

store.steampowered.com

Valheimは北欧神話ライクなオープンワールドサバイバルクラフトゲームです。

デフォルトでは1~10人のマルチプレイに対応しています。

Valheimゲームサーバーを作る

友人(最大4人程度)とマルチで遊ぶためにValheimの専用サーバーを建てることにしました。

専用サーバーの構築にはSteam CLIのインストール等が必要ですが、幸いにも有志の方によってdocker imageが公開されています。

github.com

Deploymentの項目に様々な導入方法がありますが、今回は同時接続の人数が多くて4人程度だったのでdocker-composeを使用した方法を選択しました

VPSの選定

ゲームサーバーにはIndigo VPSを選択しました。

選定した理由は以下のとおりです

  • 料金が安い
      • 使用するdocker imageのSystem requirementsの項目には「4コアCPU & 8GBを推奨」との記載がありますが、他VPSだと月7000円ほどになり、最大4人で遊ぶには高額すぎると感じました

     

Indigo VPSの評判に関してSSH接続が不安定とのレビューも散見されましたが、特に運用に関して大きく困った点はありませんでした。*1

Grafana Cloud

サーバーのリソース監視やアラート等も出したかったのでGrafana(とPrometheus)による監視を入れることにしました。

Grafanaというとオンプレで動かすことが一般的なように思えますが、クラウド版を使ってみたかったのでGrafana Cloudを使用することにしました。

grafana.com

また、Grafana Cloudのサイトには丁寧にdocker-composeによる構築方法も記載されていたため、それに従って各種設定をしました。

grafana.com

docker-compose.yml

上記のことを実行したdocker-compose.ymlならびにその他設定ファイルは以下のリポジトリにまとめてあります。

github.com

余談

Indigo VPSを契約する前、RAMは4GBで十分だろうと、さくらのVPSの4GBプランを契約しましたが、8GBにスケールアップする際に高額 & スケールダウン出来ないのでIndigo VPSに乗り換えました。

契約してしまったさくらのVPSは最低利用期間が3ヶ月なので、何に使おうかな...

*1:WebUIから登録できる鍵がRSA鍵しか受け付けない等の細かな不満点はありましたが...

ターミナルライクでイケてるHugoのTheme作ってみた

この記事はStatic Site Generator Advent Calendar 202120日*1の記事です

作ったもの

shellという名前のHugoのThemeを作りました

github.com

ベースとなるのは7月ぐらいに完成していたのですが、ちょくちょくアップデートをかけたものが一応ひと段落しました

イケてるポイント

①Goghから取得可能なカラースキーム

ターミナルライクなので配色(カラースキーム)を変更できます

7月の時点では、テーマ内に用意された数種類からしか選べなかったのですが、この度 Mayccoll/Gogh のカラースキームに対応しました

Mayccoll/Goghとは

github.com

GoghはGnome等のターミナルの配色を変更できるツールです

変更できる配色はかなり多く、以下のページにあるだけ選択肢があります

mayccoll.github.io

これらの配色はjson形式で配布されており、他のアプリケーション等で使うことができます


shellではHugoの機能を使ってこのjsonを取得し、config.tomlにテーマ名を書くだけで使えるようにしてあります

f:id:kuroblo039:20211220184349p:plain

なので、豊富なカラースキームを自分のWebサイトに適用できます

②忠実に再現したターミナルっぽさ

本物のターミナルっぽさ*2を追求しました

下記のgif画像のように、コマンドの部分のみにタイピングエフェクトがかかるようにし、それ以外は即表示されるようにしました

f:id:kuroblo039:20211220173541g:plain

また、レスポンシブにも対応しています*3

最後に

ターミナルっぽい見た目のThemeが欲しいなと思って作ってみました

豊富なカラースキームが使えるようになり、よりターミナルっぽさが増したかと思います

README.mdも極力丁寧にかいてるつもりなので、ぜひ使ってみてもらえたら幸いです

もしよければGitHubリポジトリStarでも付けてもらえると嬉しいです*4

*1:去年のアドカレは割と栄えていたのにどうして...

*2:ぽいだけでありWebシェルの類ではありません

*3:その過程でCSSを若干嫌いになりました

*4:単純な人間なのでモチベが倍増します

easyなCanSat作ってみた(と反省)

先日、easyなCanSatであるeasyCansatを作ってIoTLTで発表してきました

発表スライド

CanSatとは

f:id:kuroblo039:20211108023054p:plain

CanSatとは、教育目的で製作される模擬人工衛星をいいます

「模擬」であるため、実際に宇宙に打ち上げるわけではありません

CanSatの難しさ

f:id:kuroblo039:20211108023237p:plain

このCanSatですが、製作に回路設計やプログラミングの知識等が必要であり、単に「宇宙に興味がある」人に 簡単に 作れるよ!とは勧めがたいのが現状です

何がeasyか

f:id:kuroblo039:20211108023709p:plain

そこでM5Stackを中心にしたCanSatを作れば "簡単に" なるのではないかと考えました

具体的には以下の通りです

  • M5Stackの使用
    • 回路設計の知識が不要
    • (UIFlowを使用すれば)プログラミングの知識が不要
  • 組み立てガイド等のドキュメントを製作し、作るための情報に容易にアクセス cansat.unknownsky.net

コロナ禍での共同開発

下記は僕のCanSat製作に関する反省日記です

このeasyCansatですが、元々は所属サークルで作ろうと言い出したものなのですが、コロナ禍等の紆余曲折を経て出来上がりました

以下が簡単な経緯なので、コロナ禍のサークル活動(と自分の協調性のなさ)をみて今後の参考にしてもらえたらと思います

2020年5月:製作開始

私が所属していたのはハイブリットロケットを飛ばすことを主な目的としたサークルなのですが

ロケットを飛ばすことが主目的なため、CanSatの製作は下火にあり、作ったことのある先輩方も学年が大きく違う & コロナ禍で会えないので製作にまつわる技術はロステクの状態にありました。

そこで、自団体のCanSatをつくり、後輩に知見を残したいねということで私を含む4人程でCanSatの製作を始めました

2020年6月~7月:仕様の決定

ロステクしていたとはいえ、仕様決定の部分はロケットと共通する部分があり、割と順調に仕様が決定していきました

また、2020年8月に開催されるであろう能代宇宙イベントに出場したいねということで、出場がとりあえずの目標になりました

2020年8月:イベントの延期

目標にしていた能代宇宙イベントが11月に延期されることが発表されました

ただ、製作スケジュールの遅延やハイブリッドロケットの打上の都合上、延期後であっても出場は難しく、出場は諦めることにしました

この製作スケジュールの遅延は主に作業環境の不備が関係しており、以下のようなことがありました

  • 活動場所(大学)がコロナの影響で入構制限がかけられており、気軽に集まることができない
  • 工作設備(工具、3Dプリンター等)にアクセスできない
  • 試作品を実際に触れず、ZoomのMTGWebカメラ越しに見せるしかない
  • したがって、「設計→実物を作ってみる→修正」のアプローチが取りづらく、実物が出来にくい

2020年10月~11月:再燃?

目標にしていた大会への出場は諦めたものの、別の大会への出場を目標とし、活動をしていました

しかしながら、大会の審査が迫るなか、出場させるCanSatとして実際に組みあがったものが出来ていないことから出場を断念することにしました

代わりに、初心に立ち返って後輩に知見を残すためのCanSatを作ることにしました

2020年12月:自由

大会の期日や規格に縛られないCanSatのアイデア出しが始まりました

個人的には期日に追われていたころより楽しいなと感じていました

2021年1月~:僕の暴走

CanSatのアイデア出しは割と順調に進んでいました

しかしながら、前述のとおり、作業環境の不備による影響でCanSatの実物は依然として出来づらい(共有しづらい)状況にありました

幸いにも僕の自宅には3Dプリンタがあったり、M5Stackが転がっていたりしたので、僕は以前にも増して自宅での作業を増やしていきました

自宅での作業はだんだんとエスカレートし、最終的には、機体に関することも電装に関することも一人で決めたり作ったりするようになりました

本来は他のメンバーに「この設計を思いついたんだけど、どう?」と相談すべきだったのですが、

相談した先の状況(試作品を共有する)がボトルネックになっている以上、

相談するより先に一人で試して一人で実装、そして出来上がったものを他のメンバーに見せるといったループが自分の中で構築されていきました

2021年3月:空中分解

製作に関することが僕一人で完結するような形になり、他のメンバーへのタスクが次第になくなっていったことから、定期的に開かれていたMTGは次第に開かれなくなっていきました

連絡ツールとして使用していたSlackも、僕の一方的な報告のみになり、実質的な空中分解の状態に陥りました

~2021年10月:easyCansat完成

そんなこんなで空中分解したのち、僕はモチベーションが絶え絶えになりながらもCanSatを完成させました

ただ、当初の「後輩に知見を残す」という目的よりかは、空中分解して中途半端になったプロジェクトを終わらせるという目的の方が大きくなっていました

どうするべきだったか

どうするべきだったかに関して、僕は僕の中で結論を出せていません

実際に集まることが難しく、共用の工作機械が使えず、実際の製作物とその出来具合を共有することが難しい中、停滞する進捗に身を任せることが正解だったとは思えません

しかしながら、タスクを皆に振り分け、共同かつ円満にプロジェクトを進めていくことも(工作機械を使えない等の理由も相まって)できませんでした

まとめ

結果的には完成したCanSatですが、コロナ禍の難しさがあった中で製作したことを知っていただければ幸いです

宇宙・ロケット界隈以外では知名度の低いCanSatですが、このeasyCansatが少しでも知るきっかけになればと思います

無料で制限のないngrok的サービスを求めて

とあるハッカソンにてlocalhostで建てたサービスを外部に公開したいなぁという時があり、様々なサービスを試したのでメモ

ngrokの問題点

ngrokはコマンド一つでPublicなURLを得ることができるため、非常に便利ですが、今回使うにあたって以下のような問題にあたりました

stackoverflow.com

要約すると「過去1分間のコネクション数が多すぎるから20コネクション/分にしてね」というエラーなのですが、個人的には割とシビアな制限*1だな〜と思いました

ngrokのpricingを見ると

ngrok.com

FREEプランは40コネクション/分となっているので、ngrok全体への制限なのかなとも思ったりしましたが、最上位のプラン(Businessプラン)にしても制限はかかるっぽいので別のサービスを探すことにしました

localtunnel

localtunnel もngrokと同じ類のサービスですが、2年ほど前のIssueをみると

github.com

「セキュリティ的な迷惑行為が起きても、サーバーが落ちても、無制限」みたいなことを言っているためngrokの完全上位互換じゃん!とか思ったりしました

localtunnelの問題点

localtunnelはWebhookのテストを目的としているため、クソデカファイル(自分が試したときは60MBぐらい)を投げるとHTTP 413(Payload Too Large)を吐かれます

github.com

確かにテスト目的では良さそうなのですが、今回は画像を送り付けて何かするみたいなサービスを作っていたので、他のサービスを探すことにしました

最適解:frp

ここまでサービスの類を検討してきて、大体の場合に制限がかかっていたので自分でホスティングする方向で探しはじめました

frp は fast reverse proxyの略らしく、githubのstarの数が現時点で46.5k付いている人気なプロキシです

github.com

Readmeも丁寧かつ導入も楽そうなので、今回のハッカソンではこれを用いました

導入

frpの実行ファイルには2種類あり、Public IPが付与されるサーバー用のfrpsとクライアント用のfrpcです

githubReleaseに各種実行ファイルがあり、これに設定ファイル(frps.ini / frpc.ini)をつけて実行します

親切なことにsystemdで動かせるような*.serviceファイルも付属しており、これを/etc/systemd/systemとかにコピーするとsystemdで動かせるようになります

機能

  • frps.iniではクライアントとのSSHするポートのほかに、vhost_http_portとしてPublicに公開したいポートも選ぶことができる
  • *.inigroupをいじることでロードバランサーにもなる

やったこと

今回のハッカソンでは、Public IPが付与されるAzure上のVMの無料枠(B1s)をfrp server、本番環境をfrp clientとしてセルフホストなngrok的なやつを構築しました

また、本番環境だけでなくメンバー宅PCもfrp clientに指定して、もし本番環境が落ちたらメンバー宅PCに切り替えるみたいなこともできるようにしました

以下に使用した*.iniを示します

frps.ini

[common]
token = XXXXXX
bind_port = 8080
vhost_http_port = 80
vhost_https_port = 443

frpc.ini

[common]
token = XXXXXX
server_addr = XX.XX.XX
server_port = 8080

[web1]
type = http
local_ip = 127.0.0.1
local_port = 5000
custom_domains = www.example.com
group = XXX
group_key = XXXXX
  • tokenを指定しないとタダ乗りされる恐れがあるので、推測されにくいやつを指定する
  • custom_domainsで指定したドメインのAレコード(or CNAME)をserver_addrで指定したやつを指し示すようにする
  • ロードバランサーの設定であるgroupgroup_keyはクライアント間で共通にする

今回は導入における手間を最小限にしたかったのでtype=httpにしました

vhost_http_portに80番を指定すると(自分の環境では) Permission deniedで弾かれたのですが、sudoをつけると実行できました

よって、systemdで動かす際にはfrps.service

[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini

[Install]
WantedBy=multi-user.target

のようにUser=nobodyからUser=rootに書き換えました

まとめ

frp自体はHTTPS等他のプロトコルにも対応しているようなので、ハッカソン以外にも自分専用のngrok的サービスとして使うのも良さげだなと思いました

特に学生はAzure for StudentでB1s枠が実質無料で使えるため、おすすめです

*1:まぁ課金しろという話だとは思いますが