Samba 4 实现 Active Directory 认证与 Linux 高可用性机制
1. Samba 4 实现 Active Directory 认证
1.1 设置域控制器
- 安装 Samba 域控制器包 :
sudo dnf install samba-dc
- 清除配置文件 :为确保环境干净,移除 Samba 和 Kerberos 守护进程的所有配置文件。
sudo rm -f /etc/samba/smb.conf
sudo rm -f /etc/krb5.conf
- 自动配置域控制器 :Samba 提供了自动配置域控制器的命令,支持交互和非交互模式。以下是一个在 VirtualBox VM 中运行客户端系统时的示例命令:
sudo samba-tool domain provision --option="interfaces=vboxnet0" --option="bind interfaces only=yes" --use-rfc2307 --interactive
在交互过程中,需要输入以下信息:
-
Realm
:必须是大写的域名,如
AD.EXAMPLE.COM
。
-
Domain
:NetBIOS 意义上的域名,最长 15 个字符,如
AD
。
-
Server Role
:默认为
dc
(域控制器)。
-
DNS backend
:默认为
SAMBA_INTERNAL
。
-
DNS forwarder IP address
:可指定为
192.168.56.1
。
-
Administrator password
:设置域管理员密码。
配置完成后,会生成 Kerberos 配置文件,但需要手动复制到目标位置:
sudo cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
最后,启动 Samba 服务:
sudo systemctl start samba
1.2 创建测试用户
为验证认证功能,创建一个名为
testuser
的用户:
sudo samba-tool user create testuser
使用以下命令查看该用户的 LDAP 字段:
samba-tool user show testuser
1.3 设置客户端
-
验证控制器状态
:使用
realm discover命令验证域控制器是否正常工作。
realm discover ad.example.com
输出信息会显示客户端机器是否已加入该域,以及加入该域所需的软件包。如果有未安装的软件包,可以使用
dnf
命令进行安装,例如:
sudo dnf install samba-common-tools
- 加入域 :运行以下命令加入域,过程中需要输入域管理员密码。
sudo realm join ad.example.com
加入域后,重启 SSSD 服务使配置生效:
sudo systemctl restart sssd
生成的 SSSD 配置文件
/etc/sssd/sssd.conf
内容如下:
[sssd]
domains = ad.example.com
config_file_version = 2
services = nss, pam
[domain/ad.example.com]
default_shell = /bin/bash
krb5_store_password_if_offline = True
cache_credentials = True
krb5_realm = AD.EXAMPLE.COM
realmd_tags = manages-system joined-with-adcli
id_provider = ad
fallback_homedir = /home/%u@%d
ad_domain = ad.example.com
use_fully_qualified_names = True
ldap_id_mapping = True
access_provider = ad
-
验证用户信息
:使用
id命令查询testuser的信息,需要指定其完全限定名。
id testuser@ad.example.com
也可以使用该用户名和密码登录控制台。
1.4 相关技术表格
| 操作 | 命令 |
|---|---|
| 安装 Samba 域控制器包 |
sudo dnf install samba-dc
|
| 清除 Samba 配置文件 |
sudo rm -f /etc/samba/smb.conf
|
| 清除 Kerberos 配置文件 |
sudo rm -f /etc/krb5.conf
|
| 自动配置域控制器 |
sudo samba-tool domain provision --option="interfaces=vboxnet0" --option="bind interfaces only=yes" --use-rfc2307 --interactive
|
| 复制 Kerberos 配置文件 |
sudo cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
|
| 启动 Samba 服务 |
sudo systemctl start samba
|
| 创建测试用户 |
sudo samba-tool user create testuser
|
| 查看用户 LDAP 字段 |
samba-tool user show testuser
|
| 验证域控制器 |
realm discover ad.example.com
|
| 加入域 |
sudo realm join ad.example.com
|
| 重启 SSSD 服务 |
sudo systemctl restart sssd
|
| 查询用户信息 |
id testuser@ad.example.com
|
1.5 流程 mermaid 图
graph LR
A[安装 Samba 域控制器包] --> B[清除配置文件]
B --> C[自动配置域控制器]
C --> D[复制 Kerberos 配置文件]
D --> E[启动 Samba 服务]
E --> F[创建测试用户]
F --> G[查看用户 LDAP 字段]
G --> H[验证域控制器]
H --> I[加入域]
I --> J[重启 SSSD 服务]
J --> K[查询用户信息]
2. Linux 高可用性机制
2.1 冗余和负载均衡类型概述
现代 TCP/IP 网络栈是分层的,常见的分层模型有七层的开放系统互连(OSI)模型和四层的 DoD 模型。不同层的协议相互独立,为了使网络能够抵抗不同类型的故障,需要在多个层面实现冗余。以下是两种模型的对比表格:
| OSI 模型 | DoD 模型 | 目的 | 示例 |
| — | — | — | — |
| 物理层 | 链路层 | 传输代表比特流的电/光信号 | 以太网、Wi-Fi |
| 数据链路层 | 网络层 | 在分段、路由网络中传输数据包 | IPv4、IPv6 |
| 传输层 | 传输层 | 可靠传输数据段(完整性检查、确认、拥塞控制等) | TCP、UDP、SSTP |
| 会话层 | 应用层 | 传输特定应用程序的数据 | HTTP、SMTP、SSH |
| 表示层 | 应用层 | | |
2.2 术语说明
在描述冗余设置时,默认使用主动/备用(active/standby)术语,即同一时间只有一个活动节点工作,一个或多个备用节点等待在活动节点故障时接替工作。不过,一些旧文献可能会使用主/从(master/slave)术语,该术语因与奴隶制相关且容易产生误解,正逐渐被淘汰。在讨论仍使用该术语的协议和软件时,为保持与文档一致,会继续使用。
2.3 链路层冗余
在户外安装和工业网络中,电缆和以太网交换机端口故障较为常见,因此拥有多个链路层连接非常有用。Linux 支持多种方式将多个网卡组合使用,包括主动/备用和负载均衡配置。不同模式对交换机的要求不同,具体如下表所示:
| 类型 | 操作 | 交换机要求 |
| — | — | — |
| 主动备份(active-backup) | 一个网卡处于禁用状态,另一个正常工作 | 无,适用于任何交换机(包括非管理型交换机) |
| 802.3ad | 帧在所有端口上进行平衡 | 需要支持 803.3ad LACP 协议 |
| 平衡异或(balance-xor)和广播(broadcast) | | 需要支持 EtherChannel 协议 |
| 平衡传输层负载均衡(balance-tlb)和平衡应用层负载均衡(balance-alb) | | 无 |
以主动备份模式为例,在使用 NetworkManager 配置的系统中,可以使用以下命令将
eth0
和
eth1
网络接口组合成一个
bond0
接口:
sudo nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup"
sudo nmcli connection add type ethernet slave-type bond con-name bond0-port1 ifname eth0 master bond0
sudo nmcli connection add type ethernet slave-type bond con-name bond0-port2 ifname eth1 master bond0
sudo nmcli connection up bond0
2.4 网络层冗余和负载均衡
当系统有多个独立的互联网或内部网络连接时,可以提供备份路由或在多个路由之间平衡 IP 数据包。但在实际应用中,网络层冗余主要由路由器使用,且最简单的形式仅适用于具有公共、全球路由地址的网络。
例如,系统连接到两个不同的路由器,IPv4 地址分别为
192.0.2.1
和
203.0.113.1
。如果希望其中一个连接作为备用,可以创建两个默认路由并设置不同的度量值:
sudo ip route add 0.0.0.0/0 via 192.0.2.1 metric 200
sudo ip route add 0.0.0.0/0 via 203.0.113.1 metric 100
若要实现负载均衡,可以使用以下命令:
sudo ip route add 0.0.0.0/0 nexthop via 192.0.2.1 weight 5 nexthop via 203.0.113.1 weight 10
但这种配置与网络地址转换(NAT)不兼容,因为它可能会将属于同一 TCP 连接或 UDP 流的数据包发送到不同的网关。
2.5 传输层负载均衡(LVS)
网络层机制的主要缺点是它以单个数据包为操作单位,没有连接的概念。许多网络服务是面向连接的,因此需要确保属于同一连接的所有数据包都发送到同一服务器。Linux 提供了 Linux 虚拟服务器(LVS)框架和管理工具
ipvsadm
来解决这个问题。
LVS 的关键概念包括虚拟服务器和真实服务器。虚拟服务器提供服务的公共地址,接受连接并将其分配给多个真实服务器,真实服务器可以运行任何操作系统和软件,并且可以不知道虚拟服务器的存在。
LVS 提供了多种负载调度算法,各有优缺点,如下表所示:
| 算法 | 描述 |
| — | — |
| 轮询(Round Robin,rr) | 平均分配连接到所有服务器 |
| 加权轮询(Weighted Round Robin,wrr) | 类似于轮询,但可以通过分配更高的权重值将更多连接发送到某些服务器 |
| 最少连接(Least Connection,lc) | 优先将新连接发送到当前连接数最少的服务器 |
| 加权最少连接(Weighted Least Connection,wlc) | 默认调度算法,类似于最少连接,但可以为服务器分配权重 |
| 基于位置的最少连接(Locality-Based Least-Connection,lblc) | 将具有相同目标 IP 地址的新连接发送到同一服务器,如果该服务器不可用或过载,则切换到下一个服务器 |
| 带复制的基于位置的最少连接(Locality-Based Least-Connection with Replication,lblcr) | 如果服务器未过载,将具有相同目标 IP 地址的新连接发送到同一服务器,否则发送到连接数最少的服务器 |
| 目标哈希(Destination Hashing,dh) | 创建一个将目标 IP 地址映射到服务器的哈希表 |
| 源哈希(Source Hashing,sh) | 创建一个将源 IP 地址映射到服务器的哈希表 |
| 最短预期延迟(Shortest Expected Delay,sed) | 将新连接发送到预期延迟最短的服务器 |
| 永不排队(Never Queue,nq) | 将新连接发送到第一个空闲的服务器,如果没有空闲服务器,则切换到最短预期延迟算法 |
选择合适的调度算法取决于服务类型,例如轮询和加权轮询适用于短连接服务,如提供静态页面或文件的 Web 服务器。
2.6 流程 mermaid 图
graph LR
A[网络层连接故障] --> B[链路层冗余]
B --> C[网络层冗余和负载均衡]
C --> D[传输层负载均衡(LVS)]
D --> E[选择合适的调度算法]
通过在多个层面实现冗余和负载均衡,可以提高系统的可用性和性能,确保系统能够在各种故障情况下继续提供服务。
2.7 使用 Keepalived 实现虚拟 IP 共享与 LVS 自动化配置
Keepalived 是一个用于实现高可用性的软件,它可以在多个节点之间共享一个虚拟 IP 地址,并自动配置 LVS。以下是使用 Keepalived 实现虚拟 IP 共享和 LVS 自动化配置的步骤:
2.7.1 安装 Keepalived
在需要配置的节点上安装 Keepalived:
sudo dnf install keepalived
2.7.2 配置 Keepalived
编辑 Keepalived 配置文件
/etc/keepalived/keepalived.conf
,以下是一个示例配置:
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
}
virtual_server 192.168.1.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.1.101 80 {
weight 1
SSL_GET {
url {
path /
digest ff20ad2481f8d06963a18ff99a97acde
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
在上述配置中:
-
vrrp_instance
部分定义了虚拟路由器实例,包括状态(
state
)、接口(
interface
)、虚拟路由器 ID(
virtual_router_id
)等。
-
virtual_server
部分定义了虚拟服务器,包括 IP 地址、端口、负载均衡算法(
lb_algo
)等。
-
real_server
部分定义了真实服务器,包括 IP 地址、端口、权重(
weight
)等。
2.7.3 启动 Keepalived
启动 Keepalived 服务并设置开机自启:
sudo systemctl start keepalived
sudo systemctl enable keepalived
2.7.4 配置表格
| 操作 | 命令或配置 |
|---|---|
| 安装 Keepalived |
sudo dnf install keepalived
|
| 编辑配置文件 |
/etc/keepalived/keepalived.conf
|
| 启动服务 |
sudo systemctl start keepalived
|
| 设置开机自启 |
sudo systemctl enable keepalived
|
2.7.5 流程 mermaid 图
graph LR
A[安装 Keepalived] --> B[编辑配置文件]
B --> C[启动 Keepalived 服务]
C --> D[设置开机自启]
2.8 应用层负载均衡(HAProxy)
应用层负载均衡可以根据应用层协议(如 HTTP、HTTPS)的内容进行负载均衡,提供更细粒度的控制。HAProxy 是一个常用的应用层负载均衡器,以下是使用 HAProxy 进行应用层负载均衡的步骤:
2.8.1 安装 HAProxy
在需要配置的节点上安装 HAProxy:
sudo dnf install haproxy
2.8.2 配置 HAProxy
编辑 HAProxy 配置文件
/etc/haproxy/haproxy.cfg
,以下是一个示例配置:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend http-in
bind *:80
default_backend servers
backend servers
balance roundrobin
server server1 192.168.1.101:80 check
server server2 192.168.1.102:80 check
在上述配置中:
-
global
部分定义了全局配置,如日志、用户、组等。
-
defaults
部分定义了默认配置,如模式、超时时间等。
-
frontend
部分定义了前端配置,如监听的 IP 地址和端口。
-
backend
部分定义了后端配置,如负载均衡算法、真实服务器列表等。
2.8.3 启动 HAProxy
启动 HAProxy 服务并设置开机自启:
sudo systemctl start haproxy
sudo systemctl enable haproxy
2.8.4 配置表格
| 操作 | 命令或配置 |
|---|---|
| 安装 HAProxy |
sudo dnf install haproxy
|
| 编辑配置文件 |
/etc/haproxy/haproxy.cfg
|
| 启动服务 |
sudo systemctl start haproxy
|
| 设置开机自启 |
sudo systemctl enable haproxy
|
2.8.5 流程 mermaid 图
graph LR
A[安装 HAProxy] --> B[编辑配置文件]
B --> C[启动 HAProxy 服务]
C --> D[设置开机自启]
总结
通过本文,我们学习了如何使用 Samba 4 实现与 Microsoft Active Directory 兼容的域控制器,并从另一台 Linux 机器加入该域。同时,我们还深入探讨了 Linux 中的高可用性机制,包括链路层、网络层、传输层和应用层的冗余和负载均衡。
在链路层,我们可以通过网卡绑定实现冗余;在网络层,可以通过设置路由实现备份和负载均衡;在传输层,LVS 提供了多种调度算法来分配连接;在应用层,HAProxy 可以根据应用层协议进行负载均衡。此外,Keepalived 可以实现虚拟 IP 共享和 LVS 自动化配置。
通过在多个层面实现冗余和负载均衡,可以提高系统的可用性和性能,确保系统能够在各种故障情况下继续提供服务。希望这些知识对你有所帮助,让你能够更好地构建和管理高可用性的 Linux 系统。
超级会员免费看
966

被折叠的 条评论
为什么被折叠?



