本帖最后由 lgs2007m 于 2022-3-15 10:20 编辑
【IPv6地址自动配置的一些基础知识】
IPv6地址自动配置的三种基本形式:
1)Stateless无状态的。 这个过程是 “无状态的”,原因是它不依赖于外部分配机制(例如IPv6动态主机配置协议(DHCPv6))的状态或是否存在。 在没有外部或用户干预的情况下, 设备尝试配置其自身的IPv6地址 (可能是多个地址)。
2)Stateful有状态的。 有状态的过程仅依赖于外部地址分配机制(例如DHCPv6)。DHCPv6服务器以类似于IPv4 DHCP操作的方式,将128bit IPv6地址分配给设备。
3)Stateless+Stateful无状态和有状态组合方式。 这个过程涉及无状态地址自动配置与其他IP参数的有状态配置相结合一起使用的形式。 通常情况下, 这需要一台设备使用无状态方法自动配置一个IPv6地址,之后利用DHCPv6得到其他参数或选项,比如要在给定网络上联系哪台NTP服务器来查询时间分辨率。
* 无状态使用无状态地址自动配置 (SLAAC, Stateless address Autoconfiguration)
* 有状态使用IPv6动态主机配置协议 (DHCPv6, Dynamic Host Configuration Protocol for IPv6)
* 无状态+有状态使用SLAAC自动配置IPv6地址,使用DHCPv6获取DNS等其他信息。
在IPv6中没有地址解析协议 (ARP, Address Resolution Protocol),取而代之的是IPv6邻居发现协议 (NDP, Neighbor Discovery Protocol),其中跟地址自动配置紧密相关的是路由通告 (RA, Route Advertisements) 。
根据RA报文中的A-Flag、M-Flag和O-Flag的不同组合,可以告知客户端使用哪种形式自动配置地址:
* RA(A=1 M=0 O=0):SLAAC(仅使用RA消息,RA中包含DNS信息选项)
* RA(A=1 M=0 O=1):SLAAC+Stateless DHCPv6(RA和DHCPv6中的DNS消息选项)
* RA(A=0 M=1 O=0/1):Stateful DHCPv6(仅使用DHCPv6消息)
当然也可以RA(A=1 M=1 O=1):SLAAC和DHCPv6都用来自动配置地址,OpenWrt默认是这样设置。
【RA报文中3个关键的Flag】
A-Flag:Autonomous address configuration flag 自动地址配置标志
表示是否配置无状态IPv6地址。在一个RA报文中,可存在多个prefix,比如2401::/64、2402::/64、2403::/64,每个prefix都可以独立配置A-Flag。
* 1:表示主机应当在该prefix范围内SLAAC自动生成IPv6地址,并配置子网路由条目、网关。
* 0:表示主机不应当在该prefix范围内SLAAC自动生成IPv6地址,但是可以配置子网路由条目、网关。
M-Flag:Managed address configuration flag 受管理地址配置标志
表示是否配置有状态IPv6地址。M-Flag是RA报文的全局参数,一个RA报文只有一个M-Flag。
* 1:表示主机可以通过DHCPv6来获得IPv6地址和其他参数(如DNS、NTP)
* 0:表示不通过DHCPv6来获得IPv6地址。
O-Flag:Other configuration flag 其他配置标志
表示是否通过DHCPv6获得除IPv6地址以外的其他参数(如DNS、NTP)。O-Flag也是RA报文中的全局参数,一个RA报文只有一个O-Flag。
注意:仅当M-Flag为0时,该参数才会被读取。
* 1:当M-Flag为0,将通过DHCPv6获得其他参数
* 0:当M-Flag为0,将不通过DHCPv6获得其他参数
【LAN口下的DHCP设置】
源码:Lean's OpenWrt source
固件版本:OpenWrt R22.2.2 / LuCI Master (git-22.052.34668-380e994)
内核版本:5.4.175
# /etc/config/dhcp
config dhcp 'lan'
option interface 'lan'
option start '5'
option limit '15'
option leasetime '12h'
option dhcpv4 'server'
option force '1'
option ndp 'disabled' # NDP代理:禁用。默认禁用,是默认值时该选项在这里不显示
option ra 'server' # 路由通告服务RA:服务器模式
option ra_slaac '1' #A -Flag:1。默认1
list ra_flags 'managed-config' # M-Flag:1。默认managed-config表示是1,none表示0
list ra_flags 'other-config' # O-Flag:1。默认other-config表示是1,none表示0
option ra_dns '1' # RA DNS:1。默认1,是默认值时该选项在这里不显示
option ra_default '1' # 总是通告默认路由。
option dhcpv6 'server' # DHCPv6服务:服务器模式
option dns_service '1' # DHCPv6 DNS:1。默认1,是默认值时该选项在这里不显示
option ra_management '1' # DHCPv6模式:无状态的+有状态的
list dns '2400:3200::1' #通告的DNS服务器(RA的RDNSS、DHCPv6的DNS Recursive Name Server),默认是空,发送的是LAN口IPv6地址。用于RA/DHCPv6 DNS
list domain 'ms.local' #通告的DNS域名(RA的DNSSL、DHCPv6的Domain search list),默认是空,不发送。用于RA/DHCPv6 DNS
#-------------------------------------------------------------
NDP (Neighbor Discovery Proxy) 邻居发现代理
RDNSS (Recursive DNS Server) 递归DNS服务器(在RA中,对应DHCPv6的DNS Recursive Name Server)
DNSSL (DNS Search List) DNS搜寻列表(在RA中,对应DHCPv6的Domain search list)
系统默认是开启路由通告服务和DHCPv6服务的,所以是SLAAC和DHCPv6都用,即同时进行无状态地址配置和有状态地址配置。
单独无状态自动地址配置SLAAC,只需要设置dhcpv6=disabled禁用DHCPv6服务即可。
单独有状态自动地址配置DHCPv6,不能禁用路由通告服务,要设置ra_slaac=0(即RA中的A-Flag=0)。
这是因为在IPv6中,只有路由器发送的RA信息可以动态提供默认网关,禁用路由通告则主机不能从RA信息中动态配置默认网关。
In IPv6, only routers sending Router Advertisement messages can provide a default gateway address dynamically.
https://www.networkacademy.io/ccna/ipv6/stateful-dhcpv6
要关闭RA中的DNS信息(RDNSS、DNSSL),要设置ra_dns=0。
要关闭DHCPv6的DNS信息(DNS Recursive Name Server、Domain search list),要设置dns_service=0。
#-------------------------------------------------------------
【总是通告默认路由】参数ra_default
Name: ra_default
Type: integer
Required: no
Default: 0
Description: Default router lifetime in the RA message will be set if default route is present and a global IPv6 address (0) or if default route is present but no global IPv6 address (1) or neither of both conditions (2)
https://openwrt.org/docs/guide-user/base-system/dhcp#dhcp_pools
我的理解是:
不勾选总是通告默认路由(ra_default=0),如果路由器有IPv6默认路由且是全球IPv6(公网IPv6),则设置RA信息中的router lifetime为默认预设的1800秒,否则设为0秒。(主机收到RA信息,看到RA中的router lifetime不为0,会自动配置默认网关为RA信息源地址(即路由器链路本地地址)并配置默认路由。router lifetime为0,主机收到RA信息会认为该RA信息源地址不能设置为默认网关和默认路由。)
勾选总是通告默认路由(ra_default=1),如果路由器有IPv6默认路由即使不是全球IPv6(即是内网IPv6),则设置RA信息中的router lifetime为预设的1800秒,否则设为0秒。
ra_default=2,不管路由器是否有IPv6默认路由,是否有全球IPv6,都设置router lifetime为1800秒。
实际设置了IPv6 GUA (Global Unicast Address) 全球单播地址和IPv6 ULA (Unique Local Address) 唯一本地单播地址的情况,Wireshark抓包RA信息得到:
只设置IPv6 ULA:fd60:6777:d7ff::/48
ra_default='0':Router lifetime (s): 0,有 ICMPv6 Option (Route Information : Medium fd60:6777:d7ff::/48)
ra_default='1':Router lifetime (s): 1800,没有 ICMPv6 Option (Route Information)
ra_default='2':Router lifetime (s): 1800,有 ICMPv6 Option (Route Information : Medium fd60:6777:d7ff::/48)
只获得IPv6 GUA:2001:811c:2f82:788a::/60
ra_default='0':Router lifetime (s): 1800,有 ICMPv6 Option (Route Information : Medium 2001:811c:2f82:788a::/60)
ra_default='1':Router lifetime (s): 1800,没有 ICMPv6 Option (Route Information)
ra_default='2':Router lifetime (s): 1800,没有 ICMPv6 Option (Route Information)
IPv6 GUA+ULA:2001:811c:2f82:788a::/60+fd60:6777:d7ff::/48
ra_default='0':Router lifetime (s): 1800,有 ICMPv6 Option (Route Information : Medium 2001:811c:2f82:788a::/60+fd60:6777:d7ff::/48)
ra_default='1':Router lifetime (s): 1800,没有 ICMPv6 Option (Route Information)
ra_default='2':Router lifetime (s): 1800,没有 ICMPv6 Option (Route Information)
没有IPv6 No IPv6:
ra_default='0':Router lifetime (s): 0,没有 ICMPv6 Option (Route Information)
ra_default='1':Router lifetime (s): 0,没有 ICMPv6 Option (Route Information)
ra_default='2':Router lifetime (s): 1800,没有 ICMPv6 Option (Route Information)
如果RA中的router lifetime被设置为0,则收到RA信息的主机不会将发送RA的路由器认为是默认路由(不会将路由器本地链路地址设为默认网关)。
在RA中有个路由信息选项(Route Information Option),可以用于主机生产前缀的路由,指向RA路由器。
#-------------------------------------------------------------
【DHCPv6模式】参数ra_management的【疑问?】
Name: ra_management
Type: integer
Required: no
Default: 1
Description: RA management mode : no M-Flag but A-Flag (0), both M and A flags (1), M flag but not A flag (2)
https://openwrt.org/docs/guide-user/base-system/dhcp#dhcp_pools
DHCPv6模式默认无状态+有状态,可以看出已经有ra_slaac=1 (A-Flag=1) 无状态和ra_flags managed-config (M-Flag=1) 有状态的参数了,不是和这里冲突了?
我理解是配置DHCPv6模式为无状态即Stateless DHCPv6,可以响应主机除IPv6地址外的DNS等其他参数的请求 (INFORMATION-REQUEST) ,IPv6地址通过RA信息根据SLAAC自动配置。
https://www.networkacademy.io/ccna/ipv6/stateless-dhcpv6
配置DHCPv6模式为有状态,即Statefull DHCPv6可以相应主机IPv6地址和DNS等其他参数的请求 (REQUEST)。
https://www.networkacademy.io/ccna/ipv6/stateful-dhcpv6
但是实际设置ra_management=0,DHCPv6模式无状态,A-Flag=1,M-Flag=0,O-Flag=1,即SLAAC+Stateless DHCPv6,不按规范办事的Windows上依然能获取到有状态IPv6地址和自动生成无状态IPv6,按规范办事的Linux群晖只自动生成了无状态IPv6地址。
这让我产生了疑惑,Stateless DHCPv6不是应该只能提供除了IPv6地址外的其他信息吗,怎么也能提供IPv6地址分配了?是否Statefull DHCPv6也可做为Stateless DHCPv6单独提供除了IPv6地址外的其他信息?不明白配置DHCPv6模式的作用关联在哪里。
这里有个讨论,但是没什么结果:https://dev.archive.openwrt.org/ticket/16811
【关于DHCPv6静态分配IPv6】
DHCPv6交互过程中,客户端、服务器和中继都有一个唯一的标志符DUID(DHCP Unique Identifier,DHCP唯一标识符),其主要用途用于DHCPv6交互过程中互相标志对方。
服务器可以用Client DUID标志客户端,并可以将其用于本地的地址分配策略;客户端可以用Server DUID来标志服务器。
DUID包括三种生成方式:
DUID-LLT(DUID Based on Link-layer Address Plus Time):基于时间和链路层地址生成DHCPv6设备DUID值。
DUID-EN(DUID Assigned by Vendor Based on Enterprise Number):基于IANA注册的企业号码生成DHCPv6设备DUID值。
DUID-LL(DUID Based on Link-layer Address):基于链路层地址生成DHCPv6设备DUID值。
DHCPv6根据每个客户端系统DUID来分配IPv6,只要你的DUID不变,分配到的IPv6后缀不变。
当然可以通过DHCPv6静态分配IPv6来指定分配的后缀。首先需要在OpenWrt路由器LuCI页面查看“已分配的DHCPv6租约”那里已分配IPv6的客户端的DUID,也可以用命令ubus call dhcp ipv6leases查看(也可以在客户端系统上查看,如Windows通过ipconfig /all查看DHCPv6客户端DUID),然后添加静态地址分配。因为LuCI页面那里DHCP/DNS的“静态地址分配”没有DUID选项可以填,所以要SSH或SCP登录路由去编辑/etc/config/dhcp文件(也可以用路由插件TTYD终端),来添加DUID选项。
以root身份SSH登录或者路由的TTYD终端登录后:
1、输入vim /etc/config/dhcp
2、输入i或者a键进入编辑模式
3、编辑完后按Esc键退出编辑模式
4、输入:wq后回车保存
5、输入如下命令来重启服务
/etc/init.d/dnsmasq restart
/etc/init.d/odhcpd restart
6、重启客户端系统网卡刷新IPv6地址
>vi /etc/config/dhcp:
config host
option name 'MyPC' #主机名
option mac 'aa:bb:cc:dd:ee:ff' #主机MAC地址
option dns '1'
option duid '00010001f98caa01274d4356eff08' #DUID(十六进制),必须
option hostid '25' #IPv6后缀(十六进制,最多8个字符),自己设定
【参考链接和抓包工具】
OpenWrt IPv6 分配方式
https://sakura-paris.org/IPv6
IPv6系列-彻底弄明白有状态与无状态配置IPv6地址
https://www.cnblogs.com/fzxiaoma ... eless-stateful.html
IPv6 Fundamentals for CCNA students
https://www.networkacademy.io/ccna/ipv6
Windows网络抓包工具Wireshark_3.6.2 Stable 便携版
https://www.423down.com/8105.html
Wireshark过滤关键词 只显示
icmpv6.type == 133 ICMPv6 RS
icmpv6.nd.ra.flag ICMPv6 RA
dhcpv6 DHCPv6 数据包
请不要胡乱输入以及粘贴、复制等方式灌水
请尊重作者、并共同维护网站的正常阅读,否则账户将会被限制发帖、回帖,并且积分可能会被清零,站内短信以及阅读权限等都会受到影响,谢谢。
具体限制方式:https://www.right.com.cn/forum/thread-8307840-1-1.html
|