Amarrando IP X MAC de maneira simples e funcional

Publicado por Lacier Dias em 04/11/2005

[ Hits: 29.735 ]

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

Limitando a banda do Kazaa com CBQ

Nat simples e rápido no RedHat

Mikrotik com a hora correta sempre: NTP Server e Client

Leitura recomendada

FreeBSD com Packet Filter

Configuração do Openfire 3.7 no Ubuntu 11.04

Explorando seu hardware III

Roteamento estático no GNU/Linux

Como instalar o Docker no openSUSE 15 (15.1 e 15.2)

  

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