5-Openwrt ipv6 6to4

news/2024/5/18 15:29:35 标签: tcp/ip, udp, 运维, ipv6

当电信宽带不下发ipv6地址,但是我们又有ipv4的公网地址的时候,就可以使用公网ipv4地址生成一个唯一的ipv6地址,使得一个ipv6数据包可以在ipv4的网络中传输时,这就是ipv6的6to4协议.

1、6to4原理


1.png

路由器A及B分别是两个站点(站点A与站点B的出口路由器,并且都是IPv4及IPv6双栈路由器)。两边都申请到一个IPv4公网地址,使用这个公网IPv4地址进行映射得到全球唯一的6to4 IPv6地址,这个IPv6地址 /48位,空间非常大,用于相应站点内的IPv6用户。

如此一来,当站点A内的IPv6用户访问站点B的IPv6用户时,IPv6数据包发送到A,那么A根据IPv6数据报头中的目的IPv6地址,得到对应的目的IPv4全局IP,那么就将原始的IPv6数据包进行封装,套上6to4隧道的IPv4的头,然后将这个数据包放入IPv4网络进行路由,直到到达B。

数据包交互的详细过程:
2.png

A拿到的IPv4公网地址是132.214.1.10,而B是206.123.31.200。
A和B分别使用这个IPv4公网地址来映射得到6to4地址空间(地址池),6to4地址空间使用2002::/16,而6to4地址的形成如下:

2002:IPv4地址:子网ID::接口ID
上面的IPv4地址,就是A或B拿到的那个公网IPv4地址,注意,这个公网IP非常重要,此公网IP的变化,有可能导致IPv6站点内IPv6不得不重新编址。得到6to4 IPv6地址空间后,这个地址空间是16+32=48bits,也就是/48的,因此空间非常大,你可以进一步的进行子网的划分,这个IPv6的地址空间就将用于站点内网。

数据交互过程如下:

1、上面的例子,A拿到的IPv4公网地址:132.214.1.10,映射得到2002:84d6:010a::/48,这个地址空间的一部分最终被用在了PC1上。现在,PC1要给PC2发送一个IPv6的数据。这个数据的源IP是PC1的IPv6全局唯一地址:2002:84d6:010a:1::1,目的IP为PC2的IPv6全局唯一地址:2002:ce7b:1fc8:2::2,这个IPv6报文被送到了PC1的默认网关也就是路由器。

2、A是一台6to4路由器,它会查看这个IPv6数据包的包头里的目的IPv6地址,它发现这个IPv6目的地地址是一个6to4地址,因此,它计算得出这个6to4 IPv6地址对应的IPv4公网IP,然后,为这个原始的IPv6数据进行封装,加上一个新的IPv4的头,而这个IPv4的头源地址是132.214.1.10,目的地址刚才通过计算得出的那个IPv4地址,正是206.123.31.200。然后,这个新的IPv4数据包进入因特网,最终被传送到B

3、B将报文的IPv4头除去,得到原始的IPv6数据,转发给PC2。

2、6to4配置


查看package下面已经有了6to4的协议脚本,位于package/network/ipv6/6to4/files/6to4.sh

和netifd下面的其他脚本一样,属于network.proto的一种

root@zihome:/lib/netifd/proto# ls
6to4.sh    dhcp.sh    dhcpv6.sh  ppp.sh

所以我们只需要配置uci后,重启/etc/init.d/network restart就可以

config interface 'wan6'
        option def_ifname 'eth1'
        option web_proto '6to4'
        option proto '6to4'
        option web_enabled '1'

ps可以观察到,6to4是没有像odhcp6c或pppoe那样,有一个进程一直再请求ipv6地址,而是在6to4.sh脚本里面,获取ipv4地址,判断是否为公网,如果是旧生成一个ipv6地址,如果不是那也就没有然后了。

这样如果中途ipv4掉了重新夺取到一个ipv4地址,上面生成的ipv6地址就是不对的,需要重新拉下6to4.sh脚本生成下。

所以在/etc/hotplug.d/iface/下添加了一个03-6to4脚本,获取到wan口IP的时候,重新ifup wan6一下。

#!/bin/sh

[ "$ACTION" = ifup ] && {
        if [ "$INTERFACE" = wan ]; then
                local ipv6_enabled=$(uci -q get network.wan6.web_enabled)
                local ipv6_proto=$(uci -q get network.wan6.proto)
                # 6to4 proto need ifup wan6 again
                if [ $ipv6_enabled == 1 -a x"$ipv6_proto" == x"6to4" ]; then
                        ifup wan6
                fi
        fi
}

查看官网可以看到6to4还有其他一些uci配置值,这边就不过多介绍

NameTypeDefaultDescription
ipaddrIPv4 addressCurrent WAN IPv4 addressLocal IPv4 endpoint address
defaultrouteboolean1Whether to create an IPv6 default route over the tunnel
ttlinteger64TTL used for the tunnel interface
tosstring(none)Type Of Service : either “inherit” (the outer header inherits the value of the inner header) or an hexadecimal value (Chaos Calmer and later only)
mtuinteger1280MTU used for the tunnel interface
metricinteger0Specifies the default route metric to use

3、6to4测试


实际测试

root@zihome:/# ifconfig pppoe-wan
pppoe-wan Link encap:Point-to-Point Protocol  
          inet addr:183.49.45.171  P-t-P:183.49.44.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1480  Metric:1
          RX packets:4826182 errors:0 dropped:137 overruns:0 frame:0
          TX packets:733858 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:6436609082 (5.9 GiB)  TX bytes:108697921 (103.6 MiB)

root@zihome:/# ifconfig br-lan
br-lan    Link encap:Ethernet  HWaddr DC:4B:DD:1D:FB:6C  
          inet addr:192.168.3.1  Bcast:192.168.3.255  Mask:255.255.255.0
          inet6 addr: 2002:b731:2dab::1/60 Scope:Global
          inet6 addr: fe80::de4b:ddff:fe1d:fb6c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:741126 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4849491 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:108828123 (103.7 MiB)  TX bytes:6544994763 (6.0 GiB)

root@zihome:/# ip -6 route
default from :: via ::192.88.99.1 dev 6to4-wan6  proto static  metric 1024 
default from 2002:b731:2dab::/48 via ::192.88.99.1 dev 6to4-wan6  proto static  metric 1024 
default from 2002::/16 via ::192.88.99.1 dev 6to4-wan6  proto static  metric 1024 
::/96 dev 6to4-wan6  metric 256 
2002:b731:2dab::/64 dev br-lan  proto static  metric 1024 
unreachable 2002:b731:2dab::/48 dev lo  proto static  metric 2147483647  error -128
2002::/16 dev 6to4-wan6  proto kernel  metric 256 
fe80::/64 dev br-lan  proto kernel  metric 256 

https://oldwiki.archive.openwrt.org/doc/uci/network

https://openwrt.org/docs/guide-user/network/ipv6/barrier.breaker.ipv6.6to4


http://www.niftyadmin.cn/n/1534956.html

相关文章

字符串模式匹配的BM算法

由于毕业设计(入侵检测)的需要,这两天仔细研究了BM模式匹配算法,稍有心得,特此记下。 首先,先简单说明一下有关BM算法的一些基本概念。 BM算法是一种精确字符串匹配算法(区别于模糊匹配&#xf…

tomcat: Permission denied错误

关于-bash: ./startup.sh: Permission denied 在执行./startup.sh,或者./shutdown.sh的时候,爆出了Permission denied, 其实很简单,就是在执行tomcat的时候,用户没有权限,而导致无法执行, 用命令chmod 修改…

28、shell编程—sed之pattern详解

文章目录1.常用的pattern格式2.实战1.常用的pattern格式 匹配模式含义10command匹配到第10行不常用10,20command匹配从第10行开始,到20行结束不常用10,5command匹配从第10行开始,到16行结束不常用/pattern1/command匹配到pattern1行常用/pat…

29、shell编程—sed之编辑命令command

文章目录1.常用的编辑命令1.1.查询1.2.删除1.3.增加1.4.在查找内容之后进行追加处理2.修改3.反向引用3.1.& 和 \1 区别4.在脚本上使用1.常用的编辑命令 编辑命令含义p打印d删除a匹配到行后进行追加i匹配到行前进行追加r将后面指定文件的内容追加到指定的行w将匹配到行的内…

BM算法的改进的算法SUNDAY--Boyer-Moore-Horspool-Sunday Aglorithm

BM算法的改进的算法SUNDAY--Boyer-Moore-Horspool-Sunday Aglorithm BM算法优于KMP SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore)。两个算法在最坏情况下均具有线性的查…

java之装饰器模式

Decorator Pattern(装饰器模式),定义:Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。就增加功能来说&a…

32、shell编程—sed之实战-打印输出内容

文章目录1.简介2.创建脚本1.简介 创建一个my.conf文件 [client] port3306 socket/var/run/mysqld/mysqld.sock[mysqld_safe] socket/var/run/mysqld/mysqld.sock nice0[mysqld] # * Basic Settings usermysql pid-file/var/run/mysqld/mysqld.pid socket/var/run/mysqld/mysq…

AC算法,多模式匹配

AC算法是Alfred V.Aho(《编译原理》(龙书)的作者),和Margaret J.Corasick于1974年提出(与KMP算法同年)的一个经典的多模式匹配算法,可以保证对于给定的长度为n的文本,和模…