我在 ASUS RT-N66U 上运行 Shibby 的 Tomato 固件。我试图根据 MAC 地址为某些客户端(即我的孩子)强制使用 OpenDNS IP,而其他客户端则获取路由器的默认值。到目前为止,一切顺利(大部分)。这是我用来执行此操作的 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.4Ghz 频段上效果很好。如果他们连接到 5Ghz 频段,他们会获得路由器的默认 DNS 条目。
问题 1:有没有办法让这个脚本同时适用于 2.4Ghz (eth1) 和 5Ghz (eth2)?如果做不到这一点,Tomato 是否允许我将 5Ghz 频段的设备列入白名单?一般来说,我可以为无线设备加入白名单/黑名单,但我不知道如何为其中一个设备加入白名单/黑名单。
我总是可以为 5Ghz 使用不同的密钥,所以这不是什么大问题。更大的漏洞是这只适用于 DHCP。更改笔记本电脑上的 DNS 设置可以完全绕过这一点。我 12 岁的儿子已经可以毫不费力地解决这个问题了。
问题 #2:如果特定客户端未使用 DHCP,我该如何强制 DNS?我原本想制定某种防火墙规则,只允许 DNS 流量流向特定 MAC 地址或类似地址的特定 IP,但我不知道该怎么做。或者,有没有办法强制 DHCP(或者如果某些客户端未使用 DHCP,则阻止它们)?
答案1
不管怎样,下面是我让它工作的方法(大部分情况下)。首先,我确保所有我不想使用 OpenDNS 的设备都有主机名。接下来,我在路由器标识中添加了“home”作为域名(没有这个就无法工作)。然后我添加了以下防火墙脚本:
# 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
这几乎满足了我的要求。唯一缺少的是,如果第一个 DNS 发生故障,与第一部分不匹配的客户端(因此获取 OpenDNS ip)没有辅助 DNS。使用此方法无法指定这一点。不过,它 99.99% 的时间都有效,这已经足够好了。br1 的最后两行确保连接到我的访客网络的任何人都必须使用 OpenDNS。
答案2
我现在正在尝试使用 Tomato,但出于这个原因,我可能会回到 dd-wrt。以下是在 dd-wrt 中执行此操作的方法:
http://www.dd-wrt.com/wiki/index.php/OpenDNS
向下滚动到“拦截 DNS 端口特定 IP/范围”部分