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
有些选项是有默认值的,没有设置,则使用默认值。以下列出部分设置
这里有两张网卡
-
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.4
和 192.168.1.5
电脑的网卡地址是192.168.1.7
和 192.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.4
, 192.168.1.5
均在一个傻瓜交换机下,二层他们是连在一起的,当子网内有个主机询问,谁是192.168.1.4
?,请告诉我你的MAC地址!
我们来思考下这些问题:
arp请求的数据包从哪个网络接口流入的?
arp响应的MAC地址应该是哪个?一定是enp3s0么?
由于arp请求是个广播包,与之查询IP匹配的主机会响应该请求,不匹配的主机就沉默。
但是nas上,有两个网络接口,它两个接口都收到了arp查询请求,它该怎么办?
net.ipv4.conf.all.arp_filter
, net.ipv4.conf.all.arp_announce
,net.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
得到类似于以下信息
在网卡接口分段看到接口列表,第一列数字
17
,11
之类的是网卡的接口编号,紧接着是它的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的锅..