Schütze eine Steckdose in VpnService

Ich erforsche die Fähigkeiten von Android VPNService. Gegenwärtig habe ich einen sehr rudimentären Anforderungs-Forwarder aufgebaut, indem ich den IP-Stack im User Space im Wesentlichen neu aufbaute: Ich lese IP-Pakete aus dem Eingangsstrom des VpnService, analysiere sie und für Verbindungen, die ich nicht weiterleiten möchte, versuche ich, diese neu zu erstellen Steckdosen außerhalb der VPN-Verbindung.

Ich habe verstanden, dass dieses letzte Bit von VpnService.protect() erleichtert wird und versucht hat, es wie folgt zu implementieren:

  • Gradle Android Projekt mit Java 8 Modul
  • Android Spinner mit verschiedenen Layouts für "Dropdown-Status" und "geschlossenen Zustand"?
  • Wie man Popup-Nachricht ohne Kontext zeigt
  • Android N Vorschau Emulator Crash
  • Aktivierung der Intel-Virtualisierung (VT-X) ohne Option im BIOS
  • Setzen Sie eine VPN-Verbindung programmgesteuert auf Android 4.0
  •  Socket socket = new Socket(); vpnService.protect(socket); socket.connect(new InetSocketAddress( header.getDestinationAddress(), // From my IP datagram header body.getDestinationPort())); // From the TCP datagram header 

    Leider führt dieser Ansatz zu einem Loopback in die VPN-Schnittstelle.

    Während der oben genannte Code einfach blockiert und schließlich Socket.connect(InetSocketAddress) , beobachte ich den Loopback, indem er Socket.connect(InetSocketAddress) aus einem separaten Thread Socket.connect(InetSocketAddress) . Die Verbindung kommt direkt in den Eingangsstrom meines VpnService und der Prozess wiederholt sich.

    Unnötig zu sagen, das verursacht eine Schleife. Ich habe das Gefühl, dass der Grund dafür ist, dass zum Zeitpunkt der Socket-Erstellung (und anschließend der Aufruf von VpnService.protect(Socket) ) habe ich noch nicht die Ziel-IP & Port gesetzt.

    Dies scheint in der Tat der Fall zu sein, da die von VpnService.protect(Socket) und VpnService.protect(int) in meiner VpnService-Implementierung übergeben und die Supers in beiden Fällen aufruft, false zurückgibt.

    Wie kann ich einen Socket-Anschluss richtig schützen?

  • Wie kann ich die Digest-Authentifizierung mit Volley implementieren?
  • Verhindern, dass das Wort in TextView gebrochen wird
  • Wie kann ich HorizontalScrollView wie Galerie implementieren?
  • Skalieren und Drehen von Bitmap mit Matrix in Android
  • AndroidAnnotationen und Dolch
  • Best Practices beim Clustering großer Anzahl von Markern in Google Maps Android V2
  • 4 Solutions collect form web for “Schütze eine Steckdose in VpnService”

    Der folgende Code funktioniert.

     Socket socket = SocketChannel.open().socket(); if ((null != socket) && (null != vpnService)) { vpnService.protect(socket); } socket.connect(...); 

    New Socket () hat keinen gültigen Dateideskriptor, also kann er nicht geschützt werden.

    Ich fand, dass eine alternative Lösung war, um es in C / C ++ zu schreiben.

    Java:

     public native int createSocket(); public native int connectSocket(int fd); 

    C ++:

     // For sockets #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> // For error codes #include <errno.h> extern "C" { JNIEXPORT jint JNICALL Java_com_pixplicity_example_jni_VpnInterface_createSocket( JNIEnv * env, jobject thiz) { // Create the socket int sockfd = socket(AF_INET, SOCK_STREAM, 0); int err = errno; // Return the file descriptor return sockfd; } JNIEXPORT jint JNICALL Java_com_pixplicity_example_jni_VpnInterface_connectSocket( JNIEnv * env, jobject thiz, jint sockFd) { // Host & port are hard-coded here char* host = "74.125.136.113"; // google.com int port = 80; struct sockaddr_in peerAddr; int ret; peerAddr.sin_family = AF_INET; peerAddr.sin_port = htons(port); peerAddr.sin_addr.s_addr = inet_addr(host); // Connect to host ret = connect((int) sockFd, (struct sockaddr *) &peerAddr, sizeof(peerAddr)); if (ret != 0) { perror("connect failed"); close(sockFd); } // Return the error code return ret; } } 

    Du musst deine Steckdose vor dem Schutz binden. Das funktioniert für mich:

     Socket socket = new Socket(); //bind to any address socket.bind(new InetSocketAddress(0)); vpnService.protect(socket); socket.connect(...); 

    Sie können Ihre Anwendungssockel (s) (und damit den Verkehr, der an ihm vorbei fließt) von der Verwendung des VPN ausschließen, indem Sie Ihre Anwendung zu vpnService.builder.addDisallowedApplication("your package name")

    Ich habe es versucht und es getestet mit laufen tcpdump auf der vpn getunnelte Schnittstelle und meine ausgehende Internet-Schnittstelle. Die Pakete von meinen Anwendungen schlafen nicht in der vpn-Schnittstelle und werden über die vorwärts gerichtete Internetschnittstelle des Telefons gesendet.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.