文件共享笔记:samba搭建及smb3多网卡叠加

samba搭建到多网卡叠加

记录debian做nas的smb3叠加,有些问题并没有完全弄清楚,如果以后有搞清楚,或者有错误的地方,再更正

samba的安装

sudo aptitude install samba

samba配置

配置文件位于/etc/samba/smb.conf

它一共分成两类结点,一类是全局的节,一类是针对某些共享的节(例如打印机共享文件夹具体的设置)
全局节影响的是整个smb的设置,它包括一些smb的通用设置,例如绑定网卡,安全设置,日志等等,具体要参考smb.conf的manpage(man smb.conf)

一个节(section)的格式如下

[节的名称]
选项 = 值
选项 =  值1  值2 值3
;或者#后是注释

#这是注释
;这是注释

把打印机相关节注释掉

;[printers]
;   comment = All Printers
;   browseable = no
;   path = /var/spool/samba
;   printable = yes
;   guest ok = no
;   read only = yes
;   create mask = 0700

有些选项是有默认值的,没有设置,则使用默认值。以下列出部分设置
这里有两张网卡

  1. enp4s0 ip:192.168.1.4 子网掩码:255.255.255.0

2.enp3s0 ip:192.168.1.6 子网掩码:255.255.255.0

# 文件:/etc/samba/smb.conf

[global]
   use sendfile = yes
   fake oplocks = yes
   #绑定网卡
   ;格式是 
   ;interfaces = 网卡名A 网卡名B   网卡A的ip/掩码  网卡B的ip/掩码
   interfaces = enp4s0 enp3s0  192.168.1.4/24 192.168.1.5/24
   #最大并发
   max mux = 10000
   max open files =10000
#安全设置

   invalid users = root          ;禁止root用户登录
   server multi channel support = yes      ;启用多通道,smb3的时候,可以通过多网卡通道叠加提升带宽。

有多张网卡的时候,可以使指定samba绑定某几个网卡,具体网卡名称在/sys/class/net目录下可以看到

~$ ls /sys/class/net
docker0  enp3s0  enp4s0  lo  veth22e5494

把某个文件夹共享

# 文件:/etc/samba/smb.conf


[dirname]
        comment = 描述
        path = 真实的物理路径     #要共享文件的实际目录
        guest ok = no           #禁止匿名访问
        browseable = yes     #是都可以浏览
        create mask = 755    #创建文件时的默认权限 rwx r-x r-x
        read only = no           #取消只读
     

关于文件访问的权限问题:
共享节并没有直接控制具体到某个用户的访问权限,但是文件或者文件夹的访问,受到实际文件权限限制,因此用不同的本地用户登录,需要解决一些共享权限的问题,下面叙述完账户设置后,再叙述权限部分

修改smb.conf配置文件后,需重载smbd服务使得新配置生效
sudo systemctl reload smbd或者重启服务sudo systemctl restart smbd

smb账户

smb账户的本地账户创建需要注意的地方是:smb用户和本地用户名称要保持一致,使用smbpasswd创建用户

sudo smbpasswd -a 用户名

#例如个人用户是xxoo,则
sudo smbpasswd -a xxoo

smbpasswd 还有一些关于控制账户的选项,具体看帮助,有些选项没有用过,也不清楚具体使用。

到这一步一般情况下都可以正常登陆访问了,如果访问出现了问题,需要考虑权限问题
1.smb的本地用户名和linux本地用户要一一对应
2.访问的文件、文件夹,linux用户需要有访问权限

多路叠加

SMB3后,支持多路叠加,如果查看现在是否使用的是smb3?(下图xxoo是用户名)

~$ sudo smbstatus
Samba version 4.9.5-Debian
PID     Username     Group        Machine                                   Protocol Version  Encryption           Signing             
----------------------------------------------------------------------------------------------------------------------------------------
14186   xxoo           xxoo           192.168.1.4 (ipv4:192.168.1.4:49723)  SMB3_11           -                    partial(AES-128-CMAC)
11699   xxoo           xxoo           192.168.1.4 (ipv4:192.168.1.4:49865)  SMB3_11           -                    partial(AES-128-CMAC)

在 Protocol 列可以看到,当前连接的客户端使用的协议版本是SMB3_11

smb3多路叠加需要至少4张网卡支持,Nas 2张,电脑2张,网卡接上后,连接正常,右键左下角开始按钮,选择powershell(管理员)

PS C:\Windows\system32> Get-SmbMultichannelConnection

Server Name   Selected Client IP     Server IP     Client Interface Index Server Interface Index Client RSS Capable Client RDMA Capable
-----------   -------- ---------     ---------     ---------------------- ---------------------- ------------------ -------------------
192.168.1.4 True     192.168.1.7 192.168.1.4 17                     4294967295             False              False
192.168.1.4 True     192.168.1.8 192.168.1.5 11                     2                      False              False

上图smbd服务器的地址是192.168.1.4192.168.1.5
电脑的网卡地址是192.168.1.7192.168.1.8

图中可以看出,连接关系是:
192.168.1.7 <---> 192.168.1.4
192.168.1.8 <---> 192.168.1.5

这样说明已经成功启用了多通道叠加,随便找个大文件传输,如果速度叠加,说明配置完.....

成个P呀,当然没那么顺利

我遇上了什么情况?
因为我4张网卡都接在同一个交换机下,由路由器分配固定的IP,每个网卡都可以两两互访,路径一度混乱

1.上传叠加了,但是下载速度不变

2.下载速度叠加了,上传速度不变

查看双网卡,均有 占用带宽,但是,任务管理器中查看,win10的双网卡的都有都有发送或者接收,但是两个网卡加起来,并没与突破千兆带宽。

也就是,虽然电脑这边的双网卡的确分流了,但是nas那边,并没有使用到另外一张网卡,很郁闷,为什么出现这种情况,

我该怎么做?

这里涉及到一个ARP的问题,默认情况下,linux会启用以下参数:

net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.all.arp_announce = 0
net.ipv4.conf.all.arp_ignore = 0
enp3s0 : 192.168.1.4
enp4s0 : 192.168.1.5

linux的并不是绑定网卡的,即出现这样的一种情况: 192.168.1.4192.168.1.5 均在一个傻瓜交换机下,二层他们是连在一起的,当子网内有个主机询问,谁是192.168.1.4?,请告诉我你的MAC地址!

我们来思考下这些问题:

  • arp请求的数据包从哪个网络接口流入的?

  • arp响应的MAC地址应该是哪个?一定是enp3s0么?

由于arp请求是个广播包,与之查询IP匹配的主机会响应该请求,不匹配的主机就沉默。

但是nas上,有两个网络接口,它两个接口都收到了arp查询请求,它该怎么办?

net.ipv4.conf.all.arp_filternet.ipv4.conf.all.arp_announcenet.ipv4.conf.all.arp_ignore 这3个参数在影响着不同的处理策略

net.ipv4.conf.all.arp_filter=0 的时候,他会响应其他接口的IP,例如,从enp3s0进来的查询“192.168.1.4”,主机也会对该请求相应,但是相应的是enp4s0的MAC地址,而不是按绑定关系的enp3s0的mac地址。

那么,别人误以为enp4s0的ip地址就是192.168.1.4,他就往这里发了。

有趣的情况来了,当192.168.1.5呢?他也往这里发了!!!

电脑那边,arp查询192.168.1.4、192.168.1.5的的mac地址,可能是相同的!!

那么应该设置net.ipv4.conf.all.arp_filter=1 ,针对enp3s0,他只会响应192.168.1.4的arp请求,与自己接口对应ip无关的请求,它是忽略的。

再说net.ipv4.conf.all.arp_announce ,如果出现这样的一种情况:如果局域网内有个主机,他的IP(192.168.3.2)与nas的IP(192.168.1.4)不在同一个网段,这种ARP请求,应不应该响应?

这里就涉及到检查arp请求的源IP,应该要设置成只响应同一子网的ARP请求,当然这里的设置,和均衡负载无关的。设置成1即可。

最后一个ARP相关的问题,net.ipv4.conf.all.arp_ignore,应该回应那个MAC地址,前面说到, IP地址并不是配置到网卡上的,网卡只有mac地址,也就是二层的东西,而ARP相应,他需要给对方返回一个合适的MAC地址。

设置成1、2都行,都会考虑ARP请求查询的IP,与该请求流入的网卡上配置的IP是否一致,一致才会回复。2就加多了一个限制,ARP请求方的IP与查询的IP需要是同一子网内的。

最终的设置:

net.ipv4.conf.all.arp_filter=1
net.ipv4.conf.all.arp_announce=1
net.ipv4.conf.all.arp_ignore=2

二层的东西处理完了,我们还得处理下三层的,指导下流量从哪个网口流出。

手动建立主机路由

我的想法是,4个网口都接在同一个交换机下,让双网卡实现下面的路由关系,4个网卡都在同一个网段, 相互访问可能受到跃点值的影响,跃点值越低,网卡优先级越高,我猜猜可能是他们的路由关系并没有想象中那样。

电脑   <------> nas
192.168.1.7  <---> 192.168.1.4
192.168.1.8 <---> 192.168.1.5

于是,我手动建立了静态的路由(我4个网卡都在路由器绑定了静态ip,路由器每次都会给他们分配固定的ip,设置静态IP也行)

首先在linux端,网卡和ip对应如下

enp3s0:192.168.1.4
enp4s0:192.168.1.5

由于ip在路由上做了绑定,我这里只需要dhcp让他分配就行了
网卡的配置文件在/etc/network/interfaces,添加以下配置:
使得网卡启动后,自动添加一条主机路由到192.168.1.7

#文件:/etc/network/interfaces

#允许网卡启动,配置网卡使用dhcp
allow-auto enp3s0
iface enp3s0 inet dhcp

#up:当启动网卡是,添加一条路由关系,让访问192.168.1.7通过192.168.1.4的那个网卡
#down:当网卡卸载时,删除这条路由关系
up  route add -host 192.168.1.7 dev enp3s0
down route del -host  192.168.1.7 dev enp3s0

同样,让另外一张网卡,添加一条主机路由到192.168.1.8

allow-auto enp4s0
iface enp3s0 inet dhcp
up  route add -host 192.168.1.8 dev enp4s0
down route del -host  192.168.1.8 dev enp4s0

然后重启网卡或重启nas。

然后,在win10这边,也建立两条永久的主机路由,指导访问192.168.3.4 或者 192.168.1.5到底使用哪个网卡

首先查看网卡接口列表和路由表,搜索cmd,用管理员权限运行

route print

得到类似于以下信息

网卡接口列表

在网卡接口分段看到接口列表,第一列数字1711之类的是网卡的接口编号,紧接着是它的MAC地址,最后是名称,这里

Intel(R) I211 Gigabit Network Connection   :   192.168.1.7
Realtek PCIe GbE Family Controller           :   192.168.1.8

添加两条主机路由

# route add   目的主机  mask 255.255.255.255 网关地址 metric 跃点值  if 网卡编号
route add 192.168.1.4 mask 255.255.255.255 192.168.1.7 metric 1  if 17
route add 192.168.1.5 mask 255.255.255.255 192.168.1.8 metric 1  if 11

因为是主机路由,不是网络路由,所以,mask的值是255.255.255.255
网关地址,网卡对应的ip
跃点值,保证这条路由是优先级最高的
网卡编号可以通过route print查询到

两边都通过主机路由绑定后,断开硬盘映射,重启,重新做映射,并且通过powershell查阅对应关系正常(Get-SmbMultichannelConnection),上下行,都达到了预期。传输带宽的确叠加。

PS C:\Windows\system32> Get-SmbMultichannelConnection

Server Name   Selected Client IP     Server IP     Client Interface Index Server Interface Index Client RSS Capable Client RDMA Capable
-----------   -------- ---------     ---------     ---------------------- ---------------------- ------------------ -------------------
192.168.1.4 True     192.168.1.7 192.168.1.4 17                     4294967295             False              False
192.168.1.4 True     192.168.1.8 192.168.1.5 11                     2                      False              False

但是,并没有确定,到底是哪边的路由关系可能导致下载或上传出现的问题,干脆,两端都指定了主机路由。

使用glances可以查看系统状态,例如网卡的实时速度。或者使用bmon查看网卡,安装如下

sduo apt-get install bmon glances

使用如下

glances

bmon

对于使用了systemd的发行版,可以使用systemd来配置network,翻译文档可以查看以下链接
http://www.jinbuguo.com/systemd/systemd.network.html#

配置的思路是,利用mac地址进行匹配(Match),不同mac地址的网卡设对应的路由关系,一个.network配置文件对应一个网卡,存放在/etc/systemd/network目录下,如:/etc/systemd/network/enp3s0.network

# filename : /etc/systemd/network/xxx.network
# 匹配MAC地址的节这个配置只针对特定的MAC地址的网卡生效
[Match]
MACAddress=xx:xx:xx:xx:xx:xx

# 设置MTU选项
[Link]
MTUBytes=1500


[Network]
Description=配置网络启用DHCP客户端,并且,启用转发,详细配置看[DHCP小节]
DHCP=yes
IPForward=yes

# 可以存在多个route小节,Route小节主要是设定路由关系,下面设置的是一个主机路由
# Gateway 为0.0.0.0意味着这是个直通路由,不经过网关
# Destination只是一个通往192.168.1.2的主机路由,如果要通往一个网段,要写成192.168.1.1/24这种
# Metric设置它的跃点值,跃点值越低,优先级越高
# MTUBytes设置最大传输单元
# 有了这条路由,按照选路原则(子网掩码最长的优先),主机路由的优先级是最高的,其次才回到针对192.168.1.1/24网段的路由(子网掩码是255.255.255.0),即使Metric值比它低,主机路由还是优先的
[Route]
Destination=192.168.1.2
Gateway=0.0.0.0
Metric=0
MTUBytes=1500


#DHCP小节只有在Network小节中开启DHCP=yes才有效
# SendHostname=yes 发送特定的主机名给DHCP server
# Hostname=XXOO-x 指定特定的主机名
# RouteMetric 指定DHCP 设定的路由的跃点值,多网卡同时上网的情况,通过设置跃点值指定网卡优先级
# 这个将影响DHCP成功分配IP后,默认路由的跃点值
[DHCP]
SendHostname=yes
Hostname=XXOO-x
RouteMetric=101

然后重新启动systemd-networkd服务

sudo systemctl  restart systemd-networkd

根据网卡设置,网卡配置被加载后,同时会添加主机路由。

查看是否载入了路由:

route   -n

smb3多通道偶尔还是出现上述被限制到千兆的问题,我尝试了以下操作暂时算是恢复了,比较奇怪
在linux,重启网卡服务和samba服务

sudo systemctl restart systemd-networkd smbd 

在windows重置了winsock,然后重启windows

netsh winsock reset

检查两边的路由表,没有异常,后续再测试,速度恢复了。

上面这个问题就是因为前面所说ARP的原因造成的。


2020.1.16 emmm...太多线了,终究还是入了10G网卡。
2021.9.4 原来ARP的锅..

你可能感兴趣的:(文件共享笔记:samba搭建及smb3多网卡叠加)