We are trying to use NE Framework to setup a VPN based on OpenVPN.
We have integrated OpenVPN library in our App that semms to work correctly; we can get the tun network configuration from VPN server.
The problem is the next step: how to configure the device tun interface via NEFramework ?
We already got the Apple entitlements to use NEPacketTunnelProvider
Specific questions:
1) We try to use this code for set the VPN configuration
TunProviderManager = nil;
[NETunnelProviderManager loadAllFromPreferencesWithCompletionHandler:^(NSArray<NETunnelProviderManager *> * _Nullable managers, NSError * _Nullable error) {
if(managers != nil)
{
for(int8_t i = 0; i < [managers count]; i++)
{
if([[[managers objectAtIndex:i] localizedDescription] isEqualToString:@"iPCallVPN"])
{
TunProviderManager = [managers objectAtIndex:i];
}
}
}
else
{
}
if(TunProviderManager == nil)
{
TunProviderManager = [[NETunnelProviderManager alloc] init];
NETunnelProviderProtocol *protocol = [[NETunnelProviderProtocol alloc] init];
protocol.providerBundleIdentifier = @"com.infiniteplay.ipCall.vpnex"; /
/
protocol.serverAddress = @"195.78.202.220"; /
TunProviderManager.localizedDescription = @"iPCallVPN";
TunProviderManager.protocolConfiguration = protocol;
[TunProviderManager saveToPreferencesWithCompletionHandler:^(NSError * _Nullable error)
{
if(error)
{
}
else
{
}
}];
}
/
NSError *startError;
[[NEVPNManager sharedManager].connection startVPNTunnelAndReturnError:&startError];
if(startError) {
NSLog(@"Start error: %@", startError.localizedDescription);
} else {
NSLog(@"Connection established!");
}
*/
NETunnelProviderSession *session = (NETunnelProviderSession*) TunProviderManager.connection;
/
NSError *err;
[session startTunnelWithOptions:nil andReturnError:&err];
if(err)
{
}
}];
How must be the server address format ?
After start session we have a return error DomainError 1
2) How exactly use the NEPacketTunnelProvider extension added in our App ?
The idea is to use this code to setup the tun parameters obtained
- (void)setNetwork
{
NSArray *addresses = @[@"10.80.0.94"];
NSArray *subnetMasks = @[@"255.255.255.0"];
NSArray<NSString *> *dnsServers = @[@"8.8.8.8", @"8.8.4.4"];
NEPacketTunnelNetworkSettings *settings = [[NEPacketTunnelNetworkSettings alloc] initWithTunnelRemoteAddress:@"195.78.202.220"];
settings.IPv4Settings = [[NEIPv4Settings alloc] initWithAddresses:addresses subnetMasks:subnetMasks];
NEIPv4Route *defaultRoute = [NEIPv4Route defaultRoute];
NEIPv4Route *localRoute = [[NEIPv4Route alloc] initWithDestinationAddress:@"10.80.0.0" subnetMask:@"255.255.255.0"]; /
settings.IPv4Settings.includedRoutes = @[defaultRoute, localRoute];
settings.IPv4Settings.excludedRoutes = @[];
settings.MTU = [NSNumber numberWithInt:1500];
[PckTunProvider setTunnelNetworkSettings:settings completionHandler:^(NSError * _Nullable error)
{
if (error)
{
NSLog(@"setTunnelNetworkSettings error: %@", error);
}
else
{
}
}];
NSError *startError;
[[NEVPNManager sharedManager].connection startVPNTunnelAndReturnError:&startError];
}
But how can we use the class declared in the app extensions ?
If we do
PckTunProvider = [PacketTunnelProvider alloc];
we obtain linker error
Thanks for any suggestion