openvpn无法在新的14.04安装上导入配置


20

编辑:修复了该问题,然后在补丁程序中添加了VPN配置。现在不再使用Linux / Ubuntu。

我通过执行以下操作安装了OpenVPN Network-Manager:,sudo apt-get install network-manager-openvpn它还安装了gnome软件包。

这样就可以在13.10下导入配置,但是在我的全新安装中,我可以指向这些.conf文件,但是单击“导入”后,管理器消失了,没有添加任何连接。

我尝试手动设置它,哪种方法可行,但是一段时间后我的连接不断下降,我想是因为我没有手动设置非常详细的配置的每一个细节。

通过执行以下操作通过终端进行连接:sudo openvpn --config /path/to/openvpn.conf要求我输入用户名,然后输入密码,但是没有连接。

我该怎么做才能解决此问题?我真的需要我的VPN,任何帮助深表感谢。

编辑:这是一个错误/ 1294899

对于重新打开队列:某人对此有一个非常好的解决方法,他使用编辑将其放入,但这是值得其回答的:投票要求重新打开...


从命令行启动它,查看是否出现错误并搜索(或将其添加到此问题中)。
Rinzwind

Answers:


26

没错,这是网络管理员的错误。但是我(您也可以)通过从命令行运行openvpn来解决它。您可能至少已经完成了其中一些步骤,但是以防万一(为了他人的利益),我将逐步进行完整的操作。

首先安装所需的软件包

sudo apt-get install network-manager network-manager-openvpn network-manager-openvpn-gnome

创建文件 这些文件必须始终保持安全和私有

  1. 在主目录中创建一个名为openvpn的目录将您的VPN客户端文件(重命名为client.ovpn)复制到目录openvpn中
  2. 可选:保留文件的原始副本–命名为client.ovpn.orig
  3. 接下来,我们将在openvpn目录下创建4个文件。
  4. 有关如何自动执行以下步骤,请参见此文件的底部
  5. 在文本编辑器中打开client.ovpn文件。
  6. 创建一个名为ca.crt文件-复制的文本<ca>,并</ca>从client.ovpn到这个文件
  7. 创建一个名为client.crt文件-复制的文本<cert>,并 </cert>从client.ovpn到这个文件
  8. 创建一个名为client.key文件-复制的文本<key>,并</key>从client.ovpn到这个文件
  9. 创建一个名为ta.key文件-复制的文本 <tls-auth>,并</tls-auth>从client.ovpn到这个文件在这一点上我有一个总的6个文件我的OpenVPN目录下(包括备份文件)

5-9我刚刚确定了如何执行bash脚本。大肆 复制以下到一个文本文件中:

#!/bin/bash
sed '1,/<ca>/d;/<\/ca>/,$d' client.ovpn > ca.crt
sed '1,/<cert>/d;/<\/cert>/,$d' client.ovpn > client.crt
sed '1,/<key>/d;/<\/key>/,$d' client.ovpn > client.key
sed '1,/<tls-auth>/d;/<\/tls-auth>/,$d' client.ovpn > ta.key

我将文件与client.ovpn文件一起另存为openvpnconvert在openvpn文件夹中。使用chmod a + x命令使其可执行:

chmod a+x openvpnconvert

然后运行它:

./openvpnconvert

修改client.ovpn文件

在## —BEGIN RSA SIGNATURE—行之前,添加以下行并保存

ca ca.crt
cert client.crt
key client.key
tls-auth ta.key

最后,您需要从命令行界面(CLI)运行openvpn

cd进入openvpn文件夹

cd openvpn

如果您使用的是我指定的文件名,请运行openvpn,请参见下文,否则请使用您的文件名。

sudo openvpn --client --config ~/openvpn/client.ovpn --ca ~/openvpn/ca.crt

我目前正在运行OpenVPN,我正是按照以下步骤进行设置的。希望它对其他人同样有效。

资料来源:

创建文件-http://naveensnayak.wordpress.com/2013/03/04/ubuntu-openvpn-with-ovpn-file/

从命令行运行-http://ubuntuforums.org/showthread.php?t=2206811


谢谢,这真的很好。我实际上有一个.ovpn配置为android。遗憾的是,它不适用于我的用户,因为openvpn系统不接受用户名/密码组合,对于我的特定配置而言,这也是一个确认的错误。真是愚蠢而令人沮丧,这让我唯一的希望是,希望这个问题能尽快解决。
vaioonbuntu 2014年

我只是看了看代码,看来我的VPN提供商也使用了用户名密码类型配置。如果他们具有您可以下载的.ovpn文件,则您仍然应该可以使用上述技术。无论如何,手指都交叉了。
Tamsyn Michael 2014年

1
我将亲自给啤酒钱给曾经编写脚本来转换这些文件的人-真是令人头疼!
jowan sebastian 2015年

@jowansebastian哇,刚刚弄清楚了怎么做。我将其添加到上一个答案的末尾。
Tamsyn Michael

我正是这样做的,有些不起作用。我得到了tun0适配器,但无法访问任何内部资源。
Christian Bongiorno


2

我从未尝试导入这些连接数据,但是在不同场合使用了以下内容:

  • whatever.conf连同.crt文件和凭据放入/etc/openvpn并使用以下命令启动/停止VPN连接sudo service openvpn whatever start|stop

  • 通过手动输入连接数据,通过NetworkManager创建VPN连接。连接的配置文件将放置在/etc/NetworkManager/system-connections,以后可以编辑。


2

提取脚本:

为了响应Tamsyn Michael的有用回答,我编写了一个小程序来自动执行提取任务。它输出openvpn所需的适当文件,然后将这些文件名附加到原始设置文件中。

//woahguy@askubuntu

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int i = 0;

string buffer, filename, ca, cert, key, auth;

struct _tags { const char* first; const char* last; };

const char* files[] = { "ca.crt", "client.crt", "client.key", "ta.key" };

_tags tags[] = {
    { "<ca>", "</ca>" },
    { "<cert>", "</cert>" },
    { "<key>", "</key>" },
    { "<tls-auth>", "</tls-auth>" }
};

string string_between( string str, const string& from, const string& to ) {
    size_t first = str.find(from);
    size_t last = str.find(to);
    return( str.substr ( first+from.size(),last-first-to.size()));
}

int read_file_to_buffer( string filename )
{
    char line[12];
    FILE* pFile = fopen( filename.c_str(), "r" );
    if( pFile != NULL ) {
        while( fgets( line, sizeof( line ), pFile ) ) {
            buffer.append( line );
        }
    } else {
        return 1;
    }
    return 0;
}

int write_buffer_to_file( string buffer, string filename )
{
    FILE* pFile = fopen( filename.c_str(), "w" );
    if( pFile != NULL ) {
        fwrite (buffer.c_str(), sizeof(char), buffer.size(), pFile);
        fclose(pFile);
    } else {
        return 1;
    }
    return 0;
}

int append_found_tags_to_main( int type )
{
    FILE* pFile = fopen( filename.c_str(), "a+" );
    if( pFile != NULL ) {
        if( type == 1 ) {
            fprintf( pFile, "\nca %s\r\ncert %s\r\nkey %s\r\n",
                files[0], files[1], files[2] );
        } else {
            fprintf( pFile, "\nca %s\r\ncert %s\r\nkey %s\r\ntls-auth %s\r\n",
                files[0], files[1], files[2], files[3] );
        }
        fclose(pFile);
    }
    return 0;
}

int extract_tags( )
{
    while (buffer.find(tags[i].first) != std::string::npos ) {
        if( i == 0 ) {
            ca = string_between( buffer, tags[i].first, tags[i].last);
        } else if( i == 1 ) {
            cert = string_between( buffer, tags[i].first, tags[i].last);
        } else if( i == 2 ) {
            key = string_between( buffer, tags[i].first, tags[i].last);
        } else if( i == 3 ) {
            auth = string_between( buffer, tags[i].first, tags[i].last);
        } else {
            return 1;
        }
        i++;
    }
    return 0;
}

int write_tags( )
{
    if( !ca.empty() && !cert.empty() && !key.empty() ) {
        write_buffer_to_file( ca, files[0] );
        write_buffer_to_file( cert, files[1] );
        write_buffer_to_file( key, files[2] );
        if( !auth.empty() ) {
            write_buffer_to_file( auth, files[3] );
            append_found_tags_to_main( 0 );
        } else {
            append_found_tags_to_main( 1 );
            return 1;
        }
    } else {
        return 2;
    }
}

int main(int argc, char* argv[])
{
    if( argv[1] == NULL ) {
        printf("certgrabber<: You need to specify a valid filename to extract from.\r\n");
        return 1;
    } else {
        if( argv[2] != NULL && argv[3] != NULL && argv[4] != NULL && argv[5] != NULL) {
            files[0] = argv[2];
            files[1] = argv[3];
            files[2] = argv[4];
            files[2] = argv[5];
        }
        filename = argv[1];
    }
    read_file_to_buffer( argv[1] );
    if( buffer.empty()){
        printf("certgrabber<: You need to specify a valid filename to extract from.\r\n");
        return 2;
    }
    if( extract_tags() == 0 ) {
        int result = write_tags();
        if( result == 0 ) {
            printf("certgrabber<: All certificates and keys successfully extracted.\r\n");
        } else if( result == 1 ) {
            printf("certgrabber<: Unable to find a TLS auth key, but this isn't exactly an error.\r\n");
        } else if( result == 2 ) {
            printf("certgrabber<: Something went totally wrong with the certificate files.\r\n");
        }
    } else {
        printf("certgrabber<: Something went wrong while extracting the tags.\r\n");
        return 3;
    }
    return 0;
}

编译与构建:

您将需要安装g ++来构建它

sudo apt-get install g++

然后从终端

g++ -c main.cpp -o main.o \ g++ -o certgrabber main.o 

您现在将在文件夹中具有“ certgrabber”程序。

程序用法:

提取为默认文件名(ca.crt,client.crt,client.key,tls-auth.key)

./certgrabber settings.ovpn

提取到自定义文件名

./certgrabber settings.ovpn ca-1.crt client-1.crt client-1.key tls-1.key

谢谢。这太棒了。@ user1081275现在欠您啤酒钱。=)
Tamsyn Michael

您的程序在启动时崩溃:分段错误(核心已转储)
Dieter Pisarewski 2015年

我正在使用g ++(GCC)5.1.1进行编译。我刚测试过,似乎没有问题。
woahguy

1

从已保存的.ovpn文件添加VPN的问题仍然失败。

可以手动添加一个。

  1. 选择NM App Indicator,-> VPN->配置VPN->添加-> OpenVPN
  2. 手动命名您的连接并输入服务器的IP地址
  3. 选择认证类型:对我来说是密码+证书
  4. 输入你的用户名与密码
  5. 在接下来的三个框中选择您的证书和密钥。
  6. 从底部选择高级
  7. 输入端口(在.ovpn文件中,通常在IP地址位于“ XX”位置的底部):

    远程###。###。##。## XX

  8. 如果您的VPN是TCP,则选中“使用TCP连接”复选框

  9. 选择确定,然后选择保存。

此时,VPN连接应作为选项列出在NM AppIndicator中。选择并测试您的连接。我能够添加TCP和UDP类型的连接,但是要比导入的.ovpn保存文件能够工作要花更多的时间。

希望他们能尽快解决此问题,以便我可以轻松添加其他连接...但是至少这是一项应能帮助人们像以前一样沮丧的工作。


0

我创建了一个脚本,在这里自动抓取密码和从几个VPN站点如ZIP文件vpnbook.com,提取cacert以及key从OVPN文件中的数据,并更新opvn文件,这样的证书应该只导入你。可以很容易地对其进行修改,以供其他提供商使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.