通过前面的介绍(无需公网IPv4!手把手教你配置基于IPv6的WireGuard安全隧道),我们发现WireGuard服务端可以支持同时监听IPv4地址和IPv6地址,那我们就已经实现了在IPv6网络环境下封装IPv4流量的IPv4-in-IPv6隧道,还有在IPv4网络环境下封装IPv4流量的IPv4-in-IPv4隧道(OpenWrt如何配置WireGuard互联?)。
虽然在内网使用IPv6地址的场景不多见,但IPv6技术演进也是一个趋势,我们今天再来简单介绍一下在IPv6网络或IPv4网络环境下封装IPv6流量的隧道技术。
开始之前,我们先看一下如何配置网卡的IPv6地址。还是使用Netplan进行配置(用Ubuntu的时候,你是不是被127.0.0.53困扰好久了?来看看怎么修改DNS配置),在配置文件中,增加IPv6地址的相关配置。
network: version:2 renderer:NetworkManager ethernets: ens8: dhcp4:false addresses:[10.22.2.2/24] dhcp6:no addresses:[2002::1/64]
我们已经配置了PPPoE同时分配IPv4和IPv6地址(【送书福利】配置PPPoE拨号同时分配IPv4和IPv6地址),还是配置PPPoE主机为WireGuard服务端,主机通过PPPoE获取到的IPv4地址为10.12.1.2,获取到的IPv6地址为2025::4ddd:9f0a:f9e6:9a2e/64和2025::d174:2532:5547:d62b/64。可以看到,每次拨号获取到的IPv6地址都不一样,所以配置DDNS还是很有必要的(使用ddns-go实现自动配置IPv6的DDNS),而且WireGuard也支持配置域名。
如果要配置在IPv4网络环境下封装IPv6流量的IPv6-in-IPv4隧道,那我们需要修改WireGuard配置的虚拟接口地址为IPv6地址,并添加去往对端的IPv6路由,如下所示:
[Interface] PrivateKey = SBZA1vivDXtBAImYLd37Z4IZpaQpSq5x5ftOkqpBrVs= Address = 2012::1/64ListenPort = 10086[Peer] PublicKey = HO/YZylSoQeLWyHYuRp+hFkGsT5fkXRUJXCnk7U9bSI= AllowedIPs = 2012::/64, 2002::/64PersistentKeepalive = 10
对应的,在使用DHCPv6的客户端一侧,我们也需要修改WireGuard配置的虚拟接口地址为IPv6地址,并添加去往对端的IPv6路由,如下所示:
[Interface] PrivateKey = KCgZzqxShodHmqt5gb7q9XOSHBAOatc7Hn2DFcBvVlU= Address = 2012::2/64[Peer] PublicKey = o/00TTR2e0ZMWoFRBEeY6pZPj+WsWjLM2OpKXouQVzY= AllowedIPs = 2012::/64, 2001::/64Endpoint = 10.12.1.2:10086PersistentKeepalive = 10
从WireGuard的状态来看,已经连接成功了,我们测试一下到服务端内网的联通性。
通过对比endpoint和allowed ips部分,我们可以很清楚的看出来封装的类型,endpoint是外层报文,即公网层面;allowed ips是内层报文,即内网层面。
接下来,要配置IPv6网络环境下封装IPv6流量的IPv6-in-IPv6隧道就更简单了,只要将客户端一侧的对端IP地址替换成IPv6地址就可以了,如下所示:
[Interface] PrivateKey = KCgZzqxShodHmqt5gb7q9XOSHBAOatc7Hn2DFcBvVlU= Address = 2012::2/64[Peer] PublicKey = o/00TTR2e0ZMWoFRBEeY6pZPj+WsWjLM2OpKXouQVzY= AllowedIPs = 2012::/64, 2001::/64Endpoint = [2025::d174:2532:5547:d62b]:10086PersistentKeepalive = 10
可以看到,WireGuard已经连接成功了,我们在服务端测试一下到客户端内网的联通性。
OK,到这里我们就配完了内网流量是IPv6地址类型的WireGuard隧道。
其实,我感觉这4种类型的隧道配置可以简化一下,服务端同时监听两种服务,虚拟网卡可以同时配置IPv4地址和IPv6地址,并同时添加IPv4路由和IPv6路由;具体外层是使用IPv4地址,还是IPv6地址,交给客户端一侧去选择就好了。
按照这种思路,服务端的配置如下:
[Interface] PrivateKey = SBZA1vivDXtBAImYLd37Z4IZpaQpSq5x5ftOkqpBrVs= Address = 10.88.1.1/24,2012::1/64ListenPort = 10086[Peer] PublicKey = HO/YZylSoQeLWyHYuRp+hFkGsT5fkXRUJXCnk7U9bSI= AllowedIPs = 10.88.1.2/32, 10.22.2.0/24, 2012::/64, 2002::/64PersistentKeepalive = 10
在客户端一侧,如果我们想使用IPv4地址和服务端建立连接,那就使用下面这个配置:
[Interface] PrivateKey = KCgZzqxShodHmqt5gb7q9XOSHBAOatc7Hn2DFcBvVlU= Address = 10.88.1.2/24,2012::2/64[Peer] PublicKey = o/00TTR2e0ZMWoFRBEeY6pZPj+WsWjLM2OpKXouQVzY= AllowedIPs = 10.88.1.1/32, 10.11.1.0/24, 2012::/64, 2001::/64Endpoint = 10.12.1.2:10086PersistentKeepalive = 10
测试一下IPv4和IPv6的联通性。
可以看到,数据都是都是通过wg6接口转发的,与期望路径一致。
而如果我们想在客户端一侧使用IPv6地址和服务端建立连接,只需要调整对端IP地址为IPv6地址就可以了,配置如下:
[Interface] PrivateKey = KCgZzqxShodHmqt5gb7q9XOSHBAOatc7Hn2DFcBvVlU= Address = 10.88.1.2/24,2012::2/64[Peer] PublicKey = o/00TTR2e0ZMWoFRBEeY6pZPj+WsWjLM2OpKXouQVzY= AllowedIPs = 10.88.1.1/32, 10.11.1.0/24, 2012::/64, 2001::/64Endpoint = [2025::d174:2532:5547:d62b]:10086PersistentKeepalive = 10
从服务端测试一下客户端侧IPv4和IPv6的联通性。
其实在客户端一侧,你还可以配置DNS解析,同时配置域名的A记录和AAAA记录,按照我们之前的介绍(IPv6的默认地址选择机制),这是客户端会优先使用IPv6地址发起协商,失败后回退到IPv4地址。
***推荐阅读***
无需公网IPv4!手把手教你配置基于IPv6的WireGuard安全隧道
【送书福利】配置PPPoE拨号同时分配IPv4和IPv6地址
手把手教你玩转IPv6 PPPoE:Ubuntu拨号+VSR服务器配置全解析
告别NAT!腾讯云服务器IPv6实测:多1跳却快2ms,配置+防火墙规则一篇搞定
运营商不会告诉你的秘密:企业级路由器能通过多拨叠加带宽,轻松跑满千兆!
一行命令,轻松实现DHCPv6服务器为客户端分配固定IPv6地址
目前来看,ollama量化过的DeepSeek模型应该就是最具性价比的选择
哪怕用笔记本的4070显卡运行DeepSeek,都要比128核的CPU快得多!
帮你省20块!仅需2条命令即可通过Ollama本地部署DeepSeek-R1模型