在 java 中以编程方式打开 VPN 连接

Openvpn connection programmatically in java

我想开发一个与 VPN 配合使用的自动化应用程序。为此,我有 Openvpn 配置文件。但是,我不知道如何连接。 link 中提到了一个解决方案,但它对我不起作用。我在哪里以及如何输入我的 vpn 用户和密码?我在这方面的研究没有得到任何结果。

我想做的应用程序将简单地工作如下。例如,我将有 50 个 vpn,我的程序将通过分别连接每个 vpn 来连接到目标站点。但是,正如我所说,我不知道如何与 java 建立 openvpn 连接。你能帮我吗?以下是我为我想做的事情编写的代码。例如,我想通过意大利 vpn 位置连接到 google。

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();
        }
    }
}

运行 命令行中的 OpenVPN 客户端您需要使用单独的文本文件输入用户名和密码。

  1. 在与 .ovpn 文件相同的文件夹中创建一个文本文件。对于此示例 italy.txt.
  2. 将您的用户名和密码放在新行的文件中,如下所示:
username
password
  1. 保存文本文件。

看到 Runtime.exec 不再工作(或者它最终按预期工作,但在这种情况下没有给出结果),我们需要切换到 ProcessBuilder.

这是一个使用问题中定义的单个 VPN 连接的示例。

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());
    }
}

这将打开一个 VPN 隧道,只要开始测试 class 的 terminal/program 没有被杀死,它就会保持打开状态。

注意,除非命令失败,否则不会有任何输出!在正常操作的情况下,您只会看到一个空白屏幕。

您将需要为自己实现一个业务逻辑,然后在打开新隧道之前关闭 VPN 隧道(除非您希望最终在彼此内部有 50 个隧道,这甚至可能不会工作)。