コンテンツにスキップ

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

なぜか同じサーバーの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