I'm trying to implement a packet sniffer similar to Charles for iOS using iOS's NetworkExtension framework.
Objective
So, that's a big goal and I'm breaking it down into a tiny piece right now: I want to see the os_log
from my NEPacketTunnelProvider
(bottom box in diagram)
What I have done so far
- I have created a NetworkExtension target on type PacketTunnel. This is the code snippet in the 3rd box in the diagram titled "NEPacketTunnelProvider".
- I have included the "app groups", "personal VPN", and "Network extension" capabilities from within XCode.
Question
I am looking in the Console.app to see the output from os_log("STARTING TUNNEL!!!!")
. When I load the configuration and make the call to startVPNTunnel()
, why is my TunnelProvider code never called?
I have verified that startVPNTunnel()
is being called by placing a breakpoint in my code.
in startVPNTunnel func ,you should call setTunnelNetworkSettings,then the tunnel will started, after that ,you can read/write packet.
There are a good number of reasons why your network extension process may not be starting:
os_log("STARTING TUNNEL!!!!")
and attach to your network extension process in Xcode viaDebug -> Attach to Process by PID or Name...
before you attempt to start the VPNcom.example.vpn
then the network extension might becom.example.vpn.tunnel
.Info.plist
contains theNSExtension
dictionary withNSExtensionPointIdentifier
andNSExtensionPrincipalClass
containingcom.apple.networkextension.packet-tunnel
and yourNEPacketTunnelProvider
class (e.g.$(PRODUCT_MODULE_NAME).PacketTunnelProvider
) respectively.Personal VPN
entitlement.