ITPub博客

首页 > 数据库 > 数据库开发技术 > openEuler 22.03-LTS IPv6 vs IPv4使用差异说明

openEuler 22.03-LTS IPv6 vs IPv4使用差异说明

原创 数据库开发技术 作者:shuchaoyang 时间:2022-12-29 22:24:40 0 删除 编辑


1 IPv6 vs IPv4使用差异说明1.1 约束限制1.2 配置说明1.2.1 设置接口设备MTU值1.2.1.1 概述1.2.1.2 设置接口设备的mtu1.2.2 有状态自动配置IPv6地址1.2.2.1 概述1.2.2.2 有状态自动配置IPv6地址时dhclient设置vendor class方法1.2.3 内核支持socket相关系统调用1.2.3.1 概述1.2.3.2 link-local地址和global地址在socket调用时的差异1.2.4 IPv4的dhclient守护进程持久化配置1.2.4.1 概述1.2.4.2 约束限制1.2.4.3 IPv4 DHCP和IPv6 DHCPv6方式获取地址的配置差异1.2.5 iproute相关命令配置IPv4与IPv6时的差异说明1.2.5.1 概述1.2.5.2 IPv6地址的生命周期1.2.5.3 ip link 命令1.2.5.4 ip addr命令1.2.5.5 ip route命令1.2.5.6 ip rule命令1.2.6 NetworkManager服务配置差异说明1.2.6.1 概述1.2.6.2 配置差异说明1.3 FAQ1.3.1 iscsi-initiator-utils不支持登录fe80 IPv6地址问题现象原因分析1.3.2 网卡down掉之后,IPv6地址丢失问题现象原因分析1.3.3 bond口已具有多个IPv6地址时,添加或删除IPv6地址耗时过久问题现象原因分析解决方法1.3.4 Rsyslog在IPv4和IPv6混合使用场景中日志传输延迟问题现象原因分析解决方法


1 IPv6 vs IPv4使用差异说明

1.1 约束限制

  • chrony支持全局地址(global address),不支持链路本地地址(link-local address)。

  • Firefox支持通过http/https协议访问全局地址(global address),不支持链路本地地址(link-local address)。

1.2 配置说明

1.2.1 设置接口设备MTU值

1.2.1.1 概述

IPv6场景中会发现整个路由路径中的最小mtu的值作为当前链接的PMTU的值,源端根据PMTU的值确定是否进行分片发送,而在整个路径中的其它设备将不再需要进行分片处理,从而可以降低中间路由设备的负载大小。其中IPv6 PMTU设置的最小值为1280。

1.2.1.2 设置接口设备的mtu

如果在配置了IPv6地址的接口上设置mtu的值小于1280(IPv6 PMTU设置的最小值),则会导致该接口的IPv6地址被删除。并且无法再次添加IPv6地址。所以在IPv6场景中,对接口设备的mtu的配置一定要大于等于1280。请在root权限下运行如下命令查看具体现象:

[root@superman-21 ~]# ip add show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  link/ether 00:0c:29:96:c9:d7 brd ff:ff:ff:ff:ff:ff
  altname enp2s1
  inet 192.168.0.21/24 brd 192.168.0.255 scope global noprefixroute ens33
      valid_lft forever preferred_lft forever
  inet6 fe80::9393:f6ae:ced9:7759/64 scope link noprefixroute
      valid_lft forever preferred_lft forever
[root@superman-21 ~]#
[root@superman-21 ~]# ip link set dev ens33 mtu 1200
[root@superman-21 ~]#
[root@superman-21 ~]# ip add show ens33            
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1200 qdisc fq_codel state UP group default qlen 1000
  link/ether 00:0c:29:96:c9:d7 brd ff:ff:ff:ff:ff:ff
  altname enp2s1
  inet 192.168.0.21/24 brd 192.168.0.255 scope global noprefixroute ens33
      valid_lft forever preferred_lft forever
[root@superman-21 ~]#
[root@superman-21 ~]# ip addr add fe80::9393:f6ae:ced9:7759/64 dev ens33
RTNETLINK answers: Invalid argument
[root@superman-21 ~]#
[root@superman-21 ~]# ip link set dev ens33 mtu 1500
[root@superman-21 ~]#
[root@superman-21 ~]# ip add show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  link/ether 00:0c:29:96:c9:d7 brd ff:ff:ff:ff:ff:ff
  altname enp2s1
  inet 192.168.0.21/24 brd 192.168.0.255 scope global noprefixroute ens33
      valid_lft forever preferred_lft forever
  inet6 fe80::20c:29ff:fe96:c9d7/64 scope link
      valid_lft forever preferred_lft forever
[root@superman-21 ~]#
[root@superman-21 ~]# ip addr add 2001:222::2/64 dev ens33
[root@superman-21 ~]#
[root@superman-21 ~]# ip add show ens33                  
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  link/ether 00:0c:29:96:c9:d7 brd ff:ff:ff:ff:ff:ff
  altname enp2s1
  inet 192.168.0.21/24 brd 192.168.0.255 scope global noprefixroute ens33
      valid_lft forever preferred_lft forever
  inet6 2001:222::2/64 scope global
      valid_lft forever preferred_lft forever
  inet6 fe80::20c:29ff:fe96:c9d7/64 scope link
      valid_lft forever preferred_lft forever
[root@superman-21 ~]#

1.2.2 有状态自动配置IPv6地址

1.2.2.1 概述

IPv6与IPv4都可以在root权限下通过DHCP的方式获得IP地址。IPv6地址有两种配置方式:无状态自动配置和有状态自动配置。

  • 无状态自动配置

    不需要DHCP服务进行管理,设备根据网络RA(路由公告)获得网络前缀,或者link-local地址为固定fe80::。而接口ID则根据ifcfg配置IPV6_ADDR_GEN_MODE的具体设置来进行自动获得:

  1. IPv6_ADDR_GEN_MODE=“stable-privacy” 则根据设备及网络环境来确定一个随机接口ID。

  2. IPv6_ADDR_GEN_MODE=“EUI64” 则根据设备MAC地址来确定接口ID。

  • 有状态自动配置:需要DHCP服务器进行管理分配,服从DHCPv6协议来从DHCPv6服务器端租赁IPv6地址。

    在有状态自动配置IPv6地址时,DHCPv6服务端可以通过客户端设置的vendor class将客户端进行分类,不同类别分配不同地址段的IPv6地址。在IPv4场景中,客户端可以直接用dhclient的-V选项来设置vendor-class-identifier,DHCP服务端在配置文件中根据vendor-class-identifier来对客户端进行分类处理。而IPv6场景中,如果使用同样的方法对客户端分类,则分类并不会生效。

    dhclient -6 <interface> -V <vendor-class-identifier string> <interface>

    这是由于DHCPv6和DHCP协议存在较大差异,DHCPv6的可选项中使用vendor-class-option替代了DHCP中的vendor-class-identifier。而dhclient的-V选项并不能设置vendor-class-option。

  • 1.2.2.2 有状态自动配置IPv6地址时dhclient设置vendor class方法
    • 在客户端使用配置文件方式添加对vendor class的设置,使用方法如下:

      客户端配置文件(/etc/dhcp/dhclient6.conf),文件位置可以自定义,在使用时需要通过dhclient -cf选项来指定配置文件:

      option dhcp6.vendor-class code 16 = {integer 32, integer 16, string};
      interface "ens33" {
            send dhcp6.vendor-class <Enterprise-ID number> <vendor class string length> <vendor class string>;
      }

      说明:

      客户端使用方法:

      dhclient -6 <interface> -cf /etc/dhcp/dhclient6.conf
      • <Enterprise-ID number>,32位整型数字,企业标识号,企业通过IANA注册。

      • <vendor class string length>,16位整型数字,vendor class字符串长度。

      • <vendor class string>,要设置的vendor class字符串,例如:“HWHW”。

    • DHCPv6服务端配置文件(/etc/dhcp/dhcpd6.conf),需要dhcpd -cf选项来指定该配置文件:

      option dhcp6.vendor-class code 16 = {integer 32, integer 16, string};
      subnet6 fc00:4:12:ffff::/64 {
            class "hw" {
                    match if substring ( option dhcp6.vendor-class, 6, 10 ) = "HWHW";
            }
            pool6 {
                    allow members of "hw";
                    range6 fc00:4:12:ffff::ff10 fc00:4:12:ffff::ff20;
            }
            pool6 {
                    allow unknown clients;
                    range6 fc00:4:12:ffff::100 fc00:4:12:ffff::120;
            }
      }

      说明:substring ( option dhcp6.vendor-class, 6, 10 ) 其中子字符串的开始位置为6,因为前面包含4个字节的<Enterprise-ID number>和2个字节的<string length>。而子字符串的结束位置为:6+<vendor class string length>。这里vendor class string为“HWHW”,字符串的长度为4,所以子字符串的结束位置为6+4=10。用户可以根据实际需要来确定<vendor class string>及相应的<vendor class string length>。

      服务端使用方法:

      # dhcpd -6 -cf /etc/dhcp/dhcpd6.conf <interface>

    1.2.3 内核支持socket相关系统调用

    1.2.3.1 概述

    IPv6地址长度扩展到128比特,所以有足够的IPv6地址可供分配使用。同时IPv6头相比IPv4头进行了简化,并增强了IPv6的自动配置功能。IPv6地址分为单播地址,组播地址和任意播地址。常用的单播地址又包含:链路本地地址(link-local address),唯一本地地址(Unique local address)和全局地址(global address)。由于IPv6的全局地址十分充足,唯一本地地址一般不被使用(其前身为站点本地地址(site-local address),已于2004年被废弃)。当前主要使用的单播地址为:链路本地地址(link-local address)和全局地址(global address)。当前内核支持socket系统调用,在使用单播地址的链路本地地址和全局地址时存在差异。

    1.2.3.2 link-local地址和global地址在socket调用时的差异

    RFC 2553:Basic Socket Interface Extensions for IPv6 定义sockaddr_in6的数据结构如下;

    struct sockaddr_in6 {     
      uint8_t         sin6_len;       /* length of this struct */    
      sa_family_t     sin6_family;   /* AF_INET6 */    
      in_port_t       sin6_port;     /* transport layer port # */    
      uint32_t       sin6_flowinfo; /* IPv6 flow information */    
      struct in6_addr sin6_addr;     /* IPv6 address */    
      uint32_t       sin6_scope_id; /* set of interfaces for a scope */
    };

    说明:sin6_scope_id:32位整型,对于链路本地地址(link-local address),对于链路范围的sin6_addr,它可以用来标识指定的接口索引号。如果是站点范围的sin6_addr,则用来作为站点的标识符(站点本地地址已被抛弃)。

    在使用link-local地址进行socket通信时,在构造目的地址时,需要制定该地址所对应的接口索引号。一般可以通过if_nametoindex函数将接口名转化为接口索引号。具体方式如下,

    int port = 1234;
    int sk_fd;
    int iff_index = 0;
    char iff_name[100] = "ens33";
    char * ll_addr[100] = "fe80::123:456:789";
    struct sockaddr_in6 server_addr;

    memset(&server_addr,0,sizeof(structsockaddr_in6));
    iff_index=if_nametoindex(iff_name);

    server_addr.sin6_family=AF_INET6;
    server_addr.sin6_port=htons(port);
    server_addr.sin6_scope_id=iff_index;
    inet_pton(AF_INET6, ll_addr, &(server_addr.sin6_addr));

    sk_fd=socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
    connect(sk_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in6));

    1.2.4 IPv4的dhclient守护进程持久化配置

    1.2.4.1 概述

    通过NetworkManager服务来管理网络服务时,如果接口ifcfg-<interface-name>配置文件中配置了DHCP方式获得IP地址,则相应地NetworkManager服务会拉起dhclient守护进程来通过DHCP协议方式来从DHCP服务器获取IP地址。

    dhclient提供了"-1"选项来决定dhclient进程在未获得DHCP服务响应时,是会不断持久化尝试请求地址还是会尝试时间超时后退出。针对IPv4的dhclient守护进程,可以在ifcfg-<interface-name>配置文件中设置PERSISTENT_DHCLIENT来决定是否设置IPv4的dhclient进程的持久化。

    1.2.4.2 约束限制
    1. 当dhclient进程在运行中被杀死,network服务无法自动将其拉起,可靠性需要用户自己保障。

    2. 配置了持久化选项PERSISTENT_DHCLIENT,需要确保有相应的DHCP服务器。如果在拉起network时无可用DHCP服务器,dhclient进程不断尝试发送请求包但无回应,则会导致network服务卡死直到network服务超时失败。由于network服务在拉起多个网卡的IPv4 dhclient进程时,是通过串行的方式来拉起的。如果有网卡配置了持久化而DHCP服务器没有准备好,则会导致network服务在给该网卡获取IPv4地址超时卡死,进而导致后续网卡无法获得IPv4/IPv6地址。

    以上两种约束限制是特殊的应用场景,需要用户自己进行可靠性保障。

    1.2.4.3 IPv4 DHCP和IPv6 DHCPv6方式获取地址的配置差异

    可以通过配置接口ifcfg-<interface-name>参数来分别实现IPv4和IPv6通过DHCP/DHCPv6协议来动态获取IP地址,具体配置说明如下;

    BOOTPROTO=none|bootp|dhcp
    DHCPV6C=yes|no
    PERSISTENT_DHCLIENT=yes|no|1|0
    • BOOTPROTO:none表示静态配置IPv4地址,bootp|dhcp则会拉起DHCP dhclient来动态获取IPv4地址。

    • DHCPV6C:no表示静态配置IPv6地址,yes则会拉起DHCPv6 dhclient来动态获取IPv6地址。

    • PERSISTENT_DHCLIENT:no|0表示IPv4的dhclient进程配置为“非持久化”,当dhclient向DHCP服务器发送一次请求报文而无响应,则会间隔一段时间后退出,退出值为2。yes|1则表示IPv4的dhclient进程配置为“持久化”,dhclient会向DHCP服务器反复发送请求报文。如果没有配置PERSISTENT_DHCLIENT项,则IPv4的dhclient会默认设置为“持久化”。

      说明:PERSISTENT_DHCLIENT配置只针对IPv4生效,对IPv6相关dhclient -6进程不生效,IPv6默认不进行持久化配置。

    1.2.5 iproute相关命令配置IPv4与IPv6时的差异说明

    1.2.5.1 概述

    由于IPv4和IPv6是两个不同的协议标准,iproute相关命令在使用方法上存在一定的差异。本节主要梳理iproute包中用户经常使用到命令在IPv4和IPv6使用方面的差异,从而可以更好地指导用户使用iproute包中相关命令。

    iproute相关命令均需要在root权限下运行。

    1.2.5.2 IPv6地址的生命周期

    其它说明:

    • preferred_lft:preferred lifetime,地址为首选状态的寿命,preferred_lft没有到期的地址可以用于正常通信使用,若有多个preferred地址则按照内核具体机制选择地址。

    • valid_lft:valid lifetime,地址有效的寿命,在[preferred_lft, valid_lft]时间段内该地址不能被用于新建连接,已经创建的连接继续有效。

    1.2.5.3 ip link 命令

    命令:

    # ip link set IFNAME mtu MTU

    IPv6中PMTU的最小值为1280,如果mtu值设置小于1280则会导致IPv6地址丢失。其它设备无法ping通该IPv6地址。

    1.2.5.4 ip addr命令
    1. 命令:

      # ip [-6] addr add IFADDR dev IFNAME

      添加IPv6地址可以选择添加-6选项也可以不添加,ip addr命令会根据具体地址类型来判断是ipv4地址还是IPv6地址。

      如果指定“-6”选项,但是 IFADDR 是ipv4地址则会有错误返回。

    2. 命令:

      # ip [-6] addr add IFADDR dev IFNAME [home|nodad]

      [home|nodad] 选项只针对IPv6地址有效。

    • home:将该地址指定为RFC 6275中定义的家庭地址。(这是移动节点从家庭链路获取的地址, 是移动节点的永久地址,如果移动节点保持在相同的归属链路中,则各种实体之间的通信照常进行。)

    • nodad:配置该项(仅限IPv6)添加此地址时不执行重复地址检测DAD(RFC 4862)。如果一台设备上多个接口通过nodad配置了多个相同的IPv6地址,则会按照接口顺序使用该IPv6地址。同一个接口上不能添加一个nodad一个非nodad的相同IPv6地址。因为两个地址是一样的,所以会报“RTNETLINK answers: File exists”。

  • 命令:

    # ip [-6] addr del IFADDR dev IFNAME

    删除IPv6地址可以选择添加-6选项也可以不添加,ip addr del命令会根据具体地址类型来判断是ipv4地址还是IPv6地址。

  • 命令:

    # ip [-6] addr show dev IFNAME [tentative|-tentative|deprecated|-deprecated|dadfailed|-dadfailed|temporary]
    • 不指定-6选项,则会同时打印IPv4和IPv6地址。指定-6选项则只打印IPv6地址。

    • [tentative|-tentative|deprecated|-deprecated|dadfailed|-dadfailed|temporary],这些选项只针对IPv6,可以根据IPv6地址状态对地址进行筛选查看。

    1. tentative:(仅限IPv6)仅列出尚未通过重复地址检测的地址。

    2. -tentative:(仅限IPv6)仅列出当前未处于重复地址检测过程中的地址。

    3. deprecated:(仅限IPv6)仅列出已弃用的地址。

    4. -deprecated:(仅限IPv6)仅列出未弃用的地址。

    5. dadfailed:(仅限IPv6)仅列出重复地址检测失败的地址。

    6. -dadfailed:(仅限IPv6)仅列出未重复地址检测失败的地址。

    7. temporary:(仅限IPv6)仅列出临时地址

    1.2.5.5 ip route命令
    1. 命令:

      # ip [-6] route add ROUTE [mtu lock MTU]
    • -6选项:添加IPv6路由可以选择添加-6选项也可以不添加,ip route命令会根据具体地址类型来判断是IPv4地址还是IPv6地址。

    • mtu lock MTU:锁定路由的MTU值。如果不锁定MTU,则MTU的值则可能在PMTUD过程中被内核改变。如果锁定MTU,则不会尝试PMTUD,所有IPv4包都将不设置DF位发出,IPv6包则会按照MTU进行分段处理。

  • 命令:

    # ip [-6] route del ROUTE

    删除IPv6路由可以选择添加-6选项也可以不添加,ip route命令会根据具体地址类型来判断是IPv4地址还是IPv6地址。

  • 1.2.5.6 ip rule命令
    1. 命令:

      # ip [-6] rule list

      -6选项:设置-6选项打印IPv6的策略路由,不设置-6选项打印IPv4的策略路由。所以需要根据具体协议类型来配置-6选项。

    2. 命令:

      # ip [-6] rule [add|del] [from|to] ADDR table TABLE pref PREF

      -6选项:IPv6相关的策略路由表项需要设置-6选项,否则会报错:“Error: Invalid source address.”。相应地,IPv4相关的策略路由表项不可以设置-6选项,否则会报错:“Error: Invalid source address.”。

    1.2.6 NetworkManager服务配置差异说明

    1.2.6.1 概述

    NetworkManager服务使用ifup/ifdown的逻辑接口定义进行高级网络设置。其参数大多数都是在/etc/sysconfig/network和/etc/sysconfig/network-scripts/ifcfg-<interface-name>两个配置文件设置。前者为全局设置,后者为指定网卡的设置,当两者有冲突时,后者生效。

    1.2.6.2 配置差异说明

    其中在/etc/sysconfig/network下的配置差异有:

    而在/etc/sysconfig/network-scripts/ifcfg-<interface-name>下的差异主要有:

    1.3 FAQ

    1.3.1 iscsi-initiator-utils不支持登录fe80 IPv6地址

    问题现象

    客户端通过IPv6登录iscsi服务端时,使用如“iscsiadm -m node -p ipv6address -l”的命令格式登录,如果是全局地址(global address),直接替换将命令范例中的“ipv6address”替换为全局地址即可;但如果是链路本地地址(link-local address,fe80开头的IPv6地址)则无法使用,因为iscsi-initiator-utils目前机制还不支持用链路本地地址(link-local address)地址登录iscsi服务端。

    原因分析

    如果使用格式如“iscsiadm -m node -p fe80::xxxx -l”登录,会登录超时返回,这是因为使用链路本地地址必须指定接口,否则使用iscsi_io_tcp_connect函数调用connect函数会失败,并且产生标准错误码22。

    如果使用格式如“iscsiadm -m node -p fe80::xxxx%enp3s0 -l”登录时,iscsi_addr_match函数会将地址“fe80::xxxx%enp3s0”与服务端返回的node信息中的地址“fe80::xxxx”对比,对比结果不匹配,导致登录失败。

    因此,iscsi-initiator-utils目前机制还不支持用链路本地地址(link-local address)登录iscsi服务端。

    1.3.2 网卡down掉之后,IPv6地址丢失

    问题现象

    通过ip link down+up网卡或ifconfig down+up网卡命令,将网卡down掉之后再上线,查看网卡上配置的ip地址,发现ipv4地址不丢失,而配置的IPv6地址丢失。

    原因分析

    内核中的处理逻辑为如果网卡设置为down状态,会清空所有IPv4及IPv6地址,将网卡重新up之后,ipv4地址自动恢复,网卡上自动配置的IPv6链路本地地址也会恢复,但是其他IPv6地址默认会丢失。如果需要保留这些IPv6地址,可以通过“sysctl -w net.ipv6.conf.<网卡名>.keep_addr_on_down=1”来实现。

    1.3.3 bond口已具有多个IPv6地址时,添加或删除IPv6地址耗时过久

    问题现象

    下列方式配置或删除(包括flush)IPv6地址方式,X为动态变化的低16位,并且配置在bond口时,耗时会随已配置的IPv6地址数量成数倍增加。例如由4个物理网卡组成的bond口添加IPv6地址时,单线程添加删除3000 IPv6地址均需大概5分钟,而普通物理网卡耗时在10秒内。

    ip a add/del 192:168::18:X/64 dev DEVICE
    原因分析

    bond口在添加IPv6地址时,会生成IPv6组播地址,并进行同步到所有的物理网卡上,此耗时会随IPv6数量增加而增加,导致耗时过长。

    解决方法

    IPv6的组播地址是由IPv6地址的低24位与33-33-ff组合生成,组播地址过多会导致添加删除耗时增加,如果生成的组播地址为少量,耗时不会受此影响。

    建议添加IPv6地址时,可保持低24位一致,保持高位变动,单网卡中仅需一个网段的一个地址即可与外部正常通信,此配置更符合常规使用。

    1.3.4 Rsyslog在IPv4和IPv6混合使用场景中日志传输延迟

    问题现象

    rsyslog客户端配置文件同时配置IPv4和IPv6地址,且端口配置相同的情况下,服务端收集log时会概率性出现日志打印延迟。

    原因分析

    延迟是因为rsyslog内部存在缓冲队列机制,默认情况下需要缓冲区队列达到一定数量才会写入文件。

    解决方法

    可在root权限下通过配置Direct模式,关闭缓冲队列机制解决该问题。在rsyslog远程传输服务端的/etc/rsyslog.d目录下新增的远程传输配置文件中,最开头增加如下配置:

    $ActionQueueType Direct
    $MainMsgQueueType Direct

    说明:

    • Direct模式减少队列大小为1,所以在队列中会保留1条日志到下次日志打印;

    • Direct模式会降低服务器端的rsyslog性能。


    有什么吐槽或反馈意见,直接告诉我!

    温馨提示:如出现二维码失效也可直接添加微信号:ysc13803862469。

    原文作者:超哥的IT私房菜;如有侵权,请联系管理员删除。

    上一篇: CA安装测试报告
    请登录后发表评论 登录
    全部评论
    专注于IT系统集成、运维、架构二十年的IT职场老兵,拥有CCNA、OCA、OCP、PGCA、PGCE认证证书,公众号:超哥的IT私房菜,知识星球:超哥的IT私房菜,目前是多家IT厂商的咨询顾问。

    注册时间:2021-08-27

    • 博文量
      552
    • 访问量
      303515