SSTP
SSTP 使用 TLS 加密通过 HTTPS 提供安全的远程访问,使 VPN 连接能够穿过防火墙和 NAT 设备。本页详细介绍 MikroTik RouterOS 的 SSTP 客户端和服务器属性,包括认证、加密设置和连接管理选项。
SSTP
Secure Socket Tunneling Protocol (SSTP) 将 Point-to-Point Protocol (PPP) 流量封装在 Transport Layer Security (TLS) 会话中,以通过互联网提供安全的远程访问。SSTP 使用基于 TCP 端口 443 的 HTTPS,使 VPN 流量能够通过大多数通常允许标准 Web 流量的防火墙、网络地址转换 (NAT) 设备和代理服务器。
SSTP 通过 TLS 支持强加密、认证和数据完整性,有助于保护传输的数据免遭拦截或篡改。由于它依赖 TCP,SSTP 可以在不稳定的网络条件下提供可靠的连接,尽管与基于 UDP 的 VPN 协议相比会带来额外的开销。
SSTP 通常用于其他 VPN 协议(如 PPTP、L2TP/IPsec 或使用非标准端口的 OpenVPN)被网络限制所阻止的环境。
简介
SSTP 连接机制:

- 从客户端到服务器建立一条 TCP 连接(默认在端口 443 上)。
- SSL 验证服务器证书。如果证书有效,则建立连接;否则,连接被断开(见下方说明)。
- 客户端在 HTTPS 会话内发送 SSTP 控制数据包,从而在双方建立 SSTP 状态机。
- 通过 SSTP 进行 PPP 协商。客户端向服务器进行认证,并将 IP 地址绑定到 SSTP 接口。
SSTP 隧道现已建立,可以开始数据包封装。
警告
从 v5.0beta2 开始,SSTP 运行时不再需要证书,并且可以使用任何可用的认证类型。此功能仅在两台 MikroTik 路由器之间有效,因为它不符合 Microsoft 标准。否则,要建立安全隧道,应使用 mschap 认证以及来自同一证书链的客户端/服务器证书。
警告: TLS SNI 支持从 7.15beta10 版本开始加入,如果勾选了 "Add SNI" 复选框或在 CLI 中设置,该扩展会被添加到 client hello 数据包中:
/interface/sstp-client/setadd-sni=yes
证书
要设置安全的 SSTP 隧道,需要证书。在服务器上,认证仅通过用户名和密码进行,但在客户端上,服务器通过服务器证书进行认证。客户端还使用它来以密码学方式绑定 SSL 和 PPP 认证——客户端通过 SSTP 连接向服务器发送一个特殊值,该值派生自 PPP 认证期间生成的密钥数据和服务器证书。这使服务器能够检查两个通道是否都安全。
如果 SSTP 客户端位于 Windows PC 上,使用自签名证书设置安全 SSTP 隧道的唯一方法是在 SSTP 服务器上导入 "server" 证书,并在 Windows PC 的受信任根中添加 CA 证书。
警告
如果你的服务器证书由 Windows 已知的 CA 签发,则 Windows 客户端无需向受信任根额外导入任何证书即可工作。
注意: 如果证书由 SSTP 使用,RSA 密钥长度必须至少为 472 位。更短的密钥被视为安全威胁。 在 RouterOS 客户端上,类似的配置是导入 CA 证书并启用 verify-server-certificate 选项。在此场景下,不可能发生中间人攻击。
在两台 MikroTik 路由器之间,也可以设置不带证书的不安全隧道。在这种情况下,通过 SSTP 隧道传输的数据使用匿名 DH,中间人攻击很容易实现。此场景与 Windows 客户端不兼容。
也可以通过使用客户端证书添加额外授权来创建安全的 SSTP 隧道。配置要求为:
- 服务器和客户端上都有证书。
- 在服务器和客户端上启用验证选项。
此场景无法用于 Windows 客户端,因为无法在 Windows 上设置客户端证书。
证书错误消息
当 SSL 握手失败时,你会看到以下证书错误之一:
- Certificate is not yet valid - 证书的 notBefore 日期晚于当前时间。
- Certificate has expired - 证书的到期日期早于当前时间。
- Invalid certificate purpose - 提供的证书不能用于指定目的。
- Self signed certificate in a chain - 证书链可以用不受信任的证书构建,但无法在本地找到根证书。
- Unable to get issuer certificate locally - CA 证书未在本地导入。
- Server's IP address does not match certificate - 已启用服务器地址验证,但证书中提供的地址与服务器地址不匹配。
快速示例

SSTP 客户端
此示例创建一个不带证书的简单 SSTP 客户端:
[admin@MikroTik] > /interface/sstp-client/add connect-to=192.168.62.2 disabled=no name=sstp-out1 password=StrongPass profile=default-encryption user=MT-User
[admin@MikroTik] > /interface/sstp-client/print
Flags: X - disabled; R - running 0 R name="sstp-out1" max-mtu=1500 max-mru=1500 mrru=disabled connect-to=192.168.62.2:443 http-proxy=0.0.0.0:443 certificate=none verify-server-certificate=no verify-server-address-from-certificate=yes user="MT-User" password="StrongPass" profile=default-encryption keepalive-timeout=60 add-default-route=no dial-on-demand=no authentication=pap,chap,mschap1,mschap2 pfs=no tls-version=any
### SSTP 服务器
为特定用户配置一个 PPP secret,然后启用 SSTP 服务器:
```ros
[admin@MikroTik] > /ppp/secret/add local-address=10.0.0.1 name=MT-User password=StrongPass remote-address=10.0.0.5 service=sstp
[admin@MikroTik] > /interface/sstp-server/server/set default-profile=default-encryption enabled=yes
[admin@MikroTik] > /interface/sstp-server/server/print
enabled: yes
port: 443
max-mtu: 1500
max-mru: 1500
mrru: disabled
keepalive-timeout: 60
default-profile: default-encryption
authentication: pap,chap,mschap1,mschap2
certificate: none
verify-client-certificate: no
pfs: no
tls-version: any
信息
在 P2P 设置中,网络地址与另一端点的本地地址相同。
重要: 与其他任何 PPP 隧道一样,SSTP 也支持 BCP,这允许它将 SSTP 隧道与本地接口桥接。例如,在路由器通过 ether1 连接到互联网、工作站和笔记本电脑连接到 ether2 的设置中,两个本地网络都通过 SSTP 客户端路由,它们不在同一个广播域中。此时会使用 BCP。