newcoderlife

WireGuard 配置 IPv6 隧道
之前配置网络的时候看了这篇 GRE、Wireguard、网桥与 IPv6 收到了触动,又因为之后要去美团,不知道有...
扫描右侧二维码阅读全文
07
2019/06

WireGuard 配置 IPv6 隧道

之前配置网络的时候看了这篇 GRE、Wireguard、网桥与 IPv6 收到了触动,又因为之后要去美团,不知道有没有好用的 IPv6 网络,所以决定搭建 IPv6 隧道。经过一番 Google,我发现网上其它文章都是通过 NAT 方式分配的 IPv6 地址,正好之前我有折腾过 IPv6 网关,这里就来自己实现以下公网 IPv6 的分配。

WireGuard 的基础配置

首先是配置一个最基本的 WireGuard。WireGuard 配置文件分为两部分,一部分是本机配置,另一部分是 peer 配置。贴一份服务器配置:

[Interface]
PrivateKey = <server-secret>
Address = 192.168.10.1/24
PostUp   = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 10101
DNS = 1.1.1.1
MTU = 1420

[Peer]
PublicKey = <client-public>
AllowedIPs = 192.168.10.2/24

可以看到,这份配置文件里有局域网 IP,认证,路由和 DNS 等配置,灵活度还是很高的。而且格式简单,很快就能上手。这里我们仅仅配置了 IPv4,IPv6 的部分等会再说。

然后是 Client 的配置文件:

[Interface]
PrivateKey = <client-secret>
Address = 192.168.10.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = <server-public>
Endpoint =  <server-address>:10101
AllowedIPs = 0.0.0.0/0, ::0/0
PersistentKeepalive = 25

可以看到,客户端的配置就非常简单了。

IPv6 地址分配

其实截止上一步,我们完成了 IPv4 NAT 隧道的搭建,现在本机可以使用服务器 IPv4 地址进行网络访问。但美中不足的是,WireGuard 生成的 wg0 网卡不支持 bridge。所以我们要再多加一层 gre 隧道来实现公网 IPv6 地址分配。

在服务器上,我们运行:

SERVER_IP=<server_ipv4_addr>
SERVER_IP6=<server_ipv6_addr>
SERVER_LOCAL_IP=172.0.0.1
INTERFACE=eth0

iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
ip6tables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

ip link add taps_bridge type bridge
ip link set taps_bridge up
ip address add $SERVER_IP6/64 dev taps_bridge
ip address add $SERVER_LOCAL_IP/16 dev taps_bridge

ip link add name gretap_office type gretap \
    remote 192.168.10.2 local 192.168.10.1 ttl 225
ip link set gretap_office up
ip link set gretap_office master taps_bridge

在客户端上,我们运行:

ip link add name gretap_private address 12:ab:34:cd:56:ef type gretap \
    remote 192.168.10.1 local 192.168.10.2 ttl 225
ip link set gretap_private up
ethtool --offload gretap_private tx off

上面两端脚本的具体含义是,在服务器上建立一个名为 taps_bridge 的网桥,用于桥接所有的接入客户端。同时建立 gretap,经由 WireGuard 建立一个 ip 隧道,并在此隧道上分配 IPv6 地址。客户端建立 gretap 然后通过 WireGuard 于服务器相连。

为了分配 IPv6 地址,我们还需要完成两件事:

通过 RADVD 分配地址:

interface taps_bridge {             
    AdvSendAdvert on;               
                                    
    prefix <server_ipv6_subnet>/64 {  
        AdvOnLink on;               
        AdvAutonomous on;           
        AdvRouterAddr on;           
    };                              
};

通过 NDPPD 启用邻居发现协议:

proxy eth0 {
    autowire yes

    rule <server_ipv6_subnet>/64 {
        auto
    }
}

这样,客户端得到的 IPv6 地址就会是公网地址,可以被其他设备正常访问而不需要 NAT66.

附两张效果图:

服务器

客户端

ping 测试

存在的问题

由于我们的公网地址是通过 gretap 分配的,所以在 Windows 上大家很难完成这一操作。可以通过在虚拟机 Linux 内建立隧道,然后通过路由 NAT 给本机比较合适。诸位如果有更好的办法也欢迎在下方留言。

Last modification:June 7th, 2019 at 09:22 pm
点击广告投喂博主 以获得更快的访问速度!

4 comments

  1. 后宫学长

    目前电信不知道给的是公网IPV6还是NAT的,IPV4就是给的NAT的。

    1. newcoderlife
      @后宫学长

      IPv6应该都是公网的,NAT66没有用途。具体可以去test-ipv6测试一下。

  2. Android

    可以试试看用Windows 10的子系统,Ubuntu?

    1. newcoderlife
      @Android

      WSL对于网络栈的支持并没有想象中的那么好,可以说只有基本的 Socket,复杂的隧道之类基本没有支持。WSL 2 应该会好很多。

Leave a Comment