Amarrando IP X MAC de maneira simples e funcional

Publicado por Lacier Dias em 04/11/2005

[ Hits: 29.541 ]

Blog: http://br.linkedin.com/in/lacierdias/

 


Amarrando IP X MAC de maneira simples e funcional



Depois de vagar na internet vendo que existem várias informações desencontradas sobre este assunto, resolvi escrever esta dica com o que julgo ser a melhor maneira de implementar está solução e com o intuito de ajudar quem me ajudou a implementar a solução e principalmente ajudar aos mais novos. Por isso vamos direto ao que interessa.

O firewall é a gosto de cada um, este script de firewall é apenas para melhor entendimento da dica, mas funciona corretamente.

É relativamente simples depois que você entende o conceito das regras, por isso resolvi explicar de modo bem simples cada uma delas.

Destrinchando as regras:

1. Esta linha informa à tabela filter que os pacotes de origem 192.168.0.2 com o MAC 00:0B:05:EC:0D:5A podem ser aceitos e redirecionados para qualquer rede:

iptables -t filter -A FORWARD -d 0/0 -s 192.168.0.2 -m mac --mac-source 00:0B:05:EC:0D:5A -j ACCEPT

2. Esta linha informa à tabela filter que os pacotes com destino ao IP 192.168.0.2 que venham de qualquer rede podem ser aceitos e redirecionados:

iptables -t filter -A FORWARD -d 192.168.0.2 -s 0/0 -j ACCEPT

3. Esta linha autoriza o pacote de origem 192.168.0.2 com o MAC 00:0B:05:EC:0D:5A a serem aceitos pelo firewall:

iptables -t filter -A INPUT -s 192.168.0.2 -d 0/0 -m mac --mac-source 00:0B:05:EC:0D:5A -j ACCEPT

4. NAT:

iptables -t nat -A POSTROUTING -s 192.168.0.2 -o eth1 -j MASQUERADE

Entendido essa parte, acho que é hora de partirmos para a prática.

Abaixo segue um demonstrativo de como ficam as regras dentro de um firewall básico.

Abraço e espero ter ajudado.

#!/bin/sh

#Internet=eth1
#Rede Interna=eth0

# Ativa módulos
modprobe ip_tables
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_nat_ftp
modprobe ipt_REJECT
modprobe ipt_MASQUERADE

# Zera regras
iptables -F
iptables -X
iptables -F -t nat
iptables -X -t nat
iptables -F -t filter
iptables -X -t filter


# Determina a política padrão
iptables -P INPUT DROP
iptables -P FORWARD DROP

# Aceita os pacotes que realmente devem entrar
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Controle de acesso IP X MAC

# Cliente 1
iptables -t filter -A FORWARD -d 0/0 -s 192.168.0.2 -m mac --mac-source 00:0B:05:EC:0D:5A -j ACCEPT
iptables -t filter -A FORWARD -d 192.168.0.2 -s 0/0 -j ACCEPT
iptables -t filter -A INPUT -s 192.168.0.2 -d 0/0 -m mac --mac-source 00:0B:05:EC:0D:5A -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.0.2 -o eth1 -j MASQUERADE

# Cliente 2
iptables -t filter -A FORWARD -d 0/0 -s 192.168.0.3 -m mac --mac-source 00:0C:86:00:00:00 -j ACCEPT
iptables -t filter -A FORWARD -d 192.168.0.3 -s 0/0 -j ACCEPT
iptables -t filter -A INPUT -s 192.168.0.3 -d 0/0 -m mac --mac-source 00:0C:86:00:00:00 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.0.3 -o eth1 -j MASQUERADE

# Cliente 3
iptables -t filter -A FORWARD -d 0/0 -s 192.168.0.4 -m mac --mac-source 00:28:00:35:00:00 -j ACCEPT
iptables -t filter -A FORWARD -d 192.168.0.4 -s 0/0 -j ACCEPT
iptables -t filter -A INPUT -s 192.168.0.4 -d 0/0 -m mac --mac-source 00:28:00:35:00:00 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.0.4 -o eth1 -j MASQUERADE

#Compartilha a conexão
echo 1 > /proc/sys/net/ipv4/ip_forward

#Fecha o resto
iptables -A INPUT -j DROP
iptables -A FORWARD -j DROP

Autor: Lacier Dias
msn: lacierdias@hotmail.com

Outras dicas deste autor

Nat simples e rápido no RedHat

Mikrotik com a hora correta sempre: NTP Server e Client

Limitando a banda do Kazaa com CBQ

Leitura recomendada

O básico para ser feliz no Fedora 14

Venha pro Sabayon você também!

Configurar IP estático no Damn Small Linux

Qual Ubuntu devo usar?

Como fazer download de pacotes de uma distro Linux usando Windows

  

Comentários
[1] Comentário enviado por marcosvargasmt em 08/11/2005 - 07:34h

Parabéns pelo artigo, depois q vc comentou na "install fest" sobre esta regra eu fiquei mesmo interessado e já estava procurando algo semelhante.


marcosvargasmt

[2] Comentário enviado por richar em 08/12/2005 - 11:06h

Como faso para bloquear todos os mac e so os que eu quero permitir que accesem minha internet posam

[3] Comentário enviado por lacierdias em 08/12/2005 - 12:20h

Mano vc não bloqueia o mac vc só indica quais podem e oq for diferente da lista dos q podem ele não permite...só isso

Abraço

[4] Comentário enviado por pvhnet em 01/03/2006 - 14:03h

E seu eu quiser redirecionar para um site os clientes nao aceitos pelo firewall , como devo proceder

[5] Comentário enviado por pe360graus em 27/03/2006 - 21:30h

Cara a parada fiz igual ao exemplo só que da erro e o servidor trava.
A distri é a Slacware 10.2 o erro é este:

v1.3.3.3 iptables bad intruse ESTABELISHED, RELATED

Depois disso a máquina não faz mais nada, ela trava.

[6] Comentário enviado por lacierdias em 28/03/2006 - 08:53h

Amigo vc errou em um detalhe minusculo....

v1.3.3.3 iptables bad intruse ESTABELISHED, RELATED

Não tem espaço entre as palavras ESTABELISHED,RELATED.. É so isso...

Abraço

[7] Comentário enviado por marcosfnet em 22/04/2006 - 19:32h

Amigo, aqui no meu servidor estava tudo normal, funcionando perfeitamente, derrepente vi que o amarramento IP x MAC não estava funcionando, então veriquei e descobri que ACCEPT e MASQUERADE não estão sendo aceitos pelo IPTABLES, então verifiquei a versão e como não entendo muito, gostaria que você me desse uma luz, porque estava normal, derrepente ficou assim, veja abaixo o resultado dos comandos:

iptables v1.2.11

: command not found:
iptables v1.2.11: Invalid target name MASQUERADE
iptables v1.2.11: Invalid target name ACCEPT


Aguardo retorno, pois estou precisando resolver o meu problema.

Desde já muito obrigado!

Marcos

[8] Comentário enviado por lacierdias em 25/04/2006 - 09:15h

Marcos não tem um motivo plausivel para isso ter acontecido...
ACCEPT e MASQUERADE são funções básica do iptables... eles não para de funcionar sem motivo...tente reintalar o iptables e inserir as regras uma a uma para ver se não tem algo de errado na ordem das regras..
Qualquer coisa estamos ai.
Abraço.

[9] Comentário enviado por marcosfnet em 06/05/2006 - 17:10h

Boa tarde,

Fiz o que te falei, formatei o servidor e instalei tudo novamente, agora está tudo funcionando.

Só que agora estou com um pequeno probleminha, a dica acima funciona maravilhosamente, mas bloqueou tudo que entra no servidor, os clientes acessam a internet normalmente, mas eu usava o Apache (porta 80) dentro e fora da rede e também o SSH (porta 22) somente dentro da rede para acessar o servidor. Agora está tudo bloqueado, gostaria de saber como faço para desbloquear essas portas modificando o script acima, tentei algumas coisas mas não consegui, gostaria de ajuda.

Desde já obrigado!

Marcos

[10] Comentário enviado por barrosvip em 18/11/2006 - 12:31h

COMIGO FUNCIONOU BLZ, ATE UM CERTO PONTO, O SERVIDOR DE DNS NAO FUNCIONOU, O SERVIDOR DE DNS ESTA COM O IP DA ETHO E OS CLIENTES ESTAO LIGADOS A ETH1

[11] Comentário enviado por julianlinuxer em 24/05/2007 - 16:26h

É uma dica bem interessante para quem tem provedores, para um maior controle.

[12] Comentário enviado por samircuri em 12/12/2007 - 03:33h

Sua dica foi muito boa. Parabéns pela iniciativa. Aqui rodou tudo belezinha.

Att.
Samir Curi

[13] Comentário enviado por davirodrigues em 30/01/2008 - 16:39h

Muito bom essa Dica,

Ôooo marcosfnet, é só vc adicionar uma regra de INPUT e FORWARD na porta 80 e na porta 22 do ssh.

iptables -A INPUT -p tcp --dport 22 -s REDE_INTERNA -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -s REDE_INTERNA -j ACCEPT

essas regras vão dar acesso a sua máquina somente da sua rede interna, se quiser liberar a porta 80 para acesso externo é só colocar sem a rede interna.

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

assim vai aceitar todas as requisições de IP.


[14] Comentário enviado por bfmano em 08/07/2008 - 23:17h

para facilitar a vida do administrador pode criar um arquivo de "banco de dados" para o iptables ler em /etc/clientes no seguinte formato:
192.168.0.2#00:0B:05:EC:0D:5A#Cliente1
192.168.0.3#00:0C:86:00:00:00#Cliente2
192.168.0.4#00:28:00:35:00:00#Cliente3


ipxmac.sh
#!/bin/bash

#Declarando algumas variaveis
arq_clientes="/etc/clientes"
extnet="eth1"
intnet="eth0"

# Ativa módulos
modprobe ip_tables
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_nat_ftp
modprobe ipt_REJECT
modprobe ipt_MASQUERADE

# Zera regras do iptables
iptables -F -t filter
iptables -F -t nat
iptables -X -t filter
iptables -X -t nat

# Determina a política padrão para DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP

#Rejeita conexões Inválidas
iptables -A FORWARD -m state --state NEW,INVALID -j DROP
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

echo -e 127.0.0.1'\t'localhost > /etc/hosts

# Inicia loop para cada linha do arquivo de clientes
for ip in `cat $arq_clientes|cut -d# -f 1` ; do

# Identifica o MAC ADDRESS
mac="`grep -w $ip $arq_clientes|cut -d# -f2`"

# Identifica o nome do cliente
cliente="`grep -w $ip $arq_clientes|cut -d# -f3`"

# Atribui regra para aceitar encaminhamento com origem sendo o IP do cliente checando o par IP/MAC
iptables -t filter -A FORWARD -d 0/0 -s $ip -m mac --mac-source $mac -j ACCEPT ;

# Atribui regra para aceitar encaminhamento com destino sendo o IP do cliente
iptables -t filter -A FORWARD -d $ip -s 0/0 -j ACCEPT

# Atribui regra para fazer NAT para o IP do cliente caso não tenha IP válido
iptables -A POSTROUTING -t nat -s $ip -o $interface_saida -j MASQUERADE ;

# Ecoa na tela a mensagem de habilitação do cliente
echo -e "Habilitando: \{COMENTARIO}33[1;34m$cliente\{COMENTARIO}33[0;39m com o IP: \{COMENTARIO}33[1;33m$ip\{COMENTARIO}33[0;39m e o MAC: \{COMENTARIO}33[1;37m$mac\{COMENTARIO}33[0;39m [ \{COMENTARIO}33[1;32mok\{COMENTARIO}33[0;39m ]";
fi

# Escreve o IP e o nome do cliente no arquivo /etc/hosts
echo -e $ip'\t'$cliente >> /etc/hosts

# Atribui regra para aceitar pacotes de entrada com origem do IP do cliente checando o par IP/MAC
iptables -t filter -A INPUT -s $ip -d 0/0 -m mac --mac-source $mac -j ACCEPT ;

# Atribui regra para aceitar pacotes de saida com origem no IP do cliente
iptables -t filter -A OUTPUT -s $ip -d 0/0 -j ACCEPT
done

#Compartilha a conexão
echo 1 > /proc/sys/net/ipv4/ip_forward

# Atribui regra para aceitar acesso de SSH
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT

#Fecha o resto
iptables -A INPUT -j DROP
iptables -A FORWARD -j DROP

[15] Comentário enviado por bfmano em 08/07/2008 - 23:22h

aconteceu alguma coisa quando enviei o texto, repare que onde tem "\{COMENTARIO}33[" o "{COMENTARIO}" deve ser substituida por "\ 0", ficando "\ \ 0 3 3 [" claro que tudo junto.
vlw

[16] Comentário enviado por fbart em 19/10/2009 - 00:03h

Outra sujestão seria:

# MACS permitidos
iptables -A FORWARD -m mac -mac-source 00:60:08:91:CC:B7 -j accept
iptables -A FORWARD -m mac -mac-source 00:60:08:91:CC:B8 -j accept
iptables -A FORWARD -m mac -mac-source 00:60:08:91:CC:B9 -j accept
...

# Nega o resto
iptables -A FORWARD -m mac -mac-source ! FF:FF:FF:FF:FF:FF -j DROP
iptables -A FORWARD -m mac -mac-source ! 00:00:00:0:00:00 -j DROP

Não pode esquecer de editar conf do dhcp que fica no /etc/dhcp3/dhcpd.conf



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts