Published On: 2020-10-27|Last Updated: 2022-11-05|Categories: SMB, Windows, Windows 10|

原理

一つ目の理由、Windows は TCP/139,445 を 0.0.0.0 で listen するため、どうにかしてポートが占有される前に proxy IP のポートで listen する必要がある。これは確かサービス名 LanmanServer のプロセスが行っていることだったと思う。netstat やリソースモニターで確認できる。

二つ目の理由、Windows の SMB client はポートが固定であり、TCP/445、TCP/139 の順に叩いてダメなら諦める。このため TCP/445 の空いた IP アドレスが必要である。TCP/139 は 0.0.0.0 で listen しないが、割り当ててもプロキシーとして機能しないことが多い。

ポートを確保する方法は次の 2 つがある:

  • ポートを確保する適当なサービスを作成し、LanmanServer の前に実行されるように構成する
  • netsh でポートフォーワードを設定する。LanmanServer が実行される前に有効となる

ここでは netsh を用いる。

IP アドレスを作る

ポートフォーワードを設定する

netsh interface portproxy add v4tov4 listenaddress=10.4.4.5 listenport=445 connectaddress=10.4.4.5 connectport=44445

Windows を再起動する

この例では TCP/10.4.4.5:44445 に ssh portforward などでリモートマシンの TCP/445 をつなぐと \\10.4.4.5 で共有ファイルにアクセスできるようになる。

Windows 10 の大型アップデートで中途半端にこの設定が消されるので初めからやり直す必要がある。

関連