上篇我们理清了 F5 的整体框架,这篇直接上手实操。
学完这篇,你就能独立完成一个 HTTPS VIP 从零到上线的全流程。
三个核心概念一句话
| 组件 | 一句话 | 类比 |
|---|---|---|
| Virtual Server (VS) | 对外暴露的 VIP:Port,所有流量的入口 | 公司的前台大门 |
| Pool | 后端服务器的集合,决定流量转发给谁 | 坐在工位上的员工 |
| Profile | 协议处理模板,决定流量怎么处理 | 接待流程:登记录入 → 访客卡 → 引导 |
它们的关系:VS 绑定 Pool + Profile,来一个请求就按 Profile 规定的流程处理,然后转发给 Pool 里的某个 Member。
准备工作:先确认六个问题
动手前,先问清楚这六个问题,少一个都可能让上线失败:
| 确认项 | 说明 | 示例 |
|---|---|---|
| VIP 地址 | 从地址池申请,确认不冲突 | 10.0.0.100 |
| 端口 | 4 层(TCP/UDP)还是 7 层(HTTP/HTTPS) | 443 |
| 协议 | TCP / HTTP / HTTPS | HTTPS |
| 后端地址列表 | IP:Port,确认后端存活 | 10.0.0.10:80, 10.0.0.11:80 |
| 是否需要 SSL | 证书是否已上传 F5 | RSA 还是 ECC?通配符还是单域名? |
| 所属 Partition | 和业务线的隔离一致 | /Common/production-app |
第一步:上传证书(仅 HTTPS 需要)
# tmsh 导入证书和密钥
tmsh install sys crypto cert myapp.crt from-local-file /shared/tmp/your.crt
tmsh install sys crypto key myapp.key from-local-file /shared/tmp/your.key
tmsh install sys crypto ca-bundle myapp-ca.crt from-local-file /shared/tmp/ca.crt
也可在 GUI → System → File Management → SSL Certificate List → Import 上传。
验证证书已上传:
tmsh list sys crypto cert myapp.crt
# 应看到有效期、Subject、Issuer 等信息
第二步:创建健康检查 Monitor
Monitor 决定了一个后端 Member 是活的还是死的。
选型规则:
业务类型 推荐的 Monitor
────────────────────────────────
TCP 端口服务 tcp(只检查端口是否 Listen)
HTTP 页面 http(检查 HTTP 200)
HTTPS 页面 https(走 TLS 检查)
创建 HTTP Monitor(最常用):
tmsh create ltm monitor http myapp-monitor \
interval 10 \
timeout 31 \
time-until-up 0 \
send "GET /health HTTP/1.1\r\nHost: myapp.local\r\nConnection: close\r\n\r\n" \
recv "200 OK"
参数说明------这里是新手最容易踩坑的地方:
参数 推荐值 说明
──────────────────────────────────────────
interval 5~30 每次探测间隔(秒)
timeout interval×3+1 F5 官方公式:超时 = 间隔 × 3 + 1
time-until-up 0~60 启动后等几秒再标记 up(防止刚重启误判)
send 请求内容 写 GET /health,TCP 不用写
recv 期望响应 响应包含此字符串才算 up
重要规则:
timeout必须大于interval,否则 F5 会报错。 F5 推荐公式:timeout = interval × 3 + 1
第三步:创建 Node(节点)
这一步是新手最容易忽略的步骤,但理解 Node 和 Member 的区别是理解 F5 对象模型的关键。
Node vs Member ------ 核心区别
| 概念 | Node(节点) | Member(成员) |
|---|---|---|
| 定义 | 一台物理/虚拟机的 IP 地址,是 F5 中的独立资源 | Node + 端口的组合,属于某个 Pool |
| 粒度 | IP 级别(如 10.0.0.10) |
IP:Port 级别(如 10.0.0.10:80) |
| 创建时机 | 可提前创建,也可在 Pool 创建时自动创建 | 创建 Pool 时指定 |
| 独立性 | 是独立的对象,不依赖 Pool 存在 | 依赖于 Pool,离开 Pool 无意义 |
| 共享关系 | 一个 Node 可以被多个 Pool 引用 | 一个 Member 只能属于一个 Pool |
用一个类比帮助理解:
Node → 一栋楼(固定地址)
Member → 这栋楼里的一个房间(地址 + 门牌号)
Pool → 你在这个小区里的所有房产列表
10.0.0.10 ── 一个 Node(一栋楼)
├─ 10.0.0.10:80 ── 一个 Member(属于 Pool A)
└─ 10.0.0.10:443 ── 另一个 Member(属于 Pool B,同一个 Node)
关键理解:Node 是底层 IP 资源,Member 是"Node + 端口 + 所属 Pool"的逻辑组合。
-
一个 Node 可以有多个不同端口的 Member,分属不同的 Pool
-
在 GUI 中:看到 Node 的状态是全局的,Member 的状态只代表该端口在该 Pool 中的状态
提前创建 Node(推荐------让对象模型更清晰)
tmsh create ltm node 10.0.0.10 address 10.0.0.10
tmsh create ltm node 10.0.0.11 address 10.0.0.11
也可以不预先创建,在下一步创建 Pool 时 F5 会自动创建对应 Node(详见第四步的"两种方式")。
验证 Node 已注册:
tmsh show ltm node
# 应列出所有已注册的 Node 及其状态
第四步:创建 Pool(服务器池)
两种创建方式
方式一:引用已创建的 Node(推荐)
tmsh create ltm pool myapp-pool \
load-balancing-mode least-connections-member \
monitor myapp-monitor \
members add { \
10.0.0.10:80 { address 10.0.0.10 } \
10.0.0.11:80 { address 10.0.0.11 } \
}
方式二:一步到位(Node 自动创建)
tmsh create ltm pool myapp-pool \
load-balancing-mode least-connections-member \
monitor myapp-monitor \
members add { \
10.0.0.10:80 {} \
10.0.0.11:80 {} \
}
# 如果 Node 10.0.0.10 和 10.0.0.11 还不存在,F5 会自动创建
两种方式的区别:
| 方式一(先创建 Node) | 方式二(自动创建 Node) | |
|---|---|---|
| 明确性 | Node 先独立存在,对象间关系一目了然 | Node 随 Pool 自动产生,不直观 |
| 复用性 | 同一个 Node 可被多个 Pool 引用,提前注册即可 | 自动创建的 Node 也可被后续 Pool 引用 |
| 推荐场景 | 生产环境、长期维护 | 快速测试、临时创建 |
生产环境推荐方式一。 提前创建 Node 能让你在 F5 上看到清晰的 IP 资源视图,便于后面做全局排障和统计。
负载均衡算法选哪个?
| 算法 | 使用场景 |
|---|---|
| round-robin | 后端配置一致,通用场景 |
| least-connections-member | 长连接 / WebSocket(推荐) |
| ratio-member | 后端性能不均,按权重分 |
| fastest | 后端分布在各地,选响应最快的 |
新手黄金法则:后端配置一样用 round-robin,长连接业务用 least-connections-member。
验证 Pool 状态:
tmsh show ltm pool myapp-pool
# 重点看:
# Status: available → 绿色,正常
# Active Member Count: 2 → 有 2 个 Member 在线
注意:新建 Pool 后前几秒 Member 是红色(unknown)的。 等一个 Monitor 周期后自动变绿(up)或变红(down)。不要一上来就以为配错了。
第五步:创建 Profile
一个 HTTPS VS 通常需要这 4 个 Profile:
5.1 TCP Profile
tmsh create ltm profile tcp myapp-tcp \
idle-timeout 300 \
keep-alive-interval 10 \
reset-on-timeout enabled \
time-wait-recycle enabled \
nagle disabled
5.2 HTTP Profile
tmsh create ltm profile http myapp-http \
xforwarded-for enabled \
reset-on-timeout disabled
xforwarded-for enabled会插入X-Forwarded-For头,让后端知道客户端真实 IP。强烈建议打开。
5.3 OneConnect Profile(连接复用)
tmsh create ltm profile oneconnect myapp-oneconnect \
idle-timeout-override 60 \
max-age 60 \
max-reuse 0 \
source-prefix-length 32
OneConnect 让多个客户端复用和后端之间的 TCP 连接,减少三次握手开销。HTTP 业务强烈推荐打开。
5.4 SSL Client Profile(证书卸载)
tmsh create ltm profile client-ssl myapp-clientssl \
cert myapp.crt \
key myapp.key \
chain myapp-ca.crt \
ciphers DEFAULT:!SSLv3:!TLSv1 \
options { dont-insert-empty-fragments }
这个 Profile 负责接收客户端 HTTPS、解密成明文,然后转发给后端(后端走 HTTP,不用算加密)。
第六步:创建 Virtual Server
前面的所有东西最终都绑在这里:
tmsh create ltm virtual myapp-vip-443 \
destination 10.0.0.100:443 \
ip-protocol tcp \
mask 255.255.255.255 \
profiles add { \
myapp-tcp { context all } \
myapp-http { context all } \
myapp-clientssl { context clientside } \
myapp-oneconnect { context serverside } \
} \
pool myapp-pool \
source-address-translation { type automap } \
source 0.0.0.0/0 \
vlans-enabled \
vlans add { /Common/internal }
注意:这里没配 serverssl 的 SSL Profile,因为我们做的是 SSL 卸载 ------ F5 解密,后端走明文 HTTP。
创建后必检查:
# 状态检查
tmsh show ltm virtual myapp-vip-443
# Status: Green / Available 才对
# 看绑了哪些 Profiles
tmsh list ltm virtual myapp-vip-443 profiles
# 看指向哪个 Pool
tmsh list ltm virtual myapp-vip-443 pool
# 看 VLAN 限制
tmsh list ltm virtual myapp-vip-443 vlans
第七步:验证------5 项测试
7.1 连通性测试
nc -zv 10.0.0.100 443
# 应输出 Connection succeeded!
7.2 HTTPS 证书测试
openssl s_client -connect 10.0.0.100:443 -servername 10.0.0.100 -showcerts
# 重点关注:
# Certificate chain → 链是否完整
# Verify return code: 0 (ok)
7.3 HTTP 请求测试
curl -k -I https://10.0.0.100/
# 应返回 200 OK
# 检查 F5 插入的请求头
curl -k -v https://10.0.0.100/ 2>&1 | grep -i "x-forwarded-for"
7.4 负载均衡效果
for i in {1..5}; do
echo "Request $i:"
curl -k -s -o /dev/null -w "HTTP %{http_code} | Time: %{time_total}s\n" https://10.0.0.100/
done
7.5 故障切换
# 禁用一个 Member,观察流量是否切换到另一个
tmsh modify ltm pool myapp-pool members modify { 10.0.0.10:80 { session user-disabled } }
# 再次请求,应该还能正常返回(流量走另一个 Member)
curl -k -s https://10.0.0.100/
# 恢复
tmsh modify ltm pool myapp-pool members modify { 10.0.0.10:80 { session user-enabled } }
第九步:保存配置
F5 不会自动保存配置!改完必须手动保存。
tmsh save sys config
重大变更前建议备份全量配置:
tmsh save sys ucs /shared/tmp/backup-$(date +%Y%m%d).ucs
九步 Checklist 速查
□ 前置确认:VIP/端口/协议/后端/SSL/Partition 六问
□ 上传证书(HTTPS 业务)
□ 创建 Monitor(interval × 3 + 1 = timeout)
□ 创建 Node(理解 Node ≠ Member)
□ 创建 Pool(选 LB 算法 + Members + Monitor)
□ 创建 Profile(TCP + HTTP + OneConnect + SSL)
□ 创建 VS(绑定 Pool + Profiles + SNAT + VLAN)
□ 五步验证(连通 + 证书 + 请求 + 负载 + 故障切换)
□ 保存配置(F5 不会自动保存!)
新手高频踩坑汇总
| 症状 | 原因 | 解决 |
|---|---|---|
| VS 状态 available 但连不上 | SNAT 没开 / VLAN 没配对 | snat automap,检查 vlans |
| Member 一直红色 down | Monitor 配置不对 / 后端没开机 | 调 send 字符串,检查后端服务 |
| TCP 能连但请求卡住超时 | SNAT 没开,后端回包找不到路 | source-address-translation { type automap } |
| HTTPS 握手失败 | 证书名拼错 / Key 和证书不匹配 | tmsh list sys crypto 检查 |
| 请求返回 502 | 某个 Member 已挂但 Monitor 没踢掉 | 调小 interval 加速检测 |
| 请求很慢 | OneConnect 没开,TCP 不断重建 | 加上 OneConnect Profile |
| 配了半天流量不进来 | 没保存! | tmsh save sys config |
小结
这篇是 F5 学习系列的第二篇,也是最核心的一篇。掌握 Pool / VS / Profile 这三板斧,你就能独立完成一个 HTTPS VIP 从创建到上线的全流程。
这篇提到的其他模块------Monitor、SSL Profile、iRules、监控指标------后续会一篇一篇展开,欢迎持续关注。
相关阅读:
-
F5 BIG-IP 学习路线:一张图理清核心技术与架构关系(上一篇)
-
F5 健康检查 Monitor 深入篇(下一篇,敬请期待)