コンテンツにスキップ

2026

Minecraftで影Mod入れたらめっちゃ重かった話

Minecraft (Java版) で影Modを入れるとなぜかfpsが20を切ってしまっていた。

結論から言うと、Minecraftでは内蔵GPUが規定値になっていたため。明示的にグラボを指定することで無事改善した。

修正方法

  1. Minecraftで F3 を押して表示される Graphic: の値が 解像度 (ATI Technologies Inc.) となっていたらこの問題に該当している
  2. Minecraftを起動した状態でタスクマネージャーを開き、Minecraftの実行フォルダを開いておく
    1. 今回の場合、 以下のパスにあった。C:\Users\username\AppData\Local\Packages\Microsoft.4297127D64EC6_8wekyb3d8bbwe\LocalCache\Local\runtime\java-runtime-epsilon\windows-x64\java-runtime-epsilon\bin\
  3. Windowsの「設定」画面を開き、 システム → ディスプレイ → グラフィック に進む
  4. 「デスクトップアプリの追加」をクリックし、先ほど開いたフォルダの中の javaw.exe を選択して追加
  5. 追加されたら、「GPUのユーザー設定」でグラボのほうを選択する
  6. Minecraftを再起動するとfpsが改善する。 F3 で表示される Graphic: の値が 解像度 (NVIDIA) に変わっている。

TL;DR

WindowsもMinecraftもどっちもMicrosoftのくせに何でやねん。

突然共有フォルダに繋がらなくなった時の話

なぜか同じサーバーのSMBファイル共有に繋がらなくなったので、トラブルシュート手順のメモ。

アクセス権を確認

Get-SmbShareAccess -Name "共有フォルダ名"
icacls "C:\共有フォルダのパス"

アクセス権は問題ない。

SMB設定を確認

Get-SmbServerConfiguration | Select EnableSMB1Protocol, EnableSMB2Protocol

これもSMB2だけが有効にできている。

Windowsアップデートを確認

Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 10

ちょうど問題が起きたあたりにアップデートがあり、再起動待ちだったので再起動するも解決せず。

Windowsイベントログを確認

Get-WinEvent -LogName "Microsoft-Windows-SmbServer/Operational" -MaxEvents 30 | Select-Object TimeCreated, Message | Format-List

失敗のログらしきものは見当たらない。

Windowsファイアウォールを確認

Get-NetFirewallRule -DisplayName "*ファイルとプリンターの共有*" | Select-Object DisplayName, Enabled, Direction

SMB 受信 (Inbound) のルールはTrueになっているので、ファイアウォールは一見問題なさそう…がこれが罠だった(後述)

NTLMv1設定を確認

WindowsUpdateが何か書き換えたのか?と疑って色々確認。

Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name "LmCompatibilityLevel"

設定してないので出ない。

SMB用のポートを確認

netstat -an | findstr ":445"

LISTENINGになっている。

クライアントから確認

ここで端末がiPadだったので、 blink shell からping, nc -zv host 445 してもタイムアウトすることを確認。一方でSSH接続には問題ない。やっぱFirewallでは?

もう一度Firewallを確認

一度無効化すると、問題なく接続できることを確認できた。

Set-NetFirewallProfile -All -Enabled False

ので、いったん戻す。

Set-NetFirewallProfile -All -Enabled True

SMB 受信 のルールで確認すると、プライベートのネットワークのルールが無効化されていた。

Get-NetFirewallRule -DisplayName "*SMB 受信*" | Select-Object DisplayName, Enabled, Direction

プロファイルのルールを明示的に許可 → 解決!

いちおうプロファイルを確認しておいて、

Get-NetConnectionProfile
Get-NetFirewallProfile | Select-Object Name, Enabled

設定すると自分の接続しているプロファイルのルールが書き換わる。

Set-NetFirewallRule -DisplayName "ファイルとプリンターの共有 (SMB 受信)" -Enabled True

設定の直後にちゃんと通るようになった。

原因: ネットワークプロファイルを変更したから、別ルールの扱いになっていた

タイミング的にはWindowsアップデートかな?と思ったけど、一つ前のSSH接続の時にそういえばネットワークプロファイルをパブリックからプライベートに変えたなーと思い出した。 -DisplayName "*ファイルとプリンターの共有*" のルールセット上では問題なく許可できているように見えているが、実際のところ SMB 受信 ではパブリックのみ許可になっていたので、プライベートプロファイルにも許可することで通信が通るようになった。確かに最初よく考えずに一番厳しそうなパブリックにしとこ、みたいにやったなぁ。。。

おまけ: 明示的な新規ルール

明示的に新しいルールを作るときはプロファイルも指定して許可

New-NetFirewallRule -DisplayName "SMB Inbound Private" -Direction Inbound -Protocol TCP -LocalPort 445 -Action Allow -Profile Private

WindowsにSSH公開鍵認証でログインしようとしてハマった

WindowsにOpenSSHをインストールしてパスワードなしのSSH公開鍵認証を設定しようとしたところ、Linuxとは異なるいくつかの罠にはまったのでその記録。

環境

  • サーバー:Windows 11 Pro(OpenSSH for Windows 9.5)
  • クライアント:Debian Linux(OpenSSH 10.0)
  • ログインユーザー:ansible

基本的な設定手順

この手順で実行すれば成功する。

1. Windows側でユーザーを作成し、ログオン(重要)

ユーザー作成はコントロールパネルでもコンピューターの管理でもいいが、そのあと mkdir とかでユーザーディレクトリを作ってはいけない。 必ず一度対話型ログオンをしておくこと。

2. クライアント側で鍵ペアを生成

ssh-keygen -t ed25519

3. SSHサーバーをインストール

名前を確認してから Add-WindowsCapability でインストール

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
Add-WindowsCapability -online -name OpenSSH.Server~~~~0.0.1.0

サービスの状態を確認しつつ起動し、自動開始に設定する。

Get-Service -Name sshd
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'

4. sshd_configの確認

C:\ProgramData\ssh\sshd_config で以下を確認する。

PermitRootLogin no # お好みで
PubkeyAuthentication yes
PasswordAuthentication no # お好みで
AuthorizedKeysFile .ssh/authorized_keys

また、管理者ユーザーの場合は末尾の以下のブロックをコメントアウトしておく。
コメントアウトしないと authorized_keys の参照先が別のパスになってしまう。

# Match Group administrators
#     AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

書き換えた後はサービスを再起動

Start-Service sshd

5. 公開鍵の登録

ssh-copy-id はWindows Serverに対して使えないので(後述)、以下のコマンドで直接コピーする。

cat ~/.ssh/id_ed25519.pub | ssh user@server "powershell -Command \"\$input | Out-File -Encoding utf8 -FilePath 'C:\\Users\\ansible\\.ssh\\authorized_keys' -Append\""

6. 権限の設定

.ssh ディレクトリと authorized_keys の両方から余計な権限を取り除く。

icacls "C:\Users\ansible\.ssh" /inheritance:r `
    /grant "NT AUTHORITY\SYSTEM:(OI)(CI)(F)" `
    /grant "BUILTIN\Administrators:(OI)(CI)(F)"

icacls "C:\Users\ansible\.ssh\authorized_keys" /inheritance:r `
    /grant "NT AUTHORITY\SYSTEM:(F)" `
    /grant "BUILTIN\Administrators:(F)"

ハマりポイント

① 手動でプロファイルディレクトリを作ってはいけない

ansibleユーザーを作成する前に(あるいは作成直後に)C:\Users\ansible を手動で作成しておくと、ユーザーの初回ログオン時にWindowsがそのディレクトリが既に存在することを検知し、C:\Users\ansible.hostname(ホスト名サフィックス付き)という別のディレクトリをプロファイルとして作成してしまう。

SSHデーモンは実際のプロファイルディレクトリを参照するため、C:\Users\ansible\.ssh\authorized_keys に鍵を置いても読まれない。

対策: ユーザー作成後はWindowsの初回ログオン時にプロファイルディレクトリを自動生成させる。手動では作らない。

ssh-copy-id はWindows Serverに対して使えない

ssh-copy-id は内部で exec sh を実行しようとするが、Windows側にshellがないためコマンドが失敗する。厄介なことに、エラーメッセージが出ていても最終的に「Number of key(s) added: 1」と表示されるため成功したように見えてしまう。実際にはファイルは作成されていない。

'exec' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
Number of key(s) added: 1   ← 嘘

対策: PowerShellのコマンドを直接実行して公開鍵をコピーする。

.ssh ディレクトリ自体の権限も厳格に管理される

authorized_keys の権限だけ絞っても、親の .ssh ディレクトリに UsersEveryone が残っていると認証が拒否される。ディレクトリと authorized_keys の両方の権限を設定する必要がある。


トラブルシュートのコツ

認証が通らないときはクライアント側で -v オプションをつけて接続する。

ssh -v ansible@server

Offering public key の直後に Authentications that can continue が出て鍵が拒否されている場合は、サーバー側のイベントログを確認する。

Get-WinEvent -LogName "OpenSSH/Operational" -MaxEvents 30 | Select-Object TimeCreated, Message | Format-List

Raspberry Pi 3B + Trixie で Wi-Fi が突然認識されなくなった話

環境

  • ボード: Raspberry Pi 3B
  • OS: Raspberry Pi OS Trixie (Debian 13ベース)

症状

新規インストールして apt upgrade 後に Wi-Fi が接続されなくなった。

経緯: sudo apt upgradeしたらハングした

新規セットアップし、Wi-Fiも繋いで sudo apt update && sudo apt upgrade をした。時間がかかったので放置して置いたらセッションが切れてしまい、再ログインしようとするとWi-Fiに割り当てたはずの固定IPでログインできない。

取り急ぎ有線でログインして様子を見ようとしたものの、sudoできなくなっている。プロセスを見ると前日実行した sudo apt updgrade がそのまま残っていたので、まずこれを kill

$ ps aux | grep apt 
root 2067 0.0 0.6 20580 6336 ? S Apr01 0:00 sudo apt upgrade 
root 2069 0.0 0.2 20580 2300 ? Ss Apr01 0:00 sudo apt upgrade 
root 2070 0.1 11.5 126508 107308 ? S Apr01 0:44 apt upgrade 

$ sudo kill -9 2067 2069 2070

終わったらロックファイルを削除:

sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/lib/dpkg/lock
sudo rm /var/cache/apt/archives/lock

dpkbの状態を修復してから:

$ sudo dpkg --configure -a

Setting up rpi-chromium-mods (20260211) ... Configuration file '/etc/chromium/master_preferences' ==> Modified (by you or by a script) since installation. ==> Package distributor has shipped an updated version. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : start a shell to examine the situation The default action is to keep your current version. *** master_preferences (Y/I/N/O/D/Z) [default=N] ? 

# Yで続行

改めてアップグレード:

sudo apt upgrade

Wi-Fiが繋がらなくなった

ここでWi-Fiの様子を見る

$ ip a show wlan0
Device "wlan0" does not exist.

nmcli connection show では接続プロファイル(netplan-wlan0-homewifi)は存在しているのに、デバイス自体が見えていない。なんでや


調査の経緯

1. nmcli で状態確認

nmcli connection show
nmcli device status

接続プロファイルは存在しているが、wlan0 デバイスは --(未接続)。

ip link show

loeth0docker0 のみ表示され、wlan0 が存在しない。

3. dmesg でドライバ確認

ここからはClaudeちゃんに相談。

Linuxカーネルは起動時からずっと、ハードウェアの検出・ドライバのロード・デバイスの初期化などのログを内部バッファに記録し続けています。dmesg はそのバッファの内容を表示します。

とのことで、 dmesg をチェック。

このラズパイのWi-FiドライバはBroadcom製だそうで、 brcm で検索。

dmesg | grep -i brcm
dmesg | grep -i firmware

Bluetoothドライバはロードされているが、Wi-Fiドライバがロードされていない。

dmesg | grep -i brcmfmac
usbcore: registered new interface driver brcmfmac

Wi-Fi ドライバ brcmfmac が USB ドライバとしてのみ登録されており、本来あるべき SDIO ドライバとして認識されていない

4. mmc ログ確認

Claude曰く、

MMC は MultiMediaCard の略で、SDカードなどのストレージ規格のことです。
ただしLinuxカーネルでは意味が少し広く、SDカード・eMMC・SDIOデバイスをまとめてMMCサブシステムとして管理しています。

Pi 3Bの場合:

デバイス 用途
mmc0 SDカードスロット(OSが入っているやつ)
mmc1 Wi-Fi/BluetoothチップへのSDIOバス

SDIO(Secure Digital Input/Output)はSDカードの規格を拡張したもので、ストレージだけでなくWi-FiやBluetoothなどの通信チップを接続するためにも使われています。Pi 3BのWi-Fiチップ(BCM43430)はSDカードと同じバスに繋がっていて、カーネルからは mmc1 として見えています。

というわけでこれを探してみる。

dmesg | grep -i mmc
[ 2.672012] mmc-bcm2835 3f300000.mmcnr: mmc_debug:0 mmc_debug2:0 
[ 2.672035] mmc-bcm2835 3f300000.mmcnr: DMA channel allocated
mmc1: Failed to initialize a non-removable card

Wi-Fi チップが接続されている mmc1(SDIOスロット)の初期化に失敗していたことがわかる。このFailedは起動時の一回だけ出る。

5. デバイスツリーで status 確認

cat /proc/device-tree/model
ls /proc/device-tree/soc/

ここで mmc@7e202000mmcnr@7e300000 の両方が見えており

mmcnr@7e3000007e300000 はBCM2835(Pi 3Bのチップ)のメモリマップで mmcnr(MMC Non-Removable)に割り当てられた番地です。dmesg でも同じアドレスが出ていました:

mmc-bcm2835 3f300000.mmcnr: ...

3f7eは同じ物理アドレスを別の視点から見たもの)
また、 mmcnrnrNon-Removable の略です。取り外せないMMCデバイス=Wi-Fiチップのことだと推測できます。SDカードスロットは取り外し可能なので mmc@7e202000 の方です。

mmcnr@7e300000 がWi-Fi用のSDIOスロットのはず、ということで

ls /proc/device-tree/soc/mmcnr@7e300000/

を見ると中に wifi@1 が見えて、デバイスツリー上はWi-Fiノードが存在しているということがわかる。

cat /proc/device-tree/soc/mmcnr@7e300000/status

を見ると返るのが

disabled

デバイスツリー上で Wi-Fi が disabled になっていた。 なんでや

ここで更にClaudeからDTBを見るよう言われる:

DTB は Device Tree Blob の略で、ハードウェアの構成情報をバイナリ形式で記述したファイルです。
Linuxカーネルは起動時に「このボードにはどんなハードウェアが繋がっているか」を知る必要があります。x86 PC はその情報を BIOS/UEFI から得ますが、Raspberry Pi のような組み込みボードには BIOS がないので、代わりに DTB をカーネルに渡して教えています。
関連する用語を整理するとこうなります:

用語 意味
DTS Device Tree Source。人間が読めるテキスト形式
DTB Device Tree Blob。DTSをコンパイルしたバイナリ形式
dtc DTSとDTBを相互変換するコンパイラ
dtoverlay 起動時にDTBの一部を上書きするパッチ
# dtc -I dtb -O dts /boot/firmware/bcm2710-rpi-3-b.dtb 
#     ^^^^^^^ ^^^^^^ 
#     入力DTB 出力DTS(人間が読めるテキストに変換)
dtc -I dtb -O dts /boot/firmware/bcm2710-rpi-3-b.dtb 2>/dev/null \
  | grep -A20 "mmcnr@7e300000 {" | grep status
# → status = "okay";

ベースの DTB ファイルでは okay になっているにもかかわらず、 実際に起動時に適用されたデバイスツリー /proc/device-tree/ では disabled ...起動時に何かが書き換えている?

6. Bluetooth との競合が原因と判明

もうさっぱり分らんのでClaudeちゃんに推測してもらう。

Raspberry Pi 3B は Bluetooth と Wi-Fi が同じ SDIO バスを共有しているapt upgrade によって Bluetooth 関連パッケージが更新され、リソース割り当てが変わったことで Wi-Fi の SDIO 初期化が失敗するようになったと考えられる。

わかるか、そんなもの!


解決方法

結局Bluetoothを無効にするしかないっぽいので、そのようにする。いずれ修正されるであろう。。。

/boot/firmware/config.txt[all] セクションに以下を追加:

dtoverlay=disable-bt
sudo nano /boot/firmware/config.txt
[all]
enable_uart=1
dtoverlay=disable-bt   # ← これを追加

保存して再起動:

sudo reboot

再起動後、wlan0 が正常に認識され、Wi-Fi に接続できた。

$ ip a show wlan0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
    inet 192.168.1.95/24 ...

原因まとめ

項目 内容
直接原因 mmcnr@7e300000(Wi-Fi の SDIO スロット)が起動時に disabled になる
根本原因 Bluetooth と Wi-Fi の SDIO バス競合
トリガー apt upgrade による Bluetooth 関連パッケージの更新
解決策 dtoverlay=disable-bt で Bluetooth を無効化し競合を解消

補足

disable-bt を追加した場合、enable_uart=1 はそのまま残して問題ない。むしろこの2つはセットで使われることが多い組み合わせ。

ヘッドレスサーバー用途で不要だったので今回はBluetoothを潰して対応したが、どっちも必要な場合の対策は不明。

この記事はかなりClaudeにお世話になりました。直面した課題に適した未知のコマンドや結果の読み方を教えてくれるので、実に助かっています。

Raspberry Pi セットアップ (2026-04版)

ImagerとUSBメモリでインストール

Raspberry Pi Imager がまた進化していてめちゃ便利でした。
SSH設定などはイメージ書き込み前に指定しておくことが可能なうえ、Raspberry Pi Connect を有効にしておけばインターネットからのアクセスも簡単(安全性はラズパイ財団を信じる)

なおRasPi Imagerはラズパイ以外のイメージも指定して書き込みできるので別のLinuxやWindowsを焼きたいときにも便利です。

セキュリティ強化

以前やった Debian Setup とほぼ同じ。

パス無しsudoの禁止

sudoはインストール時に使えるようになっているので、次のファイルを削除して無効化する。

$ sudo grep -r NOPASSWD /etc/sudoers /etc/sudoers.d/
/etc/sudoers.d/010_pi-nopasswd:pi ALL=(ALL) NOPASSWD: ALL
$ sudo rm /etc/sudoers.d/010_pi-nopasswd

rootロック

ここは完全にDebianの時と同じ。
設定

# rootアカウントをロック
sudo passwd -l root

# rootのシェルをnologinに変更
sudo usermod -s /usr/sbin/nologin root

# SSHでのroot直接ログインを無効化(SSHを使用している場合)
sudo nano /etc/ssh/sshd_config
PermitRootLogin no

# sshd再起動
systemctl restart sshd

確認

# パスワードがロックされているか確認
sudo passwd -S root
root L 2024-11-19 0 99999 7 -1 # Lなのでロックされている

# シェルの設定を確認
grep root /etc/passwd #nologinになっている

fail2ban

インターネットにポート公開しているとものの10分でブルートフォース攻撃が来る。見ている限り成功したことはないものの気持ち悪いので対策。

sudo apt install fail2ban

インストールしたら設定ファイルを作成:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

[sshd] のセクションを探して以下のように追記

[sshd]
enabled = true
port    = ssh
maxretry = 5
bantime  = 1h
findtime = 10m

  • maxretry = 5 → 10分以内に5回失敗したらBANする
  • bantime = 1h → 1時間アクセス禁止

保存したら起動:

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

状態確認:

sudo fail2ban-client status sshd

Status for the jail: sshd が表示されればOK

IP固定

今時は固定しないのが定石なのかもだけど、好みで。

# 現在の接続を確認
nmcli connection show

# 固定IPを設定(例:192.168.1.100/24)
sudo nmcli connection modify <接続名> ipv4.addresses 192.168.1.100/24

# デフォルトゲートウェイ(例:192.168.1.1)
sudo nmcli connection modify <接続名> ipv4.gateway 192.168.1.1

# DNSサーバー(例:Google DNS)
sudo nmcli connection modify <接続名> ipv4.dns "8.8.8.8 8.8.4.4"

# DHCPから手動に切り替え
sudo nmcli connection modify <接続名> ipv4.method manual

# 設定を反映
sudo nmcli connection down <接続名> && sudo nmcli connection up <接続名>

# 確認
ip a show wlan0

My tmux セットアップ

最近は mosh+tmuxでiPadからいつでもどこでも再開できるのが楽しいです。

コマンド早見表

操作 コマンド
開始する tmux
新しいセッションを開始する tmux new -s name
セッションまたはペインを終了する (終了してターミナルに戻る) exit
特定のセッションを終了する tmux kill-session -t name
セッションを残したまま抜ける (デタッチ) Ctrl+b → d
セッションに戻る (アタッチ) tmux a
現在のセッションを一覧表示 tmux ls
セッション名をリネーム Ctrl+b → $
左右に分割 Ctrl+b → %
上下に分割 Ctrl+b → "
今のペインを閉じる Ctrl+b → x → y
ペイン間を移動 Ctrl+b → 矢印キー
ウィンドウ一覧を表示 Ctrl+b → w
次のウィンドウ Ctrl+b → n
前のウィンドウ Ctrl+b → p
新しいウィンドウ Ctrl+b → c
ウィンドウ番号を表示 Ctrl+b → q
tmux.conf リロード Ctrl+b → : → source-file ~/.tmux.conf
コマンドモードからセッションを終了 Ctrl+b → : → kill-session

tmux.conf

こんな見た目になります。

# =============================================================
# Gruvbox Dark テーマ
# =============================================================

# 256色 + True Color
set -g default-terminal "screen-256color"
set -ag terminal-overrides ",xterm-256color:RGB"

# ステータスバーを上に
set -g status-position top

# ステータス更新間隔(秒)
set -g status-interval 5

# =============================================================
# ステータスバー全体
# =============================================================
set -g status-style bg=#282828,fg=#ebdbb2
set -g status-left-length 40
set -g status-right-length 100

# 左:セッション名
set -g status-left "#[bg=#fabd2f,fg=#282828,bold]  #S #[bg=#282828,fg=#fabd2f]\ue0b0#[default] "

# 右:Gitブランチ + メモリ使用量 + 日時
set -g status-right "#[bg=#282828,fg=#83a598]\ue0b2#[bg=#83a598,fg=#282828]  #(git -C #{pane_current_path} branch --show-current 2>/dev/null || echo '—') #[bg=#83a598,fg=#b8bb26]\ue0b2#[bg=#b8bb26,fg=#282828]  #(free -h | awk '/Mem:/{print $3\"/\"$2}') #[bg=#b8bb26,fg=#fabd2f]\ue0b2#[bg=#fabd2f,fg=#282828]  %Y-%m-%d %H:%M "

# =============================================================
# ウィンドウタブ
# =============================================================
set -g window-status-separator ""
set -g window-status-format "#[bg=#3c3836,fg=#a89984] #I  #{?#{==:#{pane_current_command},nano},#W,#{b:pane_current_path}} #[default]"
set -g window-status-current-format "#[bg=#fe8019,fg=#282828,bold] #I  #{?#{==:#{pane_current_command},nano},#W,#{b:pane_current_path}} #[bg=#282828,fg=#fe8019]\ue0b0#[default]"

# =============================================================
# ペイン:アクティブを強調
# =============================================================

# ペインタイトルバーを有効化(アクティブ識別に使用)
set -g pane-border-status top
set -g pane-border-format "#[fg=#edc66d] #{pane_index} #{pane_current_command} #[fg=#a89984]#{b:pane_current_path} "
set -g pane-active-border-style "#[bg=#fabd2f,fg=#282828,bold] #{pane_index} #{pane_current_command} #[default]"

# 境界線の色:通常ペインは暗く、アクティブは黄色
set -g pane-border-style fg=#504945
set -g pane-active-border-style fg=#fabd2f,bold
set -g pane-border-lines heavy

# ペイン番号表示(Ctrl+b q)の色
set -g display-panes-colour gray
set -g display-panes-active-colour yellow
set -g display-panes-time 2000

# ペイン幅変更するキーセット (Alt)
bind-key -n M-Left resize-pane -L 2
bind-key -n M-Right resize-pane -R 2

# =============================================================
# その他
# =============================================================
set -g mouse on
set -g history-limit 500
set -g renumber-windows on
set -g set-clipboard on
set -ag terminal-features ",*:clipboard"
set -g allow-passthrough on

# メッセージの色
set -g message-style bg=#fabd2f,fg=#282828,bold

Cloudflare Tunnelで自宅にSSH (2026-02版)

ポート開放なしで、インターネットから自宅サーバにSSHする方法をやってみた手順の記録。

前提

サーバー:Debian
クライアント:Windows 11

  1. Cloudflareアカウントとカスタムドメインを持っていること
  2. サーバーは既にSSHログインができるようになっている。かつ、パスワード認証を禁止し鍵認証のみにするなどセキュア化が済んでいること(参考:Debian 13 trixie setup (2025-09版) - skoshbyte

サーバーにcloudflaredをインストール

Downloads · Cloudflare One docs

sudo apt-get update && sudo apt-get install cloudflared

トンネルを作成する

Create a tunnel (dashboard) · Cloudflare One docs

  1. ブラウザでCloudflareダッシュボードにサインイン
  2. Network > Connectors > Cloudflare Tunnels 画面から Add a Tunnel をクリック
  3. 任意のトンネル名を入力してSave
  4. Saveするとインストールコマンドが表示されるので、そのままコピペして実行
    sudo cloudflared service install <ここに文字列が表示されている>
    

次のコマンドでトンネル情報が表示される

cloudflared tunnel list

  1. Next をクリックし、Published application タブで任意のサブドメイン名とサービスを指定して Save
    1. Hostname: sshgw.mydomain.com
    2. Service: SSH://localhost:22

クライアントにcloudflaredをインストール

クライアント側にも cloudflaredをインストールする。
Downloads · Cloudflare One docs

winget install --id Cloudflare.cloudflared --scope user

$env:localappdata\Microsoft\Winget\Packages\Cloudflare.... の中に cloudflared.exe ができているので、これを使いやすい場所に移動しておく (c:\toolsなど)

SSH鍵セットアップ

  1. クライアント側でキーを作成

    ssh-keygen -t ed25519 -C "任意のコメント" -f ./ed-tun
    

  2. 公開鍵の方をサーバーの authorized_keys に登録

  3. クライアント側の ~/.ssh/config を設定
Host tun
    Hostname sshgw.mydomain.com
    User myuser
    IdentityFile ~/.ssh/ed-tun
    ProxyCommand  C:\tools\cloudflared.exe access ssh --hostname %h
  1. ssh tun でSSHログインできる。

セキュリティについて

Access Policy機能を使用して追加の認証レイヤーも設定できるそうだが、サーバー側で鍵認証以外禁止にしていて、クライアント側の鍵にもパスフレーズを設定しているので、個人の限定的な利用としてはいったんこれでいいかなと。

あまりにも簡単で拍子抜けした一方で、これは企業側でブロックするの難しそうと思うなどした。

2026-01-16

Web散歩