iOS 7上进行Per App VPN设置(未能实验成功)

iOS7的新特性:支持Per-App-VPN,但是几个测试版下来都没发现有相关的设置。不过最后在开发文档里找到了相关的说明,但是这个其实是作为配置文件的API,并不能直接在设备上进行设置。而且操作极其繁琐,如果各位不愿意花时间去折腾的话可以等正式版iOS7放出后相关工具更新了再去设置。

再次说明一下本方法及其繁琐而且目前处于测试阶段没办法保证100%成功。另外本文仅作为技术研究,不提供任何代理服务。如需翻墙,请出门左转购买VPS不用谢。

目前是不明原因iOS7无法安装配置文件,应该是文件内容有错误。还需慢慢进行实验调整,不过思路应该是对的。

Per-App-VPN的官方说法:
屏幕快照 2013-09-12 23.22.15

Per-App-VPN有两种模式:
1.任何App包括Safari访问特定网址触发就打开VPN(也可以设置成手动提前打开)。
2.针对单个App进行代理,即App运行后自动开启VPN。
两个模式基本都差不多,就是设置的内容有些区别。其实你也可以把它理解为是一种路由表。

建议系统为Mac,需要工具:
1.Xcode任意版本(或者单独去找plist编辑器也可以)。
2.iPhone配置实用工具(Mac版本下载地址,目前版本3.5(289))。
3.iOS7设备一台。
4.可用VPN一个。
5.终端命令行。

制作方法:
打开iPhone配置实用工具,在配置描述文件下新建一个描述文件,填写好相关信息(配置文件名称和标识符等),在VPN下添加一个VPN负载,将你的VPN信息填上。
屏幕快照 2013-09-13 21.02.18
接着將该描述文件导出,然后在Finder里找到它,将其后缀名修改成.plist,然后使用Xcode打开(如果会编写XML的也可以用别的编辑器,但是咱觉得用Xcode较为直观一些)。
屏幕快照 2013-09-13 21.06.39
打开之后展开PayloadContent,发现会有Item 0(咱刚才填写了两个VPN所有有Item 0和Item 1,即图中黄框1和2内即咱创建的两个不同的VPN设置),这个就是刚才创建的VPN了,先不动,模仿着在下面继续创建一个Item,紧接着上面的进行命名(比如咱写的Item 2)。
接着就是仿照进行编辑了,对所有项目有兴趣的话可以直接去读该页面(可能会需要iOS开发者账号才能正常访问)。

首先根据文档中的说明,单个Item里必须有的项目有:
PayloadType
PayloadVersion
PayloadIdentifier
PayloadUUID
PayloadDisplayName
PayloadDescription
PayloadOrganization
以上几个项目,而这些都是能从前面创建好的VPN里复制出来的,其中要注意:
PayloadOrganization键值可为空。
PayloadUUID作为识别码是由一定随机算法得出的,简单的制作方法就是Mac下打开终端执行uuidgen之后得出的结果,这个必须得由机器创建,乱修改会导致无法使用的。
PayloadType,如果是上面说的第一种Per-App-VPN模式的话,应该填写的是com.apple.vpn.managed.applayer。而如果是第二种则应该是com.apple.vpn.managed.appmapping。
其他项目根据前面的Item来进行编辑就好了。

于是如果目前要做第一种模式的话,除了上面说的一堆必须的东西之外,接下来添加的也是非常关键的:
屏幕快照 2013-09-13 21.13.32
VPNUUID(String):这个就不是随机创建的了,这个对应的是你前面创建好的VPN里面的PayloadUUID,这个直接从前面的复制过来就行了。
SafariDomains(Array):这个就是触发的域名了,规则是比如咱填写的twitter.com对应的除了对应twitter.com之外,还对应api.twitter.com。但是不对应xxx.devtwitter.com。
OnDemandMatchAppEnabled(Boolean):如果设置为YES,那么触发时自动开启VPN进行连接。如果为NO,那么你得预先开启VPN,然后这些网站才能走代理。

第二种模式,同样需要刚才那堆必须的,但是之后的配置会有所不同:
屏幕快照 2013-09-13 21.46.50
AppLayerVPNMapping(Array of dictionaries):这个是父级….反正创建一个array下面全是Item的Dictionary就是了。
接着每个Dictionary里有两个项目:
Identifier(String):这个就是需要自动挂代理app的bundle ID,如图中我写的一样,官方Twitter.app的bundle ID就是com.atebits.Tweetie2,而Facebook.app的则是com.facebook.Facebook,这些可以在app的ipa文件解包之后从[app名称].app文件夹里的info.plist里的CFBundleIdentifier拿到。

最后就是将这个文件保存,并且修改后缀名为.mobileconfig,然后安装到iOS设备上。由于不能使用iPhone配置实用工具来安装(导入时会不识别刚才添加的这些项目,会提示要去除这些新增的键),Xcode是最好的选择,当然也可以使用Apple Configurator,不过最好的方法还是丢在一个网页空间上,用iOS设备去网页访问下载安装。

不过目前咱安装提示是这样:
20130913-215829.jpg
不知道哪一步出现了问题。

12 thoughts on “iOS 7上进行Per App VPN设置(未能实验成功)

  1. 根据配置文档,appmapping 不能用在iOS上,10.9可以支持。估计这个被apple从ios7里拿掉了?

    App-to-Per-App VPN Mapping
    The App-to-Per-App mapping payload is designated by specifying com.apple.vpn.managed.appmapping as the PayloadType value.

    This payload is supported only in OS X v10.9 and later. It is not supported in iOS.

  2. 最近我也在研究这个,外国的文档看了好多,有个叫xenmobile的软件说是能制作ios 的per app vpn。下载后安装不上-_-
    官方文档有点矛盾呀,per app vpn那里写的支持ios7.0,但是app mapping那里写的只支持os x。没有app mapping,per app vpn怎么用呀-_-

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

:b1 :b2 :b3 :b4 :b5 :b6 more »

Note: Commenter is allowed to use '@User+blank' to automatically notify your reply to other commenter. e.g, if ABC is one of commenter of this post, then write '@ABC '(exclude ') will automatically send your comment to ABC. Using '@all ' to notify all previous commenters. Be sure that the value of User should exactly match with commenter's name (case sensitive).

This site uses Akismet to reduce spam. Learn how your comment data is processed.