ipv6测试:https://test-/
环境:移动运营商、openwrt
探讨家用路由怎么配置ipv6实现外网访问。尽量避开原理。
(想了解原理推荐看下面贴出的视频链接)
链接:红茶三杯/大佬的视频:
【IPv6 01】IPv6概述 /watch?v=scyzX3Zd5JU【IPv6 02】IPv6基础配置 /watch?v=Vr-UvtwA3kA【IPv6 03】ICMPv6详解(上) /watch?v=MYBcNPUx9YU【IPv6 04】ICMPv6详解(中)无状态自动配置 /watch?v=s_yASxcjMl0【IPv6 05】ICMPv6详解(下)以及DHCPv6 /watch?v=pw46Qu6Shsc
链接:openwrt官方文档
Network Interfaces https://oldwiki./zh-cn/doc/networking/network.interfaces
Switch Documentation https://oldwiki./zh-cn/doc/uci/network/switch
链接:他人整理文档
闲谈IPv6-典型特征的一些技术细节
/dog250/article/details/8169984闲谈IPv6-一起玩转IPv6地址自动配置
/dog250/article/details/88176596
文章目录
基础知识# 地址划分# 地址划分:LLA Link-Local Address(链路本地地址)# 地址划分:GUA Aggregatable Global Unicast Address(可聚合全球广播地址)@三大运营商GUA前缀分配# 邻居发现协议(NDP Neighbor Discovery Protocol)# 自动配置OpenWrt配置ipv6# 从运营商那获取前缀# 配置无状态ipv6地址# 配置有状态ipv6地址DDNSsocat:外网ipv6访问,映射内网ipv4地址基础知识
虽然想避开ipv6里面冗长的知识点,但是想知其然的进行ipv6配置,一些常识还是要知道的。
常识:
地址划分邻居发现无状态自动配置和有状态自动配置
# 地址划分
IPv6地址长度为128位,每16位分一段可以分8段,每一段16位又分成4段用16进制表示。
(取值范围)如下:
0000:0000:0000:0000:0000:0000:0000:0000
~ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
为了使这一长串地址有含义,设计了有三种编址方式:单播、组播、任意播。
我们只要关心单播地址(Unicast)即可
单播地址又分
GUA:Aggregatable Global Unicast Address(可聚合全球广播地址)Site-Local Address(本地站点地址)ULA:Unique local Address(唯一本地地址)LLA:Link-Local Address(链路本地地址)
# 地址划分:LLA Link-Local Address(链路本地地址)
其中链路本地地址(LLA)是ipv6两端通信的基础。所有设备开启ipv6支持都会自动生成一个唯一的LLA.
所以当我们看到这个地址,就可以确定设备是支持ipv6的
LLA以FE80::/10
为前缀,此外第11-64位为0,外加一个64位接口标识。这个64位标识号追求不重复,所以一般通过EUI-64的方法用mac地址生成。(但是windows系统是随机生成这64位的,听说考虑到安全的原因)
note:
上图的本地链路地址
fe80::6177:4638:8d0b:731b
为简写其中
::
表示中间一堆的0
(具体多少个零,由后面决定,目的是补全128位地址。)
完整的写法为
fe80:0000:0000:0000:6177:4638:8d0b:731b
# 地址划分:GUA Aggregatable Global Unicast Address(可聚合全球广播地址)
全球广播地址(GUA )相当于IPv4的公网IP。想要公网访问必须要有GUA,所以它是我们需要关心的。
GUA以001
开头,45位的全局路由选择前缀+16位的子网ID+64位的ID接口组成。(如下图)
例如
拿移动网络运营商为例,它们会提供前60位前缀,如
2409:8a55:2bf:49c0::/60
然后路由器可以根据这个前缀划分子网
如
2409:8a55:2bf:49c0::/64
2409:8a55:2bf:49c1::/64
…
2409:8a55:2bf:49cf::/64
然后路由器和终端设备(如pc)协商出最后64位
假设终端(如pc)连接路由器端口所在的前缀为
2409:8a55:2bf:49c0::/64
然后路由和终端协商的64位后缀为
64f6:9850:9a37:87fc
那么终端的ipv6地址如下
2409:8a55:2bf:49c0:64f6:9850:9a37:87fc
@三大运营商GUA前缀分配
来源:https://baiye.us/archives/8040
通过GUA我们就可以知道网络是出至哪个运营商
fe80 局域网(相当于192.168)240e 中国电信
2408 中国联通
2409 中国移动/铁通
2001 6in4 地址,是另一种隧道协议。
2002 6to4地址
例如下图
可见2409前缀就是移动的
# 邻居发现协议(NDP Neighbor Discovery Protocol)
邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议,它用于替代IPv4的ARP(Address Resolution Protocol)和ICMP路由器发现(Router Discovery)。
NDP被设计允许在同一个链路或者网段的节点(路由器和主机)找到彼此,它定义了四种报文格式:NS/NA、RS/RA
邻居请求/通告(NS/NA)(neighbor solicitation / neighbor advertisement)
在网络和链路层地址之间提供类似于ARP的映射功能
像ipv4会把ip和mac地址对应关系记录到arp表一样,ipv6会把ip和mac地址对应关系记录到邻居表里面。
arp in ipv4
neighbor in ipv6
路由器请求和通告(RS/RA)(router solicitation / router advertisement)
提供的功能包括路由器发现、移动IP代理发现、重定向, 以及对一些自动配置的支持
网上很多关于这四种报文的分析(如:《IPv6邻居发现协议》 /qq_38265137/article/details/80466128),这里只是想强调几个概念:
邻居:
是指同一个网段下可以互相通信的设备。
开启ipv6协议的设备间会时不时用NS/NA报文进行通信,以了解邻居们的状态是否可通信。
通告:
一般是指路由器发现的通告。
默认情况下,开启ipv6的路由器会时不时发出RA报文,告诉统一网段的设备它的ipv6前缀,如2409:8a55:2bf:49c0::/64
。
网段中的设备如果需要ipv6地址,那么可以发出RS报文和路由器协商剩下的64位写什么。
# 自动配置
ipv6自动配置分有状态自动配置和无状态自动配置
无状态 stateless
不需要额外的协议,不需要额外的应用服务器。仅通过RS、RA消息实现地址获取
(即插即用)
状态化 stateful
需要用到dhcpv6协议,需要额外创建提供dhcpv6服务的应用服务器
虽然比无状态自动配置麻烦一丁点,但是可以管控分配了ipv6地址的客户端的状态
同时,自动配置除了可以提供ipv6地址,还可以提供dns服务器信息、域名信息等其他配置信息
OpenWrt配置ipv6
有了上面基础知识的补充,我们知道路由器ipv6配置其实就几个问题
如何从运营商那获取前缀如何配置无状态ipv6地址如何配置有状态ipv6地址
# 从运营商那获取前缀
如果选择pppoe的拨号方式,openwrt提供有自动的方式获取ipv6。这种方式获取ipv6
config interface 'lan'option type 'bridge'option ifname 'eth0'option proto 'static'option ipaddr '192.168.1.1'option netmask '255.255.255.0'option ip6assign '64'config interface 'wan'option ifname 'eth1'option _orig_ifname 'eth1'option _orig_bridge 'false'option proto 'pppoe'option username 'xxxxxxxxxx'option password 'xxxxxxxxxx'option keepalive '0'option ipv6 'auto'
这种配置等于选择“手动”并且添加一个@wan口用dhcpv6获取地址
config interface 'lan'option type 'bridge'option ifname 'eth0'option proto 'static'option ipaddr '192.168.1.1'option netmask '255.255.255.0'option ip6assign '64'config interface 'wan'option ifname 'eth1'option _orig_ifname 'eth1'option _orig_bridge 'false'option proto 'pppoe'option username 'xxxxxxxxxx'option password 'xxxxxxxxxx'option keepalive '0'config interface 'wan6_manual'option proto 'dhcpv6'option ifname '@wan'option reqaddress 'try'option reqprefix 'auto'
# 配置无状态ipv6地址
根据前面提到的基础知识,我们知道,终端得到ipv6地址分两步
路由器通告前缀终端和路由器协商后缀
所以我们需要在 接口 》 lan 》 dhcp服务器 下开启路由通告服务
config dhcp 'lan'option interface 'lan'option start '100'option limit '150'option leasetime '12h'option dhcpv4 'server'option ra_slaac '1'# 协议报文M位置1,意为“提供dhcpv6服务”list ra_flags 'managed-config'# 协议报文O位置1,意为“提供其他配置信息”list ra_flags 'other-config'option ra 'server'option ra_default '1'
# 配置有状态ipv6地址
根据前面提到的基础知识,我们知道,配置有状态ipv6地址需要开启dhcpv6服务器
config dhcp 'lan'option interface 'lan'option start '100'option limit '150'option leasetime '12h'option dhcpv4 'server'option ra_slaac '1'# 协议报文M位置1,意为“提供dhcpv6服务”list ra_flags 'managed-config'# 协议报文O位置1,意为“提供其他配置信息”list ra_flags 'other-config' # 开启dhcpv6服务器option dhcpv6 'server'option ra_management '2'option ra 'server'
(由于不同设备厂商对ipv6的支持不一样,如果发现某些连不上ipv6,可以把无状态的路由通告开了看看)
DDNS
ddns服务提供商:(选其一)
ddns客户端文档:/docs/guide-user/services/ddns/client
ddns客户端配置:/docs/guide-user/base-system/ddns
(ddns网络提供商的配置页面通常有配置教程,那里提供的教程其实已经很详细了)
socat:外网ipv6访问,映射内网ipv4地址
恩山论坛:/forum/forum.php?mod=viewthread&tid=4129434&page=1#pid11351439
安装组件
opkg updateopkg install socat
修改socat的配置文件/etc/config/socat
config socat '3380'option enable '1'option SocatOptions '-d -d TCP6-LISTEN:3380,fork TCP4:10.0.0.4:3389'
或者纯命令添加
uci set socat.3380='socat'uci set socat.3380.enabled='1'uci set socat.3380.SocatOptions='-d -d TCP6-LISTEN:3380,fork TCP4:10.0.0.4:3389'uci commit socat
同样也可以添加更多的socat设置,比如转发给局域网的群晖
uci set socat.5000='socat'uci set socat.5000.enabled='1'uci set socat.5000.SocatOptions='-d -d TCP6-LISTEN:5000,fork TCP4:10.0.0.6:5000'uci commit socat
然后
/etc/init.d/socat enabled/etc/init.d/socat start
最后到防火墙开放对应端口3380、5000
当然,用nginx实现也不错