Windows绕开端口限制使用公网SMB服务教程
藏山于泽
2021年04月05日 20:02
收录于文集
共10篇

尝试过很多协议和方法来用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 &#​34; netsh interface portproxy show v4tov4

结果应该类似下图:

必须存在该行:

TCP    10.255.255.1:445       0.0.0.0:0              LISTENING

如果结果没问题,那就是你SMB服务的问题了。

有的时候系统更新或还原之类的操作后会出问题,执行netstat -an | find ":445 &#​34;后没有上述那一行。或者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,免费对等千兆带宽