在 CentOS 7 软路由上配置 IPv6 透传


一、前言

去年,我写了一篇文章介绍了如何在 CentOS 7 软路由上通过 DHCPv6-PD 来为内网主机接入 IPv6 公网。

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

而在现网中还有一种更加流行的 IPv6 接入方式,那就是客户设备直接通过二层网络与运营商路由器交互 IPv6 报文。

在这种接入方式中,客户设备能使用的都是理论上不可被子网化的 /64 IPv6 地址。

路由模式的光猫(无需额外拨号),手机的蜂窝移动数据网都属于这种接入方式。

而目前我们通常还需要使用路由器配合 NAT 来接入 IPv4 公网。但使用 NAT 会让客户设备无法直接通过二层网络与运营商路由器通信,这样的话客户设备自然也就无法直接接入 IPv6 公网。

那么如何解决这个问题呢?有以下三种解决方案:

说明
• 以下的“路由器”均指使用 Linux 系统的软路由。

1、在路由器上部署 IPv6 NAT。这个解决方案虽然可行,但我认为这样的话还不如不使用 IPv6……IPv4 之所以要使用 NAT,本质上还是因为 IPv4 的地址空间太小,而 IPv6……总之,如果不是对安全性有特别高的要求,不建议部署 IPv6 NAT。

2、在路由器上部署 NDP 代理。这种方案的原理和 ARP 代理差不多,但内网的所有设备都需要手工指定 IPv6 地址。这样的话,如果运营商更换了 IPv6 前缀,那么内网的所有设备都必须重新手工指定 IPv6 地址。总之这也不是一个好的解决方案。

3、在路由器的外网接口和内网接口之间建立一个只允许 IPv6 流量通过的虚拟网桥。这样的话,客户设备就可以直接透过二层网络接入 IPv6 公网,同时又不影响 IPv4 NAT。但这个方案暂时无法让路由器和客户设备同时接入 IPv6 公网。由于我们很少在路由器上搭建各种面向公网的服务,所以可不让路由器接入 IPv6 公网。

所以,第三种解决方案算是目前比较理想且容易实现的解决方案。

本文将介绍如何在 CentOS 7 软路由上通过配置虚拟网桥来实现外网接口与内网接口的 IPv6 透传。


二、软路由的环境

  • 操作系统:CentOS 7.5.1804
  • 外网接口:eth0
  • 内网接口:eth1

三、配置步骤

3.1 安装所需软件

执行以下命令:

yum -y install bridge-utils ebtables

3.2 配置 ebtables

执行以下命令:

ebtables -t broute -A BROUTING -p ! IPv6 -j DROP

说明
• ebtables 可以说是 Linux 系统的二层防火墙(对比 iptables)。
• 执行完上面的命令之后,系统中的所有虚拟网桥将不会转发除 IPv6 之外的其他所有流量。

3.3 保存 ebtables 配置

执行以下命令:

/usr/libexec/ebtables save

3.4 让 ebtables 开机自启动

执行以下命令:

systemctl enable ebtables

3.5 配置虚拟网桥

说明
• 下面将通过一个脚本来实现虚拟网桥的自动配置。
• 虚拟网桥的名称为 ipv6-br

执行以下命令:

cat << EOF > /etc/set-ipv6-br.sh

请按实际情况修改以下内容,然后粘贴到命令行窗口中按回车即可。

#!/bin/bash
/sbin/sysctl net.ipv6.conf.<外网接口>.disable_ipv6=1
/sbin/brctl addbr ipv6-br
/sbin/sysctl net.ipv6.conf.ipv6-br.disable_ipv6=1
/sbin/ip link set ipv6-br up
/sbin/brctl addif ipv6-br <外网接口> <内网接口>
EOF

例如这里是:

#!/bin/bash
/sbin/sysctl net.ipv6.conf.eth0.disable_ipv6=1
/sbin/brctl addbr ipv6-br
/sbin/sysctl net.ipv6.conf.ipv6-br.disable_ipv6=1
/sbin/ip link set ipv6-br up
/sbin/brctl addif ipv6-br eth0 eth1
EOF

完成之后再执行:

chmod +x /etc/set-ipv6-br.sh && \
/etc/set-ipv6-br.sh

执行之后等待 1-2 分钟,不出意外的话内网中所有支持且开启了 IPv6 功能的主机就都可以访问 IPv6 公网了。

3.6 设置开机自动配置虚拟网桥

说明
• 下面将通过新建服务文件来实现开机自动配置虚拟网桥。

执行以下命令:

cat << EOF > /lib/systemd/system/set-ipv6-br.service 

以下内容直接粘贴到命令行窗口中按回车即可。

[Unit]
Description=Create a Bridge for IPv6 Passthrough
After=network.target ebtables.service

[Service]
Type=oneshot
ExecStart=/etc/set-ipv6-br.sh

[Install]
WantedBy=network.target
EOF

完成之后再执行:

systemctl daemon-reload && \
systemctl enable set-ipv6-br

发表评论

电子邮件地址不会被公开。