在Ubuntu 20.04上安装和设置OpenVPN Server

在本指南中,我们将学习如何在Ubuntu 20.04上安装和设置OpenVPN Server。 开放VPN 是一款功能强大且高度灵活的开源VPN软件,它使用OpenSSL库的所有加密,身份验证和认证功能在单个UDP或TCP端口上安全地隧道IP网络。

它促进了专用网络在公共网络上的扩展,访问远程站点,建立安全的点对点连接,同时保持了在专用网络中可以实现的安全性。

在Ubuntu 20.04上安装和设置OpenVPN Server

运行系统更新

apt update
apt upgrade

在Ubuntu 20.04上安装OpenVPN

默认的Ubuntu 20.04存储库上提供了OpenVPN软件包。因此安装就像运行下面的命令一样简单。

apt install openvpn

在Ubuntu 20.04上安装Easy-RSA CA Utility

Easy-RSA软件包提供了用于生成用于保护VPN连接的SSL密钥对的实用程序。

apt install easy-rsa

创建OpenVPN公钥基础结构

安装easy-rsa后,您需要初始化OpenVPN PKI。 PKI包括:

  • 服务器和每个客户端的公用密钥和专用密钥
  • 主证书颁发机构(CA)证书和密钥,用于对每个服务器和客户端证书进行签名。

在继续之前,请将easy-rsa配置目录复制到其他位置,以确保将来的OpenVPN软件包升级不会覆盖您的修改。

cp -r /usr/share/easy-rsa /etc/

接下来,初始化PKI。

cd /etc/easy-rsa/
./easyrsa init-pki

初始化PKI后, /etc/easy-rsa/pki 被建造。

生成证书颁发机构(CA)证书和密钥

接下来,生成用于签署OpenVPN服务器和客户端证书的CA证书和密钥。

cd /etc/easy-rsa/
./easyrsa build-ca

这将提示您输入CA密钥密码和服务器通用名称。

Using SSL: openssl OpenSSL 1.1.1f  31 Mar 2020

Enter New CA Key Passphrase: ENTER PASSWORD
Re-Enter New CA Key Passphrase: RE-ENTER PASSWORD
Generating RSA private key, 2048 bit long modulus (2 primes)
...................+++++
..............+++++
e is 65537 (0x010001)
Can't load /etc/easy-rsa/pki/.rnd into RNG
139840045897024:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:98:Filename=/etc/easy-rsa/pki/.rnd
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:Kifarunix-demo CA

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/easy-rsa/pki/ca.crt

CA证书已生成并存储在 /etc/easy-rsa/pki/ca.crt

生成Diffie Hellman参数

在OpenVPN服务器和连接的客户端之间的TLS握手期间,生成用于密钥交换的Diffie-Hellman密钥。该命令已在Easy-RSA目录中执行;

./easyrsa gen-dh

在以下位置创建大小为2048的DH参数 /etc/easy-rsa/pki/dh.pem

生成OpenVPN服务器证书和密钥

要为OpenVPN服务器生成证书和私钥,请运行以下命令;

cd /etc/easy-rsa
./easyrsa build-server-full server nopass

输入上面创建的CA密钥密码短语以生成证书和密钥。

nopass 禁用密码短语的使用。

生成基于哈希的消息认证码(HMAC)密钥

TLS / SSL预共享认证密钥用作所有SSL / TLS握手数据包上的附加HMAC签名,以避免DoS攻击和UDP端口泛洪。这可以使用命令生成;

openvpn --genkey --secret /etc/easy-rsa/pki/ta.key

生成OpenVPN吊销证书

要使先前签署的证书无效,您需要生成吊销证书。在Easy-RSA目录中运行脚本;

./easyrsa gen-crl

吊销证书已生成并存储在 /etc/easy-rsa/pki/crl.pem

将服务器证书和密钥复制到服务器配置目录

将所有生成的服务器证书/密钥复制到OpenVPN服务器配置目录。

cp -rp /etc/easy-rsa/pki/{ca.crt,dh.pem,ta.key,crl.pem,issued,private} /etc/openvpn/server/

生成OpenVPN客户端证书和密钥

可以如下生成OpenVPN客户端证书和私钥

cd /etc/easy-rsa
./easyrsa build-client-full koromicha nopass
  • 哪里 koromicha 是为其生成证书和密钥的客户端的名称。
  • 对于要为其生成证书和密钥的每个客户端,请始终使用唯一的通用名称。

要为第二个客户生成,

./easyrsa build-client-full janedoe nopass

您可以看到使用方法 easyrsa 用命令 ./easyrsa --help

将客户端证书和密钥复制到客户端目录

创建OpenVPN客户端目录。例如,我们为koromicha和janedoe这两个客户端生成了证书和密钥文件,因此我们将目录创建为:

mkdir /etc/openvpn/client/{koromicha,janedoe}

之后,将客户端生成的证书/密钥和服务器CA证书复制到OpenVPN客户端配置目录。您可以

cp -rp /etc/easy-rsa/pki/{ca.crt,issued/koromicha.crt,private/koromicha.key} /etc/openvpn/client/koromicha
cp -rp /etc/easy-rsa/pki/{ca.crt,issued/janedoe.crt,private/janedoe.key} /etc/openvpn/client/janedoe/

在Ubuntu 20.04上配置OpenVPN Server

下一步是配置OpenVPN服务器。将样本OpenVPN服务器配置复制到 /etc/openvpn/server 目录如下图所示;

cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/server/

提取配置并对其进行修改以适合您的需求;

cd /etc/openvpn/server/
gunzip server.conf.gz
vim /etc/openvpn/server/server.conf

这就是我们的示例配置的样子,没有任何评论。对该配置进行了高度注释,以帮助您了解各种选项的用法。

port 1194
proto udp
dev tun
ca ca.crt
cert issued/server.crt
key private/server.key  # This file should be kept secret
dh dh.pem
topology subnet
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 192.168.2.11"
client-to-client
keepalive 10 120
tls-auth ta.key 0 # This file is secret
cipher AES-256-CBC
comp-lzo
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append  /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 1
auth SHA512

完成编辑后,保存并退出配置。

配置OpenVPN IP转发

为了确保来自客户端的流量通过OpenVPN服务器的IP地址进行路由(帮助屏蔽客户端IP地址),您需要在OpenVPN服务器上启用IP转发。

取消注释行, net.ipv4.ip_forward=1, 上 /etc/sysctl.conf 为IPv4启用数据包转发

sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf

应用更改而无需重新引导服务器。

sysctl --system

允许通过防火墙的OpenVPN服务端口;

ufw allow 1194/udp

在UFW上配置IP伪装

查找通过其发送数据包的默认接口。

ip route get 8.8.8.8
8.8.8.8 via 10.0.2.2 dev enp0s3 src 10.0.2.15 uid 0

接下来,更新UFW规则;

vim /etc/ufw/before.rules

将以下突出显示的行添加到 *filter 表设置。请注意,所使用的接口应与上面的接口名称匹配。

...
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o enp0s3 -j MASQUERADE
COMMIT
# Don't delete these required lines, otherwise there will be errors
*filter
...

保存并退出配置。

使能UFW报文转发功能;

sed -i 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufw

重新加载UFW;

ufw reload

在Ubuntu 20.04上运行OpenVPN Server

启动并启用OpenVPN服务器以在系统启动时运行;

systemctl enable --now [email protected]

检查状态;

systemctl status [email protected]
● [email protected] - OpenVPN service for server
     Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2020-05-01 16:07:33 UTC; 3s ago
       Docs: man:openvpn(8)
             https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
             https://community.openvpn.net/openvpn/wiki/HOWTO
   Main PID: 11980 (openvpn)
     Status: "Initialization Sequence Completed"
      Tasks: 1 (limit: 2281)
     Memory: 1.0M
     CGroup: /system.slice/system-openvpnx2dserver.slice/[email protected]
             └─11980 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --config server.conf

May 01 16:07:33 freeradius.kifarunix-demo.com systemd[1]: Starting OpenVPN service for server...
May 01 16:07:33 freeradius.kifarunix-demo.com systemd[1]: Started OpenVPN service for server.

当OpenVPN服务运行时,它将创建一个隧道接口tun0;

ip add s
...
4: tun0:  mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.1/24 brd 10.8.0.255 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::1989:2bf2:1e7f:7415/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever

另外,请务必检查日志;

tail /var/log/openvpn/openvpn.log
/sbin/ip link set dev tun0 up mtu 1500
/sbin/ip addr add dev tun0 10.8.0.1/24 broadcast 10.8.0.255
Could not determine IPv4/IPv6 protocol. Using AF_INET
Socket Buffers: R=[212992->212992] S=[212992->212992]
UDPv4 link local (bound): [AF_INET][undef]:1194
UDPv4 link remote: [AF_UNSPEC]
MULTI: multi_init called, r=256 v=256
IFCONFIG POOL: base=10.8.0.2 size=252, ipv6=0
IFCONFIG POOL LIST
Initialization Sequence Completed

华丽的。现在,OpenVPN服务器已准备就绪。这标志着我们关于如何在Ubuntu 20.04上安装OpenVPN Server的指南的结尾。

现在,您可以相应地配置客户端。

Sidebar