如何在 Debian 9 上设置 OpenVPN 服务器

2023-11-03

无论您是想在连接不可信的公共 Wi-Fi 网络时安全可靠地访问互联网、绕过地理限制内容还是允许您的同事在远程工作时安全地连接到您的公司网络,使用 VPN 都是最佳解决方案。

VPN 允许您连接到远程 VPN 服务器,使您的连接加密且安全,并通过保持流量数据的私密性来匿名上网。

您可以选择许多商业 VPN 提供商,但您永远无法真正确定提供商没有记录您的活动。最安全的选择是设置您自己的 VPN 服务器。

本教程将解释如何在 Debian 9 上安装和配置 OpenVPN。我们还将向您展示如何生成客户端证书和创建配置文件

OpenVPN 是一个功能齐全的开源安全套接字层 (SSL) VPN 解决方案。它使用 SSL/TLS 协议实现 OSI 第 2 层或第 3 层安全网络扩展。

先决条件#

要完成本教程,您将需要:

  • 须藤访问到具有基本功能的 Debian 9 服务器UFW防火墙我们将在其上安装 OpenVPN 服务。
  • 单独的专用机器作为您的 CA(证书颁发机构)。如果您不想为 CA 使用专用计算机,您可以在 OpenVPN 服务器或本地计算机上构建 CA。完成 CA 构建后,建议将 CA 目录移动到安全或离线的位置。

本教程假设 CA 位于单独的 Debian 9 计算机上。如果您将服务器用作 CA,则将适用相同的步骤(稍作修改)。

我们使用单独的 CA 机器来防止攻击者渗透服务器。如果攻击者设法访问 CA 私钥,他们可以使用它来签署新证书,这将使他们能够访问 VPN 服务器。

使用 EasyRSA 构建 CA#

第一步是建立公钥基础设施(PKI)包括以下内容:

  • 证书颁发机构 (CA) 证书和私钥。
  • 由我们的 CA 颁发的服务器的单独证书和私钥对。
  • 我们的 CA 为每个客户端颁发单独的证书和私钥对。

正如出于安全原因的先决条件中提到的,我们将在独立计算机上构建 CA。

我们将使用名为 EasyRSA 的 CLI 实用程序来创建 CA、生成证书请求并签署证书。

在您的计算机上执行以下步骤CA机:

  1. 首先从项目中下载最新版本的 EasyRSAGithub 存储库与以下wget命令:

    cd && wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
  2. 下载完成后提取存档 :

    tar xzf EasyRSA-unix-v3.0.6.tgz
  3. Navigate到 EasyRSA 目录并创建一个名为的配置文件vars通过复制vars.example file:

    cd ~/EasyRSA-v3.0.6/cp vars.example vars
  4. 打开文件并取消注释并更新以下条目以匹配您的信息。

    nano ~/EasyRSA-v3.0.6/vars
    〜/ EasyRSA-v3.0.6/vars
    set_var EASYRSA_REQ_COUNTRY    "US"
    set_var EASYRSA_REQ_PROVINCE   "Pennsylvania"
    set_var EASYRSA_REQ_CITY       "Pittsburgh"
    set_var EASYRSA_REQ_ORG        "Linuxize"
    set_var EASYRSA_REQ_EMAIL      "admin@linuxize.com"
    set_var EASYRSA_REQ_OU         "Community"
  5. 在生成 CA 密钥对之前,您首先需要使用以下命令初始化新的 PKI:

    ./easyrsa init-pki
    init-pki complete; you may now create a CA or requests.
    Your newly created PKI dir is: /home/causer/EasyRSA-v3.0.6/pki
  6. 下一步是构建 CA:

    ./easyrsa build-ca

    如果您不希望每次签署证书时都提示输入密码,请运行build-ca命令使用nopass选项:./easyrsa build-ca nopass.

    ...
    Enter PEM pass phrase:
    Verifying - Enter PEM pass phrase:
    -----
    ...
    -----
    Common Name (eg: your user, host, or server name) [Easy-RSA CA]:
    
    CA creation complete and you may now import and sign cert requests.
    Your new CA certificate file for publishing is at:
    /home/causer/EasyRSA-v3.0.6/pki/ca.crt

    系统会要求您为 CA 密钥设置密码并输入 CA 的通用名称。

    完成后,脚本将创建两个文件——CA公共证书ca.crt和CA私钥ca.key.

    我们将使用证书颁发机构 (CA) 文件来签署 OpenVPN 服务器和客户端的证书请求。

安装 OpenVPN 和 EasyRSA#

下一步是安装 Debian 存储库中提供的 OpenVPN 软件包,并在 OpenVPN 服务器上下载最新版本的 EasyRSA。

以下步骤是在OpenVPN服务器.

  1. OpenVPN的安装非常简单,只需在OpenVPN服务器:

    sudo apt updatesudo apt install openvpn
  2. 下载最新版本的 EasyRSA:

    cd && wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz

    下载完成后,输入以下命令来提取存档:

    tar xzf EasyRSA-unix-v3.0.6.tgz

    虽然我们已经在CA机器上初始化了一个PKI,但我们还需要在OpenVPN服务器上创建一个新的PKI。为此,请使用与之前相同的命令:

    cd ~/EasyRSA-v3.0.6/./easyrsa init-pki

    如果您仍然想知道为什么我们需要两个 EasyRSA 安装,那是因为我们将使用此 EasyRSA 实例来生成证书请求,该请求将使用上的 EasyRSA 实例进行签名CA机.

    这听起来可能很复杂,而且有点令人困惑,但一旦你阅读了整个教程,你就会发现它实际上并不复杂。

创建 Diffie-Hellman 和 HMAC 密钥#

在本节中,我们将生成一个强大的 Diffie-Hellman 密钥(将在密钥交换期间使用)和一个 HMAC 签名文件,以便为连接添加额外的安全层。

  1. 首先导航到您的 EasyRSA 目录OpenVPN服务器.

    cd ~/EasyRSA-v3.0.6/
  2. 生成 Diffie-Hellman 密钥:

    ./easyrsa gen-dh

    该脚本将生成 2048 位长的 DH 参数。根据您的系统资源,生成可能需要一些时间。完成后,屏幕上将打印以下消息:

    DH parameters of size 2048 created at /home/serveruser/EasyRSA-v3.0.6/pki/dh.pem

    复制dh.pem文件到/etc/openvpn目录:

    sudo cp ~/EasyRSA-v3.0.6/pki/dh.pem /etc/openvpn/
  3. 生成 HMAC 签名:

    openvpn --genkey --secret ta.key

    完成后复制ta.key文件到/etc/openvpn目录:

    sudo cp ~/EasyRSA-v3.0.6/ta.key /etc/openvpn/

创建服务器证书和私钥#

本节介绍如何为 OpenVPN 服务器生成私钥和证书请求。

  1. 导航到您的 EasyRSA 目录OpenVPN服务器并为服务器生成新的私钥和证书请求文件:

    cd ~/EasyRSA-v3.0.6/./easyrsa gen-req server1 nopass

    我们正在使用nopass参数是因为我们想在不输入密码的情况下启动 OpenVPN 服务器。同样在这个例子中,我们使用server1作为服务器名称(实体)标识符。如果您为服务器选择不同的名称,请不要忘记调整下面使用服务器名称的说明。

    该命令将创建两个文件,一个私钥(server1.key)和证书请求文件(server1.req).

    -----
    Common Name (eg: your user, host, or server name) [server1]:
    
    Keypair and certificate request completed. Your files are:
    req: /home/serveruser/EasyRSA-v3.0.6/pki/reqs/server1.req
    key: /home/serveruser/EasyRSA-v3.0.6/pki/private/server1.key
  2. 将私钥复制到/etc/openvpn目录:

    sudo cp ~/EasyRSA-v3.0.6/pki/private/server1.key /etc/openvpn/
  3. 将证书请求文件传输到您的 CA 计算机:

    scp ~/EasyRSA-v3.0.6/pki/reqs/server1.req causer@your_ca_ip:/tmp

    在这个例子中我们使用scp要传输文件,您还可以使用rsync通过 ssh 或任何其他安全方法。

  4. 登录到您的CA机,切换到EasyRSA目录,导入证书请求文件:

    cd ~/EasyRSA-v3.0.6./easyrsa import-req /tmp/server1.req server1

    第一个参数是证书请求文件的路径,第二个参数是服务器短(实体)名称。在我们的例子中,服务器名称是server1.

    The request has been successfully imported with a short name of: server1
    You may now use this name to perform signing operations on this request.

    该命令只是将请求文件复制到pki/reqs目录。

  5. 虽然仍在 EasyRSA 目录中CA机运行以下命令来签署请求:

    cd ~/EasyRSA-v3.0.6./easyrsa sign-req server server1

    第一个参数可以是server or client第二个是服务器短(实体)名称。

    系统将提示您验证该请求是否来自可信来源。类型yes并按enter确认:

    You are about to sign the following certificate.
    Please check over the details shown below for accuracy. Note that this request
    has not been cryptographically verified. Please be sure it came from a trusted
    source or that you have verified the request checksum with the sender.
    
    Request subject, to be signed as a server certificate for 1080 days:
    
    subject=
        commonName                = server1
    
    Type the word 'yes' to continue, or any other input to abort.
    Confirm request details: yes
    ...

    如果您的 CA 密钥受密码保护,系统将提示您输入密码。验证后,脚本将生成 SSL 证书并打印其完整路径。

    ...
    Certificate is to be certified until Sep 17 10:54:48 2021 GMT (1080 days)
    
    Write out database with 1 new entries
    Data Base Updated
    
    Certificate created at: /home/causer/EasyRSA-v3.0.6/pki/issued/server1.crt
  6. 下一步是传输签名的证书server1.crt and ca.crt文件返回到您的 OpenVPN 服务器。再次你可以使用scp, rsync或任何其他安全方法:

    scp ~/EasyRSA-v3.0.6/pki/issued/server1.crt serveruser@your_server_ip:/tmpscp ~/EasyRSA-v3.0.6/pki/ca.crt serveruser@your_server_ip:/tmp
  7. 登录到您的OpenVPN服务器,并移动server1.crt and ca.crt文件到/etc/openvpn/目录:

    sudo mv /tmp/{server1,ca}.crt /etc/openvpn/

完成本节中概述的步骤后,您的计算机上应该有以下新文件OpenVPN服务器:

  • /etc/openvpn/ca.crt
  • /etc/openvpn/dh.pem
  • /etc/openvpn/ta.key
  • /etc/openvpn/server1.crt
  • /etc/openvpn/server1.key

配置 OpenVPN 服务#

现在您已拥有由 CA 签名的服务器证书并已传输到您的OpenVPN服务器,是时候配置 OpenVPN 服务了。

我们将使用 OpenVPN 安装包提供的示例配置文件作为起点,然后向其中添加我们自己的自定义配置选项。

首先将配置文件解压到/etc/openvpn/目录:

sudo sh -c "gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server1.conf"

使用您喜欢的文本编辑器打开文件:

sudo nano /etc/openvpn/server1.conf
  • 找到证书、密钥和 DH 参数指令并更改文件名:

    /etc/openvpn/server1.conf
    cert server1.crt
    key server1.key 
    
    dh dh.pem
  • 要通过 VPN 重定向客户端流量,请找到并取消注释redirect-gateway and dhcp-option选项:

    /etc/openvpn/server1.conf
    push "redirect-gateway def1 bypass-dhcp"
    
    push "dhcp-option DNS 208.67.222.222"
    push "dhcp-option DNS 208.67.220.220"

    默认情况下使用 OpenDNS 解析器。您可以更改它并使用 CloudFlare、Google 或您想要的任何其他 DNS 解析器。

  • 找出user and group指令并通过删除“来取消注释这些设置;” 在每行的开头:

    /etc/openvpn/server1.conf
    user nobody
    group nogroup
  • 将以下行添加到文件末尾。该指令会将消息身份验证算法 (HMAC) 从 SHA1 更改为 SHA256

    /etc/openvpn/server1.conf
    auth SHA256

完成后,服务器配置文件(不包括注释)应如下所示:

/etc/openvpn/server1.conf
port 1194
proto udp
dev tun
ca ca.crt
cert server1.crt
key server1.key  # This file should be kept secret
dh dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
keepalive 10 120
tls-auth ta.key 0 # This file is secret
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
verb 3
explicit-exit-notify 1
auth SHA256

启动 OpenVPN 服务#

在本教程中,我们使用了server1.conf作为配置文件。要使用此配置启动 OpenVPN 服务,我们需要在 systemd 单元文件名后指定配置文件名:

On your OpenVPN服务器运行以下命令启动OpenVPN服务:

sudo systemctl start openvpn@server1

通过键入以下内容验证服务是否已成功启动:

sudo systemctl status openvpn@server1

如果服务处于活动状态并正在运行,输出将如下所示:

● openvpn@server1.service - OpenVPN connection to server1
   Loaded: loaded (/lib/systemd/system/openvpn@.service; disabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-03-19 03:49:53 PDT; 3s ago
     Docs: man:openvpn(8)
           https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage
           https://community.openvpn.net/openvpn/wiki/HOWTO
  Process: 1722 ExecStart=/usr/sbin/openvpn --daemon ovpn-server1 --status /run/openvpn/server1.status 10 --cd /etc/openvpn --config /etc/openvpn/server1.conf --writepid /run/openvpn/server1.pid (code=exited, status=0/SUCCESS)
 Main PID: 1723 (openvpn)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/system-openvpn.slice/openvpn@server1.service
           └─1723 /usr/sbin/openvpn --daemon ovpn-server1 --status /run/openvpn/server1.status 10 --cd /etc/openvpn --config /etc/openvpn/server1.conf --writepid /run/openvpn/server1.pid

启用服务在启动时自动启动:

sudo systemctl enable openvpn@server1
Created symlink /etc/systemd/system/multi-user.target.wants/openvpn@server1.service → /lib/systemd/system/openvpn@.service.
如果 OpenVPN 服务无法启动,请检查日志sudo journalctl -u openvpn@server1

启动时,OpenVPN Server 会创建一个 tun 设备tun0。要验证它,请使用以下命令ip命令 :

ip a show tun0

输出应如下所示:

3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
       valid_lft forever preferred_lft forever

至此,您的 OpenVPN 服务器已配置并正常运行。

防火墙和服务器网络配置#

为了正确转发网络数据包,我们需要启用IP转发。

以下步骤是在OpenVPN服务器.

打开/etc/sysctl.conf文件并添加或取消注释读取的行net.ipv4.ip_forward = 1:

sudo nano /etc/sysctl.conf
/etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

完成后,保存并关闭文件。

通过运行以下命令应用新设置sysctl命令:

sudo sysctl -p
net.ipv4.ip_forward = 1

如果您遵循先决条件,您应该已经拥有UFW防火墙在您的服务器上运行。

现在我们需要添加防火墙规则以启用伪装。这将允许流量离开 VPN,从而使您的 VPN 客户端能够访问互联网。

在添加规则之前,您需要了解 Debian OpenVPN 服务器的公共网络接口。您可以通过运行以下命令轻松找到该接口:

ip -o -4 route show to default | awk '{print $5}'

在我们的例子中,该接口被命名为eth0如下面的输出所示。您的界面可能会有不同的名称。

eth0

默认情况下,使用 UFW 时转发的数据包将被丢弃。我们需要改变这一点并指示我们的防火墙允许转发数据包。

打开UFW配置文件,找到DEFAULT_FORWARD_POLICY键并更改值DROP to ACCEPT:

sudo nano /etc/default/ufw
/etc/默认/ufw
...
# Set the default forward policy to ACCEPT, DROP or REJECT.  Please note that
# if you change this you will most likely want to adjust your rules
DEFAULT_FORWARD_POLICY="ACCEPT"
...

接下来,我们需要设置默认策略POSTROUTING链入 nat 表并设置伪装规则。

为此,请打开/etc/ufw/before.rules文件并附加以黄色突出显示的行,如下所示。

sudo nano /etc/ufw/before.rules

别忘了更换eth0 in the -A POSTROUTING行以匹配您在上一个命令中找到的公共网络接口的名称。粘贴以以下内容开头的最后一行之后的行COMMIT.

/etc/ufw/before.rules
...
# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT

#NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]

# Forward traffic through eth0 - Change to public network interface
-A POSTROUTING -s 10.8.0.0/16 -o eth0 -j MASQUERADE

# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT

完成后,保存并关闭文件。

我们还需要打开端口上的 UDP 流量1194这是默认的 OpenVPN 端口。为此,请运行以下命令:

sudo ufw allow 1194/udp

如果您忘记打开 SSH 端口,为避免被锁定,请运行以下命令打开端口:

sudo ufw allow OpenSSH

最后通过禁用并重新启用 UFW 来重新加载 UFW 规则:

sudo ufw disablesudo ufw enable

要验证更改,请运行以下命令来列出 POSTROUTING 规则:

sudo iptables -nvL POSTROUTING -t nat
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 MASQUERADE  all  --  *      eth0    10.8.0.0/16          0.0.0.0/0  

创建客户端配置基础设施#

在本教程中,我们将创建一个单独的 SSL 证书并为每个 VPN 客户端生成不同的配置文件。

客户端私钥和证书请求可以在客户端计算机或服务器上生成。为了简单起见,我们将在服务器上生成证书请求,然后将其发送到 CA 进行签名。

生成客户端证书和配置文件的整个过程如下:

  1. 在 OpenVPN 服务器上生成私钥和证书请求。
  2. 将请求发送到要签名的 CA 机器。
  3. 将签名的 SSL 证书复制到 OpenVPN 服务器并生成配置文件。
  4. 将配置文件发送到 VPN 客户端的计算机。

首先创建一组目录来存储客户端文件:

mkdir -p ~/openvpn-clients/{configs,base,files}
  • base目录将存储将在所有客户端文件之间共享的基本文件和配置。
  • configs目录将存储生成的客户端配置。
  • files目录将存储特定于客户端的证书/密钥对。

复制ca.crt and ta.key文件到~/openvpn-clients/base目录:

cp ~/EasyRSA-v3.0.6/ta.key ~/openvpn-clients/base/cp /etc/openvpn/ca.crt ~/openvpn-clients/base/

接下来将示例 VPN 客户端配置文件复制到客户端 -~/openvpn-clients/base目录。我们将使用此文件作为基本配置:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/openvpn-clients/base/

现在我们需要编辑该文件以匹配我们的服务器设置和配置。使用文本编辑器打开配置文件:

nano ~/openvpn-clients/base/client.conf
  • 找到远程指令并使用 OpenVPN 服务器的公共 IP 地址更改默认占位符:

    〜/openvpn-clients/base/client.conf
    # The hostname/IP and port of the server.
    # You can have multiple remote entries
    # to load balance between the servers.
    remote YOUR_SERVER_IP 1194
  • 找到并评论ca, cert, and key指令。证书和密钥将添加到配置文件中:

    〜/openvpn-clients/base/client.conf
    # SSL/TLS parms.
    # See the server config file for more
    # description.  It's best to use
    # a separate .crt/.key file pair
    # for each client.  A single ca
    # file can be used for all clients.
    # ca ca.crt
    # cert client.crt
    # key client.key
  • 在文件末尾附加以下行以匹配服务器设置:

    〜/openvpn-clients/base/client.conf
    auth SHA256

完成后,服务器配置文件应如下所示:

〜/openvpn-clients/base/client.conf
client
dev tun
proto udp
remote YOUR_SERVER_IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
verb 3
auth SHA256
key-direction 1

接下来,创建一个简单的 bash 脚本,将基本配置和文件与客户端证书和密钥合并,并将生成的配置存储在~/openvpn-clients/configs目录。

打开文本编辑器并创建以下脚本:

nano ~/openvpn-clients/gen_config.sh
〜/openvpn-clients/gen_config.sh
#!/bin/bash

FILES_DIR=$HOME/openvpn-clients/files
BASE_DIR=$HOME/openvpn-clients/base
CONFIGS_DIR=$HOME/openvpn-clients/configs

BASE_CONF=${BASE_DIR}/client.conf
CA_FILE=${BASE_DIR}/ca.crt
TA_FILE=${BASE_DIR}/ta.key

CLIENT_CERT=${FILES_DIR}/${1}.crt
CLIENT_KEY=${FILES_DIR}/${1}.key

# Test for files
for i in "$BASE_CONF" "$CA_FILE" "$TA_FILE" "$CLIENT_CERT" "$CLIENT_KEY"; do
    if [[ ! -f $i ]]; then
        echo " The file $i does not exist"
        exit 1
    fi

    if [[ ! -r $i ]]; then
        echo " The file $i is not readable."
        exit 1
    fi
done

# Generate client config
cat > ${CONFIGS_DIR}/${1}.ovpn <<EOF
$(cat ${BASE_CONF})
<key>
$(cat ${CLIENT_KEY})
</key>
<cert>
$(cat ${CLIENT_CERT})
</cert>
<ca>
$(cat ${CA_FILE})
</ca>
<tls-auth>
$(cat ${TA_FILE})
</tls-auth>
EOF

保存文件并使其可执行chmod :

chmod u+x ~/openvpn-clients/gen_config.sh

创建客户端证书私钥和配置#

生成客户端私钥和证书请求的过程与生成服务器密钥和证书请求时的过程相同。

正如我们在上一节中已经提到的,我们将在 OpenVPN 服务器上生成客户端私钥和证书请求。在此示例中,第一个 VPN 客户端的名称为client1.

  1. 导航到您的 EasyRSA 目录OpenVPN服务器并为客户端生成新的私钥和证书请求文件:

    cd ~/EasyRSA-v3.0.6/./easyrsa gen-req client1 nopass

    该命令将创建两个文件,一个私钥(client1.key)和证书请求文件(client1.req).

    Common Name (eg: your user, host, or server name) [client1]:
    
    Keypair and certificate request completed. Your files are:
    req: /home/serveruser/EasyRSA-v3.0.6/pki/reqs/client1.req
    key: /home/serveruser/EasyRSA-v3.0.6/pki/private/client1.key
  2. Copy私钥client1.key to the ~/openvpn-clients/files您在上一节中创建的目录:

    cp ~/EasyRSA-v3.0.6/pki/private/client1.key ~/openvpn-clients/files/
  3. 将证书请求文件传输到您的 CA 计算机:

    scp ~/EasyRSA-v3.0.6/pki/reqs/client1.req causer@your_ca_ip:/tmp

    在这个例子中我们使用scp要传输文件,您还可以使用rsync通过 ssh 或任何其他安全方法。

  4. 登录到您的CA机,切换到EasyRSA目录,导入证书请求文件:

    cd ~/EasyRSA-v3.0.6./easyrsa import-req /tmp/client1.req client1

    第一个参数是证书请求文件的路径,第二个参数是客户端名称。

    The request has been successfully imported with a short name of: client1
    You may now use this name to perform signing operations on this request.
  5. 从 EasyRSA 目录中CA机运行以下命令来签署请求:

    cd ~/EasyRSA-v3.0.6./easyrsa sign-req client client1

    系统将提示您验证该请求是否来自可信来源。类型yes并按enter确认:

    如果您的 CA 密钥受密码保护,系统将提示您输入密码。验证后,脚本将生成 SSL 证书并打印其完整路径。

    ...
    Certificate created at: /home/causer/EasyRSA-v3.0.6/pki/issued/client1.crt
  6. 接下来,传输签名的证书client1.crt文件传回您的 OpenVPN 服务器。您可以使用scp , rsync或任何其他安全方法:

    scp ~/EasyRSA-v3.0.6/pki/issued/client1.crt serveruser@your_server_ip:/tmp
  7. 登录到您的OpenVPN服务器,并移动client1.crt文件到~/openvpn-clients/files目录:

    mv /tmp/client1.crt ~/openvpn-clients/files
  8. 最后一步是使用以下命令生成客户端配置gen_config.sh脚本。切换到~/openvpn-clients目录并使用客户端名称作为参数运行脚本:

    cd ~/openvpn-clients./gen_config.sh client1

    该脚本将创建一个名为client1.ovpn in the ~/client-configs/configs目录。您可以通过列出目录来检查:

    ls ~/openvpn-clients/configs
    client1.ovpn

至此,客户端配置已创建。您现在可以将配置文件传输到要用作客户端的设备。

例如,将配置文件传输到本地计算机scp您应该运行以下命令:

scp ~/openvpn-clients/configs/client1.ovpn your_local_ip:/

要添加其他客户端,只需重复相同的步骤即可。

连接客户端#

Linux #

您的发行版或桌面环境可能提供连接到 OpenVPN 服务器的工具或图形用户界面。在本教程中,我们将向您展示如何使用openvpn tool.

  • 在 Ubuntu 和 Debian 上安装 OpenVPN

    sudo apt updatesudo apt install openvpn
  • 在 CentOS 和 Fedora 上安装 OpenVPN

    sudo yum install epel-releasesudo yum install openvpn

安装软件包后,要连接到 VPN 服务器,请使用openvpn命令并指定客户端配置文件:

sudo openvpn --config client1.ovpn

macOS #

隧道布里克是 OS X 和 macOS 上 OpenVPN 的免费开源图形用户界面。

Windows #

下载并安装最新版本的 OpenVPN 应用程序OpenVPN 的下载页面 .

复制.ovpn文件到 OpenVPN 配置文件夹(\Users\<Name>\OpenVPN\Config or \Program Files\OpenVPN\config).

启动 OpenVPN 应用程序。

右键单击 OpenVPN 系统托盘图标,您复制的 OpenVPN 配置文件的名称将在菜单中列出。单击“连接”。

安卓和iOS#

OpenVPN 开发的 VPN 应用程序适用于 Android 和 iOS。安装应用程序并导入客户端.ovp file.

  • Android OpenVPN 连接
  • iOS OpenVPN 连接

吊销客户端证书#

吊销证书意味着使已签名的证书失效,使其不能再用于访问 OpenVPN 服务器。

要吊销客户端证书,请按照以下步骤操作:

  1. 登录到您的CA机并切换到 EasyRSA 目录:

    cd EasyRSA-v3.0.6
  2. 使用以下命令运行 easyrsa 脚本revoke参数,后跟您要撤销的客户端名称:

    ./easyrsa revoke client1

    系统将提示您验证是否要吊销证书。类型yes并按enter确认:

    Please confirm you wish to revoke the certificate with the following subject:
    
    subject=
        commonName                = client1
    
    Type the word 'yes' to continue, or any other input to abort.
    Continue with revocation: yes
    ...

    如果您的 CA 密钥受密码保护,系统将提示您输入密码。一旦验证,脚本将撤销证书。

    ...
    Revocation was successful. You must run gen-crl and upload a CRL to your
    infrastructure in order to prevent the revoked cert from being accepted.
  3. Use the gen-crl生成证书吊销列表 (CRL) 的选项:

    ./easyrsa gen-crl
    An updated CRL has been created.
    CRL file: /home/causer/EasyRSA-v3.0.6/pki/crl.pem
  4. 将 CRL 文件上传到 OpenVPN 服务器:

    scp ~/EasyRSA-v3.0.6/pki/crl.pem serveruser@your_server_ip:/tmp
  5. 登录到您的OpenVPN服务器服务器和移动文件 to the /etc/openvpn目录:

    sudo mv /tmp/crl.pem /etc/openvpn
  6. 打开OpenVPN服务器配置文件:

    sudo nano /etc/openvpn/server1.conf

    将以下行粘贴到文件末尾

    /etc/openvpn/server1.conf
    crl-verify crl.pem

    保存并关闭文件。

  7. 重启OpenVPN服务以使撤销指令生效:

    sudo systemctl restart openvpn@server1

    此时,客户端应该无法再使用已吊销的证书访问 OpenVPN 服务器。

如果您需要撤销其他客户端证书,只需重复相同的步骤。

结论#

在本教程中,您学习了如何在 Debian 9 计算机上安装和配置 OpenVPN 服务器。

如果您遇到任何问题,请随时发表评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Debian 9 上设置 OpenVPN 服务器 的相关文章

  • GWT SafeHTML、XSS 和最佳实践

    OWASP 的优秀人员强调 您必须对 HTML 文档中要放入不受信任数据的部分 正文 属性 JavaScript CSS 或 URL 使用转义语法 看OWASP XSS https www owasp org index php XSS 2
  • 使用 C# 作为我的 DSL——这可能吗?如果可以,如何实现?

    是否可以使用 C 作为 DSL其中 C 源代码由最终用户在 TextBox 中编辑 在应用程序运行时编译 然后由已运行的应用程序调用 我问这个问题是因为在接下来的几个月里 我将需要实现一个简单的数学运算 DSL 类似于 Rachel Lim
  • 良好的安全实践和自动身份范围管理是否相互排斥?

    我正在尝试使用自动身份范围管理 http msdn microsoft com en us library ms152543 aspx sectionToggle1 但是 确保我的用户可以在具有标识列的表中插入记录的唯一方法是使它们db o
  • JSON 安全最佳实践?

    在研究这个问题的同时JSON 与 XML http www subbu org blog 2006 08 json vs xml 我碰到这个问题 https stackoverflow com questions 325085 when t
  • 通过访问硬盘序列号来保护软件[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想获得VB NET或VB代码来在启
  • JSON 响应周围的注释块

    我注意到一些 Web 应用程序返回 AJAX 响应 并在注释块中嵌入 JSON 数据 例如 这是一个示例响应 firstName John lastName Smith address streetAddress 21 2nd Street
  • 信任所有将文件发送到 https Web 服务的 java 类

    我需要编写自己的类来告诉 mule 与服务 wsdl 的 https 连接已验证 我的 mule 项目已经接近完成 但最后一块丢失了 在特定的 url 发送文件 我想要实现的目标 建立连接并将 xml 发送到目标 url 读取 xml 格式
  • 连接到 VPN 时 HttpClient.GetAsync 超时

    当系统不使用 VPN 时 C 4 5 2 框架 HttpClient GetAsync 方法在 Windows 10 上运行良好 连接 VPN 后 对同一地址的 HttpClient GetAsync 调用只会阻塞 直到超时 Edge 和
  • 用户如何登录定义了读者角色的 couchapp?

    我通过 Couchapp 部署了我的应用程序 这意味着整个应用程序是从数据库中提供服务的 我不希望 Couchdb 数据库中的数据公开可用 因此我指定了用户在向他提供数据之前必须具有的读者角色 然而 当我去申请时 我所能得到的是 error
  • 保护 JSF 应用程序的安全

    我的一位自由职业者朋友邀请我加入他的 JSF 2 0 项目 我正在慢慢加快速度并将各个部分整合在一起 来自 Windows Forms NET 世界 至少可以说 我还有很多东西需要学习 我主要担心的是对于如何保护 JSF 应用程序缺乏明显的
  • 如何在 Debian 上编译 DOS 程序?

    在我的汇编语言课程中 我们使用 DPMI 编写 DOS 程序 不幸的是 我无法一直使用 32 位 Windows 机器 我在我使用的几乎每台计算机上都安装了 Debian 虚拟机 我已经安装了 DOSBox 和 DOSEMU 有什么办法可以
  • 如何更改Python使用的SQLite版本?

    我在 Debian 9 12 上安装了 Python 3 8 和 SQLite 3 16 2 并且需要升级到较新版本的 SQLite 我已经下载并编译了 SQLite 网站上提供的合并 并将其放入 usr bin 所以当我这样做时 sqli
  • 用于防止滥用的 Servlet 过滤器? (DoS、垃圾邮件等)

    我正在寻找一个 Servlet 过滤器库 它可以帮助我保护我们的 Web 服务免受未经授权的使用和 DDoS 攻击 我们的网络服务有 授权客户 因此理想情况下 过滤器将帮助检测未经授权或行为不当的客户 或检测使用同一帐户的多个人 此外 我们
  • JavaScript 中的安全数据

    我必须为 Web 测试创建生成器 使用 HTML 和 JavaScript 测试必须离线和在线进行 正确答案和分数评估必须是生成的测试的一部分 最终用户的分数仅发送到服务器 无法在服务器上进行评估 并且服务器对问题一无所知 它只保存最终分数
  • AES 在汇编中的实现 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 大家好 我正在尝试构建一个代码来演示
  • 警告:您的 git 版本是 1.9.3。存在严重的安全漏洞

    我在部署到 Heroku 期间收到有关 git 1 9 3 严重安全漏洞的警告 我尝试通过 homebrew 更新 git 但发现 git 最初并不是通过 homebrew 安装的 然后我通过自制程序安装了它 brew update bre
  • 非加密用途的最快哈希值?

    我本质上是在准备要放入数据库的短语 它们可能格式错误 所以我想存储它们的简短散列 我将简单地比较它们是否存在 所以散列是理想的 我假设 MD5 在处理 100 000 个请求时相当慢 所以我想知道散列短语的最佳方法是什么 也许推出我自己的散
  • 清理 html 字符串中的所有脚本

    HTML5 剪贴板很棒 但我正在寻找一种使其安全的方法 用户正在将文本 html 粘贴到我的网页中 这允许他们粘贴图像 表格等 我正在寻找一种方法 在将粘贴的内容添加到页面之前删除所有脚本 我需要删除
  • 是否可以使用流上下文在 PHP 下使用 FTPS?

    我了解到使用ftpsPHP for Windows 下的 ftp ssl connect 很困难 您被要求进入构建自己的二进制文件以包括 Open SSL 的漫长旅程 我找到了以下建议phpseclib http phpseclib sou
  • Keystore getEntry 在 Android 9 上返回 NULL

    c我已对存储在 Android 密钥库中的登录密码进行了加密和解密 在 Android 9 上 我观察到应用程序在尝试解密密码时崩溃 我无法重现它 但拥有 Pixel 3 的用户是崩溃的设备之一 下面是我如何从密钥库解密密码 private

随机推荐

  • 生成可执行程序四个步骤:预处理、编译、汇编、链接

    预处理 相当于根据预处理指令组装新的c c 程序 经过预处理 会产生一个没有头文件 都已经被展开了 宏定义 都已经替换了 没有条件编译指令 该屏蔽的都屏蔽掉了 没有特殊符号的输出文件 这个文件的含义同原本的文件无异 只是内容上有所不同 编译
  • 如何在 Apache 中启用或禁用 CGI 脚本

    通用网关接口 CGI 是一种标准协议 使 Web 服务器能够执行外部脚本并向 Web 客户端返回动态内容 Apache 是使用最广泛的 Web 服务器之一 它支持开箱即用的 CGI 脚本 在本文中 我们将解释如何在各种平台 包括 Ubunt
  • S3FS:在 Ubuntu 和 Debian 系统上安装 Amazon S3 存储桶

    Amazon S3 是一种高度可扩展且持久的对象存储服务 允许您从网络上的任何位置存储和检索任意数量的数据 S3FS 是 Amazon S3 的 FUSE 用户空间中的文件系统 接口 允许您将 Amazon S3 存储桶作为本地文件系统挂载
  • 如何在 CentOS/RHEL 8 上创建没有 Shell 访问权限的 SFTP 用户

    SFTP SSH 文件传输协议 是两个系统之间的安全文件传输协议 它通过 SSH 协议运行并共享相同的端口 22 本教程将帮助您在 CentOS 8 和 RedHat 8 系统上创建仅 SFTP 访问用户 无 ssh 访问权限 用户只能通过
  • 什么是MySQL?

    MySQL 是一个存储网站数据的数据库系统 它是一种 RDBMS 关系数据库管理系统 这意味着它将数据组织到表中 您可以使用 SQL 命令访问和更新数据 许多流行网站都使用 MySQL 包括 Facebook Twitter 和 YouTu
  • 如何在 Bash 中创建和使用数组

    Bash 是一种流行的命令行界面 常用于 Linux 和基于 Unix 的系统 Bash 的强大功能之一是能够使用数组 Bash 数组提供了一种在单个变量中存储多个值的方法 从而可以轻松访问和操作这些值 在本教程中 我们将探索如何在 Bas
  • 解决“laravel.log 无法打开”的问题:分步解决方案

    Laravel 是一个富有表现力且优雅的 PHP 框架 由于其语法和强大的功能而被广泛应用于 Web 应用程序开发 然而 与所有技术一样 它也并非没有挑战 许多开发人员遇到的一个常见错误是 laravel log 无法打开 错误 本文提供了
  • 如何在 Ubuntu 22.04 中创建 SFTP 用户(无 Shell 访问)

    SFTP 是一种允许通过网络安全传输文件的协议 它经常被企业和个人用来传输敏感数据 SFTP 与 FTP 类似 但使用不同的协议进行通信 SFTP 比 FTP 更安全 通常与 SSH Secure Shell 结合使用以提供更高级别的安全性
  • 如何在 Debian 8 上安装和配置 Squid Proxy

    Squid 是类 Unix 操作系统上流行的代理服务器 它还用于网页过滤 它广泛用于通过缓存重复数据来提高 Web 服务器速度 本教程帮助您在 Debian 8 Jessie 系统上安装 Squid 代理服务器 还提供代理服务器的基本配置详
  • 从 Linux 文件中删除具有匹配模式的行

    操作文件是掌握 Linux 的基本部分 了解如何删除与特定模式匹配的行尤其有用 这可以使用多种命令行工具来实现 例如 grep sed 和 awk 在本文中 我们将探讨如何使用这些工具从 Linux 文件中查找和删除与特定模式匹配的行 开始
  • ffmpeg:加载共享库时出错:libavdevice.so.55:无法打开共享对象文件:没有这样的文件或目录

    Error 在 CentOS 6 5 服务器上安装 ffmpeg 后 我遇到以下错误 ffmpeg error while loading shared libraries libavdevice so 55 cannot open sha
  • 如何在 Debian 8 上安装 PHP(7.2、7.1 和 5.6)

    PHP 7 2 是可供安装的最新稳定版本 本教程将帮助您在系统上安装多个 PHP 版本 现在按照本教程在 Debian 8 Jessie 上安装 PHP 先决条件 使用 shell 访问登录到您的 Debian 8 系统 对于远程系统 使用
  • 如何在 Windows 批处理脚本中添加睡眠/等待

    您可以使用timeout命令等待命令提示符或批处理脚本指定的时间 时间定义为Seconds 例如等待5秒使用 使用 T选项 c gt timeout T 5 您还可以直接指定秒 例如 c gt timeout 5 上述命令将在按任意键时中断
  • 如何在 CentOS 7 上安装 Apache Maven

    Apache Maven 是一个免费的开源项目管理和理解工具 主要用于 Java 项目 Maven 使用项目对象模型 POM 它本质上是一个 XML 文件 其中包含有关项目 配置详细信息 项目依赖项等的信息 在本教程中 我们将向您展示在 C
  • 如何在 CentOS 8 上安装和配置 ownCloud

    ownCloud是一个用于管理和共享文件的开源 自托管云平台 它可以用作 Dropbox Microsoft OneDrive 和 Google Drive 的替代品 ownCloud 可通过应用程序进行扩展 并拥有适用于所有主要平台的桌面
  • 如何在 Ubuntu 18.04 上安装 VMware Workstation Player

    VMware是一个成熟稳定的虚拟化解决方案 允许您在一台机器上运行多个独立的操作系统 借助 VMware Workstation Player 您可以创建并运行自己的虚拟机 并评估由许多软件供应商提供的作为虚拟设备分发的软件VMware 解
  • 如何在 CentOS 7 上安装 Pip

    Pip 是一个包管理系统 可简化用 Python 编写的软件包 例如 Python 包索引 PyPI 中的软件包 的安装和管理 CentOS 7 上默认不安装 Pip 但安装非常简单 在本教程中 我们将逐步完成安装 Python 所需的步骤
  • 如何设置自动 Odoo 备份

    在本教程中 我们将引导您完成创建 Odoo 数据库的自动每日备份的过程 Odoo 是最流行的开源 ERP 系统 用 Python 编写 并使用 PostgreSQL 作为数据库后端 Odoo 将其数据存储在 PostgreSQL 数据库中
  • 如何在 Ubuntu 18.04 上安装和配置 Nagios

    Nagios 是最流行的开源监控系统之一 Nagios 保留整个 IT 基础设施的清单 并确保您的网络 服务器 应用程序 服务和流程正常运行 如果发生故障或性能不佳 Nagios 将通过各种方法发送通知警报 本教程将指导您完成在 Ubunt
  • 如何在 Debian 9 上设置 OpenVPN 服务器

    无论您是想在连接不可信的公共 Wi Fi 网络时安全可靠地访问互联网 绕过地理限制内容还是允许您的同事在远程工作时安全地连接到您的公司网络 使用 VPN 都是最佳解决方案 VPN 允许您连接到远程 VPN 服务器 使您的连接加密且安全 并通