Como forçar DNS para clientes específicos?

Como forçar DNS para clientes específicos?

Estou executando o firmware Shibby's Tomato no meu ASUS RT-N66U. O que estou tentando fazer é forçar IPs OpenDNS para determinados clientes (ou seja, meus filhos) com base no endereço MAC, enquanto outros clientes obtêm os valores padrão do roteador. Até agora, tudo bem (principalmente). Aqui está o script Dnsmasq que estou usando para fazer isso:

# Assign alternate DNS for select hosts
# Set Specific Clients to be affected
dhcp-mac=set:altdns,XX:XX:XX:XX:XX:XX # kids laptop
dhcp-mac=set:altdns,XX:XX:XX:XX:XX:XX # kids ipod

# Set Alternate DNS
dhcp-option=tag:altdns,option:dns-server,208.67.220.220,208.67.222.222

Isso funciona muito bem... na banda de 2,4 GHz. Se eles se conectarem à banda de 5 GHz, obterão as entradas DNS padrão do roteador.

Pergunta nº 1: Existe uma maneira de fazer com que este script se aplique a 2,4 GHz (eth1) e 5 GHz (eth2)? Caso contrário, o Tomato me permite colocar dispositivos na lista de permissões para a banda de 5 GHz? Posso colocar na lista de permissões/lista negra redes sem fio em geral, mas não vejo como fazer isso para um ou outro.

Sempre posso usar uma chave diferente para 5 GHz, então isso não é grande coisa. A maior lacuna é que isso só funciona com DHCP. Alterar as configurações de DNS no laptop ignora isso completamente. Meu filho de 12 anos está chegando ao ponto de conseguir descobrir isso sem muitos problemas.

Pergunta nº 2: Como posso forçar o DNS para um cliente específico se ele não estiver usando DHCP? Eu estava pensando em algum tipo de regra de Firewall permitindo apenas o tráfego DNS para IPs específicos para endereços MAC específicos ou algo assim, mas não tenho ideia de como fazer isso. Alternativamente, existe alguma maneira de forçar o DHCP (ou bloquear determinados clientes se eles não estiverem usando o DHCP)?

Responder1

Se valer a pena, veja como fiz isso funcionar (principalmente). Primeiro, certifiquei-me de que todos os dispositivos que não queria usar OpenDNS tivessem nomes de host. Em seguida, adicionei "home" como nome de domínio na identificação do roteador (não funcionará sem isso). Em seguida, adicionei o seguinte script de firewall:

# For certain devices, use default LAN DNS
# #############################################################
iptables -t nat -A PREROUTING -i br0 -s xxxx_Family_PC.home -p tcp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)
iptables -t nat -A PREROUTING -i br0 -s xxxx_Family_PC.home -p udp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)
iptables -t nat -A PREROUTING -i br0 -s xxxxxx-Laptop.home -p tcp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)
iptables -t nat -A PREROUTING -i br0 -s xxxxxx-Laptop.home -p udp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)
iptables -t nat -A PREROUTING -i br0 -s Chromecast.home -p tcp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)
iptables -t nat -A PREROUTING -i br0 -s Chromecast.home -p udp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)
iptables -t nat -A PREROUTING -i br0 -s xxxxxx-Galaxy-Note.home -p tcp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)
iptables -t nat -A PREROUTING -i br0 -s xxxxxx-Galaxy-Note.home -p udp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)
iptables -t nat -A PREROUTING -i br0 -s xxxxxx-HTC-One-M8.home -p tcp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)
iptables -t nat -A PREROUTING -i br0 -s xxxxxx-HTC-One-M8.home -p udp --dport 53 -j DNAT --to $(nvram get lan_ipaddr) 
iptables -t nat -A PREROUTING -i br0 -s Roku.home -p tcp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)
iptables -t nat -A PREROUTING -i br0 -s Roku.home -p udp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)
iptables -t nat -A PREROUTING -i br0 -s Sharp-Aquos-HDTV.home -p tcp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)
iptables -t nat -A PREROUTING -i br0 -s Sharp-Aquos-HDTV.home -p udp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)
iptables -t nat -A PREROUTING -i br0 -s xxxxxxsiPhone2.home -p tcp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)
iptables -t nat -A PREROUTING -i br0 -s xxxxxxsiPhone2.home -p udp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)
iptables -t nat -A PREROUTING -i br0 -s xxxxxx-MacBook.home -p tcp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)
iptables -t nat -A PREROUTING -i br0 -s xxxxxx-MacBook.home -p udp --dport 53 -j DNAT --to $(nvram get lan_ipaddr)

# For every other client, use OpenDNS (including guest network - br1).
# #############################################################
iptables -t nat -A PREROUTING -i br0 -p udp --dport 53 -j DNAT --to 208.67.220.220
iptables -t nat -A PREROUTING -i br0 -p tcp --dport 53 -j DNAT --to 208.67.220.220
iptables -t nat -A PREROUTING -i br1 -p udp --dport 53 -j DNAT --to 208.67.220.220
iptables -t nat -A PREROUTING -i br1 -p tcp --dport 53 -j DNAT --to 208.67.220.220

Isso me dá praticamente o que eu queria. A única coisa que falta é que os clientes que não correspondem à primeira seção (e assim obtêm o ip do OpenDNS) não tenham um dns secundário caso o primeiro esteja inativo. Simplesmente não há como especificar isso usando esse método. Ainda assim, funciona 99,99% do tempo, o que deve ser bom o suficiente. Essas duas últimas linhas para br1 garantem que qualquer pessoa que se conecte à minha rede convidada seja forçada a usar o OpenDNS também.

Responder2

Estou experimentando tomate agora, mas posso voltar ao dd-wrt exatamente por esse motivo. Aqui está como fazer isso em dd-wrt:

http://www.dd-wrt.com/wiki/index.php/OpenDNS

Role para baixo até a seção "Interceptar IP/intervalo específico da porta DNS"

informação relacionada