尝试过很多协议和方法来用NAS,多年尝试下来只有SMB才能达到能与本地盘一致的使用体验,性能上测试下来也能跑满我的内网10G带宽。
但存在一个问题:Windows的文件管理器只能使用默认的445端口,而这个端口是肯定被ISP封了的,也就使得Windows无法使用公网上的NAS。本文就介绍一下如何绕过这个问题。
具体操作十分繁杂,我已经写成了脚本:https://github.com/dbshch/smb-ssh-tunnel
有两种操作方法,一种是公网上使用不同的SMB端口(除Win外的客户端基本上都支持指定端口,可以直接用);另一种是如果由于种种限制不能暴露SMB端口,就使用SSH隧道来转发SMB协议。
前一种方法比较简单直接,使用repo里的smb.ps1脚本;后一种用SSH的使用ssh-smb.ps1脚本。自Win 10起系统已自带OpenSSH客户端和服务端,不需要另下ssh软件。
操作说明Readme里有写,本文具体介绍一下第一种较简单直接的方法,以及脚本中原理。
需要准备:
Clone或下载这个repo
公网上SMB服务以及非445的服务端口,本文以114.514.19.19和810端口为例
使用管理员权限的Powershell命令行(按Win+X后选择Powershell(管理员),不能用cmd),进入repo的路径:
cd <文件夹路径>
使用服务的IP和端口参数,执行smb.ps1脚本:
# .\smb.ps1 <服务的公网IP> <服务的公网端口> .\smb.ps1 114.514.19.19 810
出提示时直接回车并等待即可。
该脚本会在系统里添加一个网卡(默认IP为10.255.255.1,网卡名Loopback),对应一个服务。如果有多个不同IP或端口的SMB服务需要连接,需要建立多个网卡。对于每个服务依次执行:
# .\smb.ps1 <服务的公网IP> <服务的公网端口> <网卡IP> <网卡名称> .\smb.ps1 114.514.19.19 810 10.255.254.1 Loopback2
执行完成之后,需要重启。重启后就可以用添加的网卡IP(默认10.255.255.1)来使用公网SMB服务了。例如在文件浏览器里访问\\10.255.255.1\
如果无法访问,使用如下两个命令检查:
netstat -an | find ":445 " netsh interface portproxy show v4tov4
结果应该类似下图:

必须存在该行:
TCP 10.255.255.1:445 0.0.0.0:0 LISTENING
如果结果没问题,那就是你SMB服务的问题了。
有的时候系统更新或还原之类的操作后会出问题,执行netstat -an | find ":445 "后没有上述那一行。或者SMB服务的公网IP或端口变了,解决方法参考下文原理。
原理就是新建并配置一个环回网卡(默认NIC_IP 10.255.255.1),使用该网卡的445来代理目标网络端口:
netsh interface portproxy add v4tov4 listenaddress=$NIC_IP listenport=445 connectaddress=$DEST_IP connectport=$DEST_PORT
如果SMB服务的公网IP端口变了就替换掉对应变量,再次执行此命令。
但Windows对于每个网卡都会自动占掉445端口,所以需要使用如下命令来在Windows的lanmanserver服务占掉445前先抢占掉445:
sc.exe config lanmanserver start= delayed-auto sc.exe config iphlpsvc start= auto sc.exe config lanmanserver depend= SamSS/Srv2/iphlpsvc
有的时候系统操作会使得lanmanserver服务再次先启动抢掉445,或者删掉了端口代理,导致SMB没法用。就再执行以下上述4行命令并重启即可(替换掉对应的IP和端口变量)
另,欢迎报考SJTU,免费对等千兆带宽
