コンテンツにスキップ

Tips

サーバーの接続テストをするコマンド

シンプルな接続テストをするときのメモ

Linux

nc

トランスポート層 (TCP/UDPでの)接続確認。アプリケーションプロトコル (HTTP, UTPなど) は起動しているかは保証しない。
HTTPSを確認するとき、nc は異なるプロトコルとして期待通り応答しないことがある

接続クライアント側

送信側。

nc -zv $host $port
# -z zero I/O 接続の確立・切断のみ行い、データ送受信は行わない
# -v verbose エラーの時に詳細な出力を表示

nc -u $host $port # UDPの場合、接続後に "test" などメッセージ入力すると対向先に表示される。

testlistファイルの中に一行ずつ記載された hostname port を順にチェックする

while read host port; do echo "checking $host:$port"; nc -zv $host $port; done < testlist

結果:

checking myserver:9443  
Ncat: Version 7.92 ( https://nmap.org/ncat )  
Ncat: Connected to 192.10.10.143:9443.  
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.  

→ TCPレベルでの3-wayハンドシェイクは確立したが、データの送受信は行われなかった。(アプリケーションレベルでの通信が0)

checking myserver2:8009  
Ncat: Version 7.92 ( https://nmap.org/ncat )  
Ncat: Connection refused.

→ ホストは存在し、接続要求は成功するが、そのポートでサービスが動作していない、リッスンしていないのでサービスが利用できない。ホストが明示的に拒否応答した。

$ nc myserver3 8446
Ncat: TIMEOUT.

→ 何か別の問題(ホストは存在するが、接続要求に応答がない、通信が確立しない。FWでブロックされているとか、LBから飛んでないとか。

接続される側

受信側。簡易テストなどに。

nc -l 8889   # 8889でTCP LISTENにする
nc -lu 8889  # UDPポートでLISTENにする
nc -luv 8889 # 詳細つき

TCPの場合、Ctrl+Cか、接続されたら自動的に終了する

UDPの場合、
1. 受信側で nc -l 8889
2. 送信側で nc -u hostname port またはWindowsなら UDP check してテキスト送信
3. 受信側で送信されたテキストが見える
4. 受信側で Ctrl+C して抜ける

curl

HTTPレスポンスが返るか調べる

curl -kvI

-k 証明書エラーを無視(自己署名証明書などの場合)
-v 証明書を検証 -vv でさらに詳細を表示
-I htmlボディを除くヘッダのみ表示
-L 302の時にリダイレクト先を見る

curl -kvI https://www.contoso.co.jp

この証明書はCNかSANに www.contoso.co.jp が入っていれば検証が成功する。

curl -kvL https://lanserver302/ | iconv -f SHIFT_JIS

302の時に表示されるコンテンツの文字コードを変更させる

curl -w "Name Loolup:%{time_namelookup}s\nConnect: %{time_connect}s\nApp Connect: %{time_appconnect}s\nPretransfer: %{time_pretransfer}s\nRedirect: %{time_redirect}s\nStart Transfer: %{time_starttransfer}s\nTotal: %{time_total}s\n" -o /dev/null http://google.com/

DNSの応答時間を計測する。 -w は write-out オプション

# その他の変数
%{http_code} - HTTPステータスコード
%{size_download}
%{remote_ip} - 接続先IP

netstat/ss

そのサーバのLISTEN中のポートを調べる。

netstat -tulpn | grep LISTEN

-t TCP
-u UDP
-l LISTEN only
-p Proces ID/Program name
-n port number

ss -tln  # TCP
ss -tuln # UDPも含める
ss -tl   # 名前で表示

openssl

証明書の中身を検証する

openssl s_client -connect 192.20.0.105:443 -servername www.contoso.co.jp | openssl x509 -text -noout

WebサーバーがIISの場合 -servername の値は何であっても既定の動作(SNI無効)として無視される

Verification: OK なら検証は成功している

特定の行前後を取りたいとき

openssl s_client -connect google.com:443 | grep -A 15 "Certificate chain"

ローカルのファイルを見るとき

openssl x509 -text -noout -in filname.pem

.pfx ファイルの場合

openssl pkcs12 -info -in filename.pfx -nokeys -clcerts

LB simulation (Healthcheck GET)

HealthcheckのSend Stringをシミュレートする(443ポート)
- GETのパスはヘルスチェック先URL(ここではIISと仮定して D:\inetpub\wwwroot\lb_control\hltchk.html /https://servername/Inetpub/hltchk.html
- Host: FQDN (証明書のCNまたはSAN)
- IPアドレスは今解決しているIPアドレス (ヘルスチェックを返すサーバ・ここではバックエンド)

echo -ne "GET /Inetpub/hltchk.html HTTP/1.1\r\nHost: www.contoso.co.jp\r\nConnection: Close\r\n\r\n" | openssl s_client -connect 192.20.0.105:443 -quiet -servername www.contoso.co.jp

80ポートの場合

echo -ne "GET /Inetpub/hltchk.html HTTP/1.1\r\nHost: www.contoso.co.jp\r\nConnection: Close\r\n\r\n" | nc 192.20.0.105 80

Result

Can't use SSL_get_servername
depth=2 O = contoso Inc, CN = contoso Root CA
verify return:1
depth=1 O = contoso Inc, CN = contoso Issuing CA 1
verify return:1
depth=0 C = US, ST = New York, L = New York, O = "CONTOSO INTERNATIONAL GROUP, INC.", OU = contoso, CN = www.contoso.co.jp
verify return:1
HTTP/1.1 200 OK
Content-Type: text/html
Last-Modified: Fri, 05 Dec 2023 10:19:32 GMT
Accept-Ranges: bytes
ETag: "abc123:0"
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
Date: Tue, 20 Feb 2026 09:00:39 GMT
Connection: close
Content-Length: 15

<html>HC OK</html>read:errno=0

IISの場合、指定したFQDNに関係なく、レスポンスは成功する(IISではデフォルトでSNIが無効らしい)opensslの最後に -servername を指定しても同じ。

Windows

Test-NetConnection

これも nc 同様、TCPでの接続確認

Test-NetConnection -Computername hostname -Port 8080

results:

Succeeded

myserver1 9443                            
ComputerName     : myserver1  
RemoteAddress    : 192.168.200.10
RemotePort       : 9443
InterfaceAlias   : イーサネット 2 
SourceAddress    : 192.168.1.90
TcpTestSucceeded : True

Failed

myserver1 8444
警告: TCP connect to (192.168.200.10 : 8444) failed
ComputerName           : myserver1
RemoteAddress          : 192.168.200.10
RemotePort             : 8444
InterfaceAlias         : イーサネット 2
SourceAddress          : 192.168.1.90
PingSucceeded          : True
PingReplyDetails (RTT) : 27 ms
TcpTestSucceeded       : False

UDP check

$udpClient = New-Object System.Net.Sockets.UdpClient 
$udpClient.Connect("192.168.200.10", 8889) 
$bytes = [System.Text.Encoding]::ASCII.GetBytes("testtest") 
$udpClient.Send($bytes, $bytes.Length) 
$udpClient.Close()

testなら4バイト、testtestなら8バイトで返る
サーバー側ではnc -lu portしているとSendした文字列が表示される

netstat

netstat -n #アドレスとポート番号で表示
netstat -a #すべてのアクティブな接続、LISTENを表示
netstat -anf | ? {$_ -like "*LISTEN*"}

Debian 13 trixie setup (2025-09版)

メジャーバージョンが来たので新規インストールする
メジャーバージョンが来た時しかセットアップしないのでいつも何してたか忘れる
なのでこうして書いておけば忘れても大丈夫

インストール

  • USBインストーラを作成 (Debian DVD, Raspberry Pi Imagerで)
  • USB起動してGUIインストーラ実行 (モニタ・KB接続)
  • ガイドに従って設定
  • パーティションはディスク全体上書き、初心者におすすめなので
  • ネットワークミラーは yes、ないと apt updateできない

sudoをインストール

Debianはsudoがデフォルトで入っていないので、suでrootになってからインストールする

su
apt install sudo
sudo gpasswd -a choco sudo

#commands/gpasswd

gpasswd  ユーザーが所属する情報を管理するコマンド
    -a   ユーザー名 (ADD ユーザ名)   
    sudo ユーザーを入れるグループ

解像度設定

ゲーミングディスプレイだとフォントが小さすぎて見づらいので

sudo dpkg-reconfigure console-setup

Termiusを選択してフォントサイズを16x32に

パスなしsudoの禁止

sudo visudo  

# Allow members of group sudo to execute any command
%sudo  ALL=(ALL:ALL) ALL

%sudo の部分を自分のユーザー名に書き換える

sudo apt update && sudo apt upgrade

rootロック

設定

# 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になっている

固定IP設定

sudo nano /etc/network/interfaces

で自分のIPアドレス、ネットマスク、デフォルトゲートウェイを指定
今回はDNSを 1.1.1.2, 1.0.0.2 にした (CloudflareのマルウェアブロックDNS)

設定したら再起動して確認

sudo systemctl restart networking
ip addr show enp2s0

SSH設定

この時点ではPasswordAuthenticationができるので、SSH接続しておいて鍵をセットアップする

そのセッションの中でパスワードを禁止にする

sudo nano /etc/ssh/sshd_config
PasswordAuthentication no

sudo systemctl restart sshd

これでroot禁止、PWログイン禁止まで完了

Dockerエンジン

あとで使うので入れておく

Debian | Docker Docs チュートリアルに従ってセットアップ

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

Post installation stepsまで実施

sudo groupadd docker
sudo usermod -aG docker $USER
docker run hello-world

ここまで完了すると docker compose up -d ができるようになる

treeコマンド

時々使いたくなるので入れておく

.bashrcに追記

alias tree='find . -not -path "*/\.git/*"| sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"'

こんな感じ

$ tree
.
 |-docker-compose.yml
 |-config
 | |-a-records.conf

Quartzを試してみる (2025-08版)

Obsidianノートをそのまま静的サイトにするならQuartzがいいらしいと見たので試してみた。

これで動いた

NodeJSをインストール

winget install OpenJS.NodeJS

Quartzをクローン

git clone https://github.com/jackyzha0/quartz.git
cd quartz
npm i
npx quartz create

ここでObsidianフォルダをどこから持ってくるか聞かれるので、コピーなりシンボリックリンクなり選ぶ。

フォルダ構成

最低限ここだけ押さえておけばとりあえず動く

.quartz/
├── content/  # ここの中にObsidian vaultの中身をそのまま入れる
│   └── index.md # 必須
├── public/ # ここにbuildしたファイルが作成される
└── quartz.config.ts

quartz.config.tsを編集

const config: QuartzConfig = {
  configuration: {
    pageTitle: "サイト名",
    enableSPA: true,
    enablePopovers: true,
    analytics: {
      provider: "plausible",
    },
    locale: "ja-JP", // 日本語ロケールを指定
    baseUrl: "quartz.jzhao.xyz",
    ignorePatterns: ["private", "templates", ".obsidian"],
    defaultDateType: "created",
    theme: {
      fontOrigin: "googleFonts",
      cdnCaching: true,
      typography: {
        header: "Noto Sans JP", // 日本語フォント
        body: "Noto Sans JP",   // 日本語フォント
        code: "IBM Plex Mono",
      },
    },
  },
  // ...
}

動作確認

npx quartz build --serve

注意点

  • ファイル名は日本語でも大丈夫だが、リンク(ファイル・画像)に含まれるディレクトリパスは英数字しか使えない
  • Quartzはリンク内の相対パスをうまく処理できないため、絶対パス(indexからの相対)で記述が必要

Ubuntuをセットアップする (2025年8月版)

OSインストール時の解像度

22.04.5 というバージョンでUSBメモリからインストール…
と思いきやいきなりトラブル。解像度が合わなくて画面の左上しか表示されない。
以下の手順で解決:

  1. GRUBメニューで「Try Ubuntu」または「Install Ubuntu」を選択する前に、eキー を押してブートパラメータ編集画面に入る
  2. linux で始まる行の quiet splash--- debian-installer/language=ja の間に nomodeset video=1024x768 vga=ask を挿入

    こんな感じになる

    quiet splash nomodeset xrandr=1024x768 --- debian-installer/language=ja
    

  3. 編集後 Ctrl+X で保存して抜けるとインストール画面に進む

インストールパーティションの選択

Windowsの入っているディスクに新しいパーティションを作っておき、そこを選択してインストール
あらかじめフォーマットしておいたほうが見つけやすくてよい

  1. インストーラ画面で「その他」選択(手動パーティション設定などのメニュー)
  2. 目的のディスクを選択 ( /dev/sda4 など)
  3. Ext4 でフォーマット選択、マウントポイントは /
  4. デュアルブートの場合 デバイスのパーティションテーブルが変更されます:SCSI1 (0,0,0) (sda) などと出るがこれはブートパラメータ設定のことでほかのパーティション内のデータは消えない。心配せず続行

日本語入力設定 (Mozc)

インストーラでJapaneseとJapaneseキーボードを選択していれば日本語表示になっているが、Mozcを入れる

sudo apt update
sudo apt upgrade
sudo apt install ibus-mozc

GUIの設定>キーボード>Mozc設定キー設定の選択 の画面から、
直接入力 - Henkan - IME有効化
直接入力 - Muhenkan - IME無効化

とすると日本語モード・半角モード切替が楽。

GRUB設定ファイルの編集

最後に選択したOSをデフォルトブートにする

sudo nano /etc/default/grub

GRUB_DEFAULT=0となっている箇所を探して編集する

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true

編集後に反映

sudo update-grub

将来Windowsに戻したいときは回復してパーティション統合とか bcdboot C:\Windows /s C: とかの操作が必要。

今後の課題

昨今のウザさとポンコツ度合いが増すWindowsに嫌気がさしてメインゲーミングPCをLinuxにできないかとトライしたもののここでいったん挫折。

やっぱり慣れないOSだとちょっとした設定操作がすべて違うのですごく疲れる。

Steamでゲーム起動まではできたものの、

  • ネットワーク設定(なんでDebianとUbuntuとRaspberrypiでみんな違うのか)
  • 今までちまちま作ってきたPowerShellやコマンドプロンプトの便利スクリプト移行
  • Windowsでしか動かない各種アプリの移行

がボリューム大きくて課題。

GitHubのプライベートリポジトリをcloneする

いつも忘れるのでメモ。

ed25519でssh-keygenする

ssh-keygen -t ed25519 -C "your_email@example.com"

↑メールアドレスはnoreplyのものでOK

~/.ssh/config
Host github.com
  HostName github.com
  IdentityFile ~/.ssh/id_ed25519
  User git
  AddKeysToAgent yes

これも必要かも?

ssh-add ~/.ssh/id_ed25519
ssh-add -l #確認

GitHubで自分のアカウントに公開鍵を追加

プロファイル > SSH and GPG keys > New SSH Key

Warning

コピペするときはターミナルで改行されないように表示しておかないとハッシュが壊れるので注意

テストしてgit clone

ssh -T git@github.com

問題なければ git clone できる

git clone git@github.com:<github username>/<repo name>.git

Cloudflare WorkersでMkDocsをデプロイする (2025年7月版)

調べるたびに新しくなるMkDocsデプロイ方法のメモ (2025年7月版)
GitHubのプライベートリポジトリにpushしたらCloudflareでサイトを公開できるようにする

MkDocsをセットアップ

割愛。git push origin main でリポジトリ更新までできている状態
リポジトリはprivateで構わない。

ディレクトリ構成は次のとおり。

./
│  mkdocs.yml
│  requirements.txt
│  wrangler.toml
└─docs/


requirements.txt...今回はmkdocs-materialなので次のように指定

requirements.txt
mkdocs
mkdocs-material


wrangler.toml ...Cloudflareの自動デプロイに必要

wrangler.toml
name = "<Cloudflare Workersのプロジェクト名>"
compatibility_date = "yyyy-MM-DD(動作確認できた日)"

[assets]
directory = "./site"

Cloudflareをセットアップ

  1. CloudflareダッシュボードでWorkersプロジェクトを新規作成 (Import a repository から)
  2. 対象リポジトリを選択
  3. Workers Project 名を指定 (GitHubリポジトリ名と異なっていてもいい)
  4. Build command に pip install -r requirements.txt && mkdocs buildと指定
  5. Deploy command は既定値 npx wrangler deploy
  6. Non-production branch deploy command, Pathも既定値でOK
  7. Create and deploy をクリックするとデプロイされる

ドメイン名も設定する

(Cloudflare Domainsで既に独自ドメインを持っている前提)

  1. WorkersプロジェクトのSettingsタブで、Domains & Routers セクションの workers.devとPreview URLsもEnableしておく
  2. 同じセクションで Add > Route から使いたいドメインをZoneで選択
  3. Routeには今回ルートでいいので www.mydomain.com/* と指定
  4. 保存すれば即時反映される

MkDocs 構文早見表

  • 自分用構文早見表
  • Header level 1 is page title and url

Metadata

  • Future created date will be hidden as draft
  • slug is abbreviation for url

Syntax

フォント装飾

Markdown方言になるようなプラグインはなるべく使わない感じで。

  • 太字__アンダーライン2個__ または **アスタリスク2個**
  • 斜体_アンダーライン1個_ または *アスタリスク1個*
  • 太字斜体___アンダーライン3個___ または ***アスタリスク3個***
  • ハイライト==イコール2個== pymdownx.markで有効化。Obsidianでも既定で使えるので採用
  • 取り消し線~~チルダ2個~~ pymdownx.tilde で有効化。Obsidianでも既定で使えるので採用

引用
> で行を開始

Codeblock

Code block with title
    ```toml title="wrangler.toml"
    name = "skoshbyte-mkdocs"
    compatibility_date = "2025-07-28"

    [assets]
    directory = "./site"
    ```
Mermaid Flowchart
%% タイトルをつけるとコードブロック表示になる
flowchart LR
    Start --> Stop
flowchart LR
    Start --> Stop

Admonitions

Material方言っぽいのであんまり使いたくないな~と思いつつ便利なので

https://squidfunk.github.io/mkdocs-material/reference/admonitions/

Note

Abstract

Info

Tip

Success

Question

Warning

Failure

Danger

Example

Quote

Kawaiiよね…虹色で