IPv6转发开关

conf/all/forwarding配置全局的接口间IPv6报文转发,默认值为0,此值的修改将同时修改每个接口的forwarding配置项。

接口目录下forwarding配置项对于接口的Host/Router行为,默认值为0,遵循以下主机行为:

1)在邻居发现协议的Neighbour Advertisements报文中不设置IsRouter标志;
2)如果accept_ra为真(默认值),可发送Router Solicitations报文;
3)如果accept_ra为真(默认值),可接收Router Advertisements报文(包括执行地址自动配置);
4)如果accept_redirects为真(默认值),接收重定向报文。

如果接口配置的forwarding为真,接口执行路由器操作,与以上主机行为相反:

1)在邻居发现协议的Neighbour Advertisements报文中设置IsRouter标志;
2)如果accept_ra不等于2,不发送Router Solicitations报文;
3)如果accept_ra不等于2,忽略Router Advertisements报文;
4)忽略邻居发现需要的重定向报文。

以下为代码中相关配置参数的默认值:

static struct ipv6_devconf ipv6_devconf __read_mostly = {
    .forwarding     = 0,
    .accept_ra      = 1,
    .accept_redirects   = 1,
    .autoconf       = 1,

static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = {
    .forwarding     = 0,
    .accept_ra      = 1,
    .accept_redirects   = 1,
    .autoconf       = 1,

forwarding配置

如下forwarding配置项的处理函数,对于写操作,由函数addrconf_fixup_forwarding处理。

static int addrconf_sysctl_forward(struct ctl_table *ctl, int write,
        void *buffer, size_t *lenp, loff_t *ppos)
{   
    int *valp = ctl->data;
    int val = *valp;
    loff_t pos = *ppos;
    struct ctl_table lctl;
    int ret;
    
    /* ctl->data points to idev->cnf.forwarding, we should
     * not modify it until we get the rtnl lock.
     */
    lctl = *ctl;
    lctl.data = &val;
    
    ret = proc_dointvec(&lctl, write, buffer, lenp, ppos);
    
    if (write)
        ret = addrconf_fixup_forwarding(ctl, valp, val);
    if (ret)
        *ppos = pos;
    return ret;
}

如果修改的是默认default目录下的forwarding配置,在判断值改变之后,发送RTM_NEWNETCONF消息,结束处理。对于修改all目录下forwarding配置的情况,将连带修改默认default目录下的forwarding值,如果值发送变化,发送RTM_NEWNETCONF消息。具体由addrconf_forward_change处理。

另外,对于修改具体设备目录下forwarding的情况,由函数dev_forward_change处理。

static int addrconf_fixup_forwarding(struct ctl_table *table, int *p, int newf)
{
    net = (struct net *)table->extra2;
    old = *p;
    *p = newf;

    if (p == &net->ipv6.devconf_dflt->forwarding) {
        if ((!newf) ^ (!old))
            inet6_netconf_notify_devconf(net, RTM_NEWNETCONF,
                             NETCONFA_FORWARDING,  NETCONFA_IFINDEX_DEFAULT,
                             net->ipv6.devconf_dflt);
        rtnl_unlock();
        return 0;
    }
    if (p == &net->ipv6.devconf_all->forwarding) {
        int old_dflt = net->ipv6.devconf_dflt->forwarding;

        net->ipv6.devconf_dflt->forwarding = newf;
        if ((!newf) ^ (!old_dflt))
            inet6_netconf_notify_devconf(net, RTM_NEWNETCONF,
                             NETCONFA_FORWARDING,
                             NETCONFA_IFINDEX_DEFAULT,
                             net->ipv6.devconf_dflt);

        addrconf_forward_change(net, newf);
        if ((!newf) ^ (!old))
            inet6_netconf_notify_devconf(net, RTM_NEWNETCONF,
                             NETCONFA_FORWARDING,
                             NETCONFA_IFINDEX_ALL,
                             net->ipv6.devconf_all);
    } else if ((!newf) ^ (!old))
        dev_forward_change((struct inet6_dev *)table->extra1);
    rtnl_unlock();

    if (newf)
        rt6_purge_dflt_routers(net);
    return 1;
}

遍历网络命名空间中的所有设备,设置新的forwarding值,如果其发生改变,由函数dev_forward_change进行处理。

static void addrconf_forward_change(struct net *net, __s32 newf)
{
    struct net_device *dev;
    struct inet6_dev *idev;

    for_each_netdev(net, dev) {
        idev = __in6_dev_get(dev);
        if (idev) {
            int changed = (!idev->cnf.forwarding) ^ (!newf);
            idev->cnf.forwarding = newf;
            if (changed)
                dev_forward_change(idev);
        }
    }
}

对于支持多播的设备,forwarding配置项的改变,意味着加入或者离开IPv6链路/接口/站点本地所有路由器组播地址。另外,对于非tentative的有效地址,需要加入或者离开anycast地址。

static void dev_forward_change(struct inet6_dev *idev)
{
    struct net_device *dev;
    struct inet6_ifaddr *ifa;

    if (!idev) return;
    dev = idev->dev;
    if (idev->cnf.forwarding)
        dev_disable_lro(dev);
    if (dev->flags & IFF_MULTICAST) {
        if (idev->cnf.forwarding) {
            ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters);
            ipv6_dev_mc_inc(dev, &in6addr_interfacelocal_allrouters);
            ipv6_dev_mc_inc(dev, &in6addr_sitelocal_allrouters);
        } else {
            ipv6_dev_mc_dec(dev, &in6addr_linklocal_allrouters);
            ipv6_dev_mc_dec(dev, &in6addr_interfacelocal_allrouters);
            ipv6_dev_mc_dec(dev, &in6addr_sitelocal_allrouters);
        }
    }

    list_for_each_entry(ifa, &idev->addr_list, if_list) {
        if (ifa->flags&IFA_F_TENTATIVE)
            continue;
        if (idev->cnf.forwarding)
            addrconf_join_anycast(ifa);
        else
            addrconf_leave_anycast(ifa);
    }
    inet6_netconf_notify_devconf(dev_net(dev), RTM_NEWNETCONF,
                     NETCONFA_FORWARDING, dev->ifindex, &idev->cnf);

地址添加

当forwarding为真时,工作在路由器模式,对于SLAAC,不能设置地址的IFA_F_OPTIMISTIC标志,即不能使用optimistic地址,只有主机模式才能使用optimistic地址。

int addrconf_prefix_rcv_add_addr(struct net *net, struct net_device *dev,
                 const struct prefix_info *pinfo, struct inet6_dev *in6_dev,
                 const struct in6_addr *addr, int addr_type,
                 u32 addr_flags, bool sllao, bool tokenized,
                 __u32 valid_lft, u32 prefered_lft)
{
    struct inet6_ifaddr *ifp = ipv6_get_ifaddr(net, addr, dev, 1);
    int create = 0;

    if (!ifp && valid_lft) {
        int max_addresses = in6_dev->cnf.max_addresses;
        struct ifa6_config cfg = {
            .pfx = addr,
            .plen = pinfo->prefix_len,
            .ifa_flags = addr_flags,
            .valid_lft = valid_lft,
            .preferred_lft = prefered_lft,
            .scope = addr_type & IPV6_ADDR_SCOPE_MASK,
        };

#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
        if ((net->ipv6.devconf_all->optimistic_dad ||
             in6_dev->cnf.optimistic_dad) &&
            !net->ipv6.devconf_all->forwarding && sllao)
            cfg.ifa_flags |= IFA_F_OPTIMISTIC;
#endif

对于链路本地地址,处理同上,不能设置地址的IFA_F_OPTIMISTIC标志。

void addrconf_add_linklocal(struct inet6_dev *idev, const struct in6_addr *addr, u32 flags)
{
    struct ifa6_config cfg = {
        .pfx = addr,
        .plen = 64,
        .ifa_flags = flags | IFA_F_PERMANENT,
        .valid_lft = INFINITY_LIFE_TIME,
        .preferred_lft = INFINITY_LIFE_TIME,
        .scope = IFA_LINK
    };
    struct inet6_ifaddr *ifp;

#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
    if ((dev_net(idev->dev)->ipv6.devconf_all->optimistic_dad ||
         idev->cnf.optimistic_dad) &&
        !dev_net(idev->dev)->ipv6.devconf_all->forwarding)
        cfg.ifa_flags |= IFA_F_OPTIMISTIC;
#endif

对于用户配置的地址,如果设备的forwarding为真,关闭LRO(Large Receive Offload),其只在需要接口之间转发报文时使用。另外,对于路由模式,需要加入linklocal_allrouters组播地址。

static struct inet6_dev *ipv6_add_dev(struct net_device *dev)
{
    struct inet6_dev *ndev;

    ndev = kzalloc(sizeof(struct inet6_dev), GFP_KERNEL);
    ...

    if (ndev->cnf.forwarding)
        dev_disable_lro(dev);

    /* Join interface-local all-node multicast group */
    ipv6_dev_mc_inc(dev, &in6addr_interfacelocal_allnodes);

    /* Join all-node multicast group */
    ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes);

    /* Join all-router multicast group if forwarding is set */
    if (ndev->cnf.forwarding && (dev->flags & IFF_MULTICAST))
        ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters);

IsRouter标志

在DAD结束之后,如果需要发送非请求的NA报文,由函数ndisc_send_na处理,参数ifp->idev->cnf.forwarding的值决定是否设置报文中的IsRouter标志。

static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id, bool send_na)
{
    struct net_device *dev = ifp->idev->dev;
    struct in6_addr lladdr;

    ...
    /* send unsolicited NA if enabled */
    if (send_na &&
        (ifp->idev->cnf.ndisc_notify ||
         dev_net(dev)->ipv6.devconf_all->ndisc_notify)) {
        ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifp->addr,
                  /*router=*/ !!ifp->idev->cnf.forwarding,
                  /*solicited=*/ false, /*override=*/ true,
                  /*inc_opt=*/ true);
    }

anycast

对于新增的地址(RTM_NEWADDR),如果其所在设备打开了forwarding配置,加入地址对应的anycast。反之,如果删除地址(RTM_DELADDR),需要离开对应的anycast。工作在主机模式,不需要anycast。

static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
{
    struct net *net = dev_net(ifp->idev->dev);

    if (event) ASSERT_RTNL();

    inet6_ifa_notify(event ? : RTM_NEWADDR, ifp);

    switch (event) {
    case RTM_NEWADDR:
        ...

        if (ifp->idev->cnf.forwarding)
            addrconf_join_anycast(ifp);
        ...
        break;
    case RTM_DELADDR:
        if (ifp->idev->cnf.forwarding)
            addrconf_leave_anycast(ifp);
        addrconf_leave_solict(ifp->idev, &ifp->addr);

在接口down或者注销时,遍历接口上的所有地址,如果网络命名空间或者设备自身设置了down时保留地址的配置,以下函数可能不删除地址,而是离开地址对于的anycast组。

static int addrconf_ifdown(struct net_device *dev, bool unregister)
{

    list_for_each_entry_safe(ifa, tmp, &idev->addr_list, if_list) {
        struct fib6_info *rt = NULL;
        bool keep;

        addrconf_del_dad_work(ifa);

        keep = keep_addr && (ifa->flags & IFA_F_PERMANENT) && !addr_is_local(&ifa->addr);

        if (keep) {
            /* set state to skip the notifier below */
            state = INET6_IFADDR_STATE_DEAD;
            ifa->state = INET6_IFADDR_STATE_PREDAD;
            if (!(ifa->flags & IFA_F_NODAD)) ifa->flags |= IFA_F_TENTATIVE;

            rt = ifa->rt;
            ifa->rt = NULL;
        } else {
            state = ifa->state;
            ifa->state = INET6_IFADDR_STATE_DEAD;
        }
        ...
        if (state != INET6_IFADDR_STATE_DEAD) {
            __ipv6_ifa_notify(RTM_DELADDR, ifa);
            inet6addr_notifier_call_chain(NETDEV_DOWN, ifa);
        } else {
            if (idev->cnf.forwarding)
                addrconf_leave_anycast(ifa);
            addrconf_leave_solict(ifa->idev, &ifa->addr);
        }

内核版本 5.10

已标记关键词 清除标记
相关推荐
IPv4 包头为12字段 (点分十进制) IPv6 包头为8字段 (冒号分16进制) 共8个小节,每小节4个16bit IPV6地址=前缀+接口标识 <为何要部署IPV6> ·IPv4的局限性: 1.地址空间的局限性:IP地址空间的危机由来已久,并正是升级到IPv6的主要动力。 2.安全性:IPv4在网络层没有安全性可言,安全性一直被认为是由网络层以上的层负责。 3.自动配置:对于IPv4节点的配置比较复杂,让很多普通用户无所适从。 4.NAT:破坏了Internet端到端的网络模型。 5.由于IPv4地址分配杂乱无章,没有层次性,网络设备需要维护庞大的路由表项。 6.IPv4包头过于复杂,使得网络节点处理的效率不高。 IPV6的好处: 1、超大的地址空间 2、全球可达性,不需要再用NAT 3、全球重新部署,有规划,易于实现聚合 4、能自动配置,实现即插即用 5、方便的进行重编址 6、包头简单,通过扩展包头技术可实现以后的新技术扩展 (基本包头 + n多个扩展包头) ipv4 路由转发的时候,ip包会改变checksum(校验和) 和TTL(每经过一个路由器TTL值减一) ipv6 只变TTL,没有校验和 CPU现在无法实现128位的转发。 最好只是64位的。 ·Theoretical limit: 4.3 billion (十亿) 43亿 Practical limit : 250 million (百万) 2.5亿 Over 420 million Internet in Y2001 (less than 10% of the worldwide population) 没有广播,组播代替广播。所以没有ARP。 IPv4中的广播(broadcast)可以导致网络性能的下降甚至广播风暴(broadcast storm).在IPv6中,就不存在广播这一概念了,取而代之的是组播(multicast)和任意播(anycast),任意播也称为泛播. IPV6在以太网中的协议ID值是0x86DD <IPV6地址的表示方法> ·IPv4 点分十进制 32bit IPv6 冒号分十六进制 128bit 0000:0000:0000:0000:0000:0000:0000:0000=>:: 0000:0000:0000:0000:0000:0000:0000:0001=>0:0:0:0:0:0:0:1=>::1 2001:0000:0000:1234:0000:0000:0567:00ff=>2001::1234:0:0:567:ff 只能有一个:: fe80:0000:0000:0000:0000:0000:0000:0009=>fe80::9 URL的IPV6地址表示 为了区分IPV6地址中的冒号和端口号前的冒号,要把IPV6地址用[]括起来 www.example.net:8080/index.html https:[2001:410:0:1:250:fcee:e450:33ab]:8443/abc.html IPV6中掩码的表示: 在IPV6中掩码只能使用CIDR表示法 2001:410:0:1::45ff/128 2001:410::1/64 注意:在IPV6中没有广播地址和网络号保留地址 ------------------------------------------------------------------------------------------ <IPV6的地址类型> 可分为三大类: 1、单播地址 2、组播地址 3、任意播地址 单播--Unicast : one to one ·单播地址用于一对一的连接 ·IPv6单播地址有以下六种类型:  1-Aggregate Global Unicast Address 2xxx:xxxxx/3 - 3FFF: :FFFF 2001::/16 IPV6因特网地址 2002::/16 6to4过渡地址 2-Link Local Address    FE80::/10 (前10位以FE80开头) 3-Site Local Address (Private) FEC0::/10 4-Unspecified Address   0:0:0:0:0:0:0:0/128 => ::/128 5-Loopback Address     0:0:0:0:0:0:0:1/128 => ::1/128  6IPv4 Compatible Address ::192.168.30.1 => ::C0A8:1E01 以下是一些单播地址的具体说明: 1、可聚合全球单播地址Aggregate global unicast address 由IANA分配的可在全球路由的公网IP地址 目前已分配的前缀:2000::/3 占用了12.5%的IPV6地址空间 2000:0000:0000:0000:0000:0000:0000:0000--3FFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF 这个前缀中总共包含8192个/16的前缀 目前实际用于IPV6因特网运作的前缀:2001::/16 2002::/16 为使用6-TO-4过渡机制的节点保留 3ffe::/16 用于6bone测试目的的前缀 2、本地链路地址:link-local address 当在一个节点启用IPV6,启动时节点的每个接口自动生成一个link-local address 其前缀64位为标准指定的,其后64位按EUI-64格式来构造 注意:在本链路上,路由表中看到的下一跳都是对端的Link Local地址,不是公网IP地址 前缀:FE80::/10 范围:只能在本地链路使用,不能在子网间路由 为何需要link-local:在一个接口可以配置很多IPv6地址,所以学习路由就有可能出现很多下一跳。 所以出现Link Local地址唯一标识一个节点。在本地链路看到下一跳都是对端的Link Local地址。 在网络重新编址过程中,节点和路由器的Link Local地址不会发生变化,可以很容易地做一个修改,不用担心网络不可达。 R1(config-if)#ipv6 address FE80:0:0:0:0123:0456:0789:0abc link-local 手工指定link-local地址 3、本地站点地址:site-local address IPV6的私网地址,就像IPV4中的私网保留地址一样 只占用到整个IPV6地址空间的0.1% 前缀:FEC0::/10 其后的54比特用于子网ID 最后64位用于主机ID 范围:只能在本站点内使用,不能在公网上使用 例如:在本地分配十个子网 1、FEC0:0:0:0001::/64 2、FEC0:0:0:0002::/64 3、FEC0:0:0:0003::/64 10、FEC0:0:0:000A::/64 本地站点地址被设计用于永远不会与全球IPV6因特网进行通信的设备,比如:打印机、内部网服务器、网络交换机等 4、未指定地址Unspecified address 形式:0:0:0:0:0:0:0:0 表示地址未指定,或者在写默认路由时代表所有路由 5、回环地址Loopack address 形式:0:0:0:0:0:0:0:1 同IPV4中127.0.0.1地址的含义一样,表示节点自已 6、内嵌IPV4地址的IPV6地址 IPv4 Compatible Address 1、IPV4兼容的IPV6地址--用于在IPV4网络上建立自动隧道,以传输IPV6数据包。 其中高96bit设为0,后面跟32bit的IPV4地址 0000:0000:0000:0000:0000:0000:206.123.31.2 0000:0000:0000:0000:0000:0000:ce7b:1f01 由于这种机制不太好,现在已经不再使用,转而采用更好的过渡机制 2、映射IPV4的IPV6地址--仅用于拥有IPV4和IPV6双协议栈节点的本地范围 其中高80bit设为0,后16bit设为1,再跟IPV4地址 0000:0000:0000:0000:0000:ffff:206.123.31.2 0000:0000:0000:0000:0000:ffff:ce7b:1f01 EUI-64格式:扩展惟一标识符 在IPV6中,无状态自动配置机制使用EUI-64格式来自动配置IPV6地址 所谓无状态自动配置是指在网络中没有DHCP服务器的情况下,允许节点自行配置IPV6地址的机制。 手工设置LINK--LOCAL地址后,EUI-64地址自动用LINK-LOCAL后64位用到EUI后64BIT上。 EUI-64的构造规则--根据接口的MAC地址再加上固定的前缀来生成一个IPV6的地址 工作原理:自动将48bit的以太网MAC地址扩展成64bit,再挂在一个64bit的前缀后面,组成一个IPV6地址 一、将48位的MAC地址从中间分开,插入一个固定数值FFFE 0050:3EE4:4C00-->0050:3EFF:FEE4:4C00 二、将第7个比特位反转,如果原来是0,就变为1,如果原来是1,就变为0 0050:3EFF:FEE4:4C00-->0250:3EFF:FEE4:4C00 三、加上前缀--FE80::0250:3EFF:FEE4:4C00 这就是一个完整的IPV6地址 反转的原因:   在MAC地址中,第7比特为1表示本地管理,为0表示全球管理   在EUI-64格式中,第7位为1表示全球惟一,为0表示本地惟一 组播地址Multicast 在IPV6中没有广播,用组播来代替 前缀:FF00::/8 占用了0.38%的IPV6地址空间 1111 1111 4bit 4bit |→固定值←||→标志←| |→范围←| 标志位为0000表示是永久保留的组播地址,分配给各种技术使用 标志位为0001表示是用户可使用的临时组播地址 范围段定义了组播地址的范围,其定义如下: 二进制 十六进制 范围类型 0001 1 本地接口范围 0010 2 本地链路范围 0011 3 本地子网范围 0100 4 本地管理范围 0101 5 本地站点范围 类似组播的私网地址 1000 8 组织机构范围 1110 E 全球范围 类似组播的公网地址 下面是一些组播指定地址: FF02::1 all nodes 在本地链路范围的所有节点 FF02::2 all routers 在本地链路范围的所有路由器 FF02::5 all ospf routers FF02::9 all rip routers 所有运行RIP的路由器 FF02::A all eigrp routers 所有运行eigrp的路由器 FF05::2 在一个站点范围内的所有路由器 被请求节点的组播地址solicited-node multicast address--重要的东东 一种特殊的组播地址,对于节点或路由器的接口上配置的每个单播和任意播地址,都会自动生成一个对应的被请求节点组播地址。注意link-local address也会生成一个被请求节点的组播地址。 工作范围:只在本地链路上有效 特点:1、在本地链路上,被请求节点的组播地址组中通常只包含一个用户 2、只要知道一个节点的IPV6地址,就能计算出它的被请求节点的组播地址 作用:1、在IPV6中,没有ARP。ICMP代替了ARP的功能,被请求节点的组播地址被节点用来获得相同本地链路上邻居节点的链路层地址 2、用于重复地址检测DAD,在使用无状态自动配置将某个地址配置为自已的IPV6地址之前,节点利用DAD 验证在其本地链路上该地址是否已经被使用。 前缀:FF02:0000:0000:0000:0000:0001:FFxx:xxxx/104 FF02::1:FFxx:xxxx/104 如何产生:被请求节点组播地址的前104位固定,将IP地址的后24位移下来填充到后面就可以了 例如:IPv6---2001::1234:5678/64 被请求节点组播地址---FF02::1:FF34:5678/104 其中FF02::1:FF为固定部分,共104位 组播IP地址到MAC地址的映射: 映射规则:组播MAC地址的前16位固定为0x3333,将组播IPV6地址的后32位直接映射到组播MAC地址的后32位就可以了。 例:IPV6地址为--FF12::1234:5678/64 对应的组播MAC地址为--3333:1234:5678 0x3333为固定前缀 例:所有节点的组播地址:FF02::0001 对应的组播MAC地址:3333:0000:0001 任意播地址Anycast address 应用在one-to-nearest(一到近)模式 任意播是多个设备共享一个地址.分配IPv6单播(unicast)地址给拥有相同功用的一些设备.发送方发送一个以任意播为目标地址的包,当路由器接受到这个包以后,就转发给具有这个地址的离它最近的设备.单播地址用来分配任意播地址.对于那些没有配备任意播的的地址就是单播地址;但是当一个单播地址分配给不止一个接口的时候,单播地址就成了任意播地址。 例如:Mobile方面的特性,移动设备漫游到其他区域,不必接入原始的接入点,只需要找到最近的即可。 必须的IPV6地址: 一旦节点启用IPV6,那么接口就会自动生成下列地址 1、本地链路地址 2、回环地址 3、所有节点多播地址FF02::1 4、如果是路由器,还会有FF02::2 5、被请求节点的组播地址 如果接口配了一个IPV6的单播地址,还会产生被请求节点的组播地址 《如何在帧中继中写MAP》 注意:必须写两条MAP,一条是所配IPV6地址的MAP,一条是link-local地址的MAP(该加brocast的时候要加) 否则会由于没有MAP映射导致无法PING通。 <IPV6的基本命令> R1(config)#ipv6 unicast-routing 在路由器上开启IPV6路由功能 R1(config-if)#ipv6 enable 在接口下启用IPV6,会自动生成一个link-local地址 R1(config-if)#ipv6 address 2001::1/64 指定一个IP地址,配置后会自动生成一个link-local地址 R1(config-if)#ipv6 address FE80:0:0:0:0123:0456:0789:0abc link-local 手工指定link-local地址(优于自动生成) R1(config-if)#ipv6 address 2001:0410:0:1::/64 eui-64 使用eui-64格式自动生成IPV6地址的低64位 R1(config-if)#ipv6 unnumbered 让本接口使用另一个接口的MAC地址生成源地址 R1(config-if)#ipv6 mtu 1500 配置接口的MTU值 R1(config-if)#ipv6 nd suppress-ra 关闭自动下发前缀 R2(config-rtr)#no split-horizon 关闭水平分割 注意IPV6的水平分割是在进程下关闭,不是在接口下 show ipv6 interface e0 显示IPV6接口的信息,包括IPV6地址,link-local地址,加入的组播地址及被请求节点组播地址 注意:串口和loopback口会借用以太口的MAC地址来生成link-local地址。 ------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------ 《ICMP V6》 ICMP用来向源节点报告关于向目的地传输IP数据包的错误和信息。定义了多种消息类型。 ICMP V6IPV6中的协议号是58 在IPV6中ICMP的功能得到极大增强,除了原有的功能,还有以下几个主要作用 在IPV6中ICMP的主要功能: 1、路径MTU发现--PMTUD 2、替代地址解析协议--NDP 3、无状态自动配置--NDP 4、重复地址检测--NDP 5、前缀重新编址--NDP 一、PMTUD path MTU discovery 作用:使用ICMP来检测数据包传输路径上最小的MTU值,检测到后使用ICMP 类型2消息(数据包超长)告知源节点,这样分片的工作在源路由器上就可完成,中间路由器不必做这一工作。原理如下: PMTUD使用ICMPV6的类型2消息--数据包超长错误消息 Router#show ipv6 mtu 显示源节点缓存的去每一个目的地的PMTUD值 二、在IPV6中使用NDP 为NDP特有的范畴定义了新的ICMPV6消息: NS (Neighbor Solicitation) 135 邻居请求 NA (Neighbor Advertisement) 136 邻居通告 RS 133 发到FF02::2 路由器请求信息,发给所有路由器 RA 134 发到FF02::1 路由器通告信息,每200S发一次,发向所有节点 类型137 重定向消息 三、替代ARP 使用NS 135和NA 136消息 主机使用邻居请求消息NS135发向邻居的被请求节点组播地址,请求一个MAC地址,邻居回应一个NA136邻居通告消息 show ipv6 neighbors 显示IPV6邻居的地址,生存期、链路层地址、和去往邻居的接口 router#ipv6 neighbor fec0::1:0:0:1:b e0 0080:12ff:6633 静态加入一个邻居项 clear ipv6 neighbors 清除邻居发现表 默认情况下邻居请求消息1000ms发送一次,可用以下命令修改: router(config-if)#ipv6 nd ns-interval 1000 router(config-if)#ipv6 nd reachable-time 1800000 设置邻居的可达时间间隔,默认30分钟,如果30分钟内还没再收到邻居的消息,就会从邻居发现表中删除邻居表项 四、公告前缀--类似于DHCP 路由器周期性地发出RA134公告,每200S一次,主机收到后自动生成IP地址 只要在路由器的接口上配置了一个本地站点或全球可聚合单播地址,就启用了CISCO路由器上的IPV6前缀通告 默认情况下:无状态自动配置公告的前缀长度为64比特 RS 133 发到FF02::2 请求信息,发给所有路由器 RA 134 发到FF02::1 通告信息,每200S发一次,发向所有节点 注意:每一条被通告的前缀都有生存期-- 生存期:每一个被公告前缀都有生存期,可以从0到无穷大,路由器会不断检查这个值,生存期又分两种 有效生存期:主机节点保持有效状态的时间。 首选生存期:必须小于或等于有效生存期,到期后,IPV6地址不能主动去建立新的连接,但可以在有效生存期没过时之前接受别的连接。通常用于前缀重新编址。 在默认情况下,cisco设备中,有效生存期为30天,首选生存期为7天 Autoconfiguration自动配置 来看下IPv6接口的自动配置--当本地链路的路由器发送网络类型信息(前缀)给所有节点的时候.支持IPv6的主机就把它自己64位的链路层地址(即MAC地址)附着在64位的前缀后面按EUI-64格式自动配置成128位长的地址,保证地址的唯一性.自动配置启用即插即用(Plug and Play) show ipv6 interface e0 prefix 显示路由器接口上公告的前缀的参数 R2(config-if)#ipv6 address autoconfig 用路由器模拟主机时,允许这个接口使用无状态自动配置 ,默认情况下路由器不允许使用无状态自动配置 R1(config-if)#ipv6 nd ra-lifetime 1000000 设定路由器公告消息(RA134)的生存期,默认情况下为30min R1(config-if)#ipv6 nd ra-interval 200 设定路由器公告消息的时间间隔,默认是200S R1(config-if)#ipv6 nd prefix 2001:1:1::/64 20000 10000 改写前缀公告的参数,后面分别是有效时间和首选时间 R1(config-if)#no ipv6 nd prefix 2001:1:1::/64 不通告本前缀(nnd,这条命令咋不起作用) R1(config-if)#ipv6 nd suppress-ra 基于接口关闭路由器公告 R1(config-if)#ipv6 nd managed-config-flag 在主机节点上启用有状态自动配置 debug ipv6 nd 调试前缀公告信息 五、重复地址检测<DAD------Duplicate Address Detection> 使用邻居请求消息NS 135 用于确定准备配置的IPV6地址在网络上是否唯一。 六、重编址 路由器发送组播数据包,其中数据包中包含2个前缀,一个是拥有比较短的生存期的旧前缀,还有一个是新的拥有正常时间的前缀.通知网络上的节点用完旧的前缀后换成新的前缀,这样就能进行平滑的前缀过渡 也是使用RS和RA消息 七、路由器重定向 使用重定向消息,类型为137 路由器使用ICMPV6重定向消息通知链路上的节点,在链路上存在一个更好的转发数据包的路由器. 默认是启用的 R1(config-if)#no ipv6 redirects 关闭重定向 八、Ping echo 128 echo reply 129 《静态路由》 建议写法: ipv6 route 2001::/64 e0 fe80::1234:abcd:1234:abcd (下一跳的link local地址) ----------------------------------------------------------------------------------------- <RIP>--ripng 在IPV6中使用UDP521端口,在IPV4中是520端口 使用组播地址:FF02::9 操作半径15跳 R1(config)#ipv6 unicast-routing R1(config)#ipv6 router rip yucedu 必须要有一个进程号 R1(config-if)#ipv6 rip yucedu enable 必须进入接口下开启接口的RIP Show ipv6 route Show ipv6 route rip show ipv6 rip show ipv6 rip database IPV6的metric值出口和入口都加1. IPV6的水平分割是整个路由器开启(在进程中关闭),IPV4是在接口下开关的,在帧中继的HUB-spoke模式中要关闭水平分割 <OSPF> 在IPV6中使用的是OSPFV3版 R1(config)#Ipv6 router ospf 110 R1(config-router)#Router-id 2.2.2.2 注意:必须使用一个类似IPV4地址的标识,必须手工指定,不能自动选 R1(config)#Int s0 R1(config-if)#Ipv6 ospf 110 area 0 也是在接口下宣告 R1(config)#Int lo0 R1(config-if)#Ipv6 ospf 110 area 0 环回口依然是主机路由,128位,可通过改网络类型来改动 Show ipv6 route ospf R1(config)#Int s0 R1(config-if)#Ipv6 ospf neighbor 2001::2 注意OSPF手工指邻居在接口下做,而IPV4是在进程下做 <is-is> R1(config)#Router isis R1(config-router)#Net 49.0001.2222.2222.2222.00 R1(config-router)#Log-adjacency-changes all 当邻居起来时出个提示 R1(config)#Int s0 R1(config-if)#Ipv6 router isis IPV4的ISIS也是在接口下启用 重分布直连: R1(config)#Router isis R1(config-router)#Redistribute connected 在IPV4中直接在ISIS进程中重分布 R1(config)#Router isis R1(config-router)#Address-family ipv6IPV6中重分布必须进这一进程 R1(config-router-af)#Redistribute connected 注意重分布命令必须在address-family进程中用 《BGP》 使用TCP179端口,和IPV4中一样 R1(config)#Router bgp 3 R1(config-router)#No autosummary R1(config-router)#bgp router-id 3.3.3.3 (一定要手工指定) R1(config-router)#No synchronization R1(config-router)#Neighbor 2001:13::1 remote-as 1 R1(config-router)#Address-family ipv6 注意进入address-family进程下 R1(config-router-af)#Neighbor 2001:13::1 activate 必须在address-family进程下激活,否则不起效 R3(config-router-af)#network 3::/64 也要在address-family下宣告 注意:IBGP中指下一跳也要在addres-family Show bgp ipv6 neighbor Show bgp ipv6 summary 注意bgp与ipv6反过来了 Show bgp ipv6 查看路由 Clear ip bgp * 清邻居的命令和IPV4中一样 《IPV6 ACL》 在IPV6中,ACL必须命名,写法类似IPV4命名访问列表 1、标准的访问列表可以基于源和目的进行过滤 2、扩展的访问列表可以基于源地址、目的地址、传输层协议、源端口、目的端口及其他特性进行过滤。 事实上IPV6没有标准和扩展之分了。 例一: Ipv6 access-list yucedu Deny ipv6 2001:12::2/128 any Permit ipv6 any any Int s0 Ipv6 traffic-filter yucedu out 在接口下调用 Ipv6的access-list语句的后面默认隐含三条语句: Permit icmp any any nd-ns Permit icmp any any nd-na Deny ipv6 any any 例二: ipv6 access-list yucedu permit tcp any host 2001::1 eq telnet 在接口应用了访问列表后,P包不通会提示AAAAA Prefix-list 例:在R1上,只允许2002:1::/64和2001:12::/64的路由传给R3 ipv6 prefix-list yucedu permit 2001:12::/64 ipv6 prefix-list yucedu permit 2002:1::/64 默认最后有deny any ipv6 router rip xwx distribute-list prefix-list yucedu out Serial1 clear ipv6 rip xwx 在IPV6中,分布列表后只能跟prefix,不能跟ACL ----------------------------------------------------------------------------------------- 《IPV4到IPV6的过渡解决方案》 IPV6 over IP Tunnel方案 Tunnel R2(config)#int tunnel 2 R3(config)#int tunnel 3 tunnel source 2.2.2.2 tunnel source 3.3.3.3 tunnel destination 3.3.3.3 tunnel destination 2.2.2.2 tunnel mode ipv6ip tunnel mode ipv6ip ipv6 enable ipv6 enable show ipv6 interface tunnel 2 注意在采用IPV6IP模式时,会用Tunnel源IP地址来生成本Tunnel的link-local地址,即使你不用ipv6 enable命令,而采用ipv6 unnumbered 命令借用别的地址,结果还是一样。 R2(config)#ipv6 router ospf 110 R2(config-router)#router-id 2.2.2.2 R2(config)#int tunnel 2 R2(config-if)#ipv6 ospf 110 area 0 R2(config)#int e0 R2(config-if)#ipv6 ospf 110 area 0 <6 TO 4>自动Tunnel方案 特点: 1、自动tunnel 2、只要指一条静态路由就OK 前提:首先要注意E0接口的地址必须和源地址配合,且必须用2002这一前缀开头 R2(config)#int tunnel 2 R3(config)#int tunnel 3 tunnel source 2.2.2.2 tunnel source 3.3.3.3 tunnel mode ipv6ip 6to4 tunnel mode ipv6ip 6to4 ipv6 enable ipv6 enable 实际上会按源地址生成link-local地址 R2(config)#ipv6 route 2002::/16 tunnel 2 R3(config)#ipv6 route 2002::/16 tunnel 3 必须写上静态路由
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页