特定のクライアントに DNS を強制するにはどうすればよいですか?

特定のクライアントに DNS を強制するにはどうすればよいですか?

私は 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 を強制するにはどうすればよいでしょうか。特定の MAC アドレスの特定の IP への DNS トラフィックのみを許可するファイアウォール ルールのようなものを考えていましたが、その方法がわかりません。あるいは、DHCP を強制する方法 (または DHCP を使用していない特定のクライアントをブロックする方法) はありますか。

答え1

参考までに、これを動作させる方法 (ほぼ) を以下に示します。まず、OpenDNS を使用しないようにするすべてのデバイスにホスト名があることを確認しました。次に、ルーター ID のドメイン名として「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 の最後の 2 行により、ゲスト ネットワークに接続するすべてのユーザーが OpenDNS を使用するように強制されます。

答え2

私は現在トマトを試していますが、まさにこの理由で dd-wrt ​​に戻るかもしれません。dd-wrt ​​でこれを行う方法は次のとおりです。

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

「DNSポートの特定のIP/範囲をインターセプトする」セクションまでスクロールします。

関連情報