环境介绍
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 拨号
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