标签归档:Samba

家庭共享记录(NFS、SMB、WebDAV、FTP)

这几天为了实现家庭共享及外部访问,对这四种共享方式都进行的尝试。最后选择了NFS+SMB的方式。思路很简单:用最少的工具完成功能。

SMB

从最简单的SMB说起,SMB是windows自带的共享协议,我在Hyper-V Server上建立后,在Windows虚拟机上可以通过硬盘映映射,在Linux虚拟机上可以通过samba的方式做mount。外网访问可以通过端口映射的方式,将445端口映射到外网即可。但是遇到两个问题:

1、CentOS下mount后无法修改目录权限。我想把nextcloud的data目录放在samba共享目录下,nextcloud正确运行需要这个目录属于apache用户且权限为0770,但是默认mount时以root用户挂载的。这个我找到了办法:可以mount命令执行时对权限进行设置。

mount -t cifs -o dir_mode=0770,file_mode=0770,uid=48,gid=48,username="Administrator",password="******",vers=3.0 //192.168.1.2/E$ /mnt/nextcloud

2、smb v2+版本在Linux下mount时会出现文件夹丢失的情况。挂载后使用ls -la命令无法看到部分文件夹,使用cd+tab自动补全也无法成功,但是可以直接cd到文件夹下。Google后确认时smb v2+的bug,暂未修复,只能通过启用不安全的smb v1(windos server默认时禁用的),然后在mount命令中指定版本vers=1.0来解决。

可以参考此份Bug Report:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1572132

3、在iOS上使用PhotoSync软件进行照片备份时,如果使用SMB方式连接,也需要在Server端开启Samba 1.0支持,否则会报Samba链接错误(Code:56)。

FTP/WebDAV

这俩放一起讲,因为方式都差不多,可以实现共享,但也存在一些问题:

1、如果时在虚拟机上开FTP共享用SMB挂载的磁盘,将无法访问。认证的时候会一直要求登录

2、WebDAV不能挂载磁盘根目录,需要指定一个目录

3、需要使用IIS开web服务器

4、速度和稳定性实际使用不如smb

5、FTP时应用层协议,不能向文件系统一样挂载

其中FTP还得单独讲一下,FTP分为主动和被动模式。

如果不开启被动模式,访问的时候就需要在IE高级设置中关闭“使用被动FTP”选项(即使是想在资源管理器里用ftp://xxxx访问也一样得去IE设置里修改),而且也无法在外网通过FTP APP访问(不做好被动设置的话,在APP里无论选主动还是被动都无法连接)。

如果需要开启被动模式,那需要做好两个设置,1、在FTP服务器设置中,开放被动FTP端口,我设置成了5000-5099;2、需要在防火墙设置里,把/system32/svchost.exe设置为允许。

考虑到内网共享后面还有更简单的NFS方式(至少不用开IIS),这两个就先放弃了。

NFS

这个简单,但是安全性比较低。所以我只拿来做内网共享了。由于是匿名的,所以唯一的安全方式是在权限中限制可以访问的IP。优点也很明显:

1、无需登录,操作简单

2、在linux下安装nfs-utils即可mount。mount后可以修改目录权限(比samba方便许多)

3、无需使用其他服务

方案:

服务端:Windows Server开SMB+NFS共享。

内网Windows虚拟机:SMB磁盘映射

内网Linux虚拟机:NFS挂载

外网APP:SMB端口映射

 

使用Samba远程挂载Windows共享目录

本文将指导如何通过Samba挂载Windows远程目录实现在CentOS下访问Windows共享文件。

前提条件

CentOS:192.168.1.101
Windows:192.168.1.102
Windows共享目录: S盘

首先安装Samba客户端

yum install -y samba-client

安装完成后,可以用smbclient -L命令查看Windows目录共享情况

smbclient -L //192.168.1.102 -U Administrator
Enter Administrator's password:
Domain=[HYPER-V] OS=[Windows Server 2016 Datacenter 14393] Server=[Windows Server 2016 Datacenter 6.3]

        Sharename       Type      Comment
        ---------       ----      -------
        ADMIN$          Disk      远程管理
        C$              Disk      默认共享
        D$              Disk      默认共享
        IPC$            IPC       远程 IPC
        S$              Disk      默认共享
        T$              Disk      默认共享
Connection to 192.168.1.102 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
NetBIOS over TCP disabled -- no workgroup available

这里可以看到我将要共享的磁盘<S:>

接下来创建共享目录

mkdir -p /mnt/share

将远程目录mount到/mnt/share目录上

mount -t cifs -o username="Administrator",password="WIN_PASSWD" //192.168.1.102/S$ /mnt/share/

解释一下上述命令

mount: 挂载命令
-t cifs: 挂载文件格式为cifs(Common Internet File System),通用Internet文件系统
-o username,password: option选项,填写Windows用户名和密码
//192.168.1.102/S$: 远程共享目录//IP/DISK$
/mnt/share: 本地目录

挂载完成后即可直接访问该远程目录了。如果需要断开挂载,只需执行:

umont /mnt/share

挂载的Windows共享文件夹在Linux重启之后就会消失的,如果还要使用,是需要重新挂载的。
如果希望Linux开机自动挂载Windows共享文件夹,则需要将挂载命令添加到Linux的/etc/fstab,也就是将前述的命令参数按照fstab的要求添加到fstab里面。

What‘s More…

可以通过使用Apache达到用浏览器访问此目录的效果。这里给出一个参考配置文件。

<VirtualHost *:80>

    DocumentRoot /mnt/share/CONTENTS/

    <Directory /mnt/share/CONTENTS/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
        Require all granted
    </Directory>

    ErrorLog /var/log/httpd/error.log
    CustomLog /var/log/httpd/access.log combined

</VirtualHost>

如果遇到403错误,请确认是否关闭Selinux。