我把无线路由器带到了办公室,因为我家附近没有空闲的网络插座。每台通过以太网电缆连接的普通计算机通常都会通过 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 界面的相关部分:
我也必须提醒你这样做仅有的在贵公司网络管理员、IT 部门等的明确了解和批准下。
答案2
作为使用 DHCP 选项 6 的替代方案,您可以直接更改 OpenWrt 使用的 DNS 服务器。为此,请在 Web 界面 LuCI 下导航到
网络→接口→广域网→编辑→高级设置
并取消选中选项Use DNS servers advertised by peer
。然后会出现一个新的选项字段Use custom DNS servers
,您可以在其中输入您选择的一个或多个 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。我尝试过:
- 将 WAN 接口 DNS 转发到我的 AdGuard 服务器
- 设置 DHCP 并启用选项 6,让客户端使用我的 AdGuard 服务器
- 将 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