如何在 Amazon EC2 上的 RHEL 7.4 中启用 IPv6

如何在 Amazon EC2 上的 RHEL 7.4 中启用 IPv6

亚马逊提供了有关如何在 RHEL 7 和 Centos 7 上启用 IPv6 的说明:http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-migrate-ipv6.html#ipv6-dhcpv6-rhel

这些说明适用于 RHEL 7-7.3 和 Centos 7-7.3,但不适用于 RHEL 7.4(并且大概也不适用于 Centos 7.4,当它可用时)。

问题在于该文件/etc/sysconfig/network-scripts/ifcfg-eth0在旧版本中是用户可写的,但在 RHEL 7.4 中,该文件由 cloud-init 管理。

$ sed 1q /etc/sysconfig/network-scripts/ifcfg-eth0
# Created by cloud-init on instance boot automatically, do not edit.

我发现,仅仅从 7.3 升级到 7.4 就需要对网络管理进行如此根本性的改变,这非常出乎意料。我不确定这个变化是否特定于 Amazon EC2,我在 RHEL 7.4 发行说明中找不到任何内容,所以它可能是特定于 Amazon 的。

那么如何在 cloud-init 模型中在 RHEL 7.4 和 Centos 7.4 上启用 IPv6?

答案1

在 RHEL 7.4 或 CentOS 7 上配置 DHCPv6

  1. 使用实例的公有 IPv4 地址连接到您的实例。
  2. 使用您选择的文本编辑器创建一个自定义文件,例如:

    /etc/cloud/cloud.cfg.d/99-custom-networking.cfg

  3. 将以下行添加到您的文件中,然后保存更改:

    network:
      version: 1
      config:
      - type: physical
        name: eth0
        subnets:
          - type: dhcp6
    
  4. 重启您的实例。

  5. 重新连接到您的实例并使用 ifconfig 命令验证网络接口上是否配置了 IPv6 地址。

来源:https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-migrate-ipv6.html#ipv6-dhcpv6-rhel

答案2

我找到了一个很好的解决方案。我一直使用 terraform 启动我的实例并使用 cloud-init 用户数据对其进行初始配置,以下 EC2 用户数据文件对我来说效果很好:

#cloud-config
preserve_hostname: false
hostname: centos-01
fqdn: centos-01.example.com
manage_etc_hosts: true
write_files:
  - path: /etc/cloud/cloud.cfg.d/99-custom-networking.cfg
    owner: root:root
    permissions: 0600
    content: |
      network:
        version: 1
        config:
        - type: physical
          name: eth0
          subnets:
            - type: dhcp
            - type: dhcp6
power_state:
  mode: reboot
  delay: now
  message: Rebooting post-config
  timeout: 30
  condition: True

此配置的重要部分是write_files部分,它安装适当的 cloud-init 配置以启用 IPv6,然后power_state触发立即的配置后重启,然后应用网络配置更改。

重启后,网络配置如下:

[centos@centos-01 ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Created by cloud-init on instance boot automatically, do not edit.
#
BOOTPROTO=dhcp
DEVICE=eth0
DHCPV6C=yes
IPV6INIT=yes
IPV6_AUTOCONF=no
ONBOOT=yes
TYPE=Ethernet
USERCTL=no

我对这个解决方案很满意,尽管我不太清楚为什么我不能直接在用户数据中指定网络配置,而必须将其写入文件并重新启动。无论如何,这很有效,而且相当轻松。

答案3

设置网络的 cloud-init 脚本在首次启动时运行一次。如果您能找出哪个模块设置了它,您可以尝试在文件, always中的名称后附加它/etc/cloud/cloud.cfg,并在为您的 EC2 实例分配 IPv6 地址后重新启动。

如果你希望正确设置 IPv6,请确保你的子网设置为自动分配IPv6 地址。为此,请在子网列表中右键单击您的子网,然后选择“修改自动分配 IP 设置”。

最后,当它起作用时,我看到的内容如下/etc/sysconfig/network

NOZEROCONF=yes
DEVTIMEOUT=10

# Created by cloud-init on instance boot automatically, do not edit.
#
NETWORKING=yes
NETWORKING_IPV6=yes
IPV6_AUTOCONF=no

以及/etc/sysconfig/network-scripts/ifcfg-eth0

# Created by cloud-init on instance boot automatically, do not edit.
#
BOOTPROTO=dhcp
DEVICE=eth0
DHCPV6C=yes
HWADDR=xx:xx:xx:xx:xx:xx
IPV6INIT=yes
ONBOOT=yes
STARTMODE=auto
TYPE=Ethernet
USERCTL=no

答案4

我最终找到了该问题的解决方案。

我们需要添加外部 IPv6 地址,/etc/sysconfig/network-scripts/ifcfg-eth0如下所示;

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=dhcp
DEVICE=eth0
DHCPV6C=yes
IPV6INIT=yes
IPV6ADDR="xxxx:xxxx:xxxx:xxx:xx:xxx:xx" <--add the external IPv6 here
ONBOOT=yes
TYPE=Ethernet
USERCTL=no

相关内容