Claudio Borges

Technical blog about Linux, BSD, Mac OS X, Games and etc.

Archive for the ‘Linux’ tag

Configurando um servidor de openvpn parte 1

with 8 comments

OpenVPN é um solução completa de VPN. A mesma utiliza SSL para encriptar o tráfego, possui versões para os mais diversos sistemas, tais como: Linux, Todos os BSDs e derivados (isto inclui o Mac OS X e Solaris), Windows 2000/XP/2K3/Vista/7 e sua licença é GPL.

Uma de suas principais vantagens é que você pode trabalhar com qualquer porta tcp/udp, além de poder utilizá-la através de nat. Sua configuração é simples e intuitiva e não necessita de aplicação de patch no kernel.

Este artigo é baseado em debian, mas caso queira, os procedimentos de configuração se aplicam tanto para linux quanto para os bsd, levando em conta claro parâmentos como interface, usuário, grupo e arquivos de log.

Primeiramente vamos definir alguns valores que serão utilizados no decorrer deste artigo:

IP Externo da matriz: 189.47.25.20
Rede interna da Matriz: 192.168.0.0/24
Rede interna da filial: 192.168.1.0/24
Interface da vpn: tun0

A instalação do openvpn é bem simples, quem está acostumado com debian bastar utilizar o apt:

server:~# apt-get install -y openvpn

Com o openvpn instalado, edite o arquivo /etc/default/openvpn e descomente a linha #AUTOSTART=”all”.

Copie o diretório /usr/share/doc/openvpn/examples/easy-rsa para o seu /root/:

server:~# cp -a /usr/share/doc/openvpn/examples/easy-rsa /root/

Edite o arquivo /root/easy-rsa/vars e altere as variáveis a seu gosto:

export KEY_SIZE=2048

export KEY_COUNTRY=BR
export KEY_PROVINCE=SP
export KEY_CITY="Sao Paulo"
export KEY_ORG="Personal OpenVPN Server"
export KEY_ORGNAME="POS"
export KEY_EMAIL="but3k4@gmail.com"

Carregue as variáveis no ambiente:

server:~# cd easy-ca
server:~/easy-rsa# . ./vars
NOTE: when you run ./clean-all, I will be doing a rm -rf on /root/easy-rsa/keys

Obs: é . ./ mesmo.

Rode o comando clean-all:

server:~/easy-rsa# ./clean-all

Gerando os certificados e chaves:

Certificado de autoridade (CA). Você irá verificar que os valores estão pré-estabelecidos, faltando apenas o Organizational Unit Name e Common Name:

server:~/easy-rsa# ./build-ca
Generating a 2048 bit RSA private key
.................................................+++
...............................................+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [BR]:
State or Province Name (full name) [SP]:
Locality Name (eg, city) [Sao Paulo]:
Organization Name (eg, company) [Personal OpenVPN Server]:
Organizational Unit Name (eg, section) []:POS
Common Name (eg, your name or your server's hostname) []:server
Email Address [but3k4@gmail.com]:
server:~/easy-rsa#

Chaves e certificados do servidor

server:~/easy-rsa# ./build-key-server server
Generating a 2048 bit RSA private key
............................................................................+++
..............+++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [BR]:
State or Province Name (full name) [SP]:
Locality Name (eg, city) [Sao Paulo]:
Organization Name (eg, company) [Personal OpenVPN Server]:
Organizational Unit Name (eg, section) []:POS
Common Name (eg, your name or your server's hostname) []:server
Email Address [but3k4@gmail.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /root/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           : PRINTABLE:'BR'
stateOrProvinceName   : PRINTABLE:'SP'
localityName          : PRINTABLE:'Sao Paulo'
organizationName      : PRINTABLE:'Personal OpenVPN Server'
organizationalUnitName: PRINTABLE:'POS'
commonName            : PRINTABLE:'server'
emailAddress          : IA5STRING:'but3k4@gmail.com'
Certificate is to be certified until Aug  9 14:41:55 2018 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
server:~/easy-rsa#

Parâmetros Diffie Hellman

Os parâmetros Diffie Hellman são utilizados para a troca encriptada de informações

server:~/easy-rsa# ./build-dh 
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time

....... e espere pois isso pode demorar ........

server:~/easy-rsa#

Chave compartilhada

Criando uma chave compartilhada para servir de tls:

server:~/easy-rsa# openvpn --genkey --secret keys/shared.key
server:~/easy-rsa#

Criando o /etc/openvpn/openvpn.conf:

# /etc/openvpn/openvpn.conf matriz configuration file

# diretorio onde esta os arquivos de configuracao / certificados
cd /etc/openvpn

# porta usada para os clientes conectarem no servidor
port	1194

# protocolo usado na conexao
proto	udp

# device usado pelo openvpn
dev	tun

# Habilita conexoes tls
# Ajuda a bloquear ataques DoS e flooding na porta usada pelo openvpn
tls-server

# arquivo de chave compartilhada usado pelo tls-server
# O mesmo adiciona uma camada a mais de seguranca, habilitando controle de conexoes tls
tls-auth	keys/shared.key 0

# Certificado de autoridade
# Tem que ser o mesmo em todos os hosts
# que conectarem a sua vpn
ca	certs/ca.crt

# Certificado e chave privada do servidor
# Cada maquina tem que ter seu certificado e chave
cert	certs/server.crt
key	keys/server.key

# Parametros Diffie-Hellman
dh	keys/dh2048.pem

# Rede usada pelo tunel openvpn
server	10.8.0.0 255.255.255.0

# define o arquivo onde sera guardados os ips que os clientes
# obtiverem na conexao, assim os mesmos sempre irao pegar os 
# mesmos ips
ifconfig-pool-persist	ipp.txt

# define o diretorio onde irao ficar as configuracoes individuais para cada
# cliente, assim você podera habilitar as duas redes se comunicarem.
client-config-dir	ccd

# Define a rota para a rede da matriz poder enxergar a rede da filial
route 192.168.1.0 255.255.255.0

# Define a rota para a rede da filial poder enxergar a rede da matriz
push "route-delay 2 600"
push "route 192.168.0.0 255.255.255.0"

# Aceita os clientes se comunicarem entre si sem a necessidade de um outro tunnel
client-to-client

# Habilita ping de 10 em 10 segundos para dizer ao lado da filial que a matriz
# esta no ar, usado para manter a conexao ativa
ping-timer-rem
keepalive 10 120

# Tipo de criptografia usada
cipher	DES-EDE3-CBC

# habilita compressão no link VPN
comp-lzo

# Numero maximo de clientes (filiais)
max-clients	10

# usuário e grupo sob o qual o openvpn ira rodar
user	nobody
group	nogroup

# Permite um restart sem fechar a conexão e re-ler as chaves
persist-key
persist-tun

# Log de status das conexoes
status	/var/log/openvpn/status.log

# define um arquivo de log, pois o default é o /var/log/syslog
log	/var/log/openvpn/openvpn.log
log-append	/var/log/openvpn/openvpn.log

# Nivel de log
# 0 silencioso, exceto para erros fatais
# 4 razoavel para uso geral
# 5 e 6 podem ajudar a debugar problemas de conexoes
# 9 maximo debug, muito util para tentar descobrir erros caso a vpn nao suba
verb	3

# desabilita mensagens repetitivas, ou seja, erros ou conexoes em sequencia
# acima de 20, ele dropa.
mute	20

Por hoje acho que está bom, na parte 2 do artigo irei mostrar como configurar o client e fazer os ajustes finais para você ter um servidor openvpn que atenda matriz, filial e clientes remotos pelo Brasil a fora.

Written by but3k4

January 10th, 2010 at 8:22 pm

Posted in Linux

Tagged with , , ,

usando ssh para criar um tunel reverso

with 2 comments

Semana passada estavamos (eu e meus amigos de irc) tentando ajudar um colega que estava com um determinado problema. Como ele estava utilizando uma máquina atrás de um firewall e ele não tinha acesso para fazer qualquer redirecionamento para esta máquina, falamos para ele criar um tunel reverso com ssh para conectarmos na máquina que ele estava e poder ajudá-lo com o problema que ele enfrentava.

Baseado no relato acima, vamos supor que tenho um servidor remoto cujo ip é 187.10.223.67, que a porta do ssh é a 22 (padrão) e que meu usuário remoto é but3k4, iremos utilizar as seguintes opções do ssh:

C - usa compactação de todos os dados que serão trafegados, muito útil para economizar banda.
N - não executa comandos no servidor remoto, portanto o usuário não precisa ter shell.
f - logo após conectar, coloca a conexão em background.
R - especifica qual porta irei ouvir no servidor remoto, em qual ip ela será listada e para qual porta do servidor local ela será redirecionada.

Agora, sabendo tudo que irei utilizar, peço para meu amigo digitar:

ssh -C -N -f -R 4444:localhost:22 but3k4@187.10.223.67

Com o comando acima, a porta 22 da máquina local, será listada automaticamente no loopback (127.0.0.1), na porta 4444 do ip 187.10.223.67.

Com isso, eu poderei conectar na máquina dele digitando:

ssh -p 4444 localhost -l root

Simples né? Túneis ssh são muito úteis e seu funcionamento como você mesmo viu é bem simples. Então, bom proveito.

Written by but3k4

November 3rd, 2009 at 8:00 pm

Posted in Linux

Tagged with , , , , ,

Port knocking utilizando iptables

without comments

Port Knocking é uma técnica que consiste em enviar uma sequência pré-determinada de pacotes em portas específicas para abrir conexão com algum host.

Não vou me aprofundar sobre o assunto, caso queira fazer isto, o google é seu amigo =). O que irei fazer é demonstrar como utilizar o iptables para realizar esta tarefa.

Supondo que a sua política padrão é DROP e que a porta do ssh é 22 (porta padrão), vamos criar uma regra para liberar o ssh por 20 segundos quando chegar uma conexão tcp na porta 65535:

iptables -A INPUT -i eth0 -p tcp -m state --state NEW --dport 22 -m recent --rcheck --seconds 20 --name SSH --rsource -j ACCEPT 
iptables -A INPUT -i eth0 -p tcp -m state --state NEW --dport 65535 -m recent --set --name SSH --rsource -j DROP 

Supondo que o ip do servidor onde você acabou de implementar as regras acima seja 187.10.223.67, digite:

telnet 187.10.223.67 65535

Logo em seguida, pressione CTRL + C e tente conectar no ssh, você terá somente 20 segundos após ter utilizado o telnet.

Simples né? com estas duas regras acima, você criou um port knocking em iptables :).

Written by but3k4

November 2nd, 2009 at 4:17 pm

Posted in Linux

Tagged with , , ,