V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LeeReamond
V2EX  ›  程序员

异地组网并进行文件共享(使用密码保护)的一些踩坑分享

  •  
  •   LeeReamond · 38 天前 · 2056 次点击
    这是一个创建于 38 天前的主题,其中的信息可能已经有所发展或是发生改变。

    算是做个总结吧。前情提要:https://v2ex.com/t/1082711

    异地组网并进行文件共享(使用密码保护)的一些踩坑分享

    • 使用 WG 进行异地组网详细步骤教学与讨论。
    • 基于系统:Windows 10 企业版

    总体框架

    1. 软件准备
    2. 组网
    3. 共享设置

    软件准备

    1. 新系统请首先打开 [控制面板] - [程序和功能] - [启用或关闭 Windows 功能] ,选择启用 [ SMB 1.0/CIFS 文件共享支持] 和 [ SMB 直通] 两个选项,并重启系统。
    2. 访问https://www.wireguard.com/,下载并安装异地组网工具 WG 。
    • 讨论:为什么要开启 SMB ,起因似乎是因为 Windows10 自某次更新开始因为安全性原因取消了默认基于 SMB 协议的文件共享。使得原先基于 SMB 的用户访问登录协议变得无法如同原先一样工作。笔者并不清楚重新下载安装这个功能是否意味着强制开启这个协议,所以这个操作似乎并无价值,总之由于打开也没什么问题,且能满足潜在的和 linux 进行文件互通的需求,所以一般是推荐打开。 *

    组网

    使用 WG 进行组网, ** 典型比较适用的场景比如 ** :

    1. 主从双机同处于大型内网域内(例如校园网,办公网等),可以通过 IPv4 内网网段实现互通。
    2. 或者主机方具有 IPv6 公网地址可以实现某种程度上的不稳定直连。

    在此场景下如果你希望多机进行私网域构建,使信息不暴露于公网或者公开内网,那么非常适合使用 WG 组网。

    ** 不适合的场景比如 ** :

    1. 无论如何没有公网地址,需要使用转发。此情况下应有大量其他方案优于本方案。

    Wireguard 组网细节

    • 不是本文的重点,不在此处赘述
    • 希望实现的结果,例如本文最终组成了以192.168.1.1/8为服务器,以192.168.1.101/8为客户端的私有网域,要求双方在关闭 windows 防火墙的情况下可以互相 ping 通。

    组网需要进行的其他工作

    1. 尝试使用动态域名解析实现 WG 客户端对服务端 IP 变化的实时追踪。需要购买一个域名,并在服务器端部署网卡监测软件。笔者使用的项目是https://github.com/jeessy2/ddns-go,各位可以自行选择自己喜欢的。
    2. 对 WG 组成的网络进行属性设置,以实现公开网络和私有网络的区分。我们仅希望在私有网络上暴露文件共享服务,故应该将校园网等网络设置为公开网络,将 WG 组成的虚拟适配器设置为专用网络,具体操作如下:
    # 在 windows 网络的图形设置界面可以将 wifi 本身设置为公开网络
    # 然后在 powershell 中运行如下命令
    
    Get-NetConnectionProfile # 查询当前网卡区域
    
    # 例如我们的校园网络叫 University Free WIFI ,而私有网卡叫 WG_Client ,则通过以下命令将虚拟适配器设置为专用网络。
    
    Set-NetConnectionProfile -Name "WG_Client" -NetworkCategory Private # 或 Public
    

    共享设置

    Windows 10 最新版进行基础文件共享需要进行以下几个方面的设置

    1. 账户设置:启用共享账户
    2. 高级共享设置:控制全局网络共享访问情况
    3. 组策略设置:控制具体共享账号情况
    4. 凭据管理:配置客户端登录凭证
    5. 共享文件夹设置:配置具体共享文件夹情况
    • 注:如无特殊标注,本章节内容需要服务端和客户端双向都进行配置 *

    1. 账户设置

    首先我们为网络共享专门配置一个权限为普通用户组的用户,这在一定程度上是进行任何涉网络的权限敏感操作的通用处理办法。

    • 右键点击 [我的电脑] ,选择 [管理] 来打开计算机管理。选择 [本地用户和组] - [用户] ,右键空白处选择 [新用户] 来创建新用户。
    • 例如此处创建的用户为mynetuser
    • 您需配置一个用户名以及一组非弱密码( 12 位以上,包含大小写字母,数字,特殊符号)。
    • 新建账户时选择 [用户不能更改密码] ,且 [密码永不过期] 。

    2. 高级共享设置

    此部分配置实现了在私有局域网中的文件共享,而不使共享暴露于公开网络

    • 打开 [我的电脑] ,右键选择 [网络] - [属性] 。或者,在系统搜索框里输入 [网络] ,并打开 [网络和共享中心]
    • 打开 [更改高级网络共享设置]
    • 其中,在 [专用网络] 部分选择 [启用网络发现] 、 [启用文件和打印机共享] 。
    • 在 [来宾或公用] 部分选择 [关闭网络发现] 、 [关闭文件和打印机共享] 。
    • 在 [所有网络] 部分选择 [启用共享以便可以访问网络的用户可以读取和写入公用文件夹中的文件] 、 [使用 128 位加密帮助保护文件共享连接(推荐)] 、 [有密码保护的共享]
    • 点击保存更改

    3. 组策略设置

    此部分实现了私有网络下进行共享访问时,对访问来源的账号权限控制,以避免不小心连接到其他私有网络时暴露共享服务。

    • 按下winkey + R并输入gpedit.msc打开组策略配置
    • 依次打开 [计算机配置] - [ Windows 设置] - [安全设置] - [本地策略] - [安全选项] ,找到 [网络访问:本地账户的共享和安全模型] ,将其设置为 [经典-对本地用户进行身份验证,不改变其本来身份]
    • 同时将 [网络访问:不允许 SAM 账户的匿名枚举] 和 [网络访问:不允许 SAM 账户共享的匿名枚举] 都设置为 [已启用]
    • 依次打开 [计算机配置] - [ Windows 设置] - [安全设置] - [本地策略] - [用户权限分配]
    • 找到其中的 [拒绝本地登录] ,以及 [拒绝从网络访问这台计算机] ,向其中添加用户,确保Guest账号出现在这两项拒绝当中。这样可以禁止所有空密码访问的账户登录。
    • 找到 [从网络访问此计算机] ,删除其中原有的Everyone, Administrators等所有选项,并添加唯一指定账户mynetuser
    • 重启电脑
    • 此时从其他主机访问此网络位置时得到的正常反馈为访问失败,例如访问\\192.168.1.1会出现如下提示:
    请与这台服务器的管理员联系以查明你是否有访问权限。
    
    登录失败: 未授予用户在此计算机上的请求登录类型。
    

    此时说明已经对登录账号进行限制,无法进行匿名访问。

    4. 凭据管理

    • 在 windows 搜索框中输入 [凭据管理器] 或在控制面板中将其打开
    • 找到 [ Windows 凭据] - [添加 Windows 凭据] ,输入192.168.1.1, mynetuser, 非弱密码,点击 [确定]
    • 此后本机在访问192.168.1.1时会默认尝试使用此用户名密码登录。此时访问\\192.168.1.1,正常应不会出现上文所示的拦截,组策略设置的对应账户规则已经被实现。

    5. 共享文件夹设置

    • 右键选择您想共享的文件夹,打开 [属性] ,选择 [共享] - [共享] 。
    • 添加刚刚创建的用户mynetuser并将权限设置为允许读取和写入,同时记得删除 [ Everyone ] 等通用性用户的权限。对于所有文件夹的Administrators账户则不需进行改动,再点击 [确定] (如果未经 3/4 步骤组策略和登录凭据设置,则此处用户会以匿名身份登录,那么就必须开放 Everyone 权限才能够实现共享。反之,经过 3/4 步设置后,登录用户已经被严格限制为mynetuser,故可以抛开 Everyone ,对其实现精准权限控制。)
    • 同理,选择 [高级共享] ,勾选 [共享此文件夹] ,点击 [权限] ,并对其中进行如同上一步一样的对Everyone的控制,和对mynetuser的权限开放。点击 [确定]
    • 设置全部完成,重启电脑。

    至此,您应该能够实现仅限于私有网络的基于用户名/密码安全性的文件共享系统。

    讨论

    本文实现了什么?

    • 本文实现了基于 WG 的异地组网+文件共享系统。您可以实现多机数据连通。如果您的组织网络不是特别差的话,一般能形成比较良好的办公、学习体验,而不需要背着数据到处跑了。
    • 本文解决了目前网上博客教学尚未更新过的,在新版 windows 场景下使用密码保护文件共享的设置方法。

    本方案安全性如何?

    • 您进行了局限于异地虚拟内网的文件共享,并以密码对其进行安全保护。
    • 由于服务未暴露于公网,通常来说,如果攻击者有意对您进行攻击,他需要物理接驳于您所在的域网络内进行扫描。而后对方还需要持有您的 WG 私钥才能建立连接。而建立连接后对方同样需要破译您的 windows 账户密码才可以正常访问数据,笔者认为安全性是足够的。
    • 加入用户名/密码权限控制,可以保证当用户切换至其他私有网络时(例如您把笔记本带家庭 WIFI 后),新私有网络内的其他第三方仍需要持有密码才可以访问数据。

    本文局限性

    • 基于 WG 的组网目前只实现了 [一主对多从] 的组网模式,从机之间无法互相访问。即例如笔者有三台设备,工位的电脑、宿舍的电脑,两者可以实现完全数据互联。但如果使用第三设备手机访问,则只能连接二者中作为主机的电脑。如果希望多机组网可能需要依赖于 Zerotier 之类的工具,而不是 WG 。
    • 暴露数据(并且基于一个易操作的图形界面)目前还有其他方案。除了 windows 自带的文件共享外,就笔者了解起码还有 FTP 、软件 webdav 的方案,且似乎同样能够实现账户安全性配置,还更简单。没有进行过详细调研。

    如觉得有帮助欢迎投喂货币,谢谢大家

    16 条回复    2024-10-27 19:37:11 +08:00
    uncat
        2
    uncat  
       38 天前
    > 从机之间无法互相访问。

    这是你这套方案配置不完善导致的,并不是 WireGuard 不支持。

    你配置完善的情况下,所有加入 WireGuard 网络内的所有设备之间可彼此互相通信的。不能互相访问实际上是因为:

    1. 防火墙规则限制
    2. 内核未开启封包转发
    uncat
        3
    uncat  
       38 天前
    你这套方案,实际上就是公司用来实现内部、外部服务认证和鉴权的方案。SMB 就是常见的内部服务的一种。

    1. 只有经过 VPN 认证的开发者,才能访问内部用户。
    2. 通过创建、注销 VPN 用户配置,实现入、离职流程控制。
    3. 通过 VPN 实现内网(无公网 IP )服务的公网访问。(类似:内网穿透,原理:加入了 VPN 的任意设备可互相访问,即实现了内网穿透)。

    一些跟高阶的需求:

    基于 VPN 实现局域网互通。类似:物理专线,效果比如:

    1. 办公区局域网 <-> 阿里云 VPC 。
    2. 办公区局域网 <-> K8s SVC IP 互通。

    即:

    1. 办公网中的设备可以直接通过云服务器的内网 IP 访问到对应的云服务器。
    2. 办公网中的设备可以直接通过 K8s SVC IP 访问到阿里云 K8s 集群中的 SVC 。
    uncat
        4
    uncat  
       38 天前
    上一条消息有一些错别字。修正一下:

    你这套方案,实际上就是公司用来实现内部、外部服务认证和鉴权的方案。SMB 就是常见的内部服务的一种。目的是:

    1. 只有经过 VPN 认证的开发者,才能访问内部服务。
    2. 通过创建、注销 VPN 用户配置,实现入、离职人员对内部服务的访问控制。
    3. 通过 VPN 实现内网(无公网 IP )服务的公网访问。(类似:内网穿透。原理:加入了 VPN 的任意设备可互相访问)。

    一些更高阶的功能:

    基于 VPN 实现局域网互通。

    类似物理专线。效果比如:

    1. 办公区局域网 <-> 阿里云 VPC 。
    2. 办公区局域网 <-> K8s SVC IP 互通。

    即:

    1. 办公网中的设备可以直接通过云服务器的内网 IP 访问到对应的云服务器。
    2. 办公网中的设备可以直接通过 K8s SVC IP 访问到阿里云 K8s 集群中的 SVC 。
    songpengf117
        5
    songpengf117  
       38 天前 via iPhone
    建议使用 openssh ,将 smb 替换为 sftp
    fyq
        6
    fyq  
       38 天前
    关于 SMB 到底应该如何设置分享,有一篇来自《什么值得买》上的文章是我见过的所有教程里面最清晰详尽的:
    https://post.smzdm.com/p/akxwkxqk/
    《 Windows 10/ 11 下安全并正确地使用 SMB 共享》
    dode
        7
    dode  
       38 天前
    @uncat 有公网 IP ,wg 所有节点都可以点对点通信,记得 AllowedIPs 配置 192.168.x.xxx/32
    flynaj
        8
    flynaj  
       38 天前
    SMB 1.0/CIFS 这个是 winxp 用的,win7 以上都不需要。玩不来 你还是装个 Zerotier 简单方便,还更安全。
    dalaoshu25
        9
    dalaoshu25  
       38 天前
    看到 192.168.1.1/8 ,笑了。
    这都洋洋洒洒写了些啥啊,基本的网络基础知识都没搞明白。
    lxh1983
        10
    lxh1983  
       38 天前 via iPhone
    @dalaoshu25 确实
    LeeReamond
        11
    LeeReamond  
    OP
       38 天前
    @dalaoshu25 查了一下是写错了,那我也配错了,照 255 子网配应该是/24
    一般是/16 也就无所谓哪边,我感觉用不到那么大就缩了 8 位,方向错了
    LeeReamond
        12
    LeeReamond  
    OP
       38 天前
    @fyq 仔细看了一下文章,好像和我说的大差不差,但讲解顺序是反过来的,我是从头到尾他是从尾到头。
    看了一下他建议的几个和我写的不同的选项
    1. 关闭 SMB1.0 协议
    2. 关闭网络发现
    3. 在 Lanman 工作站中禁用不安全的来宾登录
    4. 为 smb 用户配置禁止通过本地或远程共享访问
    LeeReamond
        13
    LeeReamond  
    OP
       38 天前
    @uncat WG 显然是强大工具,只是因为我是刚接触所以查了查资料,只配出了一主一从。如果想配小型网络的话不知道怎么配。
    fyq
        14
    fyq  
       38 天前
    @LeeReamond 我转发这篇教程的目的是为了让看到本帖的朋友能够安全访问他们的共享文件夹,在暴露于公网的机器中尤其重要。因为你的教程里如其他朋友所提到的那样,第一步就启用了不安全的 SMBv1 .
    dalaoshu25
        15
    dalaoshu25  
       38 天前
    @LeeReamond 简单地说,你除了会写 markdown 以外其他的都是错的。

    自己基本概念不清技术细节不懂(比如搞不清网络地址掩码和 smb 协议版本),也不懂 wireguard 的设置(内部 IP 地址和路由),还不知道合适发帖的板块(为啥不去宽带症候群板块而在程序员板块)。

    你这样的初学者,何必要在论坛上装模作样写这些帖子,浪费大家时间和金钱。
    LeeReamond
        16
    LeeReamond  
    OP
       37 天前
    @dalaoshu25 笑出声,v2 现在的攻击性了不起。

    术业有专攻,我一个搞开发的又不是学网安的,我分享我遇到的问题是怎么解决的,后面有人看到帖子了照我写的和后面 v 友补充的能配明白,我列了详细步骤,原因和修正方案,这就是做贡献了,你除了喷做了什么贡献?

    掩码方向记错了这就叫不懂掩码了,照你这逻辑我直接 255.255.0.0 是不是就又懂掩码了?就这么肤浅? smb 协议我除了用它和 linux 交互,我是做协议相关开发的吗?版本细节不了解也就是一篇文章的事,就这么点内容轮得到你在这高谈阔论,可见你的内容量也就这么点。

    你不爱看就不看,我自认比论坛里吹水的帖子多做了那么点工作,就这你还嫌浪费时间金钱,其他贴子里怎么没见你做道德卫士?笑出声了。程序员分区遇不到组网的事对吧,好了我懂了,是我不配在大佬面前自称程序员,我工作都是假的,幻想出来的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1089 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:20 · PVG 03:20 · LAX 11:20 · JFK 14:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.