Para fins de teste e educacionais, quero configurar um cenário do tipo intermediário da seguinte forma:
- O host T é o host de destino que deve ser "clonado"
- O host M é o homem no meio com as interfaces
eth0
e eth1
; M está conectado à rede via eth0
e a T via eth1
.
O ponto da configuração é que T deve ser capaz de responder a algumas solicitações (particularmente a autenticação 802.1X via EAPoL, portanto, M está usando T como um oráculo de autenticação). Especificamente, por padrão, T estaria conectado à rede e se autenticaria via 802.1X, enquanto M teria acesso negado. Por outro lado, o usuário tem acesso administrativo a M, mas não a T. O objetivo é permitir que M pareça ser T durante o diagnóstico de rede, o que não seria possível a partir de T devido à falta de privilégios.
Existem duas abordagens possíveis:
-
Escreva um programa (por exemplo, python com scapy ou C com libpcap) que copia os quadros relevantes para frente e para trás.
-
Use ebtables
e iptables
.
A questão aqui se concentra em 2 e simplesmente diz: Como conseguir o resultado desejado?
O que eu tentei até agora
O primeiro passo foi colmatar eth0
e eth1
(por exemplo, anexá-los a br0
). Sem nenhuma regra ebtables
/ iptables
T é visível para a rede como se estivesse conectado diretamente a ela. Então, como o foco é principalmente representar o T no IPv4, estabeleci a seguinte regra:
ebtables -A FORWARD -p IPv4 -j DROP
Esta regra impede que o tráfego IPv4 atravesse a ponte. Agora, para representar T, M deve fazer algum NAT nas camadas 2 e 3:
# interception of incoming packets for T:
ebtables -t nat -A PREROUTING -i eth0 -p IPv4 -d $TARGET_MAC_ADDR -j dnat --to-destination $MY_ETH0_MAC_ADDR
iptables -t nat -A PREROUTING -i eth0 -d $TARGET_IP4_ADDR -j DNAT --to-destination $MY_ETH0_IP4_ADDR
# spoofing of outgoing packets as coming from T:
ebtables -t nat -A POSTROUTING -o eth0 -p IPv4 -s $MY_ETH0_MAC_ADDR -j snat --to-source $TARGET_MAC_ADDR
iptables -t nat -A POSTROUTING -o eth0 -s $MY_ETH0_IP4_ADDR -j SNAT --to-source $TARGET_IP4_ADDR
Meu pensamento ingênuo era que isso deveria funcionar. Mas isso não acontece. Além de "desconectar" T, M não se comporta como T. Especialmente, iptables -t nat -L -v -n
mostra que as regras SNAT são acionadas como esperado, mas a regra DNAT é inerte (isto é, 0 pacotes, não importa o que aconteça). O que estou perdendo aqui?
Notas
O problema é semelhante a este mas a configuração não é a mesma.
Em um comentário, Rui ressalta que alguns protocolos são propensos a problemas quando NAT. Este é o caso se um roteador estiver mascarando hosts em uma rede upstream (a.k.a. Cone NAT ). No entanto, este não é o ponto aqui. Neste cenário, NAT é usado para mascarar M como T enquanto o sombreado T. M simplesmente descarta os pacotes de T (veja a primeira regra de ebtables)
Antecedentes
802.1X (mais precisamente 802.1X-2010) fornece apenas autenticação, mas nenhuma segurança de "canal" subsequente. É como se o handshake TLS resultasse em criptografia e autenticação NULL - o "suplicante" prova no momento da autenticação sua autenticidade, mas a "sessão" após a autenticação pode ser seqüestrada.
A solução para conexões com fio é o MACsec (também conhecido como 802.1ae, que faz parte do 802.1X-2014). O pingente sem fio para MACsec é WPA / WPA2. Surpreendentemente, até mesmo o hardware mais barato pode dominar o WPA2, enquanto os switches high end que são capazes de MACsec são consideravelmente mais caros do que aqueles sem o recurso.
Entre outras coisas, o cenário descrito mostra que o 802.1X sem MACsec é inútil.