这次看看物理机上的多网卡,纯普通物理机、不是宿主机。
一、为什么要这么多网卡?有什么用?
在企业级服务器架构中,将网络流量进行物理隔离是保障系统高可用、高性能和高安全性的基石,因此出现了不同业务功能的网卡,当然这些网卡的取名也是每家企业都不太一样
1、带内网卡:服务器的主要业务出口,承载对外服务流量,业务服务也是绑定在这张网卡上
2、管理网卡:用于服务器运维管理的网卡,比如监控、备份、高危运维操作等,一般是考虑不挤占带内网卡流量所以独立出来的,后续主流都和入高带宽的带内网卡了
3、心跳网卡:服务器和其他服务器组建集群时会使用,要求高带宽、低延迟、互联网络节点也要尽可能少
4、带外网卡:服务器主板上自带的管理口,它在物理上拥有独立的网络平面,不与 OS 网络相通,比操作系统更底层、更独立的BMC,只要服务器通电就可以操作开关机、重装操作系统、查看风扇电源网卡状态等
5、HBA卡:这个不是以太网卡,是光纤FC网卡,专门连接光纤交换机后获取SAN存储服务,后面单独再聊
思考一下:从安全视角下,如果攻击者从带内网卡的监听服务上攻击成功了,获取主机权限,是否会选择从带外网卡、心跳网卡等去横向移动,那要做的安全工作是不是更多了?
二、网卡bond聚合mode4和mode1实践细节
为了更好的承载业务流量、增加带宽和提高冗余,通常会选择网卡聚合,常用的是mode4和mode1来说:1、如果交换机支持LACP,带内和心跳网卡常用mode4:物理机和交换机用802.3ad协议、形成LACP动态聚合,总带宽翻倍;流量分发基于 Hash 算法(一般是源ip+目标ip ),由于 Hash 算法限制,任何单一 TCP/UDP 连接(单流)的极限速度依然无法突破单张物理网卡的带宽上限(例如单流最高 10Gbps),但多并发连接(多流)可以均衡分布在两张网卡上,实现整体总带宽翻倍(最高 20Gbps)注:bond聚合还会改变两张物理网卡的mac地址,使用ifconfig命令,可以发现bond网卡和两张eth网卡的mac地址是一样的,都是master网卡的mac地址,slave网卡的mac地址被覆盖了(使用 ethtool -P <网卡名>可以显示真实mac地址)
2、如果交换机不支持LACP、又想冗余性高点,带外用mode1,只有一张网卡处于活动状态,其他网卡作为备份,即使两张物理网卡分别接入两台完全独立、没有做堆叠的交换机,也能实现无缝的主备切换。
仅凭 ifconfig 的输出,确实无法直接、100% 确定是 mode1 还是 mode4(或其他模式),需要通过cat /proc/net/bonding/bond0命令查看聚合口模式
Bonding Mode: fault-tolerance (active-backup) → 这是 mode1Bonding Mode: IEEE 802.3ad Dynamic link aggregation → 这是 mode4Bonding Mode: load balancing (round-robin) → 这是 mode0
一台服务器配置多网卡后,需要高度关注它的路由表配置,其中 ip rule show 显示策略路由、决定走那张路由表;ip route show table <bond0_table>显示具体路由表的内容。实际应用下,不太会使用策略路由、路由表也是用default即可,此时所有网卡都是共用一张路由表;但是此时切记仅在主业务带内网卡上配置网关,会生成一条去0.0.0.0/0指向带内网关、走带内网卡的默认路由;其他网卡不配置网关,需要通过配置明细静态路由、明确去向特定ip走指定网卡
# 带内网卡示例BOOTPROTO=static IPADDR=10.1.1.1 NETMASK=255.255.255.0 GATEWAY=10.1.1.254 # 只要写了这一行,重启网络服务后,系统会自动执行 ip route add default ...
注意:在整个操作系统的所有网卡配置文件(ifcfg-*)中,GATEWAY 这一行只能、也必须只能出现在主业务带内网卡(如 bond0)的配置中,其他网卡配置文件绝不能出现 GATEWAY 字样
生成的路由表示例如下:
default via 10.1.1.254 dev bond0 10.1.1.0/24 dev bond0 proto kernel scope link src 10.1.1.1 20.1.1.0/24 dev bond1 proto kernel scope link src 20.1.1.1 30.1.1.0/24 dev bond2 proto kernel scope link src 30.1.1.1 40.1.1.0/24 dev mgmt0 proto kernel scope link src 40.1.1.1
四、多网卡下如何发包
再看下怎么发包,大致步骤如下:
1. 应用层发起:应用程序调用 send(),数据封装成 TCP/UDP 段,确定目标IP地址2. 路由查找:内核先查 策略路由(ip rule),决定查哪张路由表,在路由表中进行最长前缀匹配。- 结果 A(无路由):丢弃数据包,向上层报错(ICMP不可达)
3. ARP邻居解析:根据确定的下一跳 IP,去邻居表里找对应的 MAC 地址。命中缓存:直接进入下一步;未命中:创建邻居项,状态置为 INCOMPLETE。
4. 发送 ARP 请求(广播):数据包暂时挂在邻居项的队列上等待。收到 ARP 回复后,更新 MAC,唤醒挂起的数据包。若多次重试失败,标记为 FAILED,通知上层(触发 TCP 重传或报错)。
5. 链路层发送:构建以太网帧头(填入源/目的 MAC),经过 Netfilter OUTPUT/FORWARD 链(如果还没走的话),进入 Qdisc流量控制队列进行排队、整形。
6. 驱动层发送:调用网卡驱动的 hard_start_xmit,网卡通过 DMA 将数据拷贝到 Ring Buffer,开始物理发送。