用openvpn配置一个vpn
安装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
创建根证书和根密钥,它会提示你设置密码,
并且给出common name
,自定义即可。
最后都保存在了/usr/share/easy-rsa/pki/ca.crt
创建服务器密钥对
1 | ./easyrsa gen-req myservername nopass |
生成的文件名默认为server.req, server.key,结果如下
1 | Common Name (eg: your user, host, or server name) [server]:server |
这里注意,这是一个证书请求文件。在创建 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 | easyrsa sign-req server server |
我们需要输入用于访问CA(证书颁发机构)私钥的密码,以确保只有授权的人可以签发证书。这是为了保护CA的私钥安全。
设置之后显示如下:
1 | Check that the request matches the signature |
创建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 | cp /usr/share/doc/openvpn/examples/sample-keys/{ca.crt,server.{crt,key},dh2048.pem,ta.key} /etc/openvpn/keys/ |
配置客户端openvpn密钥文件
vpn客户端也需要一个证书去向服务器验证自身身份。我们要为每个客户端创建不同的证书。
这可以在服务器端完成,然后分发到客户端。创建用以下命令
1 | ./easyrsa gen-req myclient1 nopass 比如这里我的client就是macbook,服务器名称就是ubuntu |
为什么要用CA进行证书签发?
假设有 Alice、Bob 和 Mallory 三个人,其中 Alice 和 Bob 之间希望进行安全通信。Mallory 是一个恶意的攻击者,想要窃听他们的通信。
- 正常通信:
- Alice 和 Bob 使用安全协议(如TLS/SSL)进行通信,双方的通信被加密,确保了数据的机密性和完整性。
- 他们的通信可能涉及到登录、传输敏感信息等。
- 伪造证书:
- Mallory 伪造了一个证书,声称它是 Bob 的证书。这个伪造的证书可能包含 Mallory 生成的公钥,并附带 Bob 的身份信息。
- 请注意,正常情况下证书由受信任的证书颁发机构(CA)签名,而 Mallory 现在成功伪造了一个未经 CA 签名的证书。
- 中间人攻击:
- 当 Alice 尝试与 Bob 安全通信时,Mallory 插入自己成为通信的中间人。
- Alice 向 Mallory 发送了请求,而 Mallory 则使用伪造的证书响应 Alice,并声称自己是 Bob。
- 窃听和篡改:
- 现在,Mallory 可以窃听 Alice 和 Bob 之间的通信,因为他拦截了所有的数据。
- 由于 Mallory 拥有伪造的证书,他能够解密和查看通信内容,了解 Alice 和 Bob 之间传输的所有信息。
- Mallory 还可以篡改通信内容,向 Alice 或 Bob 发送虚假信息。
所以CA也就是一个可信第三方。
然后将以下文件复制到客户端即可
1 | pki/ca.crt |
编辑openvpn服务端配置文件
然后开始编辑服务器端server.conf
1 | port 1194#接受端口 |
编辑/etc/sysctl.conf
并取消注释以下行以启用 IP 转发。
1 | net.ipv4.ip_forward=1 |
然后就可以启动了。
采用如下方式启动。
1 | sudo systemctl start openvpn@myserver |
编辑openvpn客户端配置文件
1 | client |
之后我们在客户端进行连接即可!
1 | sudo systemctl start openvpn@client |