基本的ZTNA部署TCP转发
基本的ZTNA部署TCP转发
功能介绍
ZTNA TCP 转发(TCP Forwarding Access Proxy,简称 TFAP)用于让受管终端访问内部 SSH、RDP 等 TCP 应用。用户仍在应用客户端中输入内部服务器地址,FortiClient 根据下发的目标规则接管连接,经 FortiGate 的 ZTNA 入口访问后端服务。
FortiGate 在允许访问前检查设备身份和 ZTNA 策略。终端获得的是指定应用的访问权限,不是整个内部网段的访问权限。EMS 负责终端管理、证书与策略下发、标签计算和同步,业务数据通过 FortiClient、FortiGate 到达后端,不经过 EMS。
本例发布一个 SSH 服务和一个 RDP 服务,使用设备证书与允许标签进行准入控制,并保留应用自身的账号登录。FortiGate 操作以 FortiOS 7.4.8 为参照;EMS 和 FortiClient 不同版本的界面可能有差异,实施前应确认版本、终端系统、授权及 FortiGate 型号支持所需功能。
实现方式与组件关系
各组件的职责
| 组件 | 作用 | 本例需要配置的内容 |
|---|---|---|
| FortiClient | 匹配应用目标,将连接转交给 ZTNA 网关,并提供设备证书 | Destination Host、Proxy Gateway、Encryption |
| EMS | 管理终端,签发设备证书,下发规则,计算并同步标签 | ZTNA Destinations Profile、Endpoint Policy、允许标签 |
| FortiGate | 提供访问入口,执行身份与策略检查,代理访问后端 | EMS Connector、ZTNA Server、TCP 映射、ZTNA 策略 |
| 后端服务器 | 提供 SSH、RDP 等服务并完成应用账号认证 | 服务监听、主机防火墙、账号权限及网络回程 |
管理链路与业务链路

注
- 图中的加密转发对应本例启用 Encryption 的配置。FortiGate 终止外层代理连接,再连接后端;FortiGate 到服务器这一段是否加密,取决于应用协议和后端配置。
两类地址与两类证书
| 项目 | 含义 | 本例 |
|---|---|---|
| Destination Host | 用户真正要访问的应用地址与端口,也是 FortiClient 的目标匹配条件 | 10.10.20.20:22 |
| Proxy Gateway | FortiClient 建立代理连接的 FortiGate 入口 | ztna.example.com:8443 |
| 网关服务器证书 | 让终端验证所连接的网关;名称应匹配网关域名,证书链应受信任 | 包含 ztna.example.com 的服务器证书 |
| 终端设备证书 | 让 FortiGate 识别受管终端,关联 EMS 同步的终端信息 | EMS 签发、包含 FortiClient UID 的证书 |
设备证书证明设备身份,标签用于表达其状态或分类。证书有效不等于满足允许条件,属于允许标签也不能代替设备证书检查。设备身份及证书的关系参见 FortiClient EMS 设备身份与信任信息。
完整运行过程
以下以终端访问 10.167.12.115:22 为例。

- 终端注册并取得配置。 FortiClient 注册到 EMS,取得设备证书和 ZTNA Destination 规则。EMS 根据终端上报信息统计标签,FortiGate 通过 EMS Connector 同步相关信息。开始测试前,应在两端确认同一终端的 UID 与标签状态。
- 用户发起应用连接。 用户执行
ssh user@10.167.12.115。应用使用内部服务器地址,不填写 Proxy Gateway地址10.234.12.30:8443。 - FortiClient 匹配目标规则。 目标 IP 和端口命中 SSH 规则后,FortiClient 接管该连接并转向 Proxy Gateway。未命中的流量不能假定受到该条 ZTNA 规则保护,应继续检查其实际路由和其他访问控制。
- 建立网关连接并校验证书。 FortiClient 解析网关域名/IP地址,连接 TCP/12345,验证网关证书,并使用设备证书参与身份校验。FortiGate 将设备身份与 EMS 提供的信息关联。
- 检查访问条件与后端映射。 FortiGate 判断请求是否满足 ZTNA 策略中的来源、设备标签等条件,并检查所请求的目标是否属于允许的 TCP 映射。未授权的设备或目标不能进入后端转发阶段。若另外部署了用户认证,还需通过对应认证流程。
- FortiGate 连接后端。 授权和映射检查通过后,FortiGate 连接
10.167.12.11522。这一段依赖 FortiGate 到服务器的路由、服务监听、主机防火墙及回程路径。 - 执行应用登录并传输数据。 SSH 客户端继续进行主机密钥校验及账号认证,数据通过代理链路双向传输。ZTNA 放行不代表 SSH 账号已经登录,也不赋予该账号额外的服务器权限。
- 关闭连接并记录结果。 退出应用后,检查 FortiGate 的 ZTNA 日志,关联终端、策略、后端目标和会话结果。标签或策略发生变化时,应分别验证新连接和已有连接的行为,不将“标签已同步”直接等同于“所有已有会话立即断开”。
RDP 使用相同的访问链路,应用目标改为 10.167.12.115:3389,后端继续执行 Windows/RDP 登录认证。客户端目标规则及设备识别方式参见 FortiClient ZTNA Destination。
部署规划
实验拓扑及参数

| 参数 | 示例值 |
|---|---|
| FortiGate 外部接口 | port1,实施时替换为实际接口 |
| 网关外部域名/地址与端口 | 10.234.12.30:12345 |
| ZTNA Server 名称 | ZTNA-TCP-Server |
| SSH 后端 | 10.167.12.115:22 |
| RDP 后端 | 10.167.12.115:3389 |
| 后端服务器名称 | ZTNA-backyard |
| EMS 允许标签 | ZTNA-TCP-Pilot |
| EMS 配置文件(ztna destination) | ZTNA-TCP-Pilot-Profile |
| ZTNA 允许策略 | ZTNA-TCP-Allow-Pilot |
重要
- 以上实验参数用于文档示例,部署时替换为实际地址。如果 FortiGate 位于上游 NAT 后,应将外部 TCP/12345 转发至实际 ZTNA 监听地址,并保证终端可以解析、访问该入口。
部署前检查
- 终端管理: FortiClient 已连接 EMS,具备所需功能授权,设备证书有效;终端、EMS 和 FortiGate 的时间准确。
- 信任同步: FortiGate 与 EMS Connector 连接正常,能够看到测试终端及其标签。不能只凭连接器显示在线就判定标签已经正确同步。
- 网关入口: 证书匹配网关域名,监听地址和端口不与管理 HTTPS 或其他服务冲突。
- 后端网络: FortiGate 能到达两台服务器,目标端口已监听,后端允许代理连接使用的实际来源地址并具备回程路径。
- 试点范围: 先使用专用终端组、标签和配置文件;记录原 Endpoint Policy,并备份将要修改的 FortiGate 配置。
部署步骤
配置FortiGate
1. 建立 EMS 信任与允许标签
在 FortiGate 的 Security Fabric > Fabric Connectors 中配置 FortiClient EMS 连接器,完成连接与授权。随后在 Policy & Objects > ZTNA 的安全状态标签页面确认 EMS 标签已同步。 在 EMS 中建立本例的 ZTNA-TCP-Pilot 标签规则。规则条件应体现预期的准入要求,并确认测试终端实际命中。 FortiGate连接EMS详细设置请参考EMS和FortiGate集成;创建标签请参考创建动态TAG。
2. 创建 ZTNA 入口与 TCP 映射
- 在Policy&Objects>Address条目下新建目标(后端)服务器的地址对象。
| 参数 | 配置 |
|---|---|
| 名称(Name) | ZTNA-backyard |
| 接口(Interface) | any |
| 类型(Type) | Subnet(子网) |
| IP地址/子网(IP/Netmask) | 10.167.12.115/32 |

参考CLI:
config firewall address
edit "ZTNA-backyard"
set type ipmask
set subnet 10.167.12.115 255.255.255.255
next
end- 进入 **Policy & Objects > ZTNA **,进入ZTNA界面。

- 在ZTNA Servers选项卡下单击Create new按钮,创建名为
ZTNA-TCP-Server的实例。

- 按照要求设置外部接口、实际监听 IP、端口号和默认网关服务器证书。

注
在没有服务器证书的情况下选择Fortinet_Factory证书即可,但依旧强烈建议使用特定的服务器证书。
- 在 Service/server mapping 表格中单击Create new按钮添加服务器实例。

- 进入添加页面后,Service选择 TCP Forwarding,并配置以下信息:
- Virtual Host:选择Any Host
- Address:选择之前创建的
ZTNA-backyard - Ports:填写22, 3389 (端口号之间使用英文逗号)

- 完成配置后单击OK按钮保存,回到ZTNA Server界面之后再单击OK按钮保存ZTNA Server配置。

这里面存在多个配置段,对应的对象关系为:access-proxy VIP → access-proxy → TCP forwarding realservers。其中 VIP 定义外部入口,realservers 定义允许访问的后端。 参考CLI配置:
###access-proxy VIP###
config firewall vip
edit "ZTNA-TCP-Server"
set type access-proxy
set server-type https
set extip 10.234.12.30
set extintf "port1"
set extport 12345
set ssl-certificate "Fortinet_Factory"
next
end
###access-proxy###
config firewall access-proxy
edit "ZTNA-TCP-Server"
set vip "ZTNA-TCP-Server"
### TCP forwarding realservers###
config api-gateway
edit 1
set url-map "/tcp"
set service tcp-forwarding
config realservers
edit 1
set address "ZTNA-backyard"
set mappedport 22 3389
next
end
next
end
next
end3. 配置 ZTNA 策略
本例中两项应用对同一测试组开放,采用 Simple ZTNA Policy。
- 进入 Policy & Objects > Firewall Policy,单击Create new按钮新建策略。

- 进入新策略页面后,配置类型(Type) 为
ZTNA

- 根据以下信息配置ZTNA策略
| 字段 | 本例设置 |
|---|---|
| Name | ZTNA-TCP-Allow-Pilot |
| Incoming Interface | 实际 ZTNA 入口接口 |
| Source | 按需求限制来源地址;远程地址不固定时可使用 all,同时保留设备和标签限制 |
| Security Posture Tags | EMS 同步的 ZTNA-TCP-Pilot 对象 |
| ZTNA Server | ZTNA-TCP-Server |
| Schedule / Action | always / ACCEPT |
| 日志 | 启用允许流量日志用于调试 |
| Enable this policy | Enable |

注
- Simple ZTNA Policy 不能按真实服务器目的地址或目的接口进一步区分权限。如果 SSH 与 RDP 面向不同人群,可拆分 ZTNA Server,或使用 Policy & Objects > Proxy Policy 下的 Full ZTNA Policy 细分后端权限。不要直接给同一宽泛允许策略追加多个后端。策略能力差异参见 Full 与 Simple ZTNA 策略。
- 本例未配置独立的网关用户认证。需要用户组或 MFA 时,还须配置匹配的 Authentication Scheme、Authentication Rule 和受支持的客户端认证方式,仅在策略中填写用户组并不能完成整套认证部署。
- 配置多个标签时,应明确选择“任一满足”还是“全部满足”,避免把默认的 Any 当作所有条件均须成立。
在完成配置后单击OK按钮保存策略。 参考CLI:
config firewall policy
edit 0
set name "ZTNA-TCP-Allow-Pilot"
set srcintf "port1"
set dstintf "any"
set action accept
set srcaddr "all"
set dstaddr "ZTNA-TCP-Server"
set ztna-ems-tag "EMS1_ZTNA_ZTNA-TCP-Pilot"
set schedule "always"
set logtraffic all
set nat enable
next
end配置EMS
1. 配置ZTNA应用
- 登录EMS,进入 Fabric & Connectors,查看 FortiGate 同步到 EMS 的自动探测 ZTNA 应用规则。这些规则可供 ZTNA Destination 引用。
重要
- 在有些情况中,FortiGate(Proxy Gateway)会在NAT后面,这样在FortiClient就会触发DNAT到实际的FortiGate地址,但是FortiGate不知道自己的网络位置,所以本例会另外创建手动配置。

- 单击上方的Gateway View按钮进入网关试图,尝试ZTNA配置网关。

- 点击 +Add 按钮创建新的ZTNA网关实例。

- 在Create Gateway界面填写FortiGate对应参数,完成单击Create按钮完成Gateway 创建。
| 项目 | 对应FortiGate项目/说明 | 示例值 |
|---|---|---|
| address | FortiGate 作为Proxy Gateway的地址 | 10.234.12.30 |
| port | 对应Proxy Gateway地址使用的端口号 | 12345 |
| FQDN | 能解析成FortiGate 作为Proxy Gateway的地址的FQDN | 本例不涉及 |
| Alias | 和FortiGate无关,作为EMS上容易分辨的友好名称 | ZTNA-Poilt |

- 完成后能看到新建的手动配置。

- 单击Application View按钮,回到应用视图界面。

- 点击 +Add 按钮创建新的ZTNA应用实例。

- 在Add Application界面填写应用对应参数,完成单击Finish按钮完成应用创建。
| 项目 | 对应FortiGate项目/说明 | 示例值 |
|---|---|---|
| Application Type //应用类型 | 在FortiGate上是手动填写的应用,应该选Private | Private |
| 地址类型 | 覆盖了FortiGate的TCP forwarding realservers应用的地址/域名 | IP/10.167.12.115/255.255.255.255 |
| 端口类型 | 覆盖了FortiGate的TCP forwarding realservers应用的端口号 | Port List/22,3389端口号之间用英文逗号隔开 |
| Select Gateways //选择网关 | 选择前面步骤创建的网关信息 | 10.234.12.30:12345 |
| Name | ZTNA应用实例的名称,本地有效 | ZTNA-TCP-Server |
| Enable UDP //允许UDP | 允许ZTNA代理UDP流量,本例不涉及 | Disable |
| Enable Encryption //允许加密 | 将ZTNA流量加密 | Disable |
| Enable Redirect //允许重定向 | 打开“Enable Redirect”以使用默认外部浏览器进行 ZTNA SAML 身份验证。如果禁用此设置,FortiClient 将使用 FortiClient 内置浏览器进行 ZTNA SAML 身份验证 | Disable |
提示
- Encryption 的作用范围: 本例要求 FortiClient 到 FortiGate 的代理数据持续加密。关闭该选项时,连接起始仍有 TLS 握手,但后续转发可通过协议切换移除外层 HTTPS 加密。因此,“抓包看到 TLS 握手”不能单独证明后续业务数据一直由 TFAP 加密。相关行为参见 TCP 转发加密说明。

- 创建完成后页面会显示创建的应用。

2. 配置ZTNA Destination Profile
- 在 EMS 的 Endpoint Profiles > ZTNA Destinations 中,单击 +Add 按钮创建
ZTNA-TCP-Pilot-Profile配置

- 单击Advanced按钮进入高级视图,并在Rules列表里单击+Add 按钮添加规则。

- 选择刚刚创建的ZTNA应用,然后单击Finish按钮保存。

- 完成后打开Profile左侧的眼睛图标,确保用户能够看到该应用在启用。

- 单击Save按钮保存配置文件。

3. 下发配置到FortiClient
- 进入 Endpoint Policy & Components > Manage Policies。

- 编辑/确认在测试终端组使用的已启用策略中选择/确认该ZTNA Destination 配置文件。

- 检查策略优先级并保存。

- 等待终端完成下一次 Telemetry 通信。可以看到FortiClient上的ZTNA目标开启,可以看到应用配置。

- 在 Endpoints > All Endpoints > Summary > Configuration 中确认终端实际命中预期策略。

完整策略下发方法请参阅客户端配置的推送。
配置验证
使用已收到规则且具有允许标签的测试终端,从外部网络测试。避免测试期间存在其他 VPN 或直连路径,使应用绕过预期入口后仍然访问成功。
1. 验证业务
SSH 测试:
ssh user@10.167.12.115
Windows RDP 测试:
mstsc /v:10.167.12.115:3389
将 user 替换为后端实际账号。不要在 SSH 或 RDP 客户端中填写网关地址;访问网关的动作由 FortiClient 完成。
2. 查看日志
进入Log&Report>ZTNA Traffic页面,查看ZTNA流量日志,可以看到设备ZTNA流量流经FortiGate。

查看详细信息能看到对应的设备信息、策略、ZTNA服务器、以及TAG等信息

3. 不满足TAG的情况
在没有匹配到TAG时,被策略阻拦

日志里显示被隐式策略拒绝:

常见问题
下面列出了常见的ZTNA配置问题。
| 现象 | 优先检查 |
|---|---|
| 终端没有连接网关 | 规则是否下发、目标地址及端口是否命中、是否存在其他直连路径 |
| 网关 TCP/8443 不通 | DNS、上游 NAT、防火墙、监听地址与端口冲突 |
| TLS 或证书校验失败 | 网关证书名称和证书链、有效期、设备证书、系统时间 |
| 设备已识别但访问被拒绝 | EMS 标签同步、UID 对应关系、策略条件和顺序 |
| 出现目标映射相关拒绝 | 请求目标是否与真实服务器对象和映射端口一致 |
| 请求已获准但应用连接超时 | FortiGate 到后端的路由、服务器监听、主机防火墙和回程 |
| SSH/RDP 已进入登录阶段但登录失败 | 后端账号、登录权限及应用安全设置 |
| 修改配置后仍呈现旧行为 | 终端实际配置、同步进度、旧连接复用;关闭测试会话后重试 |
提示
- 按“终端规则 → 网关连接 → 设备与策略 → 后端连接 → 应用登录”的顺序检查,并使用同一次测试的时间、终端 UID 和目标地址关联记录。
- FortiGate 可按 ZTNA 流量类型筛选日志,核对策略名称/ID、
accessproxy、目标地址、端口和结果。日志显示接受后仍需检查应用是否真正可用,日志为空也应先确认日志存储和记录设置。进一步诊断见 ZTNA 的排错信息。
更新历史
| Ver | Description | Author | Rev | Date |
|---|---|---|---|---|
| 1.0 | First Complete | ysheng | tanga | 2026.11.04 |