Skip to content

Instantly share code, notes, and snippets.

@iwalfy
Last active May 11, 2024 01:33
Show Gist options
  • Save iwalfy/dbc32e116732e7e8394e76d8d744985c to your computer and use it in GitHub Desktop.
Save iwalfy/dbc32e116732e7e8394e76d8d744985c to your computer and use it in GitHub Desktop.
WireGuard on Alpine Linux with IPv6 NAT (Russian)

WireGuard сервер на Alpine Linux с IPv6 NAT

Изначально я хотел выдавать каждому клиенту нормальный внешний 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

Настройка UFW

Да я знаю что может лучше было бы использовать более каноничный для алпайна 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

Настройка WireGuard

Для начала создадим ключи и дадим им нужные права:

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

OpenRC демон

Ну и чтоб поднимать наш интерфейс после ребута нам нужно создать в /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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment