
我在我的華碩 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?我正在考慮某種防火牆規則,只允許特定 MAC 位址或其他特定 IP 的 DNS 流量,但我不知道如何做。或者,有沒有辦法強制 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
這幾乎讓我得到了我想要的。唯一缺少的是,與第一部分不匹配(因此獲取 OpenDNS IP)的客戶端沒有輔助 dns,以防第一個 dns 關閉。沒有辦法使用此方法來指定這一點。儘管如此,它在 99.99% 的時間裡都能工作,這已經足夠好了。 br1 的最後兩行確保連接到我的訪客網路的任何人也被迫使用 OpenDNS。
答案2
我現在正在嘗試番茄,但出於這個原因我可能會回到 dd-wrt。以下是在 dd-wrt 中執行此操作的方法:
http://www.dd-wrt.com/wiki/index.php/OpenDNS
向下捲動至「攔截 DNS 連接埠特定 IP/範圍」部分