GNU/Linux
 
 
OpenVPN Server
(Open Virtual Private Network Server)

Artigo relacionado: OpenVPN Client.




OPENVPN SERVER
(CHAVE SIMETRICA/UNICA/COMPARTILHADA/SECRETA/ESTATICA)



Instalação
# apt-get install openvpn


Criação de uma chave compartilhada
# openvpn --genkey --secret /etc/openvpn/shared.key (essa chave estática e compartilhada deve ser inserida nos arquivos de configuração tanto do servidor quanto do cliente)
ou


Arquivo de configuração
# vi /etc/openvpn/servidor.conf (esse arquivo não existe por padrão e será criado para inserir alguns parâmentros de conexão. Todos os arquivos dentro diretório "/etc/openvpn" com a extensão ".conf" serão lidos ao restartar o servidor OpenVPN. Isso quer dizer que se pode ter vários arquivos ".conf", representando os mais variados tipos de configuração)
local SERVER_IP (IP deste servidor VPN que será usado para receber as conexões VPN dos clientes)
dev NET_INTERFACE (nome da interface de rede que sera criada e usada pelos IPs definidos nesse arquivo na opção logo abaixo chamada "ifconfig". Guarde bem o nome dessa interface de rede, pois ela deverá ser usada nas regras de bloqueio e/ou permissão com o "iptables". Ela deve ser única, não podendo existir outra com o mesmo nome)
ifconfig IP1 IP2 (IP1 é endereço IP privado da VPN deste servidor e IP2 é endereço IP privado da VPN do cliente. Lembre-se que uma VPN como o próprio no sugere é uma rede privada, ou seja, um rede interna. Mesmo o cliente esteja na Internet, ele será exergado como se estivesse na LAN ou em alguma rede dentro do domínio da empresa. Por isso, é importante usar endereços privados como: 10.0.0.1-10.255.255.254, 172.16.0.1-172.31.255.254 e 192.168.0.1-192.168.255.254. É interessante evidenciar também que os endereços definidos nessa opção terão como máscara "255.255.255.252". Devido à isso, os dois IPs usados nessa opção devem estar na mesma rede, ou seja, se o IP1 for 10.11.13.45, o IP2 deve ser 10.11.13.46, não podendo ser usado algo do tipo como 10.11.13.1 e 10.11.13.242, pois devida a máscara ser "255.255.255.252" eles estaria em rede diferentes. Além disso, na se esqueça que como uma máscara dessa "255.255.255.252" se pode ter somente 4 endereços. Dois, desses quadro, já são reservados, um para rede e outro para broadcast. Então, só sobrarão dois endereços para definir o servidor e o cliente VPN. Essa opção é mais usada quando se tem um único cliente VPN)
proto udp|tcp-server (protocolo que será usado para a troca de pacotes criptografados entre este servidor VPN e seus clientes VPN. É interessante usar o "udp" para evitar o famoso TCP over TCP, visto que dentro de um túnel VPN roda todos os tipos de protocolos e a VPN não tem a obrigação de a entrega de pacote e nem de realizar conexão. Isso deve ser feito pelos protocolos dentro do túnel)
Obs: ao usar a opção "ifconfig IP1 IP2" em conjunto com a opção "proto tcp" a porta aberta se fechará (CLOSED) depois da conexão ter sido realizada (ESTABLISHED). Totalmente o contrário ao se usar a opção "server SUBNET MASK".
port SERVER_PORT (porta deste servidor VPN que será aberta para receber as tentativas de conexões de seus clientes VPN. Essa porta também deve ser única, não podendo ter outro túnel VPN a utilizando)
secret /etc/openvpn/shared.key (chave compartilhada que foi criada neste servidor OpenVPN, conforme visto anteriormente. Observe que podemos indicar qual vai ser a chave usada, assim podemos criar várias outras para os mais diferentes tipos de conexão)


Arquivo de configuração de exemplo (sem comentários para cópia)
# vi /etc/openvpn/servidor.conf
local 200.200.200.200
dev tun0
ifconfig 192.168.150.1 192.168.150.2
proto udp
port 35000
secret /etc/openvpn/shared.key


Restartar o serviço
# /etc/init.d/openvpn restart
Obs: ao restartar o serviço, todo conteúdo do diretório "/etc/openvpn/" que tiver a extensão ".conf" será lido. Assim, podemos ter várias conexões/túneis VPN com diferentes configurações e acessos. Devido a essas premissas, duas opções que devem ser diferentes dentro dos vários arquivos de configuração que poderão existir são: "dev" e "port")
# ifconfig (veja que uma nova interface virtual de rede foi criada e que as suas informações correspondem ao arquivo de configuração elaborado anteriormente)

Para configurar um Cliente VPN para trabalhar com chave secreta/compartilhada acesse OpenVPN Client.






IPTABLES e TCPDUMP

Geralmente o servidor VPN fica no mesmo equipamento do Firewall (iptables). Isso é devido a sua posição estratégica e privilegiada. Devido à isso, é necessário adicionar algumas regras para que os pacotes passem através do Firewall para alcançar a LAN. Como primeiro teste, de forma segura, independente de qualquer interface de rede e configuração, poderíamos adicionar a regra a seguir:

Obs: um dos motivos de colocar o servidor VPN no Firewall é para que o tráfego criptografado do túnel VPN fique somente até o Firewall, ou seja, somente entre a Internet e o Firewall. Caso contrário (ex: um servidor VPN num equipamento dentro da LAN) um IDS, IPS, Anti-Vírus, tcpdump etc que fique depois do Firewall nunca saberá ou poderá analisar um tráfego que está passando, pois o mesmo vai estar criptografado.

# iptables -t filter -A FORWARD -m limit --limit 5/s -p icmp -j ACCEPT

A regra anterior faz com que os ICMP fique liberado. Com isso, poderemos usar o comando "ping" a vontade para testar a comunicação. Depois que os testes acabem, pode-se remover tal regra. Agora com a pingue liberado, vá no equipamento do cliente VPN ou peça a proprietário dele que ping um IP de um máquina da LAN. É muito interessante usa o comando "tcpdump" para verificar o que está acontecendo em termos de pacotes trafegado pelo Firewall. Um que poderíamos usar para capturar pacotes seria:

# tcpdump -i tunO -tnS

Agora, vamos liberar o TS (Terminal Server - MSTSC) do MS-Windows para que ele possa acessar uma computador na LAN.

# iptables -t filter -i tun0 -o eth0 -A FORWARD -p tcp --dport 3389 -j ACCEPT
# iptables -t filter -i eth0 -o tun0 -A FORWARD -p tcp --sport 3389 -j ACCEPT

Tente acessar um equipamento da LAN via TS para ver se consegue. Se sim, pode correr para o abraço. O interessante é que se pode liberar todo o tipo de conexão como o compartilhado de arquivo, banco de dados, sistemas administrativos, DNS etc. Caso queira liberar tudo, utilize as duas regras a seguir, contudo muito cuidado:

# iptables -t filter -i tun0 -o eth0 -A FORWARD -j ACCEPT
# iptables -t filter -i eth0 -o tun0 -A FORWARD -j ACCEPT

Não é nessário fazer regras do tipo "FORWARD" para a conexão VPN em si, pois na maioria das vezes o estabelecimento da conexão/túnel VPN fica entre o cliente (estação de trabalho) e o servidor VPN (Firewall). Talvez um "INPUT" seja necessário, dependendo da política adotada no Firewall. Regras desnecessárias:

# iptables -t filter -A FORWARD -p udp --dport 1529 -j ACCEPT
# iptables -t filter -A FORWARD -p udp --sport 1529 -j ACCEPT





OPENVPN SERVER
(CHAVE PUBLICA E PRIVADA)



Instalação
# apt-get install openvpn


Criação de um certificado para a CA (apenas um)
# openssl req -nodes -new -x509 -keyout /etc/openvpn/ca.key -out /etc/openvpn/ca.crt -days 3650 ()
# /usr/lib/ssl/misc/CA.pl -newca ()
# vi /etc/openvpn/demoCA/index.txt.attr ()
unique_subject = no ()


Criação de um certificado para o cliente (um para cada cliente)
# openssl req -nodes -new -keyout /etc/openvpn/client.key -out /etc/openvpn/client.csr ()
# openssl ca -out /etc/openvpn/client.crt -in /etc/openvpn/client.csr ()


Diffie Hellman somente para o servidor
# openssl dhparam -out /etc/openvpn/dh2048.pem 2048 (uma alternativa seria: RSA Key Management)


Arquivo de configuração
# vi /etc/openvpn/servidor.conf (esse arquivo não existe por padrão e será criado para inserir alguns parâmentros de conexão. Todos os arquivos dentro diretório "/etc/openvpn" com a extensão ".conf" serão lidos ao restartar o servidor OpenVPN. Isso quer dizer que se pode ter vários arquivos ".conf", representando os mais variados tipos de configuração)
dev NET_INTERFACE (nome da interface de rede usada pelos IPs definidos nesse arquivo na opção logo abaixo chamada "ifconfig". Guarde bem o nome dessa interface de rede, pois ela deverá ser usada nas regras de bloqueio e/ou permissão com o "iptables". Ela deve ser única, não podendo existir outra com o mesmo nome)
local SERVER_IP (IP deste servidor VPN que será usado para receber as conexões VPN dos clientes)
server NETWORK MASK (especifica uma subrede (privada) e máscara que serão usadas pelos clientes. O cliente ao se conectar no servidor VPN irá receber um IP dentro dessa faixa de endereçamento. Essa subrede deve ser diferente de todas as outras subredes existentes na sua rede. Essa opção deve ser usada no lugar do "ifconfig" quando se tem mais de um cliente VPN, ficando assim mais fácil de gerenciar.
proto udp|tcp-server (protocolo que será usado para a troca de pacotes criptografados entre este servidor VPN e seus clientes VPN. É interessante usar o "udp" para evitar o famoso TCP over TCP, visto que dentro de um túnel VPN roda todos os tipos de protocolos e a VPN não tem a obrigação de a entrega de pacote e nem de realizar conexão. Isso deve ser feito pelos protocolos dentro do túnel)
Obs: ao usar a opção "server SUBNET MASK" em conjunto com a opção "proto tcp" a porta aberta continuará aberta (LISTEN) mesmo depois da conexão ter sido realizada (ESTABLISHED). Totalmente o contrário ao se usar a opção "ifconfig IP1 IP2".
port SERVER_PORT (porta deste servidor VPN que será aberta para receber as tentativas de conexões de seus clientes VPN. Essa porta também deve ser única, não podendo ter outro túnel VPN a utilizando)
client-to-client ()
tls-server ()
remote-cert-tls server (metodo de verificacao de certificado)
dh dh2048.pem ()
ca ca.crt (certificado da CA)
cert client.crt (certificado ou chave pública do cliente)
key client.key (chave privada do cliente)
comp-lzo ()
persist-tun ()
persist-key ()


Arquivo de configuração de exemplo (sem comentários para cópia)
# vi /etc/openvpn/servidor.conf
dev tun0
local 200.200.200.200
server 192.168.150.0 255.255.255.0
proto tcp
port 35000
client-to-client
tls-server
remote-cert-tls server ()
dh dh2048.pem
ca ca.crt
cert client.crt
key client.key
comp-lzo
persist-tun
persist-key

Para configurar um Cliente VPN para trabalhar com chave pública e privada acesse OpenVPN Client.





Referências Bibliográgicas
http://www.vivaolinux.com.br/artigo/Configurando-o-OpenVPN-para-multiplos-clientes/?pagina=3
 
 


ETI - Especialista em Tecnologia
da Informação