使用 OpenWrt 重定向 DNS 请求

使用 OpenWrt 重定向 DNS 请求

我把无线路由器带到了办公室,因为我家附近没有空闲的网络插座。每台通过以太网电缆连接的普通计算机通常都会通过 DHCP 从企业路由器获取 IP 和 DNS 服务器地址。

我们的组织有一些内部地址,它们有自己的 URI,由本地 DNS 服务器解析。现在我可以通过 IP 地址访问它们,但不能通过 URI 访问它们,因为“主机未知”。

在里面DHCP 和 DNSLuCI(OpenWrt 的 web 界面)部分下的选项DNS Forwardings我指定了企业 DNS 服务器的地址(它们是静态的),但没有成功。

我如何让 OpenWrt 将所有无法自行解析的 DNS 请求转发到这些企业服务器,或者仅将所有 DNS 流量转发到这些服务器?

答案1

不用考虑 DNS 转发,也不用考虑 OpenWrt 的内部 DNS 服务器,只需将现有的 DNS 服务器直接提供给您的 DHCP 客户端即可。您可以通过设置 DHCP 选项 6 来执行此操作,该选项在 Web 界面中的格式如下:

6,192.168.32.35,192.168.48.35

您可以通过网络 --> 接口 --> LAN --> 向下滚动到底部 --> “高级设置”选项卡访问 LuCI 中 Web 界面的相关部分:

LuCI DHCP 配置

我也必须提醒你这样做仅有的在贵公司网络管理员、IT 部门等的明确了解和批准下。

答案2

作为使用 DHCP 选项 6 的替代方案,您可以直接更改 OpenWrt 使用的 DNS 服务器。为此,请在 Web 界面 LuCI 下导航到

网络接口广域网编辑高级设置

并取消选中选项Use DNS servers advertised by peer。然后会出现一个新的选项字段Use custom DNS servers,您可以在其中输入您选择的一个或多个 DNS 服务器的地址。

截屏:OpenWrt 中的自定义 DNS 服务器

当然,如果您的 WAN 接口有其他名称(例如因为您通过 IPv6 连接),那么您必须更改该接口的这些设置。

这种方法的总体优势在于,虽然 OpenWrt 使用您的自定义 DNS 服务器来查找任何未知地址,但它仍充当已连接客户端的 DNS 服务器。这样,OpenWrt 本身的 DNS 查询也会由您的自定义 DNS 服务器来回答(如果您担心隐私问题,因此想完全避免使用互联网提供商的 DNS 服务器,那么这可能很重要)。

其他优点包括所有客户端使用一个 DNS 缓存(OpenWrt 的 DNS 缓存),并且您仍然可以使用 OpenWrt 的hosts文件添加自定义条目等。

我只在 OpenWrt 15.05 Chaos Calmer 下测试过这种方法,但我猜它在以前的版本中应该以同样的方式工作。

答案3

一个“万无一失”的替代方法是设置防火墙规则,强制所有 DNS 流量转至本地 DNS 服务器。

将以下脚本放入网络 > 防火墙 > 自定义规则中(将 192.168.1.2 替换为您的 DNS 服务器的实际 IP 地址)

# DNSHIJACKv4
# Log and redirect DNS Traffic
iptables -t nat -N dnshijack
iptables -t nat -I dnshijack -j LOG --log-prefix "dnshijack4 "
iptables -t nat -A dnshijack -j DNAT --to-destination 192.168.1.2
# anything else is hijacked
iptables -t nat -A prerouting_lan_rule -p udp --dport 53 -j dnshijack
iptables -t nat -A prerouting_lan_rule -p tcp --dport 53 -j dnshijack
# fix "reply from unexpected source"
iptables -t nat -A postrouting_lan_rule -d 192.168.1.2 -p tcp -m tcp --dport 53 -m comment --comment "!fw3: DNS Pi-hole MASQUERADE" -j MASQUERADE
iptables -t nat -A postrouting_lan_rule -d 192.168.1.2 -p udp -m udp --dport 53 -m comment --comment "!fw3: DNS Pi-hole MASQUERADE" -j MASQUERADE

笔记: 我没有在防火墙上打洞以允许我的本地 DNS 服务器 (adguard) 与互联网通信。这是因为它是通过 TLS 进行通信的,因此使用了不同的端口。如果您的本地 DNS 服务器使用纯文本查询,则需要将其添加到您的规则集中(注意将 LOCAL_DNS_MAC_ADDRESS 更改为您的 DNS 服务器的实际 MAC 地址):

iptables -t nat -A prerouting_lan_rule -m mac --mac-source LOCAL_DNS_MAC_ADDRESS -p udp --dport 53 -j ACCEPT
iptables -t nat -A prerouting_lan_rule -m mac --mac-source LOCAL_DNS_MAC_ADDRESS -p tcp --dport 53 -j ACCEPT

语境

我正在使用 OpenWRT,并尝试将所有 DNS 流量重定向到另一台计算机上的 AdGuard。我尝试过:

  1. 将 WAN 接口 DNS 转发到我的 AdGuard 服务器
  2. 设置 DHCP 并启用选项 6,让客户端使用我的 AdGuard 服务器
  3. 将 OpenWRT 的系统 DNS 转发到我的 AdGuard 服务器

一切都没有成功。然后我偶然发现了这个帖子: https://forum.openwrt.org/t/redirect-all-outbound-dns-traffic-to-internal-ip/18783/11我找到了更全面的规则集:

# DNSHIJACKv4
# Log and hijack to Pihole
iptables -t nat -N dnshijack
iptables -t nat -I dnshijack -j LOG --log-prefix "dnshijack4 "
iptables -t nat -A dnshijack -j DNAT --to-destination 10.0.2.2
# allow Pihole to query internet
iptables -t nat -A prerouting_lan_rule -m mac --mac-source 00:11:22:33:44:55 -p udp --dport 53 -j ACCEPT
iptables -t nat -A prerouting_lan_rule -m mac --mac-source 00:11:22:33:44:55 -p tcp --dport 53 -j ACCEPT
# allow queries to OpenWrt
iptables -t nat -A prerouting_lan_rule -p tcp --dport 53 -d 10.0.2.1 -j ACCEPT
iptables -t nat -A prerouting_lan_rule -p udp --dport 53 -d 10.0.2.1 -j ACCEPT
# anything else is hijacked
iptables -t nat -A prerouting_lan_rule -p udp --dport 53 -j dnshijack
iptables -t nat -A prerouting_lan_rule -p tcp --dport 53 -j dnshijack
# other zones
iptables -t nat -A prerouting_guest_rule -p tcp --dport 53 -d 10.0.2.2 -j ACCEPT
iptables -t nat -A prerouting_guest_rule -p udp --dport 53 -d 10.0.2.2 -j ACCEPT
iptables -t nat -A prerouting_guest_rule -p udp --dport 53 -j dnshijack
iptables -t nat -A prerouting_guest_rule -p tcp --dport 53 -j dnshijack
iptables -t nat -A prerouting_iot_rule -p tcp --dport 53 -d 10.0.2.2 -j ACCEPT
iptables -t nat -A prerouting_iot_rule -p udp --dport 53 -d 10.0.2.2 -j ACCEPT
iptables -t nat -A prerouting_iot_rule -p udp --dport 53 -j dnshijack
iptables -t nat -A prerouting_iot_rule -p tcp --dport 53 -j dnshijack
# fix "reply from unexpected source"
iptables -t nat -A postrouting_lan_rule -d 10.0.2.2 -p tcp -m tcp --dport 53 -m comment --comment "!fw3: DNS Pi-hole MASQUERADE" -j MASQUERADE
iptables -t nat -A postrouting_lan_rule -d 10.0.2.2 -p udp -m udp --dport 53 -m comment --comment "!fw3: DNS Pi-hole MASQUERADE" -j MASQUERADE

相关内容