From 93213caa1c1456836dc0f9d2ade45eed1a3d4e4a Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Thu, 13 Sep 2012 01:42:20 +0200 Subject: Add support for persist-tun option (closes issue #83) --- openvpn/src/openvpn/init.c | 25 +++++++++++------ openvpn/src/openvpn/socket.c | 2 +- res/values-de/strings.xml | 11 ++++---- res/values/strings.xml | 2 ++ res/xml/vpn_obscure.xml | 32 ++-------------------- src/de/blinkt/openvpn/ConfigParser.java | 4 ++- src/de/blinkt/openvpn/OpenVpnManagementThread.java | 2 ++ src/de/blinkt/openvpn/VpnProfile.java | 5 ++++ 8 files changed, 39 insertions(+), 44 deletions(-) diff --git a/openvpn/src/openvpn/init.c b/openvpn/src/openvpn/init.c index cd5ebd3d..1f06eaa5 100644 --- a/openvpn/src/openvpn/init.c +++ b/openvpn/src/openvpn/init.c @@ -1402,8 +1402,19 @@ do_open_tun (struct context *c) c->c2.ipv4_tun = (!c->options.tun_ipv6 && is_dev_type (c->options.dev, c->options.dev_type, "tun")); +#ifndef TARGET_ANDROID if (!c->c1.tuntap) { +#endif + +#ifdef TARGET_ANDROID + /* If we emulate persist-tun on android we still have to open a new tun and + then close the old */ + int oldtunfd=-1; + if(c->c1.tuntap) + oldtunfd = c->c1.tuntap->fd; +#endif + /* initialize (but do not open) tun/tap object */ do_init_tun (c); @@ -1439,7 +1450,10 @@ do_open_tun (struct context *c) /* open the tun device */ open_tun (c->options.dev, c->options.dev_type, c->options.dev_node, c->c1.tuntap); - +#ifdef TARGET_ANDROID + if(oldtunfd>=0) + close(oldtunfd); +#endif /* set the hardware address */ if (c->options.lladdr) set_lladdr(c->c1.tuntap->actual_name, c->options.lladdr, c->c2.es); @@ -1481,6 +1495,7 @@ do_open_tun (struct context *c) ret = true; static_context = c; +#ifndef TARGET_ANDROID } else { @@ -1503,6 +1518,7 @@ do_open_tun (struct context *c) "up", c->c2.es); } +#endif gc_free (&gc); return ret; } @@ -2488,13 +2504,6 @@ do_option_warnings (struct context *c) msg (M_WARN, "NOTE: --connect-timeout option is not supported on this OS"); #endif - if (script_security >= SSEC_SCRIPTS) - msg (M_WARN, "NOTE: the current --script-security setting may allow this configuration to call user-defined scripts"); - else if (script_security >= SSEC_PW_ENV) - msg (M_WARN, "WARNING: the current --script-security setting may allow passwords to be passed to scripts via environmental variables"); - else - msg (M_WARN, "NOTE: " PACKAGE_NAME " 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables"); - if (script_method == SM_SYSTEM) msg (M_WARN, "NOTE: --script-security method='system' is deprecated due to the fact that passed parameters will be subject to shell expansion"); } diff --git a/openvpn/src/openvpn/socket.c b/openvpn/src/openvpn/socket.c index bb973bc9..1e38e82c 100644 --- a/openvpn/src/openvpn/socket.c +++ b/openvpn/src/openvpn/socket.c @@ -730,9 +730,9 @@ create_socket (struct link_socket *sock) struct user_pass up; strcpy(up.username ,__func__); management->connection.fdtosend = sock->sd; + msg(M_DEBUG, "Protecting socket fd %d", sock->sd); management_query_user_pass(management, &up , "PROTECTFD", GET_USER_PASS_NEED_OK,(void*) 0); - #endif } diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index ad8cd5bc..1db01388 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -218,12 +218,13 @@ In dieser Anwendung wird die Routing und Netzwerkkonfiguration nicht mit den traditionellen ifconfig/route Kommandos konfiguriert sondern mittels der VPNService API. Diese erwartet eine Tunnel IP Adresse und die Netzwerke, die über den Tunnel geroutet werden sollen. Insbesondere wird keine Gateway oder Peer IP Adresse benötigt. Die Anwendung ignoriert diese daher auch beim Import. Dass die Verbindung zum VPN Server nicht über den Tunnel geroutet wird, wird auch über die VPNService API sichergestellt ohne dass hierfür spezielle Routen nötig sind. Da nur Netzwerke, die über den Tunnel geroutet werden sollen, angeben werden können, ist es nicht möglich andere Routen zu unterstützen (z.B. route x.x.x.x y.y.y.y net_gateway)" Da OpenVPN sicherheitsrelevant sein sein sind einige Worte zur Sicherheit der Anwendung angebracht. Alle Daten, die sich auf der SD Karte befinden sind als absolut unsicher anzusehen. Jede Anwendung kann diese lesen. (Diese Anwendung braucht zum Beispiel keine SD Karten Berechtigung). Die restlichen Konfiguration dieser Anwendung kann nur von der Anwendung selbst gelesen werden. Wenn die Option genutzt wird, dass die Zertifikate und Schlüssel eingebettet werden, werden diese im VPN Profil gespeichert. Die VPN Profile sind nur von der Anwendung selbst lesbar. (Vergessen Sie nicht die ursprünglichen Zertifikate/Schlüssel von der SD Karte zu löschen). Die Daten die Anwendung selbst speichert sind unverschlüsselt. Es besteht die Möglichkeit diese mittels \"rooten\" des Telefons/Tablets oder anderen Schwachstellend diese Daten auszulesen. Gespeicherte Passwörter werden auch im Klartext gespeichert. Es wird dringend empfohlen die Zertifikate in dem Android Keystore zu speichern." Android hat einen Fehler beim Anzeigen des Zertifikat Dialog gemeldet. Dies sollte nie passieren, da dies ein Standard Feature von Android 4.0+ ist. Eventuell ist Unterstützung von Zertifikaten in Ihrer Firmware fehlerhaft - Die Meldung, dass OpenVPN versucht eine VPN-Verbindung aufzubauen und dabei den gesamten Netzwerkverkehr abhören kann, wird vom Android System selbst erzeugt. Diese wird vom System erzwungen, damit keine Anwendung vom Benutzer unbemerkt eine VPN Verbindung aufbauen kann\Die VPN Benachrichtigung (Das Schlüssel Symbol) wird genauso vom Android System angezeigt um eine bestehende VPN anzuzeigen.\nDiese beiden Features wurden in Android für die Sicherheit des Nutzers implementiert und können nicht umgangen werden. (Auf machen Telefon/Tablets wird die Benachrichtigung leider mit einem Ton signalisiert.) - Die gleiche Frage nochmal? Meinen Sie das ernst? Ohne root kann tap wirklich nicht unterstützt werden. Emails an mich mit der Frage wann tap unterstützt wird, helfen hier kein Stück - -Kann nicht auf die Android Keychain Zertifikate zugreifen. (Dies kann durch ein System Update oder durch Zurücksichern der Anwendung aus einem Backup hervorgerufen werden.). Bitte editieren sie das VPN und wählen Sie erneut das Zertifikat in dem Grundeinstellungen aus um die Berechtigung auf das Zertifikat zuzugreifen zu können wieder herzustellen. -Ein drittes Mal? Nun gut, theoretisch kann tap mit einem tun Gerät emuliert werden. Dieser tap Emulator müsste die Layer 2 Informationen beim Senden hinzufügen und beim Empfangen wieder entfernen. Zusätzlich muss noch ARP und sinnvollerweise auch ein DHCP Client implementiert werden. Mir ist niemand bekannt, der etwas in diese Richtung unternimmt. Kontaktieren Sie mich, wenn Sie etwas in dies implementieren wollen. + Die Meldung, dass OpenVPN versucht eine VPN-Verbindung aufzubauen und dabei den gesamten Netzwerkverkehr abhören kann, wird vom Android System selbst erzeugt. Diese wird vom System erzwungen, damit keine Anwendung vom Benutzer unbemerkt eine VPN Verbindung aufbauen kann\Die VPN Benachrichtigung (Das Schlüssel Symbol) wird genauso vom Android System angezeigt um eine bestehende VPN anzuzeigen.\nDiese beiden Features wurden in Android für die Sicherheit des Nutzers implementiert und können nicht umgangen werden. (Auf machen Telefon/Tablets wird die Benachrichtigung leider mit einem Ton signalisiert.) + Die gleiche Frage nochmal? Meinen Sie das ernst? Ohne root kann tap wirklich nicht unterstützt werden. Emails an mich mit der Frage wann tap unterstützt wird, helfen hier kein Stück + Kann nicht auf die Android Keychain Zertifikate zugreifen. (Dies kann durch ein System Update oder durch Zurücksichern der Anwendung aus einem Backup hervorgerufen werden.). Bitte editieren sie das VPN und wählen Sie erneut das Zertifikat in dem Grundeinstellungen aus um die Berechtigung auf das Zertifikat zuzugreifen zu können wieder herzustellen. + Ein drittes Mal? Nun gut, theoretisch kann tap mit einem tun Gerät emuliert werden. Dieser tap Emulator müsste die Layer 2 Informationen beim Senden hinzufügen und beim Empfangen wieder entfernen. Zusätzlich muss noch ARP und sinnvollerweise auch ein DHCP Client implementiert werden. Mir ist niemand bekannt, der etwas in diese Richtung unternimmt. Kontaktieren Sie mich, wenn Sie etwas in dies implementieren wollen. <p>Von offiziellen HTC Firmwares ist bekannt, dass diese teilweise merkwürdige Routing Probleme haben, die dafür sorgen, dass der Verkehr nicht durch den Tunnel fließt. (Siehe auch <a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=18\">Issue 18</a> im Bug Tracker.)</p><p>Bei den offiziellen SONY Firmwares für das Xperia arc S and Xperia Ray scheint der VPNService Support komplett zu fehlen. Für andere Sony Firmwares mag dies genauso gelten. (Siehe <a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=29\">Issue 29</a> im Bug Tracker.)</p><p>Auf anderen (insbesondere Custom ROMS) fehlt teilweise das tun Kernel Modul oder die Rechte von /dev/tun sind falsch gesetzt. Auf einigen CM9 Firmware wird die \"/dev/tun Eigentümer setzen\" Option in den Allgemeinen Einstellungen benötigt.</p><p>Am wichtigsten ist aber, falls Sie eine fehlerhafte Firmware haben, melden Sie dies Ihrem Hersteller. Desto mehr Leute den Fehler dem Hersteller melden desto wahrscheinlicher werden Sie eine Fehlerkorrektur bekommen.</p> + Verhindere Zurückfallen auf nicht VPN Verbindungen während OpenVPN neu verbindet. + Persistentes tun Device diff --git a/res/values/strings.xml b/res/values/strings.xml index bed55604..d5445c22 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -258,4 +258,6 @@ Convert remote-tls format from OpenVPN 2.2 to 2.3 format Routing/Interface Configuration The Routing and interface configuration is not done via traditionell ifconfig/route command but by using the VPNService API. This results in a different routing configuration than on other OSes. The configuration only consists of the IP of the tunnel interface and the networks that should be routed over this interface. Especially no peer partner address or gateway address is needed. Special routes to reach the VPN Server (for example added when using redirect-gateway) are not needed either. The application will consequently ignore these settings when importing a configuration. The app ensures with the VPNService API that the connection to the server is not routed through the VPN tunnel. Since only specifing networks to be routed via tunnel is supported extra routes not pointing to the tunnel cannot be supported either. (e.g. route x.x.x.x y.y.y.y net_gateway). The show information button in the log windows show the current configuration of the VPNService network configuration. + Do not fallback to no VPN connection when OpenVPN is reconnecting. + Persistent tun diff --git a/res/xml/vpn_obscure.xml b/res/xml/vpn_obscure.xml index 44f71c52..c99e039c 100644 --- a/res/xml/vpn_obscure.xml +++ b/res/xml/vpn_obscure.xml @@ -19,37 +19,11 @@ android:persistent="false" android:summary="@string/float_summary" android:title="@string/float_title" /> - - - - - - + android:key="usePersistTun" + android:summary="@string/persisttun_summary" + android:title="@string/persistent_tun_title" /> - authuser = getOption("auth-user-pass",0,1); if(authuser !=null){ diff --git a/src/de/blinkt/openvpn/OpenVpnManagementThread.java b/src/de/blinkt/openvpn/OpenVpnManagementThread.java index e06c1194..24537732 100644 --- a/src/de/blinkt/openvpn/OpenVpnManagementThread.java +++ b/src/de/blinkt/openvpn/OpenVpnManagementThread.java @@ -147,6 +147,8 @@ public class OpenVpnManagementThread implements Runnable { exp =e; } catch (InvocationTargetException e) { exp =e; + } catch (NullPointerException e) { + exp =e; } if(exp!=null) { exp.printStackTrace(); diff --git a/src/de/blinkt/openvpn/VpnProfile.java b/src/de/blinkt/openvpn/VpnProfile.java index afb779d2..404072b1 100644 --- a/src/de/blinkt/openvpn/VpnProfile.java +++ b/src/de/blinkt/openvpn/VpnProfile.java @@ -101,6 +101,7 @@ public class VpnProfile implements Serializable{ public String mKeyPassword=""; static final String MINIVPN = "miniopenvpn"; + public boolean mPersistTun = true; public void clearDefaults() { @@ -110,6 +111,7 @@ public class VpnProfile implements Serializable{ mUseDefaultRoute=false; mUseDefaultRoutev6=false; mExpectTLSCert=false; + mPersistTun = false; } @@ -337,6 +339,9 @@ public class VpnProfile implements Serializable{ if(mUseFloat) cfg+= "float\n"; + if(mPersistTun) + cfg+= "persist-tun\n"; + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); boolean usesystemproxy = prefs.getBoolean("usesystemproxy", true); if(usesystemproxy) { -- cgit v1.2.3