安装openvpn客户端

这里直接上官网安装对应主机型号的客户端。比如我是macos系统,则对应https://openvpn.net/client-connect-vpn-for-mac-os/

注意!在mac m1上连接到vpn时,要手动运行一个命令

1
sudo /Library/Frameworks/OpenVPNConnect.framework/Versions/Current/usr/sbin/ovpnagent

如果能够连接就不用运行,不能连接运行一下即可!

安装openvpn服务器

1
sudo apt install openvpn easy-rsa

配置服务器端openvpn密钥文件

openvpn服务器需要四个密钥文件ca.crt, server.crt, server.key,和dh1024.pem。幸好服务器端已经给出我们模板,但是不幸的是,这是密钥啊,肯定不能用模板啊,要自己生成。先创建一个文件夹

1
sudo mkdir /etc/openvpn/keys

然后安装easy-rsa

1
sudo apt-get install easy-rsa

我们可以搜索easy-rsa的文件都在哪些目录

1
whereis easy-rsa#注意,一半生成的密钥,或者nginx中的网站内容等,都会在usr/share中,巧合的是,easy-rsa生成的文件默认会在/usr/share/easy-rsa/keys里面,正好符合。

下面生成密钥。在新版中,我们先用easyrsa init-pki

然后easyrsa build-ca创建根证书和根密钥,它会提示你设置密码,

image-20230927154053895

并且给出common name,自定义即可。

最后都保存在了/usr/share/easy-rsa/pki/ca.crt

创建服务器密钥对

1
./easyrsa gen-req myservername nopass

生成的文件名默认为server.req, server.key,结果如下

1
2
3
4
Common Name (eg: your user, host, or server name) [server]:server
Keypair and certificate request completed. Your files are:
req: /usr/share/easy-rsa/pki/reqs/server.req
key: /usr/share/easy-rsa/pki/private/server.key

这里注意,这是一个证书请求文件。在创建 SSL/TLS 证书时,您首先生成证书请求 (CSR - Certificate Signing Request) 文件。CSR 包含有关要创建的证书的信息,如公钥、主题(通常是您的域名或服务器的名称)以及一些其他详细信息。CSR 文件是您向证书颁发机构(CA)请求签发 SSL/TLS 证书的方式。

而server.key是私钥文件,通常我们将CSR文件(req)发送给证书颁发机构(CA),然后CA将使用CSR文件中的信息来创建一个SSL/TLS证书。该证书将包含公钥,并且与您的私钥匹配,以确保安全的通信。

下面是向CA提交CSR文件的过程,也称为送过去签名过程

1
./easyrsa sign-req server myservername

签名结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/usr/share/easy-rsa# easyrsa sign-req server server

Using SSL: openssl OpenSSL 1.1.1s 1 Nov 2022


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 = server


Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Using configuration from /usr/share/easy-rsa/pki/safessl-easyrsa.cnf
Enter pass phrase for /usr/share/easy-rsa/pki/private/ca.key:

我们需要输入用于访问CA(证书颁发机构)私钥的密码,以确保只有授权的人可以签发证书。这是为了保护CA的私钥安全。
设置之后显示如下:

1
2
3
4
5
6
7
8
9
10
11
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'server'
Certificate is to be certified until Jun 7 12:17:22 2026 GMT (1080 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /usr/share/easy-rsa/pki/issued/server.crt
签名成功!

创建diffie-hellman对称密钥,因为HTTPS协议中使用的是RSA和Diffie-hellman两种协议,分别为非对称密钥加密和对称密钥加密,DH密钥交换是SSL/TLS握手协议的一部分,用于确保客户端和服务器之间的通信是加密的。Diffie-Hellman密钥交换协议允许两个通信方在协商时生成共享的对称密钥,用于加密和解密通信中的数据。这有助于确保通信的保密性,因为即使拦截了通信的内容,也很难破解生成的共享密钥。

./easyrsa gen-dh会保存在pki文件夹中

上述是最重要的四个密钥,要保存到/etc/openvpn/文件夹下或者/etc/openvpn/keys文件夹下。

并且ssl/tls提供了一层额外安全,创建了HMAC防火墙,阻挡udp flood攻击和dos攻击

1
用openvpn --genkey --secret ta.key

服务器和客户端必须都要有这个key的副本,配置文件中写次密钥项的时候第二个参数,在服务器上是0,在客户端上是1。

将需要用到的openvpn证书和密钥一同复制过来

1
2
cp /usr/share/doc/openvpn/examples/sample-keys/{ca.crt,server.{crt,key},dh2048.pem,ta.key} /etc/openvpn/keys/
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/#我们把模板也复制一份过来。

配置客户端openvpn密钥文件

vpn客户端也需要一个证书去向服务器验证自身身份。我们要为每个客户端创建不同的证书。

这可以在服务器端完成,然后分发到客户端。创建用以下命令

1
2
3
4
./easyrsa gen-req myclient1 nopass 比如这里我的client就是macbook,服务器名称就是ubuntu
./easyrsa sign-req client myclient1
签好之后显示如下
Certificate created at: /usr/share/easy-rsa/pki/issued/macbook.crt

为什么要用CA进行证书签发?

假设有 Alice、Bob 和 Mallory 三个人,其中 Alice 和 Bob 之间希望进行安全通信。Mallory 是一个恶意的攻击者,想要窃听他们的通信。

  1. 正常通信:
    • Alice 和 Bob 使用安全协议(如TLS/SSL)进行通信,双方的通信被加密,确保了数据的机密性和完整性。
    • 他们的通信可能涉及到登录、传输敏感信息等。
  2. 伪造证书:
    • Mallory 伪造了一个证书,声称它是 Bob 的证书。这个伪造的证书可能包含 Mallory 生成的公钥,并附带 Bob 的身份信息。
    • 请注意,正常情况下证书由受信任的证书颁发机构(CA)签名,而 Mallory 现在成功伪造了一个未经 CA 签名的证书。
  3. 中间人攻击:
    • 当 Alice 尝试与 Bob 安全通信时,Mallory 插入自己成为通信的中间人。
    • Alice 向 Mallory 发送了请求,而 Mallory 则使用伪造的证书响应 Alice,并声称自己是 Bob。
  4. 窃听和篡改:
    • 现在,Mallory 可以窃听 Alice 和 Bob 之间的通信,因为他拦截了所有的数据。
    • 由于 Mallory 拥有伪造的证书,他能够解密和查看通信内容,了解 Alice 和 Bob 之间传输的所有信息。
    • Mallory 还可以篡改通信内容,向 Alice 或 Bob 发送虚假信息。

所以CA也就是一个可信第三方。

然后将以下文件复制到客户端即可

1
2
pki/ca.crt
pki/issued/myclient1.crt

编辑openvpn服务端配置文件

然后开始编辑服务器端server.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
port 1194#接受端口
proto tcp

dev tun#路由模式,桥接模式用tap
ca /etc/openvpn/keys/ca.crt#公钥路径
cert /etc/openvpn/keys/server.crt
key keys/server.key
dh keys/dh2048.pem
ifconfig-pool-persist /var/log/openvpn/ipp.txt
server 10.8.0.0 255.255.255.0
duplicate-cn
#这样可以让不同的人使用相同密钥链接
max-clients 100
log /var/log/openvpn/openvpn.log
keepalive 10 120
;client-to-client
#允许客户端与客户端之间通信
comp-lzo
#允许压缩传输
user nobody
group nogroup
persist-key
persist-tun
verb 3

编辑/etc/sysctl.conf并取消注释以下行以启用 IP 转发。

1
#net.ipv4.ip_forward=1

然后就可以启动了。

采用如下方式启动。

1
sudo systemctl start openvpn@myserver

编辑openvpn客户端配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
client
port 1194
proto udp
dev tun
remote 193.200.130.243 1194
resolv-retry infinite
nobind
comp-lzo
ca /Users/spencerzhang/Desktop/openvpn_hongkong_config/ca.crt
cert /Users/spencerzhang/Desktop/openvpn_hongkong_config/macbook.crt
key /Users/spencerzhang/Desktop/openvpn_hongkong_config/macbook.key
persist-key
persist-tun
user nobody
group nogroup
verb 3

之后我们在客户端进行连接即可!

1
sudo systemctl start openvpn@client