Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Openvpn connection programmatically in java

Tags:

java

vpn

openvpn

I want to develop an automation application that works with VPN. For this I have Openvpn config files. However, I don't know how to connect. A solution is mentioned in this link but it didn't work for me. Where and how do I type my vpn user and password? I could not get any results in my research on this.

The application I want to do will work briefly as follows. For example, I will have 50 vpn and my program will connect to the target site by connecting with each vpn respectively. However, as I said, I do not know how to set up an openvpn connection with java. Can you help me with this? Below are the codes I wrote for what I want to do. For example, I wanted to connect to google through italy vpn location.

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import java.io.IOException;

public class Main {

    public static void main(String[] args) {

        Runtime runtime = Runtime.getRuntime();
        try {
            Process process = runtime.exec("C:\\Program Files\\OpenVPN\\bin\\openvpn C:\\Users\\DATABASE\\OpenVPN\\config\\italy\\italy.ovpn");
        } catch (IOException e) {
            e.printStackTrace();
        }


        System.setProperty("webdriver.gecko.driver", "C:\\geckodriver\\geckodriver.exe");
        WebDriver driver = new FirefoxDriver();

        try {
            driver.get("https://www.google.com/");
        } finally {
            driver.quit();
        }
    }
}
like image 346
idrisyagci Avatar asked Oct 20 '25 08:10

idrisyagci


1 Answers

Running the OpenVPN client from the command line you need to input the username & password using a separate text file.

  1. Create a text file in the same folder as the .ovpn file. For this example italy.txt.
  2. Put your username & password in the file on new lines, like this:
username
password
  1. Save the text file.

Seeing as Runtime.exec isn't working anymore (or it's finally working as expected, but not giving a result in this case), we need to switch to a ProcessBuilder.

Here is a example using a single VPN connection as defined in the question.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {
    private static final String NEW_LINE = System.getProperty("line.separator");
    
    public static void main(String[] args) {        
        StringBuilder result = new StringBuilder(80);
        try {
            ProcessBuilder pb = new ProcessBuilder("C:\\Program Files\\OpenVPN\\bin\\openvpn.exe", "--config", "C:\\Users\\DATABASE\\OpenVPN\\config\\italy\\italy.ovpn", "--auth-user-pass", "C:\\Users\\DATABASE\\OpenVPN\\config\\italy\\italy.txt").redirectErrorStream(true);
            Process process = pb.start();
            try (BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())))
            {
                while (true)
                {
                    String line = in.readLine();
                    if (line == null)
                        break;
                    result.append(line).append(NEW_LINE);
                }
            }
        } catch (IOException e) {
        }
        
        System.out.println(result.toString());
    }
}

This will open a VPN tunnel and it will stay open as long as the terminal/program starting the Test class isn't killed.

Be careful that it will not give any output unless the command fails! In case of normal operation you just see a blank screen.

You will need to implement a business logic for yourself and subsequently close the VPN tunnel when you are done with it before opening a new tunnel (unless you want to end up with 50 tunnels inside each other, which might not even work).

like image 176
Fullslack Avatar answered Oct 21 '25 23:10

Fullslack



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!