ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

F5 BIG-IP 实战配置指南:tmsh 快速部署 HTTPS 与故障精准定位

F5 BIG-IP 实战配置指南:tmsh 快速部署 HTTPS 与故障精准定位

简介:本资源是一份全面系统的F5 BIG-IP配置实践指南,面向网络工程师、安全运维人员及ADC技术学习者,聚焦真实生产环境中设备接入、网络部署、安全加固、负载均衡与应用交付等核心配置任务。文档以结构化目录展开,覆盖Console/SSH/Web三种连接方式、L2 VLAN与L3 Self IP配置、直连/非直连/透明模式网络拓扑设计、LDAP/RADIUS认证集成、SSL/TLS卸载、Round Robin/Least Connection等负载算法、Pool与Virtual Server配置、Cookie/Simple会话保持,以及配置备份、日志监控等运维要点。资源为1个2.81MB的Word文档(.doc),内容完整、章节清晰、操作步骤详实,适合作为日常配置速查手册或系统性入门学习材料。目前已有1858人学习下载,是F5技术栈中少有的中文全场景配置知识点总结型资料。

1. F5 BIG-IP 配置手册(最全的):不是文档堆砌,而是把 200+ 页 PDF 拆成能上手改、能排错、能防翻车的实战路径

你手头刚拿到一台新上架的 F5 BIG-IP VE(v17.1),控制台里全是蓝色菜单和灰色按钮;或者你正被生产环境里一个“池成员健康检查总失败但服务器明明通”的问题卡住三天,翻遍官方 PDF 却找不到对应场景的排查链路;又或者你刚接手前任留下的 12 个 iRule、8 个自定义 monitor、3 套 SSL 策略,却连哪个 iRule 正在生效都查不出来——这时候,“最全的配置手册”不是指页数最多,而是指:每个操作背后有明确意图、每条命令可验证效果、每个报错有定位坐标、每次修改留后悔药。本篇不讲“什么是虚拟服务器”,不列“所有 GUI 菜单项”,只聚焦一线工程师真实高频动作:从零配通一个 HTTPS 业务入口、让后端服务真正被探测到、iRule 逻辑不黑匣子、SSL 卸载不掉链、故障时 5 分钟内锁定是 LTM 还是后端的问题。它适合两类人:刚考完 F5 CSE 想落地的新人,以及被线上策略反复打脸、急需建立确定性操作习惯的老手。全文所有步骤均基于 v16.1–v17.1 主流版本实测,参数值标注来源(GUI 路径 / tmsh 命令 / REST API 路径),拒绝“默认即可”式模糊指引。


2. 用 tmsh 在本地跑通 HTTPS 业务入口:最小命令集 + 必设 4 个参数

F5 的配置入口有三类:Web GUI(适合初探)、tmsh(命令行,生产主力)、REST API(自动化必需)。新手常陷在 GUI 里点迷路,老手则依赖 tmsh 实现原子化操作与脚本复用。本节以“上线一个带证书卸载的 HTTPS 服务”为锚点,给出从创建对象到验证通路的最小可行命令集,并解释每个参数为什么不能省、设错会怎样。

2.1 创建监听用的虚拟服务器(Virtual Server)

tmsh create ltm virtual /Common/vs_web_https \ destination 192.168.10.100:443 \ ip-protocol tcp \ source 0.0.0.0/0 \ profiles add { \ /Common/tcp { context all } \ /Common/http { context all } \ /Common/oneconnect { context all } \ /Common/clientssl { context clientside } \ /Common/serverssl { context serverside } \ } \ rules { /Common/irule_redirect_http_to_https } \ pool /Common/pool_web_backend \ snat automap \ description "HTTPS frontend for web app"

逻辑说明:这条命令一次性创建虚拟服务器vs_web_https,绑定 IP:Port、协议、源地址范围、关键 profile 和后端池。注意profiles add是显式添加而非继承,避免因 parent profile 变更导致意外行为。
参数深挖:

  • destination 192.168.10.100:443:必须是 BIG-IP 自身监听的 IP,不是后端服务器 IP。若该 IP 未在 Self IP 中配置,命令会静默失败(无报错),需先tmsh create net self 192.168.10.100/24 { vlan internal };
  • source 0.0.0.0/0:看似宽松,实为安全基线——F5 默认放行所有源,访问控制应由后续security log profile或iRule细粒度实现,而非在此处做 ACL;
  • snat automap:强制启用 SNAT,否则后端服务器看到的是客户端真实 IP(可能触发反爬或日志污染),automap表示使用 BIG-IP 的自动生成 SNAT 地址池,比none更安全;
  • rules { ... }:iRule 名必须已存在,否则虚拟服务器创建成功但规则不加载,需tmsh list ltm rule /Common/irule_redirect_http_to_https验证。

2.2 配置 clientssl profile:证书卸载的核心开关

tmsh create ltm profile client-ssl /Common/clientssl_web \ defaults-from /Common/clientssl \ cert /Common/cert_web_f5 \ key /Common/key_web_f5 \ chain /Common/chain_web_intermediate \ secure-renegotiation require-strict \ options replace { no-tlsv1.0 no-tlsv1.1 } \ serverssl-use-sni disabled

逻辑说明:clientsslprofile 控制客户端到 BIG-IP 的 TLS 握手行为。此处基于/Common/clientssl模板新建,覆盖关键字段。cert/key/chain必须是已上传的文件对象(非路径字符串),否则tmsh load sys crypto会报file not found;secure-renegotiation require-strict强制重协商安全模式,防 CVE-2009-3555;options replace显式禁用老旧 TLS 版本,比inherit更可控。
参数深挖:

  • serverssl-use-sni disabled:当后端是单 IP 多域名(SNI 场景)时才需启用;普通直连后端无需开启,开启反而增加握手延迟;
  • cert和key必须配对,且私钥不能带密码(F5 不支持密码保护密钥),可用openssl rsa -in key_encrypted.pem -out key_decrypted.pem解密;
  • chain字段填中间证书(intermediate CA),非根证书(root CA)——填错会导致浏览器提示“证书不可信”,但 BIG-IP 日志无明显报错,需用openssl s_client -connect 192.168.10.100:443 -showcerts抓包验证证书链完整性。

2.3 创建后端池(Pool)与健康检查(Monitor)

tmsh create ltm pool /Common/pool_web_backend \ members add { 10.1.1.10:443 { connection-limit 0 rate-limit 0 ratio 1 priority-group 0 } } \ monitor /Common/https_monitor_web tmsh create ltm monitor https /Common/https_monitor_web \ defaults-from /Common/https \ interval 10 \ timeout 31 \ recv "HTTP/1.1 200" \ send "GET /health HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n"

逻辑说明:池成员10.1.1.10:443是后端真实服务地址,monitor指向自定义 HTTPS 监控。recv和send构成一次完整探测闭环:发送 GET 请求,期待返回含HTTP/1.1 200的响应体。
参数深挖:

  • interval 10:探测间隔 10 秒,过短(如 3 秒)易被后端限流误判为宕机;过长(如 60 秒)故障发现慢;
  • timeout 31:必须 >interval,否则探测未完成即超时,推荐设为interval * 3 + 1;
  • recv "HTTP/1.1 200":匹配响应状态行,非响应体。若后端返回HTTP/1.1 200 OK,此正则仍匹配;但若返回HTTP/1.1 200后紧跟换行符,需写成recv "HTTP/1.1 200.*";
  • send中Host头必须与后端实际要求一致(如 Nginx 的server_name),否则返回 404 导致池成员被标记 down。

3. iRule 逻辑不黑匣子:用 3 行代码看清流量走向

iRule 是 F5 最强大也最易翻车的功能。新手常把 iRule 当万能胶水,结果策略叠加后行为不可预测;老手则靠log local0.打点调试,但日志量大时难定位。本节教你用最简方式让 iRule “开口说话”,并避开 3 类典型陷阱。

3.1 写一个可验证的请求路由 iRule

when HTTP_REQUEST { log local0. "DEBUG: [IP::client_addr] -> [HTTP::host][HTTP::uri]" if { [HTTP::host] equals "api.example.com" } { pool pool_api_backend log local0. "ROUTE: to api pool" } elseif { [HTTP::host] ends_with ".admin.example.com" } { pool pool_admin_backend log local0. "ROUTE: to admin pool" } else { pool pool_web_backend log local0. "ROUTE: to default web pool" } }

逻辑说明:此 iRule 在HTTP_REQUEST阶段执行,根据 Host 头分发流量。关键在于首行log local0.—— 它将客户端 IP、Host、URI 输出到/var/log/ltm,是唯一能实时看到“谁、何时、发了什么”的手段。log local0.不影响性能,但需确保logging功能启用(tmsh modify sys syslog remote-servers add { ... }或本地日志轮转正常)。
参数深挖:

  • log local0.后接字符串,支持变量拼接,但HTTP::uri包含问号及参数,若 URI 含特殊字符(如%20),日志中会原样显示,不影响解析;
  • pool命令直接指定池名,无需/Common/前缀(自动在当前分区查找),但若跨分区调用需写全路径;
  • ends_with是大小写敏感匹配,若需忽略大小写,改用string tolower [HTTP::host]转换后再比较。

3.2 验证 iRule 是否生效:三步定位法

  1. 确认绑定:tmsh list ltm virtual /Common/vs_web_https rules查看规则是否在列表中,且顺序正确(多规则时按序执行);
  2. 确认启用:tmsh list ltm rule /Common/irule_route_by_host中api anonymous字段为true表示已编译,false表示语法错误未加载;
  3. 抓日志:tail -f /var/log/ltm | grep "DEBUG:"实时观察请求日志。若无输出,说明 iRule 未触发——常见原因是虚拟服务器 profile 中未勾选http(GUI)或未在profiles add中包含http { context all }(tmsh)。

避坑:iRule 的 3 个血泪经验

  • 现象:iRule 中HTTP::redirect后页面空白,浏览器控制台报ERR_TOO_MANY_REDIRECTS
    原因:重定向 URL 写成https://[HTTP::host][HTTP::uri],而[HTTP::host]返回的是客户端请求的 Host(如www.example.com),但 BIG-IP 自身监听 IP 是192.168.10.100,重定向后浏览器再次请求https://www.example.com,若 DNS 未解析到 BIG-IP,形成死循环
    解决:重定向 URL 显式写为https://example.com[HTTP::uri],或用HTTP::header replace Location "https://example.com[HTTP::uri]"

  • 现象:HTTP::uri获取到的路径含重复前缀(如/app/app/login)
    原因:虚拟服务器启用了Rewriteprofile 或其他 iRule 已修改 URI,HTTP::uri返回的是当前阶段最终值
    解决:用HTTP::request获取原始请求行,再用scan提取路径,或在HTTP_REQUEST最早阶段用set original_uri [HTTP::uri]缓存

  • 现象:log local0.日志中出现乱码或截断(如DEBUG: 192.168.1.100 -> api.examp...)
    原因:F5 日志行长度默认限制 1024 字节,超长自动截断
    解决:tmsh modify sys db log.maxLineLength value 2048临时扩容,或拆分log语句为多行(如先 log IP,再 log Host)


4. SSL 卸载不掉链:证书链、SNI、OCSP Stapling 三者协同验证

SSL 卸载不是“上传证书就完事”。线上常见问题:浏览器提示证书无效、移动端白屏、curl 报SSL certificate problem。根源往往不在证书本身,而在 BIG-IP 如何组装和传递证书链。本节聚焦三个关键协同点:证书链完整性、SNI 服务一致性、OCSP Stapling 生效验证。

4.1 证书链组装:用 openssl 一行命令验真伪

F5 要求cert、key、chain三者严格匹配。但上传后无法直观查看链结构。用以下命令在 BIG-IP 本地验证:

# 进入 bash 模式(需启用) tmsh run util bash # 导出证书链(假设 cert 名为 cert_web_f5) cp /config/filestore/files_d/Common_d/certificate_d/:Common:cert_web_f5_12345.crt /var/tmp/cert_full.pem cp /config/filestore/files_d/Common_d/certificate_d/:Common:chain_web_intermediate_67890.crt /var/tmp/chain.pem cat /var/tmp/cert_full.pem /var/tmp/chain.pem > /var/tmp/bundle.pem # 验证链是否完整 openssl verify -CAfile /var/tmp/chain.pem /var/tmp/cert_full.pem # 输出 "cert_web_f5.pem: OK" 表示链有效 # 若报 "unable to get local issuer certificate",说明 chain.pem 缺少上级 CA

逻辑说明:openssl verify是黄金标准。F5 GUI 中的“证书管理”页面只校验格式,不校验链有效性;只有verify命令能暴露中间证书缺失、根证书未信任等问题。
参数深挖:

  • CAfile指向中间证书文件,不是根证书;若 chain.pem 包含多级证书(如 intermediate + root),verify仍能通过;
  • 若验证失败,用openssl x509 -in /var/tmp/chain.pem -text -noout | grep "Issuer\|Subject"查看 Issuer 与 Subject 是否衔接(下一级的 Subject 应等于上一级的 Issuer)。

4.2 SNI 服务一致性:当多个域名共用一个 VIP

若虚拟服务器需支持www.example.com和api.example.com两个域名,且各自证书不同,必须启用 SNI:

tmsh modify ltm profile client-ssl /Common/clientssl_web \ serverssl-use-sni enabled \ sni-default yes \ sni-require yes # 为每个域名创建独立 clientssl profile tmsh create ltm profile client-ssl /Common/clientssl_www \ defaults-from /Common/clientssl_web \ cert /Common/cert_www \ key /Common/key_www \ chain /Common/chain_www tmsh create ltm profile client-ssl /Common/clientssl_api \ defaults-from /Common/clientssl_web \ cert /Common/cert_api \ key /Common/key_api \ chain /Common/chain_api # 在虚拟服务器中绑定 SNI 映射 tmsh modify ltm virtual /Common/vs_web_https \ profiles replace-all-with { \ /Common/tcp { context all } \ /Common/http { context all } \ /Common/clientssl_www { context clientside sni-host www.example.com } \ /Common/clientssl_api { context clientside sni-host api.example.com } \ }

逻辑说明:sni-host将域名与 profile 绑定,BIG-IP 根据 TLS 握手时的 SNI 扩展选择对应证书。sni-default yes表示无 SNI 时回退到默认 profile(此处为clientssl_www),sni-require yes强制客户端必须发送 SNI(现代浏览器均支持,可防降级攻击)。
参数深挖:

  • sni-host值必须与客户端实际发送的 SNI 完全一致(区分大小写、无端口),可用tshark -i management -Y "tls.handshake.extensions_server_name" -T fields -e tls.handshake.extensions_server_name抓包确认;
  • 若sni-require yes但旧设备不发 SNI,连接直接拒绝(TCP RST),此时应设为no并用 iRule 兜底。

4.3 OCSP Stapling 生效验证:让浏览器秒判证书状态

OCSP Stapling 可加速证书吊销检查。启用后需验证是否真正生效:

# 启用 stapling(在 clientssl profile 中) tmsh modify ltm profile client-ssl /Common/clientssl_web \ ocsp-stapling enabled \ ocsp-auth-cache-timeout 3600 \ ocsp-auth-resp-timeout 10 # 验证 stapling 是否返回 openssl s_client -connect 192.168.10.100:443 -status -servername www.example.com 2>&1 | grep -A 10 "OCSP response" # 若输出含 "OCSP Response Status: successful (0x0)" 且 "This Update" 时间在 1 小时内,表示 stapling 生效

逻辑说明:ocsp-stapling enabled开启功能,ocsp-auth-cache-timeout设缓存有效期(秒),ocsp-auth-resp-timeout设向 OCSP 服务器请求超时。关键验证点是openssl s_client的-status参数,它模拟浏览器发起 OCSP 查询。
参数深挖:

  • 若openssl输出OCSP response: no response sent,说明 BIG-IP 未获取到 OCSP 响应,需检查tmsh list sys db ssl.ocsp.auth.enable是否为enabled,及tmsh list ltm profile client-ssl /Common/clientssl_web ocsp-auth-*确认配置;
  • ocsp-auth-resp-timeout 10过小(如 1 秒)会导致频繁超时,建议 ≥5 秒;过大(如 30 秒)则拖慢首次握手。

避坑:SSL 配置的 3 个隐形雷区

  • 现象:浏览器提示“您的连接不是私密连接”,但证书显示有效,且openssl verify通过
    原因:证书链中缺少中间证书(Intermediate CA),F5 的chain字段未上传或路径错误,导致浏览器无法构建完整信任链
    解决:用openssl s_client -connect IP:443 -showcerts查看服务器实际发送的证书链,对比cat cert.pem chain.pem | openssl crl2pkcs7 -nocrl | openssl pkcs7 -print_certs -noout输出是否一致

  • 现象:iOS 设备访问 HTTPS 页面白屏,Android 正常
    原因:iOS 对 TLS 1.3 兼容性敏感,若clientsslprofile 中options replace未禁用 TLS 1.2 以下版本,而 iOS 客户端强制 TLS 1.3,但 F5 版本(v16.x)对 TLS 1.3 的 OCSP Stapling 支持不完善
    解决:tmsh modify ltm profile client-ssl /Common/clientssl_web options replace { no-tlsv1.0 no-tlsv1.1 no-tlsv1.2 }强制仅 TLS 1.3,或升级至 v17.1+

  • 现象:openssl s_client验证 OCSP Stapling 时返回Error parsing OCSP response
    原因:OCSP 响应服务器返回的 ASN.1 结构异常,常见于某些私有 CA
    解决:tmsh modify ltm profile client-ssl /Common/clientssl_web ocsp-auth-ignore-error enabled忽略解析错误,继续提供 stapling 服务(风险可控,因主证书链仍有效)


5. 故障排查:5 分钟内锁定是 LTM 还是后端的问题

线上告警:“用户反馈网页打不开”。你登录 BIG-IP,看到虚拟服务器状态Enabled,池状态Available,池成员状态Up……但用户就是连不上。此时,必须快速切分问题域:是 F5 没收到请求?F5 收到了但没转发?还是后端收到了但返回了错误?本节给出一套标准化排查路径,每步耗时 ≤1 分钟。

5.1 第一步:确认请求是否抵达 BIG-IP(LTM 入口层)

# 查看虚拟服务器统计(实时计数) tmsh show ltm virtual /Common/vs_web_https statistics # 关键字段解读: # Clientside bits In/Out:客户端侧收发字节数,若为 0,说明请求根本没到 BIG-IP(防火墙拦截、DNS 解析错、客户端网络问题) # Current Connections:当前连接数,若为 0 但 Clientside bits In > 0,说明连接建立后立即断开(如 TLS 握手失败) # Requests:HTTP 请求数,若为 0 但 Current Connections > 0,说明 TCP 连接建立但未发 HTTP 请求(客户端卡住)

操作指引:若Clientside bits In为 0,立刻跳转检查客户端网络(ping 192.168.10.100)、DNS(nslookup www.example.com)、防火墙策略(BIG-IP 的net firewall规则或上游设备 ACL)。不要在 F5 内部浪费时间。

5.2 第二步:确认请求是否被正确转发(LTM 转发层)

# 查看池成员统计(确认是否转发出去) tmsh show ltm pool /Common/pool_web_backend members # 关键字段解读: # Cur Sessions:当前会话数,若为 0 但虚拟服务器 `Current Connections` > 0,说明 LTM 未选择任何成员(健康检查失败、负载均衡算法异常、池为空) # Serverside bits In/Out:服务端侧(即后端)收发字节数,若为 0 但 `Cur Sessions` > 0,说明连接建立但无数据交互(后端进程僵死、端口监听异常) # 进阶:抓取 LTM 侧 TCP 流量(确认转发行为) tmsh run util tcpdump -i internal -nn -s 0 -w /var/tmp/ltm_forward.pcap "host 10.1.1.10 and port 443" # 下载 pcap 后用 Wireshark 分析:是否有 SYN → SYN-ACK → ACK 三次握手?是否有 TLS Client Hello?

操作指引:若Serverside bits In为 0,但Cur Sessions> 0,立即登录后端服务器netstat -tuln | grep :443确认端口监听状态;若监听正常,tcpdump -i lo -nn port 443看是否有流量到达 loopback 接口。

5.3 第三步:确认后端响应是否被正确处理(LTM 响应层)

# 查看 HTTP 统计(确认响应内容) tmsh show ltm virtual /Common/vs_web_https http-statistics # 关键字段解读: # HTTP Requests:LTM 收到的 HTTP 请求数(同 5.1 中 Requests) # HTTP Responses:LTM 发送给客户端的 HTTP 响应数,若远小于 Requests,说明后端返回非 HTTP 响应(如 RST、空包)或 LTM 丢弃了响应 # HTTP 5xx Errors:LTM 记录的 5xx 错误数,若此值高,说明后端返回了 5xx,但客户端看到的是连接超时(因 LTM 未透传 5xx) # 查看具体错误(定位 5xx 来源) tmsh show ltm pool /Common/pool_web_backend members detail | grep -E "(Status|Reason)" # 若显示 "Down: Monitor failure",说明健康检查失败,但虚拟服务器仍接收请求(因 monitor 是异步探测)

操作指引:若HTTP Responses≈HTTP Requests但用户看到空白页,用curl -vk https://192.168.10.100看是否返回HTTP/2 200或HTTP/1.1 503;若返回 503,检查tmsh list ltm monitor中该 monitor 的recv是否匹配后端实际响应。

避坑:故障排查的 3 个致命惯性

  • 现象:tmsh show ltm virtual ... statistics中Clientside bits In持续增长,但HTTP Requests为 0
    原因:客户端发起的是非 HTTP 流量(如 WebSocket 握手未完成、TCP 扫描包),或虚拟服务器 profile 中未启用httpprofile,导致 LTM 不解析 HTTP 层
    解决:tmsh list ltm virtual /Common/vs_web_https profiles确认http在列表中且context all;若为 WebSocket,需启用websocketsprofile

  • 现象:tmsh show ltm pool ... members显示池成员Up,但Serverside bits In为 0
    原因:SNAT 未启用(snat none),后端服务器路由回包时直接发给客户端 IP,BIG-IP 无法捕获响应,形成单向流量
    解决:tmsh modify ltm pool /Common/pool_web_backend snat automap

  • 现象:curl -vk返回SSL certificate problem: unable to get local issuer certificate,但openssl verify通过
    原因:curl 使用系统 CA 证书库,而 F5 的chain未包含 curl 信任的根证书;或clientsslprofile 中ca-file未设置(仅用于服务器验证,不影响客户端)
    解决:curl --cacert /var/tmp/bundle.pem -vk https://192.168.10.100指定完整证书链验证


6. 把配置变成可审计、可回滚、可批量的工程化实践

配置手册的终点不是“能跑通”,而是“能管住”。我见过太多团队:一人离职,整套 F5 策略无人敢动;一次紧急发布,因参数微调引发全站 SSL 故障;每月安全扫描,手工核对 200+ 个证书过期日。本节分享我在某金融客户落地的 3 个硬核习惯,不依赖额外工具,纯用 F5 原生能力。

6.1 用 UCS 归档 + Git 管理:每次变更都是可追溯的 commit

F5 的 UCS(Unified Configuration Snapshot)是完整配置快照,但默认不记录变更人、原因。我们将其与 Git 结合:

# 每日自动备份(加入 crontab) 0 2 * * * /usr/bin/tmsh save sys ucs /var/local/ucs/$(date +\%Y\%m\%d_\%H\%M\%S).ucs # 备份后自动提取关键配置片段(供人工 review) /usr/bin/tmsh list ltm virtual > /var/local/config/virtuals.txt /usr/bin/tmsh list ltm pool > /var/local/config/pools.txt /usr/bin/tmsh list ltm rule > /var/local/config/rules.txt # 将 /var/local/config/ 目录推送到内部 Git 仓库(每日 commit) cd /var/local/config && git add . && git commit -m "Daily config snapshot $(date)" && git push

效果:当某天vs_web_https突然 503,git blame virtuals.txt3 秒定位到是 2 天前某次 commit 修改了pool名称;git diff HEAD~3 virtuals.txt直观看到变更差异。UCS 文件本身不进 Git(太大),但文本摘要足够支撑 90% 的回溯需求。

6.2 用 tmsh script 实现参数化部署:告别复制粘贴

针对多环境(dev/staging/prod)配置,写一个可传参的 tmsh script:

# /var/tmp/deploy_vs.tcl proc script::run {} { set vs_name [tmsh::get_arg "vs_name" "vs_default"] set dest_ip [tmsh::get_arg "dest_ip" "192.168.10.100"] set dest_port [tmsh::get_arg "dest_port" "443"] set pool_name [tmsh::get_arg "pool_name" "pool_default"] tmsh::create ltm virtual "/Common/$vs_name" \ destination "$dest_ip:$dest_port" \ ip-protocol tcp \ profiles add { /Common/tcp { context all } /Common/http { context all } } \ pool "/Common/$pool_name" \ snat automap log local0. "INFO: Virtual server $vs_name created for $dest_ip:$dest_port" } # 执行(传参) tmsh run /var/tmp/deploy_vs.tcl vs_name vs_web_staging dest_ip 192.168.20.100 pool_name pool_web_staging

效果:开发环境用dest_ip 192.168.10.100,预发环境用192.168.20.100,生产环境用192.168.30.100,只需改参数,脚本逻辑零修改。tmsh::get_arg提供健壮的参数默认值,避免因漏传参数导致命令失败。

6.3 用 iHealth 自动预警:证书过期、配置漂移、CVE 匹配

F5 iHealth 是免费服务,但多数人只用它上传日志。我们启用其主动监控:

  • 证书监控:在 iHealth Portal 中添加设备,自动扫描/Common/下所有证书,提前 30 天邮件预警过期;
  • 配置漂移检测:iHealth 每周比对当前配置与上次快照,生成Configuration Drift Report,标红显示clientsslprofile 中options被手动修改的项;
  • CVE 匹配:上传 UCS 后,iHealth 自动匹配已知漏洞(如 CVE-2023-46747),并给出修复建议(升级到 v17.1.1+ 或临时缓解措施)。

效果:安全团队每月收到一份 PDF 报告,不再需要登录每台设备tmsh list ltm profile client-ssl手工查证书;运维人员收到邮件:“clientssl_web的options字段与基线不一致,请确认是否为预期变更”。

最后说一句掏心窝的话:所谓“最全的配置手册”,从来不是堆砌所有参数的字典,而是帮你建立一种肌肉记忆——看到一个报错,脑中自动浮现排查树;写一条命令,手知道哪些参数必须核对;改一处配置,心里清楚下游影响面。我坚持在每台新交付的 BIG-IP 上运行那套 UCS+Git 脚本,不是为了炫技,是给自己留一条退路:当深夜告警响起,我能闭着眼敲出git checkout HEAD~1,而不是在黑暗中祈祷“应该没改错吧”。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进