Skip to content
xxooxxooxx edited this page Apr 22, 2020 · 19 revisions
                                +-------------+ 
                                |  IPv6 地址  |
                                +------+------+
                                       |
 +-------------+                +------+------+                +-------------+    
 |     单播    |----------------|     组播     |----------------|    任意播   |
 +------+------+                +------+------+                +------+------+
        |                              |                              |                  
 +------+------+            +----------+----------+            +------+------+
 | 本地链路地址 |            |      组播地址        |            | 本地链路地址 |
 | 聚合全局地址 |            |  被请求节点的组播地址 |            | 聚合全局地址 | 
 | 唯一本地地址 |            +----------+----------+            +-------------+
 |   特殊地址   |
 +-------------+ 

单播

  • 链路本地地址:
    FE80::/10
    链路本地地址是一类非常重要的地址,它的有效范围仅在所处链路上(同个交换机或一个路由同一个接口下)

  • 可聚合全球单播地址
    2001::/16
    2002::/16
    3FFE::/16
    可在全球路由的公网IP地址

  • 唯一本地地址
    FC00::/7(RFC4193)
    IPV6的私网地址,就像IPV4中的私网保留地址一样

  • 特殊地址
    ::/128
    全0地址,表示地址未指定,也作为某些报文的源IP地址,比如作为重复地址检测时DAD时发送的邻居请求报文的源地址,或者DHCPv6初始化过程中客户端所发送报文的源IP。
    ::1/128
    本地回环,同IPV4中127.0.0.1地址的含义一样,表示节点自已。
    ::192.168.1.1
    在过渡技术中会使用到一些包含IPv4地址的IPv6地址

组播

  • 组播地址
8 4 4 80 32
11111111 flags scop 0 GID
  • flags 用来表示永久或者临时组播组
    • 0000   永久
    • 0001   临时
  • scop 表示组播组的范围
    • 0001    1    节点本地范围    单个接口有效,仅用于Loopback通信
    • 0010    2    链路本地范围
    • 0011    3    本地子网范围
    • 0100    4    本地管理范围
    • 0101    5    站点本地范围    类似组播的私网地址
    • 1000    8    组织机构范围
    • 1110    E    全球范围        类似组播的公网地址
  • GID 表示类型
    • 1    nodes
    • 2    routers
    • 5    ospf routers
    • 9    rip routers
    • A    eigrp routers

FF01::1 节点本地范围所有节点组播地址
FF01 ::2 节点本地范围所有路由器组播地址
FF02::1 链路本地范围所有节点组播地址
FF02::2 链路本地范围所有路由器组播地址

  • 被请求节点的组播地址
    FF02:0:0:0:0:1:FFXX:XXXX
    地址由前缀FF02::1:FF00:0/104和ipv6单播地址的最后24位组成。 在IPv6组播地址中,被请求节点组播地址(Solicited-node)是一种特别的组播地址。
    对于节点或路由器的接口上配置的每个单播和任意播地址,都会自动生成一个对应的被请求节点组播地址。
    在IPV6中,没有ARP。ICMP代替了ARP的功能,被请求节点的组播地址被节点用来获得相同本地链路上邻居节点的链路层地址
    用于重复地址检测DAD,在使用无状态自动配置将某个地址配置为自已的IPV6地址之前,节点利用DAD 验证在其本地链路上该地址是否已经被使用。
    注意链路本地地址也会生成一个被请求节点的组播地址,作用范围只在本地链路上有效。

任意播

节点及路由器必须具备的IPv6地址

  • 节点
本地链路地址- fe80::1:2ff:fe03:409/64
全局单播地址- 2001::1/64
回环地址- ::1/128
所有节点多播地址- ff01::1
                 ff02::1
被请求节点的组播地址- ff02::1:ff03:409
                    ff02::1:ff00:1
所属组的组播地址- ff00::/8
  • 路由器
    除了上述节点所拥有的地址以外,还拥有
所有路由的组播地址- ff01::2
                  ff02::2

vultr

vultr 分配的IPV6地址块不会路由整个子网,如果用AnyIP方式绑定整个分配的块,是不会正常工作的。

ip route add local 2001:19f0:6001:40e3::/64 dev lo

tunnelbroker.net就和上面的有所不同,甚至可以分配可路由的/48地址块。
vultr使用了一个特殊的网络(邻居发现协议),IPV6为无状态自动配置。
邻居发现协议非常的复杂,简单一点理解ens3为原生接口,只有这个接口上的链路本地才能合法注册IPV6地址并被路由。
默认的/etc/network/interfaces

auto lo
iface lo inet loopback

allow-hotplug ens3
iface ens3 inet dhcp
iface ens3 inet6 auto

修改为

.
.
iface ens3 inet6 auto
up ip addr add 2001:19f0:6001:40e3::10/64 dev ens3
down ip addr del 2001:19f0:6001:40e3::10/64 dev ens3

这时两个IPV6(一个无状态自动分配,一个手动)都是可以被外部ping通的。

bridge

apt-get install bridge-utils ebtables
auto lo
iface lo inet loopback

auto ens3
iface ens3 inet manual

auto br0
    iface br0 inet dhcp
    bridge_ports ens3 vpn
    bridge_stp off
    bridge_maxwait 1
    bridge_fd 0
    up ip addr add 10.0.8.1/24 dev br0
    down ip addr del 10.0.8.1/24 dev br0

iface br0 inet6 auto

vpn 为tinc的虚拟网卡,10.0.8.1/24为tinc LAN,如果dhcp有问题,可改为下面的static方式

auto lo
iface lo inet loopback

allow-hotplug ens3
iface ens3 inet manual

auto br0
    iface br0 inet static
    address 45.32.68.7
    netmask 255.255.254.0
    gateway 45.32.68.1
    dns-nameserver 8.8.8.8
    dns-nameserver 8.8.4.4
    bridge_ports ens3 vpn
    bridge_stp off
    bridge_maxwait 1
    bridge_fd 0
    up ip addr add 10.0.8.1/24 dev br0
    down ip addr del 10.0.8.1/24 dev br0

iface br0 inet6 auto

routing

apt-get install ndppd radvd

/etc/network/interfaces

auto lo
iface lo inet loopback

allow-hotplug ens3
iface ens3 inet dhcp
iface ens3 inet6 auto

auto br0
    iface br0 inet static
    address 10.0.8.1
    netmask 255.255.255.0
    bridge_ports vpn
    bridge_stp off
    bridge_maxwait 1
    bridge_fd 0
    up ip addr add 2001:19f0:6001:40e3::10/80 dev br0
    down ip addr del 2001:19f0:6001:40e3::10/80 dev br0

上级分配的地址段为2001:19f0:6001:40e3::/64,继续往下分就不能使用64,只能比64大,否则会造成接入机器的路由表混乱。
/etc/ndppd.conf

route-ttl 30000
proxy ens3 {
    router yes
    timeout 500
    ttl 30000
    rule 2001:19f0:6001:40e3::/80 {
        static
    }
}

/etc/radvd.conf

interface br0
{
        AdvManagedFlag on;
        AdvSendAdvert on;
        AdvLinkMTU 1480;
        MaxRtrAdvInterval 300;
        MinRtrAdvInterval 60;

        prefix 2001:19f0:6001:40e3::10/80
        {
            AdvRouterAddr on;
            AdvOnLink on;
            AdvAutonomous off;
            AdvPreferredLifetime 600;
            AdvValidLifetime 3600;
         };
         route ::/0 {
         };
         RDNSS 2001:4860:4860::8888 2001:4860:4860::8844 {
         };
};

由于使用了非标准的80地址块,radvd无状态地址配置不会正常工作,需要安装isc dhcp server

apt-get install isc-dhcp-server

/etc/sysctl.conf

.
net.ipv6.conf.all.forwarding=1

/etc/default/isc-dhcp-server

# Defaults for isc-dhcp-server (sourced by /etc/init.d/isc-dhcp-server)

# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
#DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf

# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
#DHCPDv4_PID=/var/run/dhcpd.pid
DHCPDv6_PID=/var/run/dhcpd6.pid

# Additional options to start dhcpd with.
#       Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead
#OPTIONS=""

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4=""
INTERFACESv6="br0"

/etc/dhcp/dhcpd6.conf

.
subnet6 2001:19f0:6001:40e3::/80 {
    range6 2001:19f0:6001:40e3::20 2001:19f0:6001:40e3::100;
}

man interfaces->INET6 ADDRESS FAMILY

accept_ra的值
0不接受,1非转发时接收,2即使开着转发也接受路由通告(默认)

如果不使用ndppd代理应答邻居响应,也可手动配置

sysctl -w net.ipv6.conf.all.forwarding=1
sysctl -w net.ipv6.conf.ens3.proxy_ndp=1
ip -6 neigh add proxy 2001:19f0:6001:40e3::e3 dev ens3
ip -6 neigh show proxy

无状态配置dns需安装

apt-get install rdnssd
Clone this wiki locally