Please enable Javascript to view the contents

通过 Linux PPPOE 拨号 获取 IPv6 地址

 ·  🕒 4 分钟  ·  ✍️ 加文 · 👀... 阅读

环境介绍

1、系统级软件版本说明

  • 拨号主机:CentOS 7.9( Linux Kernel 5.4.257 )
  • 拨号软件: rp-pppoe-3.11-7.el7.x86_64
  • IPv6 无状态地址分配:radvd-2.17-3.el7.x86_64

2、网络环境拓扑说明

  • 拨号接口 ens9 与其它主机终端处于同一个二层网络内,其它终端将拨号接口的 IPv6 地址视为 IPv6 网络的下一跳
  • 其它内网主机通过拨号主机获取 IPv6 地址的两种方式: 静态手动配置 、动态配置

Install 组件

1、安装必要的基础组件

# pppoe 拨号
yum install rp-pppoe-3.11-7.el7.x86_64 -y

# 无状态地址分配
yum install radvd-2.17-3.el7.x86_64  -y

PPPOE 拨号基本设置参考

PPPOE 拨号

1、启用 pppoe 拨号时的 IPv6 支持

# 启用 IPv6 支持
echo +ipv6 >> /etc/ppp/options

# 开始拨号,等价命令 ifup ppp0
pppoe-start  /etc/sysconfig/network-scripts/ifcfg-ppp0

pppoe-stop      # 停止拨号
pppoe-status    # 查看状态

2、查看拨号后的路由表信息、及接口 ppp0 状态

ifconfig ppp0
#> ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1492
#>         inet 100.78.185.33  netmask 255.255.255.255  destination 100.78.128.1
#>         inet6 fe80::116b:f069:95a0:7ec9  prefixlen 10  scopeid 0x20<link>
#>         inet6 240e:398:ae04:1d73:116b:f069:95a0:7ec9  prefixlen 64  scopeid 0x0<global>
#>         ppp  txqueuelen 3  (Point-to-Point Protocol)
#>         RX packets 6  bytes 162 (162.0 B)
#>         RX errors 0  dropped 0  overruns 0  frame 0
#>         TX packets 7  bytes 113 (113.0 B)
#>         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ifconfig ens9
#> ens9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
#>         inet6 fe80::e8c5:3a3a:33d6:381a  prefixlen 64  scopeid 0x20<link>
#>         ether 52:54:00:1d:20:2e  txqueuelen 1000  (Ethernet)
#>         RX packets 1544  bytes 115528 (112.8 KiB)
#>         RX errors 0  dropped 0  overruns 0  frame 0
#>         TX packets 813  bytes 35428 (34.5 KiB)
#>         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ip -6 route show |grep -v unreachable
# linux 系统 kernel 根据 ipv6 接口地址自动生成的直连路由
#> 240e:398:ae04:1d73::/64 dev ppp0 proto kernel metric 256 expires 2591929sec pref medium
#> fe80::/64 dev eth0 proto kernel metric 100 pref medium
#> fe80::/64 dev ens9 proto kernel metric 101 pref medium
#> fe80::/10 dev ppp0 metric 1 pref medium
#> fe80::/10 dev ppp0 proto kernel metric 256 pref medium
# ipv6 默认路由
#> default via fe80::7057:bf30:d800:0 dev ppp0 proto ra metric 1024 expires 1729sec hoplimit 64 pref medium

通过 ipv6 路由信息,可以确定拨号后,获取的 ipv6 网络前缀为240e:398:ae04:1d73::/64(每次拨号时字符 1d73 部分是动态变化的), ISP 端 IPv6 本地链路地址为fe80::7057:bf30:d800:0。并且,仅接口 ppp0 有获取公网 IPv6 地址,拨号时使用的接口 ens9 是没有获取公网 IPv6 地址的 !!,内网其它非拨号主机可以获取公网 IPv6 吗 ?? 答案当然是可以的,并且有两种方式:1》静态手动配置 、 2》动态自动配置

静态配置 IPv6

1、拨号主机 a1 接口 ens9 及路由配置

[root@a1 ~]# ifconfig ens9 inet6 add 240e:398:ae04:1d73::1/64
[root@a1 ~]# ifconfig ens9 |grep inet6
#> inet6 240e:398:ae04:1d73::1  prefixlen 64  scopeid 0x0<global>
#> inet6 fe80::e8c5:3a3a:33d6:381a  prefixlen 64  scopeid 0x20<link>

# 删除拨号时,通过 ISP 端的 ra 报文生成的默认 ipv6 路由
[root@a1 ~]# ip route del default via fe80::7057:bf30:d800:0 dev ppp0 proto ra metric 1024 expires 1746sec hoplimit 64 pref medium

# 添加源网段为 240e:398:ae04:1d73::/64 的流量发送至 ISP 端链路地址所在接口。若使用 radvd 则会自动配置该路由
[root@a1 ~]# ip route add default from 240e:398:ae04:1d73::/64 via fe80::7057:bf30:d800:0 dev ppp0  metric 100

# 开启 ipv6 网络转发。
[root@a1 ~]# sysctl -w net.ipv6.conf.all.forwarding=1
# 可选,开启防火墙时,需调整默认防火墙规则
[root@a1 ~]# systemctl stop firewalld

注意(坑点),开启 ipv6 转发后 pppoe 重新拨号将无法获取 ipv6 地址 !!欲重新 pppoe 拨号,需先禁用 ipv6 转发后再拨即可(sysctl -w net.ipv6.conf.all.forwarding=0)

2、内网 Linux 测试主机 a2 配置

# 配置 ipv6 地址
[root@a2 ~]# ifconfig ens9 inet6 add 240e:398:ae04:1d73::2/64

# 配置默认路由,下一跳指向拨号主机 ens9 接口的本地链路地址 fe80::e8c5:3a3a:33d6:381a
[root@a2 ~]# ip -6 route add default via fe80::e8c5:3a3a:33d6:381a dev ens9 

# 验证本机对外网络的连通性
[root@a2 ~]# ping6 -I ens9 2400:3200::1
#> PING 2400:3200::1(2400:3200::1) from 240e:398:ae04:e6d:364e:40c:14eb:7ded ens9: 56 data bytes
#> 64 bytes from 2400:3200::1: icmp_seq=1 ttl=119 time=39.1 ms
#> 64 bytes from 2400:3200::1: icmp_seq=2 ttl=119 time=39.8 ms

动态配置 IPv6

内网主机 通过 radvd 动态配置 IPv6 地址

radvd 路由器公告守护进程,用于发送路由器公告消息 RA,该消息用于 IPv6 无状态自动配置,其它终端设备将根据这些公告自动配置其地址、并选择默认路由器。

ipv6 无状态自动配置: 所有支持 IPv6 的路由器都监听各主机终端发送的路由请求包 RS(Router Solicitation), IPv6 路由器对这类请求包的回复数据包 RA (Router Advertisement)包含IPv6 地址的前缀(prefix)等信息,主机在收到这样的包以后,可以根据自己的一些已有信息(比如 MAC 地址,或者随机数),生成自己的 IPv6 地址

1、在 pppoe 拨号主机 a1 安装 radvd ,添加如下自定义配置:

# install radvd
yum install radvd-2.17-3.el7.x86_64 -y

# cat /etc/radvd.conf 查看配置
interface ens9
{
        AdvSendAdvert on;
        AdvDefaultPreference high;
        AdvManagedFlag off;
        AdvOtherConfigFlag on;
        MinRtrAdvInterval 30;
        MaxRtrAdvInterval 100;
        # 1d73 需要更改为对应的 ipv6 前缀
        prefix 240e:398:ae04:1d73::/64 
        {
                AdvOnLink on;
                AdvAutonomous on;
                AdvRouterAddr off;
        };

        RDNSS 2400:3200::1 
        {
                AdvRDNSSLifetime 200;
        };
};

systemctl restart radvd

拨号主机 a1 路由配置

# 删除拨号时,通过 ISP 端的 ra 报文生成的默认 ipv6 路由
[root@a1 ~]# ip route del default via fe80::7057:bf30:d800:0 dev ppp0 proto ra metric 1024 expires 1746sec hoplimit 64 pref medium

# 添加源网段为 240e:398:ae04:1d73::/64 的流量发送至 ISP 端链路地址所在接口。若使用 radvd 则会自动配置该路由
[root@a1 ~]# ip route add default from 240e:398:ae04:1d73::/64 via fe80::7057:bf30:d800:0 dev ppp0  metric 100

# 开启 ipv6 网络转发。注意,开启 ipv6 转发后再次 pppoe 拨号将无法获取 ipv6 地址 !!欲重新 pppoe 拨号,则需禁用 ipv6 转发后再拨即可
[root@a1 ~]# sysctl -w net.ipv6.conf.all.forwarding=1
# 备注:开发 ipv6 转发后,上面生成的默认 ipv6 路由会被自动删除 ?? 原因 ??

2、内网测试主机 a2,此时 a1 作为 IPv6 路由转发流量

# 第一和第四条路由信息是通过路由公告 ra 获取
[root@a2 ~]# ip -6 route show |grep -v unre
#> 240e:398:ae04:267::/64 dev ens9 proto ra metric 101 pref medium
#> fe80::/64 dev eth0 proto kernel metric 100 pref medium
#> fe80::/64 dev ens9 proto kernel metric 101 pref medium
#> default via fe80::e8c5:3a3a:33d6:381a dev ens9 proto ra metric 101 pref high

[root@a2 ~]# ping6 -I ens9 2400:3200::1 
PING 2400:3200::1(2400:3200::1) from 240e:398:ae04:267:2710:4fa3:9f0f:355e ens9: 56 data bytes
64 bytes from 2400:3200::1: icmp_seq=1 ttl=119 time=38.6 ms
64 bytes from 2400:3200::1: icmp_seq=2 ttl=119 time=38.0 ms
...

参考

# 访问 http 服务
# curl 中使用 "[" 和 "]" 将 ipv6 地址括起来,且使用 -g 选项,解析 url 中的 "[" 和 "]" 字符
curl -6 -g http://[240e:398:ae04:17a1::2]:80

加文
作者: 加文
运维工程师
版权声明:自由转载-非商用-非衍生-转载请注明出处!


目录