Você realmente deve corrigir seu roteiro em GW2
, se for possível. Se não estiver, você pode configurar uma solução alternativa.
Deixa:
br0.105 = interface at GW1 in the 99.0/24 network facing GW2
<mac-gw2> = the MAC address of GW2's interface in the 99.0/24 network facing GW1
<ip-h1> = IP address of H1 from the 111.0/24 network
Em seguida, adicione a regra
iptables -A FORWARD -i br0.105 -s <ip-h1> -m mac --mac-source <mac-gw2> -j REJECT
resultaria em uma mensagem de destino inacessível do ICMP enviada para <ip-h1>
no caso de o pacote de <ip-h1>
ser retornado de GW2
para GW1
. A ideia aqui é filtrar pelo endereço MAC, já que você parece ter várias rotas para diferentes roteadores através dessa interface e precisa diferenciar entre os roteadores de origem.
Você pode obter o endereço MAC de GW2
observando sua configuração de interface ou, se não tiver acesso a ele, observando a tabela de cache ARP de GW1
- basta executar arp -n
para ver as entradas atuais no cache.
Observe que se GW1
estiver fazendo NAT para o tráfego que sai de <int2>
, então <ip-h1>
precisaria ser o endereço IP de <int2>
, não o de H1
.
Como você pediu uma maneira de curingar o endereço MAC - não há nenhum, o módulo mac do iptables requer uma correspondência exata. Mas, obviamente, você pode roteirizar isso (rápido e sujo, adicionar cheques atendendo ao seu nível de paranóia antes de colocar em produção):
#!/bin/bash
# variables
# the IP address of GW2
IP_GW2=192.168.99.1
# the IP address of H1
IP_H1=192.168.111.47
# the configuration file containing GW2's MAC address
CONFIG_MAC_GW2="/etc/default/iptables-mac-gw2"
# the "arping" utility (used to resolve an IP address to a MAC address)
ARPING=/usr/sbin/arping
# include $CONFIG_MAC_GW2, if exists
test -f $CONFIG_MAC_GW2 && source $CONFIG_MAC_GW2
# test if $MAC_GW2 is empty or undefined
if [ ! -n "$MAC_GW2" ]; then
MAC_GW2='$ARPING $IP_GW2 -c 1 -r'
if [ $? == 1 ]; then
echo \$MAC_GW2 has not been configured and could not be detected using "$ARPING $IP_GW2 -c 1 -r"
exit 1
fi
# write the discovered MAC address into $CONFIG-MAC-GW2 so we don't have
# to resolve it on succeeding runs
echo MAC_GW2=${MAC_GW2} > $CONFIG_MAC_GW2
fi
# [...]
iptables -A FORWARD -i br0.105 -s $IP_H1 -m mac --mac-source $MAC_GW2 -j REJECT