请教大佬们一个局域网自定义 DNS 的问题

2024 年 4 月 10 日
 felix0012

== 背景

在家用玩客云刷了 armbian 搭了些服务,比如 Gitea 、Wordpress 、Homeassistant 这些。平时会用台式机、手机访问自己搭的服务。 另外还有个电视盒子,也刷成 armbian 做一些小实验。

用得久了,不想每次输入 ip 、端口号这些来访问 web ,就有了自己搭 DNS 的想法,把自己的服务都映射到自定义域名上,再用 nginx 做反向代理。 自己有一台主路由,无线网络是 802.11AC ,配置不算高但刷了官方 openwrt 。就用 openwrt 的 DNS 服务实现宏域名到 IP 的映射,比如*.onecloud.lan 映射到 192.168.1.2 这样。

== 版本 0.1

主路由挂在光猫下面,其他节点挂在主路由下面。拓扑大概是这样

---------
|  光猫  |
---------
      |
---------
| 主路由 |
---------
  |  |  |
  |  |  --------
  |  ---       |
  |    |       |
节点 1  节点 2  节点 3 ...

主路由通过 LAN 连结各节点,通过 WAN 口连接光猫,开启 DHCP 和 DNS 。 这时候 DNS 按预期工作。一切都很好,唯一的问题是主路由要跟光猫一起放在弱电箱里(因为弱电箱是全家网线汇集点)

== 版本 0.2

为了发挥主路由的 5GHz 无线网功能,把主路由挪到一个房间里。现在主路由跟其他节点一起挂在光猫下面,光猫连结主路由的 LAN 口。拓扑如下

 -----------
|   光猫    |
 -----------
 |  |  |  |
 |  |  |  ------------
 |  |  --------      |
 |  -----     |      |
 |      |     |      |
主路由  节点 1  节点 2  节点 3 ...

关闭光猫的 DHCP ,主路由开启 DHCP 和 DNS ,DHCP 中把网关指定为光猫地址,把 DNS 指定为自己。这时候本应正常工作的。 但实际使用时,台式机访问本地域名上的服务,本地域名无法被主路由 DNS 解析。抓包调试半天发现,台式机存在两个 DNS: 一个是主路由通过 DHCP 配置的主路由 IPv4 地址, 另一个是光猫通过 IPv6 的 RA 分配的光猫 IPv6 地址. 域名解析时默认询问了光猫,光猫自然不知道本地域名所以返回了错误结果。

== 问题

这时候如果禁用台式机的 ipv6 是可以解决本地域名解析的,但代价比较大。 彻底解决需要禁止光猫在 ipv6 上的 DHCP 行为,但光猫配置界面比较简单,没有这项设置。

这种情况下有没有办法设置主路由 openwrt 来强制覆盖光猫的 ipv6 设置呢?

10427 次点击
所在节点    宽带症候群
91 条回复
ferock
2024 年 4 月 11 日
@felix0012 #33

可惜,不是大佬,相互交流…

1. 不用 ipv6 是因为弊大于利,如果不是公网的 ipv6 ,意义不大,而且局域网不想暴露给公网。

2. dhcp 关闭 ipv6 就行了
luoshengdu
2024 年 4 月 11 日
一群人在这绕弯解决问题。

题主你的问题:现在这种网络结构,dns 会优先想 ipv6 的光猫请求解析
解决方法:你让你电脑的 ipv6 获取指定的 ipv6 dns 服务器 IP (你自己的 dns server )


解决思路:ipv6 的 ip 地址也有是有私有地址段的,fc00::段,你可以理解它是 ipv4 下面的( 192.168. 172.16 )。所以给你的 openwrt 配置一个私有地址段的 ipv6 地址,然后让电脑找该 ipv6 解析,就完美解决了。

优点:你的网络架构不用任何改动,该私有 ipv6 配置好之后,家里的所有支持 ipv6 的邻居,都是自动配置好,所以都是可通达的。只需要在 ipv6 的 dhcp 里面“通告的 DNS 服务器”即可
缺点:没有缺点,ipv6 普及的时代,劝别人关闭 ipv6 的人才是缺点。你们都不打算拥抱新技术吗?


思路来自于: https://fast.v2ex.com/t/793278
十楼是思路,十六楼是最佳实践


------------------效果-----------------------
ifconfig | grep inet6
inet6 addr: fd3c::1/56 Scope:Global


cat /etc/config/dhcp | grep dns
config dnsmasq
option ednspacket_max '1232'
list dns 'fd3c::cfb'
option dns '1'
option dns '1'
option dns '1'
option dns '1'
option dns '1'
option dns '1'
option dns '1'
option dns '1'
option dns '1'
option name 'EasyMosdns'
option dns '1'
felix0012
2024 年 4 月 12 日
@luoshengdu 谢谢大佬,这也是我寻求的方案。我对 openwrt 的 ipv6 下面配置不太熟悉,一直想实现 openwrt 下发 v6 dns 地址但没成功。

今晚回家试试看
felix0012
2024 年 4 月 12 日
@luoshengdu
我看了一下 Wireshark 抓包记录,发现以下特点:

1) 网络中光猫分发的是 FE80::地址,自己是 FE80::1 ,这个地址好像叫做本地链接地址( Link-local )
2) openwrt 路由器分发的是 fd5c:001e:6cb0::/48 ,一个 ULA 地址。自己有两个地址,一个是自己的 fd5c:1e:6cb0::1 ,一个是从光猫获得的 fe80::2276:93ff:fe00:a03c
3) 节点( Windows 系统)执行 ipconfig /renew6 后,向网络发送了 DHCPv6 Solicit XID 请求,请求是通过 FE80::前缀的地址发出的
4) 光猫和 openwrt 路由器分别使用 FE80::地址的 DHCPv6 Advertise XID 回复了节点。回复中光猫和 Openwrt 各自声明 DNS 服务器是自己,分别是 FE80::1 和 fd5c:1e:6cb0::1 。这说明 Openwrt 路由器的 DHCPv6 是工作了的。
5 )节点只向光猫发送了 DHCPv6 Request XID ,并得到光猫的 DHCPv6 Reply XID
6) 节点 ipconfig /renew6 命令完成后,DNS 列表里只有光猫,没有 Openwrt 路由器
felix0012
2024 年 4 月 12 日
@luoshengdu
我怀疑节点获得的多个 IPv6 地址中,FE80::的优先级比 FDxx::的优先级高,或者说 Link-local 地址的优先级比 ULA 的优先级高…
luoshengdu
2024 年 4 月 12 日
@felix0012 IP 地址不存在优先级,去找 fe80::1 是因为你没有告诉电脑找 fd5c 的 IP 。

自定义 IP 地址方便你控制自己的网络逻辑结构,并且配置好他们不会再变化
虽说 fe80 的 link-local (相当于 ipv4 没有 dns 服务器自动配置的 169.254 的地址)地址也不能变化,但是你也无法配置它

在 dhcp 服务器上配置 v6 dns 的信息下发
felix0012
2024 年 4 月 12 日
@luoshengdu
>> 去找 fe80::1 是因为你没有告诉电脑找 fd5c 的 IP
这里没看懂,告诉电脑用哪个 IPv6 地址,这就是 DHCPv6 的工作呀
现在电脑发送了 Solicit 请求,路由和光猫都回复了 Advertise 。只是电脑挑选了光猫来进行接下来的协议。

>> 在 dhcp 服务器上配置 v6 dns 的信息下发
这一点也实现了,因为路由给出了 DHCPv6 Advertise ,其中包含了 DNS 。

>> IP 地址不存在优先级
刚才我找了下资料,确实是这样。
但是优先级现象是存在的。
问题出在 DHCPv6 协议的环节,当网络上存在多个 Advertise 时,电脑会做出倾向性选择
参考 https://blog.csdn.net/Kuaisen/article/details/118675607

我又仔细看了抓包记录里面的两个 Advertise ,光猫的带有 preference option 字段,openwrt 给出的没有这个 option 。我猜测电脑收到这两个 Advertise 后倾向于回复光猫就是因为他的带有 preference 。

然后我又找 openwrt 的 odhp 怎么能加入这个 preference option ,没找到有资料。

接下来我感觉解决方案有两类,一个是拿到光猫的超级用户密码,想办法禁止光猫的 DHCPv6 。再就是用带有 VLAN 的交换机或者增加一个路由器,向子网屏蔽光猫的 DHCPv6
felix0012
2024 年 4 月 12 日
Openwrt 路由器的 Advertise

DHCPv6
Message type: Advertise (2)
Transaction ID: 0x19f696
Server Identifier
Option: Server Identifier (2)
Length: 10
DUID: xxx
DUID Type: link-layer address (3)
Hardware type: Ethernet (1)
Link-layer address: xxx
Link-layer address (Ethernet): xxx
Client Identifier
Option: Client Identifier (1)
Length: 14
DUID: xxx
DUID Type: link-layer address plus time (1)
Hardware type: Ethernet (1)
DUID Time: Dec 28, 2022 00:08:43.000000000 中国标准时间
Link-layer address: xxx
Link-layer address (Ethernet): xxx
SOL_MAX_RT
Option: SOL_MAX_RT (82)
Length: 4
DNS recursive name server
Option: DNS recursive name server (23)
Length: 16
1 DNS server address: fd5c:1e:6cb0::1
Identity Association for Non-temporary Address
Option: Identity Association for Non-temporary Address (3)
Length: 40
IAID: 03e09467
T1: 21600
T2: 34560
IA Address
Option: IA Address (5)
Length: 24
IPv6 address: fd5c:1e:6cb0::7e8
Preferred lifetime: 43200
Valid lifetime: 43200

------------

光猫的 Advertise

DHCPv6
Message type: Advertise (2)
Transaction ID: 0x19f696
Client Identifier
Option: Client Identifier (1)
Length: 14
DUID: xxx
DUID Type: link-layer address plus time (1)
Hardware type: Ethernet (1)
DUID Time: Dec 28, 2022 00:08:43.000000000 中国标准时间
Link-layer address: xxx
Link-layer address (Ethernet): xxx
Server Identifier
Option: Server Identifier (2)
Length: 10
DUID: 0003000628011c3da73f
DUID Type: link-layer address (3)
Hardware type: IEEE 802 (6)
Link-layer address: xxx
Link-layer address (Ethernet): xxx
Identity Association for Non-temporary Address
Option: Identity Association for Non-temporary Address (3)
Length: 40
IAID: 03e09467
T1: 26117
T2: 41787
IA Address
Option: IA Address (5)
Length: 24
IPv6 address: 240e:3af:e1a:2080:e294:67ff:fe0f:af4b
Preferred lifetime: 52234
Valid lifetime: 52234
Preference
Option: Preference (7)
Length: 1
Pref-value: 7
DNS recursive name server
Option: DNS recursive name server (23)
Length: 16
1 DNS server address: fe80::1
Vendor-specific Information
Option: Vendor-specific Information (17)
Length: 25
Enterprise ID: Reserved (0)
felix0012
2024 年 4 月 12 日
一贴文字,缩进格式全没了……

Openwrt 路由器的 Advertise

DHCPv6
____Message_type:_Advertise_(2)
____Transaction_ID:_0x19f696
____Server_Identifier
________Option:_Server_Identifier_(2)
________Length:_10
________DUID:_0003000120769300a03c
________DUID_Type:_link-layer_address_(3)
________Hardware_type:_Ethernet_(1)
________Link-layer_address:_xxx
________Link-layer_address_(Ethernet):_xxx
____Client_Identifier
________Option:_Client_Identifier_(1)
________Length:_14
________DUID:_000100012b3dd50b507b9d730987
________DUID_Type:_link-layer_address_plus_time_(1)
________Hardware_type:_Ethernet_(1)
________DUID_Time:_Dec_28,_2022_00:08:43.000000000_中国标准时间
________Link-layer_address:_xxx
________Link-layer_address_(Ethernet):_xxx
____SOL_MAX_RT
________Option:_SOL_MAX_RT_(82)
________Length:_4
____DNS_recursive_name_server
________Option:_DNS_recursive_name_server_(23)
________Length:_16
_________1_DNS_server_address:_fd5c:1e:6cb0::1
____Identity_Association_for_Non-temporary_Address
________Option:_Identity_Association_for_Non-temporary_Address_(3)
________Length:_40
________IAID:_03e09467
________T1:_21600
________T2:_34560
________IA_Address
____________Option:_IA_Address_(5)
____________Length:_24
____________IPv6_address:_fd5c:1e:6cb0::7e8
____________Preferred_lifetime:_43200
____________Valid_lifetime:_43200


光猫的 Advertise

DHCPv6
____Message_type:_Advertise_(2)
____Transaction_ID:_0x19f696
____Client_Identifier
________Option:_Client_Identifier_(1)
________Length:_14
________DUID:_000100012b3dd50b507b9d730987
________DUID_Type:_link-layer_address_plus_time_(1)
________Hardware_type:_Ethernet_(1)
________DUID_Time:_Dec_28,_2022_00:08:43.000000000_中国标准时间
________Link-layer_address:_xxx
________Link-layer_address_(Ethernet):_xxx
____Server_Identifier
________Option:_Server_Identifier_(2)
________Length:_10
________DUID:_0003000628011c3da73f
________DUID_Type:_link-layer_address_(3)
________Hardware_type:_IEEE_802_(6)
________Link-layer_address:_xxx
________Link-layer_address_(Ethernet):_xxx
____Identity_Association_for_Non-temporary_Address
________Option:_Identity_Association_for_Non-temporary_Address_(3)
________Length:_40
________IAID:_03e09467
________T1:_26117
________T2:_41787
________IA_Address
____________Option:_IA_Address_(5)
____________Length:_24
____________IPv6_address:_240e:3af:e1a:2080:e294:67ff:fe0f:af4b
____________Preferred_lifetime:_52234
____________Valid_lifetime:_52234
____Preference
________Option:_Preference_(7)
________Length:_1
________Pref-value:_7
____DNS_recursive_name_server
________Option:_DNS_recursive_name_server_(23)
________Length:_16
_________1_DNS_server_address:_fe80::1
____Vendor-specific_Information
________Option:_Vendor-specific_Information_(17)
________Length:_25
________Enterprise_ID:_Reserved_(0)
luoshengdu
2024 年 4 月 13 日
@felix0012 #87
关于 1 ,就是手工指定电脑的 v6 地址 dns server 服务器(不方便);

现在你这个网络的架构难点在于需要通过光猫自动中继分发 ipv6 地址 ,因为 v6 链路能上网是默认路由,所以它 dhcpv6 优先级高?。 [所以,能操作光猫,在里面配置 LAN 的 dns 服务器地址最方便]

若屏蔽光猫的 dhcpv6 ,可得结果是,电脑只是拿不到 dhcpv6 的地址;但是 v6 slaac 的协议是通过 icmp 分配起来的,电脑依然可以拿到 v6 地址且同时拿到光猫给的 v6 dns 服务器
godall
2024 年 4 月 15 日
@felix0012 我知道你的问题了,你在 openwrt 的 DNS 设置里面,要把 ipv6 前缀地址( fd5c 开头)给删除留空,这样 openwrt 就不会自己管理 ipv6 的 DNS 服务器,访问 ipv6 地址时它会直接请求运营商真实的 ipv6 DNS ( 240e 的)。

这样 nslookup gitea.onecloud.lan 会直接返回 ipv4 本地地址。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1031174

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX