Claudio Borges

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

Archive for the ‘firewall’ tag

VPN Ipsec entre OpenBSD e Juniper Netscreen

with 2 comments

Há alguns dias precisei configurar uma VPN Ipsec entre um Juniper Netscreen e um OpenBSD. Como o protocolo é Ipsec, o OpenBSD tem tudo nativo :). Nele você pode configurar uma VPN Ipsec utilizando 2 caminhos:

[text]
– ipsec: A configuração é definida em um único arquivo (/etc/ipsec.conf). Configuração bastante simples.
– isakmpd: Além do arquivo de configuração (/etc/isakmpd/isakmpd.conf), você precisa configurar o arquivo de policy (/etc/isakmpd/isakmpd.policy). Configuração um pouco complexa de entender no inicio.
[/text]

Não vou entrar em detalhes sobre o ipsec e isakmpd, caso precise leia a documentação do mesmo, nada como um man arquivo não resolva, ou então clique nos respectivos links :).

Deixando a teoria de lado, vamos a pratica. As informações do Netscreen são praticamente iguais as utilizadas nas VPNs Cisco e no CheckPoint. Então esta documentação serve para os 3 produtos. O que pode mudar é o group, hash, encryption algorithm e é claro, a shared-key:

[text]
IP Netscreen: 201.56.120.125
Lan Netscreen: 192.168.1.0/24
Shared Key: fGrkApZlrNf@uR0@zlr#!4ka

Fase 1:

Hashing Algorithm: MD5
Diffie-Hellman Group: Group-2
Transform (IPSec Protocol): ESP
Perfect Forward Secrecy: PFS
Encryption Algorithm: 3DES

Fase 2:

Diffie-Hellman Group: Group-0
Encryption Algorithm: 3DES
Hashing Algorithm: MD5
Perfect Forward Secrecy: noPfs
[/text]

No meu servidor OpenBSD tenho os seguintes IPs:

[text]
IP OpenBSD: 187.10.223.67
Lan OpenBSD: 10.10.1.0/24
[/text]

Consultando a documentação do ipsec.conf (man ipsec.conf), listei as opções que recebi do Netscreen e criei uma lista compatível que será usada no arquivo /etc/ipsec.conf:

[text]
Fase 1 = main mode
Hashing Algorithm: hmac-md5
Diffie-Hellman Group: modp1024
Transform (IPSec Protocol): esp
Encryption Algorithm: 3des

Fase 2 = quick mode
Diffie-Hellman Group: none
Encryption Algorithm: 3des
Hashing Algorithm: hmac-md5
[/text]

Baseado nas informações anteriores, gerei o esqueleto da configuração para um melhor entendimento:

[text]
ike [Transform (IPSec Protocol)] from src to dst \
main auth [Hashing Algorithm] enc [Encryption Algorithm] group [Diffie-Hellman Group] \
quick auth [Hashing Algorithm] enc [Encryption Algorithm] group [Diffie-Hellman Group] \
psk [shared-key]
[/text]

Depois de entender a lógica da configuração, vamos criar o arquivo final. Renomeie o /etc/ipsec.conf para /etc/ipsec.conf.default:

[bash]
mv /etc/ipsec.conf /etc/ipsec.conf.default
[/bash]

Crie o /etc/ipsec.conf com o seguinte conteúdo:

[text]
# /etc/ipsec.conf
#
ext_if = "fxp0"
openbsd_lan = "10.10.1.0/24"
netscreen_lan = "192.168.1.0/24"
netscreen_gw = "201.56.120.125"

ike esp from $openbsd_lan to $netscreen_lan peer $netscreen_gw \
main auth hmac-md5 enc 3des group modp1024 \
quick auth hmac-md5 enc 3des group none \
psk "fGrkApZlrNf@uR0@zlr#!4ka"
[/text]

Antes de iniciar a VPN, é preciso criar o arquivo de policy do isakmpd. Este procedimento torna-se necessário para o isakmpd não ficar gerando log dizendo que o arquivo de policy não foi encontrado:

[bash]
touch /etc/isakmpd/isakmpd.policy
[/bash]

Repara que o arquivo acima foi criado sem nenhum conteúdo.

Adicione a variável netscreen_gw = “201.56.120.125” no seu /etc/pf.conf, depois adicione as linhas abaixo para permitir o tráfego entre o OpenBSD e o GW Netscreen:

[text]
pass in on $ext_if proto udp from $netscreen_gw to $ext_if port { 500, 4500 }
pass out on $ext_if proto udp from $ext_if to $netscreen_gw port { 500, 4500 }
pass in on $ext_if proto esp from $netscreen_gw to $ext_if
pass out on $ext_if proto esp from $ext_if to $netscreen_gw
[/text]

Dê um reload nas suas regras e start a VPN:

[bash]
pfctl -f /etc/pf.conf
isakmpd -K
ipsecctl -f /etc/ipsec.conf
[/bash]

Caso não tenha recebido nenhuma mensagem de erro, verifique se o túnel subiu:

[bash]
netstat -nr
[/bash]

Nas últimas linhas você verá as seguintes informações:

[text]
Encap:
Source Port Destination Port Proto SA(Address/Proto/Type/Direction)
192.168.1.0/24 0 10.10.1.0/24 0 0 201.56.120.125/esp/use/in
10.10.1.0/24 0 192.168.1.0/24 0 0 201.56.120.125/esp/require/out
[/text]

Utilizamos o ipsecctl para verificar as regras de policy do ipsec:

[text]
FLOWS:
flow esp in from 192.168.1.0/24 to 10.10.1.0/24 peer 201.56.120.125 srcid 187.10.223.67/32 dstid 201.56.120.125/32 type use
flow esp out from 10.10.1.0/24 to 192.168.1.0/24 peer 201.56.120.125 srcid 187.10.223.67/32 dstid 201.56.120.125/32 type require

SAD:
esp tunnel from 187.10.223.67 to 201.56.120.125 spi 0x097a93d3 auth hmac-md5 enc 3des-cbc
esp tunnel from 201.56.120.125 to 187.10.223.67 spi 0x6f5c0fef auth hmac-md5 enc 3des-cbc
[/text]

Adicione as seguintes linhas no /etc/rc.conf.local para que a VPN suba se o servidor reiniciar:

[text]
isakmpd_flags="-K" # enabled isamkpd
ipsec=YES # enabled ipsec
[/text]

Para visualizar o tráfego utilize o tcpdump na interface externa filtrando tudo que entra e sai para o IP do Netscreen:

[bash]
tcpdump -i fxp0 -netttvvv src or dst 201.56.120.125
[/bash]

Chegamos ao final, VPN pronta, tunel no ar e clientes felizes :).

Written by but3k4

April 17th, 2010 at 12:13 pm

Posted in OpenBSD

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:

[text]
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.
[/text]

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

[bash]
ssh -C -N -f -R 4444:localhost:22 but3k4@187.10.223.67
[/bash]

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:

[bash]
ssh -p 4444 localhost -l root
[/bash]

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:

[bash]
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
[/bash]

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

[bash]
telnet 187.10.223.67 65535
[/bash]

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 , , ,