本文主要介绍如何开启或关闭Aliyun Linux 2操作系统中的IPv6。

前提条件

  • 选用的实例规格必须支持IPv6,详情请参见实例规格族
  • 创建的实例必须在支持开通IPv6网段的地域下,并搭建了IPv6专有网络,详情请参见搭建IPv6专有网络

背景信息

Aliyun Linux 2镜像在aliyun-2.1903-x64-20G-alibase-20190829.vhd及之前的版本未开启IPv6,从aliyun_2_1903_x64_20G_alibase_20200221.vhd版本开始默认开启了IPv6。

本文所有操作步骤均是在ECS实例内进行,远程连接实例的方式请参见连接方式概述

暂时开启IPv6

在镜像aliyun_2_1903_64_20G_alibase_20190619.vhd及之前的版本中,/etc/systemd/network/目录下的.network文件只配置了DHCP=ipv4,您可以按照以下步骤修改文件内容来暂时开启IPv6。

注意 实例一旦停止或重启,开启IPv6的相关配置会失效。
  1. 运行以下命令进入/etc/systemd/network/目录。
    cd /etc/systemd/network/
  2. 使用命令ls查询该目录下的.network文件。
    本文以50-dhcp.network文件为例。alinux2
  3. 修改文件50-dhcp.network内容。
    vi /etc/systemd/network/50-dhcp.network
  4. i进入编辑模式。
    [Network]下的信息修改为DHCP=yes
    说明 文件内参数Name=eth*表示适配所有网络接口,所有网络接口都将通过DHCP配置IP地址与路由。如果只需要配置指定的网络接口,可以修改参数Name为指定的网络接口,例如,Name=eth0表示只适配eth0网络接口。更多关于network的信息请参见systemd.network
    [Match]
    Name=eth*
    
    [Network]
    DHCP=yes
    修改完成后按esc键,并输入:wq后按下回车键,保存并退出。
  5. 运行以下命令开启IPv6。
    • 开启所有网络接口。
      sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0
      sudo sysctl -w net.ipv6.conf.default.disable_ipv6=0
    • 开启指定网络接口示例。
      sudo sysctl -w net.ipv6.conf.eth0.disable_ipv6=0
  6. 重启systemd-networkd服务使配置生效。
    sudo systemctl restart systemd-networkd

持久开启IPv6

以下操作步骤将持久化开启IPv6,实例重启后配置仍然生效。

  1. 修改/etc/sysctl.conf配置文件。
    vi /etc/sysctl.conf
  2. i进入编辑模式。使用以下任一方式修改文件内容。
    • 删除下列配置信息。
      net.ipv6.conf.all.disable_ipv6 = 1
      net.ipv6.conf.default.disable_ipv6 = 1
      net.ipv6.conf.lo.disable_ipv6 = 1
    • 修改对应的配置信息为如下内容。
      net.ipv6.conf.all.disable_ipv6 = 0
      net.ipv6.conf.default.disable_ipv6 = 0
      net.ipv6.conf.lo.disable_ipv6 = 0
      如果需要开启指定网络接口,修改信息示例如下。
      net.ipv6.conf.eth0.disable_ipv6 = 0
    修改完成后按esc键,并输入:wq后按下回车键,保存并退出。
  3. 验证/etc/sysctl.conf配置信息是否与initramfs中的/etc/sysctl.conf存在差异。
    diff -u /etc/sysctl.conf <(lsinitrd -f /etc/sysctl.conf)
    说明 Aliyun Linux 2配置了initramfs(initram file system)。如果initramfs中的/etc/sysctl.conf文件与IPv6的配置文件/etc/sysctl.conf存在差异,系统可能会生效新的配置,与您需求的配置混淆。
  4. 如果两个配置文件存在差异,您可以执行以下命令重新生成initramfs。
    sudo dracut -v -f
  5. 重启实例。
    sudo reboot
  6. 执行ifconfig命令判断是否已开启IPv6。
    如果网络配置信息包含以下信息,表示IPv6已开启。
    inet6 <以fe80::开头的单播地址>
    inet6 <ECS实例的IPv6地址>

暂时关闭IPv6

以下命令将暂时关闭IPv6。

注意 实例一旦停止或重启,关闭IPv6的相关配置会失效。
  • 关闭所有网络接口。
    sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
    sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
  • 关闭指定网络接口示例。
    sudo sysctl -w net.ipv6.conf.eth0.disable_ipv6=1

持久关闭IPv6

以下操作步骤将持久化关闭IPv6,实例重启后配置仍然生效。您可以通过以下任一方式关闭IPv6。

  • 通过以下任一命令行参数持久化关闭IPv6。
    • sudo grubby --args="ipv6.disale_ipv6=1" --update-kernel=/boot/vmlinuz-$(uname -r)
    • sudo grubby --args="ipv6.disale=1" --update-kernel=/boot/vmlinuz-$(uname -r)
    说明 参数--args="ipv6.disale_ipv6=1"--args="ipv6.disale=1"均能实现关闭IPv6的功能,区别在于设置--args="ipv6.disale_ipv6=1"参数只关闭网络接口IPv6;而设置--args="ipv6.disale=1"参数直接禁用了IPv6的内核模块,详情请参见Linux内核IPv6说明
  • 通过修改/etc/sysctl.conf文件持久化关闭IPv6。
  1. 修改/etc/sysctl.conf配置文件。
    vi /etc/sysctl.conf
  2. i进入编辑模式,将对应的配置信息修改为如下所示。
    net.ipv6.conf.all.disable_ipv6=1
    net.ipv6.conf.default.disable_ipv6=1
    如果需要关闭指定网络接口,修改示例如下。
    net.ipv6.conf.eth0.disable_ipv6=1
  3. 重启实例。
    sudo reboot
  4. 执行ifconfig命令判断是否已关闭IPv6。
    如果网络配置信息没有包含以下信息,表示IPv6已关闭。
    inet6 <以fe80::开头的单播地址>
    inet6 <ECS实例的IPv6地址>