CentOS7部署OpenVPN服务端
一、配置阿里镜像
二、安装OpenVPN
安装EPEL
额外的企业Linux软件包(EPEL)存储库是由Fedora项目管理的一个额外存储库,其中包含非标准但受欢迎的软件包。OpenVPN不在默认的CentOS存储库中,但在EPEL中可用,因此安装EPEL:
yum install epel-release -y
安装OpenVPN
yum install -y openvpn
如果没有安装过wget,还需要安装wget,我们将使用它来安装Easy RSA
yum install -y wget
wget --version
可以查看当前环境有没有安装wget
使用wget下载Easy RSA。出于本教程的目的,我们建议使用easy-rsa-2,因为该版本有更多的可用文档。您可以在项目的Releases页面上找到easy-rsa-2最新版本的下载链接:
wget -O /tmp/easy-rsa.tar.gz https://github.com/OpenVPN/easy-rsa-old/archive/2.3.3.tar.gz
如果遇到网络问题无法下载,可以先下载后,上传到linux系统中
接下来使用tar解压缩文件
注意,得先切换到压缩文件所在得目录,然后进行解压操作
cd /tmp # 切换到tmp目录
tar -zxf easy-rsa.tar.gz # 解压缩文件
解压或会多一个easy-rsa-old-2.3.3的目录,在/etc/openvpn下创建一个新的子目录,并命名为easy-rsa:
mkdir /etc/openvpn/easy-rsa
将提取的Easy RSA文件复制到新目录:
cp -rf easy-rsa-old-2.3.3/easy-rsa/2.0/* /etc/openvpn/easy-rsa
然后将目录的所有者更改为您的非root sudo用户:
chown garson /etc/openvpn/easy-rsa/
三、生成密钥和证书
进入 /etc/openvpn/easy-rsa
目录
vars文件配置
参考:https://www.yesdotnet.com/archive/post/611695169900549.html#mcetoc_1ick3lmavi1
source ./vars
使用 build-ca
脚本构建证书颁发机构。您将被提示输入证书字段的值,但如果您之前在 vars
文件中设置了变量,所有选项都将已设置为默认值。您可以按 ENTER
接受每个选项的默认值:
./build-ca nopass
执行命令如果出现./clan-all提示,那么就执行一下下 ./clean-all
此脚本将生成一个名为 ca.key
的文件。这是用于签署服务器和客户端证书的私钥。如果丢失该文件,您将无法再信任来自此证书颁发机构的任何证书,如果有人能够访问此文件,则可以签署新证书并在您不知情的情况下访问您的 VPN。因此,OpenVPN 建议将 ca.key
存储在尽可能脱机的位置,并且只有在创建新证书时才应激活它。
接下来,使用 build-key-server 脚本为服务器创建密钥和证书:
./build-key-server server
与构建 CA 一样,您将看到您设置的默认值,因此您可以在提示时按ENTER
。此外,您将被提示输入挑战密码和可选的公司名称。如果您设置了挑战密码,连接到 VPN 时将要求您输入该密码。如果您不想设置挑战密码,只需将此行留空并按ENTER
。最后,输入 Y
以提交更改。
创建服务器密钥和证书的最后一部分是生成 Diffie-Hellman 密钥交换文件。使用 build-dh
脚本来完成此操作:
./build-dh
一旦服务器完成生成密钥交换文件,将服务器密钥和证书从 keys
目录复制到 openvpn/server
目录:
# 切换keys目录
cd keys/
cp dh2048.pem ca.crt server.crt server.key /etc/openvpn
# 返回上级目录
cd ..
每个客户端还需要一个证书,以便 OpenVPN 服务器对其进行身份验证。这些密钥和证书将在服务器上创建,然后您将不得不将它们复制到您的客户端,这将在后续步骤中完成。建议您为打算连接到您的 VPN 的每个客户端生成单独的密钥和证书。
因为我们只在这里设置了一个客户端,我们将其称为client
,但如果您愿意,可以将其更改为更具描述性的名称:
cd /etc/openvpn/easy-rsa
./build-key client
最后,将带版本号的 OpenSSL 配置文件 openssl-1.0.0.cnf 复制为无版本名称的文件 openssl.cnf。如果未执行此操作,可能会导致 OpenSSL 无法加载配置,因为它无法检测到其版本:
cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf
现在,您的服务器和客户端所需的所有必要密钥和证书都已生成,您可以继续设置两台机器之间的路由。
四、配置OpvnVPN
OpenVPN在其文档目录中有几个示例配置文件。首先,将示例server.conf文件复制为您自己配置文件的起点。
sudo cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf /etc/openvpn/
输入编辑配置文件
在此文件中,有几行需要更改,其中大多数只需要取消注释,即删除行首的分号;。这些行的功能以及本教程未提及的其他行在每行上方的注释中都有详细说明。
首先,找到并取消注释包含push "redirect-gateway def1 bypass-dhcp"的行。这样做将告诉您的客户端通过OpenVPN服务器重定向其所有流量。请注意,启用此功能可能会导致其他网络服务(如SSH)的连接问题:
push "redirect-gateway def1 bypass-dhcp"
因为您的客户端将无法使用由ISP提供的默认DNS服务器(因为其流量将被重新路由),您需要告诉它可以使用哪些DNS服务器连接到OpenVPN。您可以选择不同的DNS服务器,但在这里我们将使用Google的公共DNS服务器,其IP为8.8.8.8和8.8.4.4。
通过取消注释push "dhcp-option DNS ..."行并更新IP地址来设置这一点:
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
我们希望OpenVPN在启动后不具备特权,因此我们需要告诉它以nobody用户和组运行。为此,请取消注释user nobody和group nobody行:
user nobody
group nobody
接下来,取消注释topology subnet行。这与其下面的server 10.8.0.0 255.255.255.0行一起,将配置您的OpenVPN安装为子网,并告诉客户机应使用哪个IP地址。在本例中,服务器将成为10.8.0.1,第一个客户端将成为10.8.0.2:
topology subnet
还建议您在服务器配置文件中添加以下行。这样可以双重检查任何传入的客户端证书是否真的来自客户端,从而加强我们稍后将建立的安全参数:
# 阿里云开启这个后,会失败,不知道为什么,所以阿里云上这个可以不用
remote-cert-eku "TLS Web Client Authentication"
最后,这是一种确保计算机网络上安全通信的加密协议。为此,您需要生成一个静态加密密钥(在我们的示例中命名为myvpn.tlsauth,但您可以选择任何名称)。在创建此密钥之前,通过在配置文件中的tls-auth ta.key 0行前面加上分号来注释该行。然后,在其下一行添加tls-crypt myvpn.tlsauth:
;tls-auth ta.key 0
tls-crypt myvpn.tlsauth
使用以下命令生成静态加密密钥
sudo openvpn --genkey --secret /etc/openvpn/myvpn.tlsauth
允许多个客户端使用相同的证书连接到服务器。
duplicate-cn
现在,您的服务器已配置完成
服务端完整配置如下(删除注释后的配置)
local 0.0.0.0
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
dh dh2048.pem
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
duplicate-cn
keepalive 10 120
tls-crypt myvpn.tlsauth
# 阿里云开启这个后,会失败
# remote-cert-eku "TLS Web Server Authentication"
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
explicit-exit-notify 1
客户端配置如下Windows:
client
dev tun
proto udp
remote <server> 1194
resolv-retry infinite
nobind
# Downgrade privileges after initialization (non-Windows only)
;user nobody
;group nobody
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
tls-crypt myvpn.tlsauth
cipher AES-256-CBC
verb 3
# 根据服务器配置
# remote-cert-eku "TLS Web Server Authentication"
五、防火墙设置
将 openvpn
服务添加到 firewalld 允许的服务列表中,然后再次运行该命令,但加上 --permanent
选项,使该设置永久生效
firewall-cmd --zone=trusted --add-service openvpn
firewall-cmd --zone=trusted --add-service openvpn --permanent
您可以使用以下命令检查服务是否已正确添加:
firewall-cmd --list-services --zone=trusted
确保通过重新加载 firewalld 来实施这些防火墙规则的更改:
firewall-cmd --reload
启用 IP 转发。这将会将来自客户端的所有网络流量路由到您服务器的 IP 地址,客户端的公共 IP 地址将被有效地隐藏。
打开 sysctl.conf
进行编辑:
vi /etc/sysctl.conf
然后在文件顶部添加以下行:
net.ipv4.ip_forward = 1
最后,重新启动网络服务,以便 IP 转发生效:
systemctl restart network.service
有了路由和防火墙规则,我们可以在服务器上启动 OpenVPN 服务。
启动OpenVPN
OpenVPN 是一个使用 systemctl
作为 systemd 服务进行管理的。我们将配置 OpenVPN 在启动时启动,这样只要您的服务器运行,您就可以随时连接到您的 VPN。为此,通过将其添加到 systemctl
来启用 OpenVPN 服务器:
systemctl -f enable openvpn@server.service
然后启动 OpenVPN 服务:
systemctl start openvpn@server.service
使用以下命令再次检查 OpenVPN 服务是否处于活动状态。您应该在输出中看到 active (running)
:
systemctl status openvpn@server.service
固定IP
/etc/openvpn 下创建ccd文件夹
/etc/openvpn
创建客户端节点配置文件,文件名和生成客户端证书名称相同
touch <client-name>
配置文件内容:
ifconfig-push 10.8.0.2 255.255.255.0
配置好后重启openvpn
systemctl status openvpn@server.service
参考来源:
如何在Cent OS 7上设置和配置OpenVPN服务器_centos7 openv-CSDN博客