跳到主要内容

使用 .mobileconfig 描述文件部署

创建 Apple .mobileconfig 描述文件,将 Vylos WireGuard 隧道安装为受管理、只读的系统项目。

选择描述文件类型

目标VPN 有效负载类型下发要求
将符合条件的设备流量通过一个隧道路由com.apple.vpn.managed直接安装或通过 MDM 下发。
将分配的受管理 App 通过 Vylos 路由com.apple.vpn.managed.applayer即使 VPN 描述文件本身是直接安装的,生产环境中的 App 分配仍然需要 MDM。

两种描述文件都会在 Vylos 中创建一个受管理隧道。它们不同于受管理 App 配置;后者控制 App 行为,但不会安装 VPN。

各项设置的位置

功能描述文件中的位置
WireGuard 接口和对等节点VendorConfig.WgQuickConfigBase64 或 WgQuickConfig
DNS 分流和搜索域VendorConfig.VylosConfigBase64 或 VylosConfig
自动激活VPN.OnDemandEnabled 和 VPN.OnDemandRules
阻止未经过 VPN 的连接VPN.IncludeAllNetworks
按 App 激活顶层 OnDemandMatchAppEnabled 和 VPNUUID
Vylos 限制和偏好设置受管理 App 配置,而不是 VPN 描述文件

下面的示例使用 Apple 属性列表格式。如果 MDM 显示的是表单,请按相同的字典嵌套关系和值类型填写;不要将带点的名称直接作为键。

传递 WireGuard 配置

在 VPN 有效负载的 VendorConfig 字典中只放置以下一个键:

键值
WgQuickConfigWireGuard .conf 文件未经修改的多行 UTF-8 内容。
WgQuickConfigBase64同一 .conf UTF-8 内容的单行 Base64 编码。

如果 MDM 字段无法保留换行,请使用 WgQuickConfigBase64。如果有效负载同时包含两个键,Vylos 会因为无法确定预期来源而拒绝它。

Base64 是传输编码,不是加密。编码值是 .conf 文本本身,而不是 .vylos 文件、ZIP 归档或指向这些文件的路径。

在 macOS 上,以下命令会把可直接粘贴的值复制到剪贴板:

bash
base64 -i "tunnel.conf" | tr -d '\n' | pbcopy

base64 对文件编码,tr -d '\n' 删除编码输出中的换行,pbcopy 将结果放入剪贴板。在 MDM 的键值编辑器中,将结果粘贴为 WgQuickConfigBase64,并省略 WgQuickConfig。

传递 DNS 分流设置

受管理隧道使用 DNS 分流时,请在同一个 VendorConfig 字典中仅添加以下一个可选键:

键值
VylosConfig采用 settings.conf 格式的多行 UTF-8 Vylos 设置文本。
VylosConfigBase64同一文本的单行 Base64 编码。

通过 MDM 下发时请使用 VylosConfigBase64,以免键值编辑器删除或修改换行符。创建如下文件:

settings.conf
ini
[SplitDNS]
Domains = corp.example.com, *.internal.example.com
SearchDomains = example.com

然后在 macOS 上复制编码值:

bash
base64 -i "settings.conf" | tr -d '\n' | pbcopy

将结果粘贴为 VylosConfigBase64。WireGuard 配置还必须在 [Interface] 中包含至少一个 DNS 服务器。Domains 选择使用这些服务器的查询,SearchDomains 为短主机名添加后缀,而流量路由仍由 AllowedIPs 控制。

受管理隧道的终止开关

要让受管理的设备范围隧道具备终止开关行为,请在 VPN 字典中使用 Apple 的 IncludeAllNetworks 键:

xml
<key>IncludeAllNetworks</key>
<integer>1</integer>

将其放在 RemoteAddress 和 AuthenticationMethod 旁边。请通过 OnDemandRules 单独配置自动激活。

IncludeAllNetworks 不会扩展 WireGuard 的 AllowedIPs 路由。它会阻止普通流量绕过 VPN,但每个对等节点可以承载哪些目标仍由 AllowedIPs 决定。完整双栈隧道应使用 0.0.0.0/0 和 ::/0。部分路由会成为严格的允许列表,并且路由还必须覆盖 [Interface] 中的每个 DNS 服务器。

Apple 仍会为网络控制流量和某些设备服务保留例外。部署前请查阅 VPN 载荷中的 IncludeAllNetworks 字段。

设备范围描述文件

传统的设备范围隧道使用 com.apple.vpn.managed。部署前,请替换所有示例标识符、UUID、密钥、地址和端点。

xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PayloadDisplayName</key>
    <string>Vylos Managed Tunnel</string>
    <key>PayloadIdentifier</key>
    <string>com.example.vylos.vpn</string>
    <key>PayloadType</key>
    <string>Configuration</string>
    <key>PayloadUUID</key>
    <string>00000000-0000-0000-0000-000000000003</string>
    <key>PayloadVersion</key>
    <integer>1</integer>
    <key>PayloadContent</key>
    <array>
        <dict>
            <key>PayloadDisplayName</key>
            <string>VPN</string>
            <key>PayloadIdentifier</key>
            <string>com.example.vylos.vpn.corp</string>
            <key>PayloadType</key>
            <string>com.apple.vpn.managed</string>
            <key>PayloadUUID</key>
            <string>00000000-0000-0000-0000-000000000004</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>UserDefinedName</key>
            <string>Corporate VPN</string>
            <key>VPNType</key>
            <string>VPN</string>
            <key>VPNSubType</key>
            <string>io.cbnventures.vylos</string>
            <key>VendorConfig</key>
            <dict>
                <key>WgQuickConfig</key>
                <string>[Interface]
PrivateKey = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
Address = 10.0.0.2/32
DNS = 10.0.0.1

[Peer]
PublicKey = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=
AllowedIPs = 0.0.0.0/0
Endpoint = vpn.example.com:51820
PersistentKeepalive = 25
</string>
                <key>VylosConfig</key>
                <string>[SplitDNS]
Domains = corp.example.com, *.internal.example.com
SearchDomains = example.com
</string>
            </dict>
            <key>VPN</key>
            <dict>
                <key>RemoteAddress</key>
                <string>vpn.example.com</string>
                <key>AuthenticationMethod</key>
                <string>Password</string>
            </dict>
        </dict>
    </array>
</dict>
</plist>

使用 uuidgen 生成唯一 UUID。每个额外隧道都是外层 PayloadContent 数组中的另一个 com.apple.vpn.managed 字典。

如需使用单行值,请将示例 WgQuickConfig 键和多行字符串替换为:

xml
<key>WgQuickConfigBase64</key>
<string>BASE64_ENCODED_CONF</string>

请以相同方式替换示例中的 VylosConfig 键和多行字符串:

xml
<key>VylosConfigBase64</key>
<string>BASE64_ENCODED_SETTINGS_CONF</string>

按 App 描述文件

使用 com.apple.vpn.managed.applayer 和 Vylos 的数据包隧道提供程序来实现按 App 的 WireGuard 路由。载荷支持同样的 WgQuickConfig 和 WgQuickConfigBase64 两种方式,以及 VylosConfig 或 VylosConfigBase64 中的可选 DNS 分流设置。

设置值
PayloadTypecom.apple.vpn.managed.applayer
VPNTypeVPN
VPNSubTypeio.cbnventures.vylos
VPN.ProviderBundleIdentifierio.cbnventures.vylos.packet-tunnel
VPN.ProviderTypepacket-tunnel
VPNUUID与分配给此 VPN 的每个受管理 App 共享的唯一值。
OnDemandMatchAppEnabled设为 true,使分配的 App 发起网络通信时自动连接。

以下字典可替换描述文件 PayloadContent 数组中的设备范围 VPN 字典:

xml
<dict>
    <key>PayloadDisplayName</key>
    <string>Vylos Per-App VPN</string>
    <key>PayloadIdentifier</key>
    <string>com.example.vylos.vpn.per-app</string>
    <key>PayloadType</key>
    <string>com.apple.vpn.managed.applayer</string>
    <key>PayloadUUID</key>
    <string>00000000-0000-0000-0000-000000000005</string>
    <key>PayloadVersion</key>
    <integer>1</integer>
    <key>UserDefinedName</key>
    <string>Corporate Per-App VPN</string>
    <key>VPNType</key>
    <string>VPN</string>
    <key>VPNSubType</key>
    <string>io.cbnventures.vylos</string>
    <key>VPNUUID</key>
    <string>00000000-0000-0000-0000-000000000006</string>
    <key>OnDemandMatchAppEnabled</key>
    <true/>
    <key>VendorConfig</key>
    <dict>
        <key>WgQuickConfigBase64</key>
        <string>BASE64_ENCODED_CONF</string>
        <key>VylosConfigBase64</key>
        <string>BASE64_ENCODED_SETTINGS_CONF</string>
    </dict>
    <key>VPN</key>
    <dict>
        <key>AuthenticationMethod</key>
        <string>Password</string>
        <key>RemoteAddress</key>
        <string>vpn.example.com</string>
        <key>ProviderBundleIdentifier</key>
        <string>io.cbnventures.vylos.packet-tunnel</string>
        <key>ProviderType</key>
        <string>packet-tunnel</string>
        <key>OnDemandEnabled</key>
        <integer>1</integer>
    </dict>
</dict>

安装此有效负载会创建 VPN,但不会为其分配 App。请继续参阅配置按 App VPN,将受管理 App 与同一 VPNUUID 关联,并了解支持的路由字段。

安装和移除描述文件

通过 MDM 下发描述文件,以便集中管理所有权、替换和移除。如果无法使用 MDM,用户也可以直接安装设备范围描述文件,然后通过操作系统的描述文件管理设置将其移除。

无论使用哪种方式,Vylos 都将其视为由描述文件拥有且只读。受支持的更改方式是更新或移除描述文件,而不是在 Vylos 中编辑隧道。

有关 App 中的最终体验,请参阅部署受管理隧道。有关 Apple 的完整有效负载约定,请参阅 VPN 和 AppLayerVPN 参考。