Enrutamiento IPv6 a través de WireGuard con soporte SLAAC

Inspirado por los argumentos del artículo " IPv6 es un mundo maravilloso que merece una rápida transición a él ", comencé a extrañar mucho IPv6. Objetivo final: proporcionar a cada uno de sus dispositivos un IPv6 pseudoestático público único.





Para un hogar, la solución es bastante simple: si tiene IPv4 estático, puede obtener una subred IPv6 de un corredor de túneles y esta pregunta puede considerarse cerrada.





Pero esto no funcionará con dispositivos móviles: el servicio IPv4 estático es bastante raro aquí; y si hay WiFi gratuito, elegiré conectarme a él y no a la red móvil.





La única opción que queda es usar una VPN. Soluciones como " wireguard-install " o " openvpn-install " que existen en GitHub tienen un defecto fatal: le dan al cliente una única dirección IPv6 / 128 y para que los clientes puedan autoconfigurarse, necesitan una subred completa / 64.





Se propone una solución basada en WireGuard.






Necesitará

  1. Un servidor virtual especial. Para implementar el plan, debe comprar un VDS, que el proveedor de servicios de alojamiento acepta proporcionar al menos una subred / 60. Al final resultó que, encontrar algo así es una tarea bastante difícil : en el peor de los casos, por alguna razón, los hosters venden IPv6 por piezas; en el mejor de los casos, solo subredes / 64. Como resultado de una búsqueda larga y una coincidencia favorable, se encontró Melbicom , que es capaz de asignar una subred / 56 a VDS.





  2. Linux + wireguard + udppd + nftables. ArchLinux está instalado en mi servidor, pero la solución descrita también se puede reproducir en otras distribuciones.





Simbolos

ens3



- el nombre de la interfaz de red.





Más adelante en el texto se utilizan las siguientes direcciones "IP":





  • 2a06:X:X:a::2/128



    y 213.x.x.2/24



    - direcciones IPv6 e IPv4 VDS. Son asignados por el hoster de forma automática y gratuita por cada VDS comprado.





  • 2a06:X:X:100::/56



    – VDS /56 IPv6. .





  • 2a06:X:X:111::/64



    – ( ), /56 .





  • 2a06:X:X:111:a:b:c:d/64



    – IPv6 ( ), a:b:c:d



    (interface id) .





X



IPv6 , x



- IPv4 .





/56

, , . /etc/systemd/network/ens3.network :





[Match]
Name = ens3

[Network]
Address = 213.x.x.2/24
Gateway = 213.x.x.1

Address = 2a06:X:X:a::2/128
Gateway = 2a06:X:X:a::1
      
      



, : tcpdump ip6 -nq -i ens3







, IPv6 , 2a06:X:X:111:a:b:c:d



. , :





19:14:39.689842 IP6 fe80::XX > ff02::XX ICMP6, neighbor solicitation, who has 2a06:X:X:111:a:b:c:d, length 32







ndppd

Ndppd — , : «neighbor solicitation» «router advertisement» , , . wireguard .





, ArchLinux ndppd AUR. , .





:

pacman -Suy git base-devel







, :

useradd -m router







:

su router







cd /home/router







- :

git clone https://aur.archlinux.org/ndppd.git







cd ndppd







makepkg







root:

exit







ndppd:

cd /home/router/ndppd







ndppd-*.zst :

pacman -U ndppd-0.2.5-1-x86_64.pkg.tar.zst







ndppd

/etc/ndppd.conf :





proxy ens3 {
	rule 2a06:X:X:100::/56 {
		static
	}
}
      
      



:





  • ens3







  • static



    - , ndppd, Neighbor Solicitation, .





.





:

systemctl enable ndppd







:

systemctl start ndppd







IPv6 , /etc/sysctl.d/ wireguard.conf :





net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
      
      



IPv4, — IPv6. .





:

sysctl --system







WireGuard

:

wg genkey | tee server-private.key | wg pubkey > server-public.key







:

wg genkey | tee client1-private.key | wg pubkey > client1-public.key







pre-shared key:

wg genpsk > pre-shared.key







/etc/wireguard/wg0.conf:





[Interface]
SaveConfig = false
ListenPort = 52525 #  
PrivateKey = # server-private.key#
Address = 10.20.30.1/24, 2a06:X:X:100::/56

[Peer]
PublicKey = # client1-public.key#
PresharedKey = # pre-shared.key#
AllowedIPs = 10.20.30.17/32, 2a06:X:X:111::/64
      
      



wireguard:

systemctl enable wg-quick@wg0 && systemctl start wg-quick@wg0







, :

wg-quick down wg0 && wg-quick up wg0







nftables

iptables , nftables.





:

pacman -S nftables







/etc/nftables.conf :





#!/usr/sbin/nft -f

# Start by flushing all the rules.
flush ruleset

#  https://man.archlinux.org/man/nft.8

#  :     IPv4 
define wan = ens3
define vpn = wg0
define vpn_net4 = 10.20.30.0/24

#    IPv6  IPv4
table inet wg-common {
	#      ,   ,    vpn  wan
	chain forward {
		type filter hook forward priority 0; policy drop;
		iifname $wan oifname $vpn accept;
		oifname $wan iifname $vpn accept;
	}

	chain input {
		type filter hook input priority 0;

		# allow established/related connections
		ct state {established, related} accept

		# early drop of invalid connections
		ct state invalid drop

		# allow from loopback
		iifname lo accept

		# allow icmp
		ip protocol icmp accept
		meta l4proto ipv6-icmp accept

		# allow ssh
		tcp dport ssh accept
		
		#     WireGuard
		udp dport 52525 accept;

		# everything else
		reject with icmpx type port-unreachable
	}
}

#  NAT  IPv4
table ip wg-nat {
	#    IPv4 c  vpn   wan  
	chain pre {
		type nat hook postrouting priority 0;
		oifname $wan ip saddr $vpn_net4 masquerade persistent;
	}
}
      
      



WireGuard

:





[Interface]
PrivateKey = # client1-private.key#
Address = 10.20.30.17/32, 2a06:X:X:111:a:b:c:d/64
DNS = 9.9.9.9, 149.112.112.112, 2620:fe::fe, 2620:fe::9

[Peer]
PublicKey = # server-public.key#
PresharedKey = # pre-shared.key#
AllowedIPs = 2000::/3
Endpoint = # IP ,  #:52525
PersistentKeepalive = 25
      
      



. , WireGuard, , IPv6. , IPv6 a:b:c:d



interface id. SLAAC. wireguard IPv4 , AllowedIPs



0.0.0.0/0



.





:

Si, debido a la política del gobierno, parte de Internet está bloqueada, utilizando el cliente WireGuard en un enrutador OpenWRT, puede omitir el bloqueo.





Para hacer esto, transferimos la configuración del cliente a un enrutador con OpenWRT, especificando las AllowedIPs



subredes bloqueadas en el parámetro . Por ejemplo, para desbloquear Yandex de Ucrania, debe especificar:





AllowedIPs=5.45.192.0/18,5.45.196.0/24,5.45.202.0/24,5.45.205.0/24,5.45.213.0/24,5.45.229.0/24,5.45.240.0/24,5.255.192.0/18,5.255.195.0/24,5.255.196.0/24,5.255.197.0/24,5.255.255.0/24,37.9.64.0/18,37.9.64.0/24,37.9.73.0/24,37.9.112.0/24,37.140.128.0/18,77.88.0.0/18,77.88.8.0/24,77.88.35.0/24,77.88.44.0/24,77.88.54.0/24,77.88.55.0/24,87.250.224.0/19,87.250.247.0/24,93.158.128.0/18,95.108.128.0/17,100.43.64.0/19,141.8.128.0/18,141.8.174.0/24,178.154.128.0/19,178.154.131.0/24,178.154.160.0/19,185.32.187.0/24,199.21.96.0/22,199.36.240.0/22,213.180.192.0/19,213.180.199.0/24,2a02:6b8::/29,2620:10f:d000::/44
      
      



La lista de subredes de Yandex se toma de aquí https://ipinfo.io/AS13238





IPv4 funcionará de inmediato. Y para que IPv6 funcione, debe cambiar el prefijo del cliente usando nat6. En la sección Firewall :: Custom Rules, agregue las siguientes reglas personalizadas:





ip6tables -t nat -A POSTROUTING -d 2a02:6b8::/29 -j NETMAP --to 2a06:X:X:111::/64
ip6tables -t nat -A POSTROUTING -d 2620:10f:d000::/44 -j NETMAP --to 2a06:X:X:111::/64
      
      



Después de eso, puede ir a https://yandex.ru/internet/ y asegurarse de que todo funcione.








All Articles