All Projects → passepartoutvpn → Tunnelkit

passepartoutvpn / Tunnelkit

Licence: gpl-3.0
Non-official OpenVPN client library for Apple platforms.

Programming Languages

swift
15916 projects

Projects that are alternatives of or similar to Tunnelkit

Passepartout Apple
User-friendly OpenVPN client app for iOS and macOS.
Stars: ✭ 284 (+57.78%)
Mutual labels:  vpn, openvpn, osx
killswitch-windows
VPN kill switch for windows.
Stars: ✭ 22 (-87.78%)
Mutual labels:  tunnel, openvpn, vpn
Azclient
Customizable VPN client, meant to be simple and sleek.
Stars: ✭ 106 (-41.11%)
Mutual labels:  vpn, openvpn
Vpn2018
One Click VPN for Android. 一键连接VPN Android 专用.
Stars: ✭ 108 (-40%)
Mutual labels:  vpn, openvpn
Nordvpn Networkmanager
A CLI tool for automating the importing, securing and usage of NordVPN (and in the future, more) OpenVPN servers through NetworkManager.
Stars: ✭ 111 (-38.33%)
Mutual labels:  vpn, openvpn
Docker Openvpn
🔐 Out of the box stateless openvpn-server docker image which starts in less than 2 seconds
Stars: ✭ 174 (-3.33%)
Mutual labels:  vpn, openvpn
Nordpy
A gui application to connect automatically to the recommended NordVPN server
Stars: ✭ 95 (-47.22%)
Mutual labels:  vpn, openvpn
Mullvadvpn App
The Mullvad VPN client app for desktop and mobile
Stars: ✭ 1,953 (+985%)
Mutual labels:  vpn, openvpn
Tunnelblickctl
🔒 Command-line interface for Tunnelblick
Stars: ✭ 64 (-64.44%)
Mutual labels:  vpn, openvpn
Adblocking Vpn
🔒 Create your own VPN server that blocks malicious domains to enhance your security and privacy
Stars: ✭ 139 (-22.78%)
Mutual labels:  vpn, openvpn
Pia Tools
Shell script to automate privateinternetaccess port forwarding and starting/stopping transmission when connected/disconnected and other stuff
Stars: ✭ 130 (-27.78%)
Mutual labels:  vpn, openvpn
Ladder
梯子,科学上网,翻墙 , 代理, 外网, 加速器, 路由, V2Ray,SS,shadowsocks, SSR
Stars: ✭ 141 (-21.67%)
Mutual labels:  vpn, openvpn
Vycontrol
vyos frontend
Stars: ✭ 92 (-48.89%)
Mutual labels:  vpn, openvpn
Desktop Legacy
VPN.ht Desktop Application for Windows and Mac OS X built on top of Electron
Stars: ✭ 83 (-53.89%)
Mutual labels:  vpn, openvpn
Android
VPN.ht Android Application. Based on ics-openvpn.
Stars: ✭ 99 (-45%)
Mutual labels:  vpn, openvpn
Pi Hole Pivpn On Google Compute Engine Free Tier With Full Tunnel And Split Tunnel Openvpn Configs
Run your own privacy-first ad blocking service in the cloud for free on Google Cloud Services.
Stars: ✭ 1,141 (+533.89%)
Mutual labels:  vpn, openvpn
Cake Vpn
Android VPN app based on OpenVPN library.
Stars: ✭ 109 (-39.44%)
Mutual labels:  vpn, openvpn
Ovpnmcgen.rb
An OpenVPN iOS Configuration Profile (.mobileconfig) Utility—Configures OpenVPN for use with VPN-on-Demand that are not exposed through Apple Configurator 2.
Stars: ✭ 154 (-14.44%)
Mutual labels:  vpn, openvpn
Simple Vpn Demo
A Simple Point-to-Point tunnelling implementation in C
Stars: ✭ 59 (-67.22%)
Mutual labels:  vpn, tunnel
Vpn At Home
1-click, self-hosted deployment of OpenVPN with DNS ad blocking sinkhole
Stars: ✭ 1,106 (+514.44%)
Mutual labels:  vpn, openvpn

iOS 12+ macOS 10.15+ OpenSSL 1.1.1h License GPLv3 Travis-CI

TunnelKit

This library provides a simplified Swift/Obj-C implementation of the OpenVPN® protocol for the Apple platforms. The crypto layer is built on top of OpenSSL 1.1.1, which in turn enables support for a certain range of encryption and digest algorithms.

Getting started

The client is known to work with OpenVPN® 2.3+ servers.

  • [x] Handshake and tunneling over UDP or TCP
  • [x] Ciphers
    • AES-CBC (128/192/256 bit)
    • AES-GCM (128/192/256 bit, 2.4)
  • [x] HMAC digests
    • SHA-1
    • SHA-2 (224/256/384/512 bit)
  • [x] NCP (Negotiable Crypto Parameters, 2.4)
    • Server-side
  • [x] TLS handshake
    • Server validation (CA, EKU)
    • Client certificate
  • [x] TLS wrapping
    • Authentication (--tls-auth)
    • Encryption (--tls-crypt)
  • [x] Compression framing
    • Via --comp-lzo (deprecated in 2.4)
    • Via --compress
  • [x] Compression algorithms
    • LZO (via --comp-lzo or --compress lzo)
  • [x] Key renegotiation
  • [x] Replay protection (hardcoded window)

The library therefore supports compression framing, just not newer compression. Remember to match server-side compression and framing, otherwise the client will shut down with an error. E.g. if server has comp-lzo no, client must use compressionFraming = .compLZO.

Support for .ovpn configuration

TunnelKit can parse .ovpn configuration files. Below are a few limitations worth mentioning.

Unsupported:

  • UDP fragmentation, i.e. --fragment
  • Compression via --compress other than empty or lzo
  • Connecting via proxy
  • External file references (inline <block> only)
  • Static key encryption (non-TLS)
  • <connection> blocks
  • vpn_gateway and net_gateway literals in routes

Ignored:

  • Some MTU overrides
    • --link-mtu and variants
    • --mssfix
  • Multiple --remote with different host values (first wins)
  • Static client-side routes

Many other flags are ignored too but it's normally not an issue.

Installation

Requirements

  • iOS 12.0+ / macOS 10.15+
  • Xcode 11+ (Swift 5)
  • Git (preinstalled with Xcode Command Line Tools)
  • Ruby (preinstalled with macOS)
  • CocoaPods 1.6.0
  • jazzy (optional, for documentation)
  • Disable Bitcode

It's highly recommended to use the Git and Ruby packages provided by Homebrew.

CocoaPods

To use with CocoaPods just add this to your Podfile:

pod 'TunnelKit'

Testing

Download the library codebase locally:

$ git clone https://github.com/passepartoutvpn/tunnelkit.git

Assuming you have a working CocoaPods environment, setting up the library workspace only requires installing the pod dependencies:

$ pod install

After that, open TunnelKit.xcworkspace in Xcode and run the unit tests found in the TunnelKitTests folder. A simple CMD+U while on TunnelKit-(iOS|macOS) should do that as well.

Demo

There are demo targets containing a simple app for testing the tunnel, called BasicTunnel.

For the VPN to work properly, the BasicTunnel demo requires:

  • App Groups and Keychain Sharing capabilities
  • App IDs with Packet Tunnel entitlements

both in the main app and the tunnel extension target.

In order to test connectivity in your own environment, modify the file TunnelKit/Demo/Configuration.swift to match your VPN server parameters.

Example:

private let ca = CryptoContainer(pem: """
-----BEGIN CERTIFICATE-----
MIIFJDCC...
-----END CERTIFICATE-----
""")

Make sure to also update the following constants in the same files, according to your developer account and your target bundle identifiers:

public static let appGroup
public static let tunnelIdentifier

Remember that the App Group on macOS requires a team ID prefix.

Documentation

The library is split into several modules, in order to decouple the low-level protocol implementation from the platform-specific bridging, namely the NetworkExtension VPN framework.

Full documentation of the public interface is available and can be generated with jazzy. After installing the jazzy Ruby gem with:

$ gem install jazzy

enter the root directory of the repository and run:

$ jazzy

The generated output is stored into the docs directory in HTML format.

Core

Contains the building blocks of a VPN protocol. Eventually, a consumer would implement the Session interface, expected to start and control the VPN session. A session is expected to work with generic network interfaces:

  • LinkInterface (e.g. a socket)
  • TunnelInterface (e.g. an utun interface)

There are no physical network implementations (e.g. UDP or TCP) in this module.

AppExtension

Provides a layer on top of the NetworkExtension framework. Most importantly, bridges native NWUDPSession and NWTCPConnection to an abstract GenericSocket interface, thus making a multi-protocol VPN dramatically easier to manage.

Manager

This subspec includes convenient classes to control the VPN tunnel from your app without the NetworkExtension headaches. Have a look at VPNProvider implementations:

  • MockVPNProvider (default, useful to test on simulator)
  • OpenVPNProvider

Set VPN.shared to either of them at app launch time.

Protocols/OpenVPN

Here you will find the low-level entities on top of which an OpenVPN connection is established. Code is mixed Swift and Obj-C, most of it is not exposed to consumers. The module depends on OpenSSL.

The entry point is the OpenVPNSession class. The networking layer is fully abstract and delegated externally with the use of opaque IOInterface (LinkInterface and TunnelInterface) and OpenVPNSessionDelegate protocols.

Another goal of this module is packaging up a black box implementation of a NEPacketTunnelProvider, which is the essential part of a Packet Tunnel Provider app extension. You will find the main implementation in the OpenVPNTunnelProvider class.

A debug log snapshot is optionally maintained and shared by the tunnel provider to host apps via the App Group container.

Extra/LZO

Due to the restrictive license (GPLv2), LZO support is provided as an optional subspec.

License

Copyright (c) 2020 Davide De Rosa. All rights reserved.

Part I

This project is licensed under the GPLv3.

Part II

As seen in libsignal-protocol-c:

Additional Permissions For Submission to Apple App Store: Provided that you are otherwise in compliance with the GPLv3 for each covered work you convey (including without limitation making the Corresponding Source available in compliance with Section 6 of the GPLv3), the Author also grants you the additional permission to convey through the Apple App Store non-source executable versions of the Program as incorporated into each applicable covered work as Executable Versions only under the Mozilla Public License version 2.0 (https://www.mozilla.org/en-US/MPL/2.0/).

Part III

Part I and II do not apply to the LZO library, which remains licensed under the terms of the GPLv2+.

Contributing

By contributing to this project you are agreeing to the terms stated in the Contributor License Agreement (CLA).

For more details please see CONTRIBUTING.

Credits

  • lzo - Copyright (c) 1996-2017 Markus F.X.J. Oberhumer
  • PIATunnel - Copyright (c) 2018-Present Private Internet Access
  • SURFnet
  • SwiftyBeaver - Copyright (c) 2015 Sebastian Kreutzberger

This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit. (https://www.openssl.org/)

Copyright (c) 2002-2018 OpenVPN Inc. - OpenVPN is a registered trademark of OpenVPN Inc.

Contacts

Twitter: @keeshux

Website: passepartoutvpn.app

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].