在 CentOS 7 软路由上通过 DHCPv6-PD 为内网主机接入 IPv6 公网


一、前言

前段时间,我写了一篇文章介绍了 DHCPv6-PD 的基本原理以及 DHCPv6-PD 在思科路由器上的用法。

思科路由器 DHCPv6-PD 的应用

而我家里的路由器是使用 CentOS 7 系统的软路由。在国家大力推动 IPv6 的背景下,怎能不介绍下 Linux 系统 DHCPv6-PD 的用法呢?

本文将介绍如何在 CentOS 7 软路由上通过 DHCPv6-PD 从运营商处获得 IPv6 网段并分配给内网主机使用。


二、网络拓扑图及说明

已知某运营商可通过 DHCPv6-PD 为客户分配一段 /56 的 IPv6 地址。

现在要求客户路由器在得到这段 /56 的 IPv6 地址之后,能自动为其内网主机分配 /64 的 IPv6 地址。

客户路由器是使用 CentOS 7.5.1804 系统的软路由。

下面将介绍客户路由器与 DHCPv6-PD 有关的配置。配置完成后,客户的内网主机(Windows 7 系统)必须能通过 IPv6 访问 Google 的 DNS 服务器。

说明
• 为了简便,本文中的客户路由器没有使用 PPPoE 接入 Internet,这与现网环境可能有所不同。如果需要在 PPPoE 中使用 DHCPv6-PD 的话,只需将配置文件中对应的外网接口换成 PPPoE 接口即可。


三、配置步骤

3.1 安装所需软件

执行以下命令:

yum -y install epel-release && \
yum -y update && \
yum -y install wide-dhcpv6 radvd

3.2 开启 IPv6 转发

执行以下命令:

echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf && \
sysctl -p

3.3 安装 DHCPv6-PD 服务文件

执行以下命令:

cat << EOF > /lib/systemd/system/[email protected]
[Unit]
Description=Wide DHCPv6 client for %i
[Service]
Type=forking
ExecStart=/sbin/dhcp6c -c /etc/wide-dhcpv6/dhcp6c.conf %i
[Install]
WantedBy=network.target
EOF

3.4 配置 DHCPv6-PD 服务

执行以下命令:

cat << EOF > /etc/wide-dhcpv6/dhcp6c.conf

请按实际情况以及注释提示修改以下内容,完成后去除 # 号和后面的注释,然后粘贴到命令行窗口中按回车即可。

interface <外网接口名> {
    send ia-pd 0;
};

id-assoc pd 0 {
    prefix-interface <内网接口名> {
        sla-id 1;
        sla-len <值>; # <值> 与运营商分配的 IPv6 地址的前缀长度相加必须等于 64。所以客户需要先了解运营商分配的 IPv6 地址的前缀长度是多少。
    };
};
EOF

例如这里是:

interface eth0 {
    send ia-pd 0;
};

id-assoc pd 0 {
    prefix-interface eth1 {
        sla-id 1;
        sla-len 8;
    };
};

接着按实际情况修改以下命令并执行来开启相关服务并让其开机自启动:

systemctl start [email protected]<外网接口名> && \
systemctl enable [email protected]<外网接口名> && \
systemctl status [email protected]<外网接口名>

例如这里是:

systemctl start [email protected] && \
systemctl enable [email protected] && \
systemctl status [email protected]

执行命令之后如果有出现绿色小点,说明服务已成功启动。

3.5 配置路由通告

说明
• 这里将配置路由器可向内网接口发送 IPv6 路由通告报文,这样才能让内网主机发现路由器并将其设置为 IPv6 默认网关。

请使用 vim 之类的文本编辑器打开 /etc/radvd.conf

打开之后清空该文件,然后按实际情况修改以下内容,修改完成之后将其添加到文件中。

interface <内网接口名>
{
    AdvSendAdvert on;
    MinRtrAdvInterval 30;
    MaxRtrAdvInterval 100;
    AdvManagedFlag off;
    AdvOtherConfigFlag on;
    prefix ::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
        AdvRouterAddr on;
    };
};

例如这里是:

interface eth1
{
    AdvSendAdvert on;
    MinRtrAdvInterval 30;
    MaxRtrAdvInterval 100;
    AdvManagedFlag off;
    AdvOtherConfigFlag on;
    prefix ::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
        AdvRouterAddr on;
    };
};

修改完成后保存退出,然后执行以下命令来开启相关服务并让其开机自启动:

systemctl start radvd && \
systemctl enable radvd && \
systemctl status radvd

执行命令之后如果有出现绿色小点,说明服务已成功启动。


四、验证结果

4.1 路由器接口的 IPv6 地址

执行以下命令:

ip -6 addr show

运行结果:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
    inet6 fe80::2fcd:a059:5695:2aaa/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
    inet6 2001:123:456:1:5201:ff:fe02:1/64 scope global  <-- 通过 DHCPv6-PD 自动设置的网段
       valid_lft forever preferred_lft forever
    inet6 fe80::5201:ff:fe02:1/64 scope link 
       valid_lft forever preferred_lft forever

可以看出,路由器可以通过 DHCPv6-PD 自动设置内网网段。验证通过。

4.2 路由器的 IPv6 路由表

执行以下命令:

ip -6 route show default

运行结果:

default via fe80::a8bb:ccff:fe00:1100 dev eth0 proto ra metric 100 pref medium

可以看出,路由器可以通过运营商发送的路由通告报文自动设置通向外网接口的 IPv6 默认路由。验证通过。

4.3 内网主机访问 IPv6 外网

可以看出,内网主机可获取到正确的 IPv6 地址并成功通过 IPv6 访问 Google 的 DNS 服务器。验证通过。

发表评论