특정 클라이언트에 대해 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를 사용하고 싶지 않은 모든 장치에 호스트 이름이 있는지 확인했습니다. 다음으로 라우터 식별의 도메인 이름으로 "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가 없다는 것입니다. 이 방법을 사용하여 이를 지정할 수 있는 방법은 없습니다. 그래도 99.99%의 시간 동안 작동하므로 충분히 좋을 것입니다. br1의 마지막 두 줄은 내 게스트 네트워크에 연결하는 모든 사람도 OpenDNS를 사용해야 함을 보장합니다.

답변2

나는 지금 토마토를 실험하고 있지만 바로 이런 이유로 dd-wrt로 돌아갈 수도 있습니다. dd-wrt에서 수행하는 방법은 다음과 같습니다.

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

"DNS 포트 특정 IP/범위 차단" 섹션까지 아래로 스크롤합니다.

관련 정보