Изначально я хотел выдавать каждому клиенту нормальный внешний IPv6 из подсетки, но оказалось что провайдер (BlueVPS) у которого я уже оплатил вдску на год вперед, дает сраные 4 айпишника (не /64 подсетки а тупо сраные /128 айпишники).
Конченная экономия на спичках когда IPv6 у всех как грязи, но уже ничего не поделать, все будут за натом.
Открываем /etc/network/interfaces
и делаем там следующее:
auto eth0
iface eth0 inet static
address 203.0.113.22
netmask 255.255.255.0
gateway 203.0.113.1
post-up iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iface eth0 inet6 static
address 2001:db8::baba:1234
address 2001:db8::deda:2345
address 2001:db8::1337:3456
address 2001:db8::1488:4567
netmask 64
post-up ip -6 route add default via 2001:db8::1 src 2001:db8::baba:1234
post-up ip6tables -t nat -A POSTROUTING -s fd63:bf25:9cc3::/64 -o eth0 -j SNAT --to-source 2001:db8::deda:2345
В этом случае я хотел использовать :1234
айпишник для самой вдски а VPN-клиентам выдать :2345
Если же у вас всего один внешний IPv6 можете убрать строчку с route add
и вместо SNAT
использовать MASQUERADE
doas apk add wireguard-tools ufw
Далее нам нужно включить поддержку IPv4/IPv6 форвардинга в ядре, открываем /etc/sysctl.conf и дописываем следующее:
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
Для того чтоб применить их можно использовать:
doas rc-update add sysctl
doas rc-service sysctl restart
Да я знаю что может лучше было бы использовать более каноничный для алпайна awall
, но я в рот ебал все его JSON файлики и привык уже к UFW за многие годы.
doas ufw limit <SSH_PORT>/tcp # allow ssh with rate limit
doas ufw allow <RANDOM_WG_PORT>/udp # allow wg connections
doas ufw route allow in on wg0 out on eth0 # allow forwarding
doas ufw enable
doas rc-update add ufw
Для начала создадим ключи и дадим им нужные права:
wg genkey | doas tee /etc/wireguard/private.key
doas cat /etc/wireguard/private.key | wg pubkey | doas tee /etc/wireguard/public.key
doas chmod 600 /etc/wireguard/private.key
Создадим конфиг /etc/wireguard/wg0.conf
:
[Interface]
Address = 10.0.8.1/24
Address = fd63:bf25:9cc3::1/64
Table = off
# choose random port in range ~10000-60000 to prevent detection
ListenPort = XXXXX
PrivateKey = <PREVIOUSLY_GENERATED_PRIVATE_KEY>
[Peer]
# first client
PublicKey = <CLIENT_PUBLIC_KEY>
AllowedIPs = 10.0.8.2/32, fd63:bf25:9cc3::2/128
И ему тоже выдадим необходимые права:
doas chmod 600 /etc/wireguard/wg0.conf
Table = off
тут нужен потому что в алпайне толи слишком старый толь слишком новый iptables и он вываливает синтаксическую ошибку при попытке поднять его через wg-quick
А ну и да чтоб сгенерировать уникальную локальную IPv6 подсетку можете использовать: https://unique-local-ipv6.com/
Ну и проверим сразу через: doas wg-quick up wg0
Ну и чтоб поднимать наш интерфейс после ребута нам нужно создать в /etc/init.d/wg-quick
файл со следующим содержимым:
#!/sbin/openrc-run
# Copyright 2020 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
name="WireGuard"
description="WireGuard via wg-quick(8)"
depend() {
need net
use dns
}
CONF="${SVCNAME#*.}"
checkconfig() {
if [ "$CONF" = "$SVCNAME" ]; then
eerror "You cannot call this init script directly. You must create a symbolic link to it with the configuration name:"
eerror " ln -s /etc/init.d/wg-quick /etc/init.d/wg-quick.vpn0"
eerror "And then call it instead:"
eerror " /etc/init.d/wg-quick.vpn0 start"
return 1
fi
return 0
}
start() {
checkconfig || return 1
ebegin "Starting $description for $CONF"
wg-quick up "$CONF"
eend $? "Failed to start $description for $CONF"
}
stop() {
checkconfig || return 1
ebegin "Stopping $description for $CONF"
wg-quick down "$CONF"
eend $? "Failed to stop $description for $CONF"
}
Далее нам нужно дать ему права на исполнение и сделать симлинк для нашего интерфейса:
doas chmod +x /etc/init.d/wg-quick
doas ln -s /etc/init.d/wg-quick /etc/init.d/wg-quick.wg0
Далее запустим демон и сделаем чтоб он запускался вместе с системой:
doas rc-service wg-quick.wg0 start
doas rc-update add wg-quick.wg0
И да я спиздил этот скрипт из ебилда в генте: https://gitweb.gentoo.org/repo/gentoo.git/tree/net-vpn/wireguard-tools/files/wg-quick.init