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á
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.
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
y213.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
:
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.