
Я использую прошивку Shibby's Tomato на моем ASUS RT-N66U. Я пытаюсь принудительно назначить IP-адреса OpenDNS для определенных клиентов (например, моих детей) на основе MAC-адреса, в то время как другие клиенты получают значения маршрутизатора по умолчанию. Пока все хорошо (в основном). Вот скрипт Dnsmasq, который я использую для этого:
# 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
Это отлично работает... на частоте 2,4 ГГц. Если они подключаются к частоте 5 ГГц, они получают записи DNS маршрутизатора по умолчанию.
Вопрос № 1: Есть ли способ применить этот скрипт как к 2,4 ГГц (eth1), так и к 5 ГГц (eth2)? Если это невозможно, позволяет ли Tomato вносить устройства в белый список для диапазона 5 ГГц? Я могу вносить устройства в белый/черный список для беспроводной сети в целом, но я не вижу, как это сделать для одного или другого.
Я всегда могу просто использовать другой ключ для 5 ГГц, так что это не проблема. Большая лазейка в том, что это работает только с DHCP. Изменение настроек DNS на ноутбуке полностью обходит это. Мой 12-летний сын дошел до того, что он может разобраться с этим без особых проблем.
Вопрос №2: Как принудительно включить DNS для определенного клиента, если они не используют DHCP? Я думал о каком-то правиле брандмауэра, разрешающем трафик DNS только определенным IP-адресам для определенных MAC-адресов или что-то в этом роде, но я понятия не имею, как это сделать. Или есть ли способ принудительно включить DHCP (или заблокировать определенных клиентов, если они не используют DHCP)?
решение1
Если это имеет значение, вот как я заставил это работать (в основном). Во-первых, я убедился, что все устройства, которые я не хотел использовать OpenDNS, имеют имена хостов. Затем я добавил "home" в качестве имени домена в Router Identification (без этого работать не будет). Затем я добавил следующий скрипт брандмауэра:
# 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
Это дает мне почти то, что я хотел. Единственное, чего не хватает, так это того, что клиенты, которые не соответствуют первому разделу (и поэтому получают IP OpenDNS), не имеют вторичного DNS на случай, если первый не работает. Просто нет способа указать это с помощью этого метода. Тем не менее, это работает в 99,99% случаев, что должно быть достаточно хорошо. Последние две строки для br1 гарантируют, что любой, кто подключается к моей гостевой сети, также вынужден использовать OpenDNS.
решение2
Сейчас я экспериментирую с томатом, но, возможно, вернусь к dd-wrt именно по этой причине. Вот как это сделать в dd-wrt:
http://www.dd-wrt.com/wiki/index.php/OpenDNS
Прокрутите страницу вниз до раздела «Перехват определенного IP-адреса/диапазона портов DNS»