シンプルな接続テストをするときのメモ
トランスポート層 (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 して抜ける
HTTPレスポンスが返るか調べる
-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
そのサーバの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 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
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
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 を指定しても同じ。
これも 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
$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 -n #アドレスとポート番号で表示
netstat -a #すべてのアクティブな接続、LISTENを表示
netstat -anf | ? {$_ -like "*LISTEN*"}