Índice
3. Criptografia e Autenticação
1. Instale o openvpn e o easy-rsa (este pacote é usado para criar o certificado ca)
2. Configure o diretório /etc/openvpn/
3. Crie o certificado e a chave do servidor
4. Crie um certificado de cliente
5. Coloque os arquivos necessários no lado do servidor no diretório etc/openvpn/
6. Coloque os arquivos do cliente necessários no diretório root/client/
7. Escreva um arquivo de configuração para o servidor
8. O iptables define as regras nat e abre o encaminhamento de rota
3. O cliente se conecta ao openvpn
1. Baixe o cliente openvpn e instale-o
2. Configure o arquivo de configuração do cliente e importe-o
1. Introdução
1. Definição
OpenVPN é um pacote de software para criar túneis criptografados para redes privadas virtuais
2. Princípio
O núcleo técnico do OpenVPN é a placa de rede virtual, seguida pela implementação do protocolo SSL
A placa de rede virtual é um software de driver implementado usando a tecnologia de programação de rede subjacente. Depois de instalar esse programa, uma placa de rede não real será adicionada ao host e poderá ser configurada como outras placas de rede. O programa de serviço pode abrir a placa de rede virtual na camada de aplicativo. Se o software de aplicativo (como um navegador da Web) enviar dados para a placa de rede virtual, o programa de serviço poderá ler os dados. Se o programa de serviço gravar os dados apropriados na placa de rede virtual, o software aplicativo também poderá recebê-los. Placas de rede virtuais são implementadas em muitos sistemas operacionais, o que é uma razão importante pela qual o OpenVPN pode ser usado em várias plataformas.
No OpenVPN , se o usuário acessar um endereço virtual remoto (pertencente à série de endereços utilizada pela placa de rede virtual, diferente do endereço real), o sistema operacional enviará o pacote de dados (modo TUN) ou quadro de dados (TAP mode) através do mecanismo de roteamento Na placa de rede virtual, após o programa de serviço receber os dados e executar o processamento correspondente, ele os enviará da rede externa através do SOCKET . Isso conclui um processo de transferência unidirecional e vice-versa. Quando o programa de serviço remoto recebe dados da rede externa por meio de SOCKET , e após o processamento correspondente, ele os envia de volta para a placa de rede virtual e o software aplicativo pode recebê-los.
3. Criptografia e autenticação
( 1 ) criptografia
O OpenVPN usa a biblioteca OpenSSL para criptografar dados e controlar informações. Isso significa que ele pode usar qualquer algoritmo suportado pelo OpenSSL . Ele fornece uma função HMAC de pacote opcional para aumentar a segurança da conexão. Além disso, a aceleração de hardware do OpenSSL também pode melhorar seu desempenho. As versões posteriores à 2.3.0 apresentam o PolarSSL .
( 2 ) Autenticação
OpenVPN fornece uma variedade de métodos de autenticação para confirmar a identidade de ambas as partes, incluindo:
① Chave privada pré-compartilhada
②Certificado de terceiros
③Combinação de nome de usuário /senha
A chave pré-compartilhada é a mais simples, mas ao mesmo tempo só pode ser usada para criar uma VPN ponto a ponto ; o certificado de terceiros baseado em PKI fornece as funções mais completas, mas requer uma manutenção adicional de um Sistema de certificado PKI . Depois do OpenVPN2.0, foi introduzido o método de autenticação de combinação de nome de usuário/senha, que pode omitir o certificado do cliente, mas ainda requer um certificado do servidor para criptografia.
2. Crie openvpn no centos 7.5
1. Instale o openvpn e o easy-rsa (este pacote é usado para criar o certificado ca )
( 1 ) Instale a fonte do armazém epel
yum install epel-release -y
( 2 ) Instale o openvpn
[root@localhost ~]# yum -y install openvpn
( 3 ) No github , baixe o último easy-rsa
① https://github.com/OpenVPN/easy-rsa pacote de download
②Upload , descompacte
[root@localhost ~]# mkdir openvpn
[root@localhost openvpn]# unzip easy-rsa-3.0.5.zip
[root@localhost openvpn]# mv easy-rsa-3.0.5 easy-rsa
2. Configure o diretório /etc/openvpn/
( 1 ) Crie um diretório e copie o diretório easy-rsa
[root@localhost ~]# mkdir -p /etc/openvpn/
[root@localhost openvpn]# cp -Rp easy-rsa /etc/openvpn/
( 2 ) Configure, edite o arquivo vars e configure de acordo com seu próprio ambiente
[root@localhost test]# cd /etc/openvpn/easy-rsa/easyrsa3
[root@localhost easyrsa3]# cp vars.example vars
[root@localhost easy-rsa3]# vim vars (将下面6行写入文件)
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "Beijing"
set_var EASYRSA_REQ_CITY "Beijing"
set_var EASYRSA_REQ_ORG "username"
set_var EASYRSA_REQ_EMAIL "[email protected]"
set_var EASYRSA_REQ_OU "My OpenVPN"
3. Crie o certificado e a chave do servidor
Entre no diretório /etc/openvpn/easy-rsa/easyrsa3/
①Inicialização _
[root@localhost ~]# cd /etc/openvpn/easy-rsa/easyrsa3/
[root@localhost easyrsa3]# ./easyrsa init-pki
Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/easy-rsa/easyrsa3/pki
② Crie um certificado raiz
[root@localhost easyrsa3]# ./easyrsa build-ca
Nota: Na parte acima, você precisa inserir a senha PEM Passphrase PEM , digite-a duas vezes, essa senha deve ser lembrada, caso contrário, você não poderá assinar o certificado no futuro. Você também precisa inserir o nome comum , que pode ser definido como exclusivo.
③ Crie um certificado do lado do servidor
[root@localhost easyrsa3]# ./easyrsa gen-req server nopass
Nesse processo, você precisa inserir o nome comum , que é opcional, mas não igual ao certificado raiz anterior
④Assine o certificado do servidor
[root@localhost easyrsa3]# ./easyrsa assinar servidor servidor
Neste comando , você precisa confirmar a geração, deve digitar sim e também precisa fornecer a senha quando criamos o CA naquele momento. Se você esquecer sua senha, comece do zero
⑤Crie Diffie-Hellman para garantir que a chave atravesse o comando da rede insegura
[root@localhost easyrsa3]# ./easyrsa gen-dh
4. Crie um certificado de cliente
①Entre no diretório raiz para criar uma nova pasta do cliente , a pasta pode ser nomeada à vontade, copie a pasta easy-ras obtida da descompactação anterior para a pasta do cliente e insira o seguinte diretório
[root@localhost ~]# mkdir client
[root@localhost ~]# cp /etc/openvpn/easy-rsa client -Rp
[root@localhost ~]# cd client/easy-rsa/easyrsa3/
②Inicialização _
[root@localhost easyrsa3]# ./easyrsa init-pki // Digite sim para confirmar
③Crie uma chave de cliente e gere um certificado (lembre-se de gerar a senha inserida por seu próprio login de cliente)
[root@localhost easyrsa3]# ./easyrsa gen-req nome de usuário // Defina o nome você mesmo
④Importe a solicitação de usuário obtida e assine o certificado
a. Vá para /etc/openvpn/easy-rsa/easyrsa3/
[root@localhost easyrsa3]# cd /etc/openvpn/easy-rsa/easyrsa3/
b. solicitação de importação
[root@localhost easyrsa3]# ./easyrsa import-req /root/client/easy-rsa/easyrsa3/pki/reqs/username.req username
c. Certificado de assinatura
[root@localhost easyrsa3]# ./easyrsa assinar nome de usuário do cliente
Nota: O cliente é gerado aqui , portanto deve ser um cliente e o nome de usuário deve ser consistente com o nome importado anteriormente
O certificado de assinatura acima é semelhante ao do servidor , então não vou tirar uma captura de tela, mas você ainda precisa inserir a senha do CA durante o período
5. Coloque os arquivos necessários no lado do servidor no diretório etc/openvpn/
Certificado CA , certificado de servidor, chave secreta
[root@localhost ~]# cp /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt /etc/openvpn/
[root@localhost ~]# cp /etc/openvpn/easy-rsa/easyrsa3/pki/private/server.key /etc/openvpn/
[root@localhost ~]# cp /etc/openvpn/easy-rsa/easyrsa3/pki/issued/server.crt /etc/openvpn/
[root@localhost ~]# cp /etc/openvpn/easy-rsa/easyrsa3/pki/dh.pem /etc/openvpn/
6. Coloque os arquivos de cliente necessários no diretório root/client/
O certificado do cliente, chave secreta e se você quiser fazer login com o modo de chave, copie-o para o cliente e altere o modo de login. Este artigo usa o nome de usuário e a senha para fazer login
[root@localhost ~]# cp /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt /root/client/
[root@localhost ~]# cp /etc/openvpn/easy-rsa/easyrsa3/pki/issued/username.crt /root/client/
[root@localhost ~]# cp /root/client/easy-rsa/easyrsa3/pki/private/username.key /root/client
Visualize o arquivo ca do cliente para copiar para o arquivo de configuração do cliente
7. Escreva um arquivo de configuração para o servidor
( 1 ) Quando você tiver instalado o openvpn , ele fornecerá um exemplo de arquivo de configuração do servidor , haverá um arquivo server.conf em /usr/share/doc/openvpn-2.4.11/sample/sample-config-files /etc/openvpn
[root@localhost ~]# rpm -ql openvpn |grep server.conf
[root@localhost ~]# cp /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/server.conf /etc/openvpn/
( 2 ) Modifique o arquivo de configuração
[root@localhost ~]# vim /etc/openvpn/server.conf
[root@localhost ~]# grep '^[^#|;]' A modificação de /etc/openvpn/server.conf é a seguinte:
A. O arquivo de configuração do modo de login da chave não é muito prático e pode ser ignorado. Use o arquivo de configuração B
local 0.0.0.0
port 1194
proto tcp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key # This file should be kept secret
dh /etc/openvpn/dh.pem
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"
client-to-client
keepalive 10 120
cipher AES-256-CBC
comp-lzo
max-clients 100
user openvpn
group openvpn
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 3
B. Arquivo de configuração do modo de login de nome de usuário e senha
local 0.0.0.0
port 1194
proto tcp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key # This file should be kept secret
dh /etc/openvpn/dh.pem
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"
client-to-client
keepalive 10 120
cipher AES-256-CBC
comp-lzo
max-clients 100
user openvpn
group openvpn
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 3
script-security 3
auth-user-pass-verify /etc/openvpn/checkpw.sh via-env #指定用户认证脚本
username-as-common-name
verify-client-cert none
( 3 ) Configure os arquivos do usuário e verifique os scripts
#检查脚本
[root@localhost ~]# vim /etc/openvpn/checkpw.sh
#!/bin/sh
###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman <[email protected]>
#
# This script will authenticate OpenVPN users against
# a plain text file. The passfile should simply contain
# one row per user with the username first followed by
# one or more space(s) or tab(s) and then the password.
PASSFILE="/etc/openvpn/pw-file"
LOG_FILE="/var/log/openvpn/openvpn-password.log"
TIME_STAMP=`date "+%Y-%m-%d %T"`
###########################################################
if [ ! -r "${PASSFILE}" ]; then
echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
exit 1
fi
CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
if [ "${CORRECT_PASSWORD}" = "" ]; then
echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
fi
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
exit 0
fi
echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
#密码文件
[root@localhost ~]# vim /etc/openvpn/pw-file
user1 123456789
user2 haha2023
( 4 ) Configurar permissões
[root@localhost ~]# mkdir /var/log/openvpn
[root@localhost ~]# chown -R openvpn.openvpn /var/log/openvpn/
[root@localhost ~]# chown -R openvpn.openvpn /etc/openvpn/*
8. O iptables define as regras nat e abre o encaminhamento de rota
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
[root@localhost ~]# iptables -vnL -t nat
[root@localhost ~]# vim /etc/sysctl.conf //打开路由转发
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p
9. Abra o serviço openvpn
[root@localhost ~]# openvpn /etc/openvpn/server.conf &
[root@localhost ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:1194 0.0.0.0:* LISTEN 14948/openvpn
3. O cliente se conecta ao openvpn
1. Baixe o cliente openvpn e instale-o
https://download.csdn.net/download/zhangxueleishamo/87688762
Basta baixar e instalar
2. Configure o arquivo de configuração do cliente e importe-o
client
proto tcp
remote 服务器ip 1194
dev tun
nobind
persist-key
persist-tun
cipher AES-128-GCM
verb 3
comp-lzo
auth-user-pass
<ca>
将上文二.6中ca密码在上文中有直接复制进来,即可
</ca>
3. Entrar
Quarto, otimização openvpn
1. Configurar roteamento e DNS
Adicione uma rota ao arquivo de configuração principal do openvpn. Quando o cliente acessa o segmento de rede especificado, a linha vpn é usada. Em outros momentos, a rede original da máquina é usada para evitar operações desnecessárias que ocupam o tráfego da linha vpn.
Adicionar dhcp para obter dns automaticamente, você pode especificar dns de intranet
push "route 10.0.0.0 255.0.0.0"
#push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 202.106.0.20"
push "dhcp-option DNS 94.140.14.14"
2. Desative a compactação comp-lzo
A função de compactação comp-lzo é removida no servidor e no cliente, e o desempenho é aprimorado em 2 a 4 vezes
3. Altere o protocolo proto tcp---->proto udp porta 21194
Todos sabemos que o udp é muito mais rápido que o tcp, alterar o protocolo e o número da porta não apenas acelera, mas também melhora a segurança
port 21194
proto udp
4. Configure uma conta para vários logins
duplicate-cn
5. Erros
1、Sem certificado de servidor
Fri Apr 14 17:49:21 2023 AVISO: Nenhum método de verificação de certificado de servidor foi ativado. Consulte http://openvpn.net/howto.html#mitm para obter mais informações.
Resolvido adicionando o arquivo do cliente
servidor remote-cert-tls
2. Ao importar o arquivo, é encontrado um erro: certificado externo ausente
Resolvido adicionando no arquivo do cliente
client-cert-not-required