Настройка wireguard на Debian 9

Почему wireguard? Мне очень понравилась концепция, быстрая и простая настройка, представляет собой обычный сетевой интерфейс в системе, использует современные алгоритмы шифрования.

На самом деле установка и настройка простая и доступно описана в официальной документации, но я по неопытности столкнулся с неочевидными моментами и решил себе это все задокументировать.

В связи с блокировками РКН мне нужно было завернуть бота Telegram в VPN, использовать проксю в данном случае было нельзя, решил завернуть всю сеть телеги в туннель. Входные данные следующие:
1) Виртуальная машина за NATом с ботом телеги на борту, назовем ее BOT
2) Зарубежная VPSка с белым внешним IP x.x.x.x, назовем ее VPS

Установка

Сперва нужно полностью обновить систему, т.к. я при установке столкнулся с тем, что wireguard скачал модуль для ядра версии выше чем у меня была установлена. Наверняка это можно обойти, но ядро все равно нужно было обновить, так почему бы не совместить.

apt-get dist-upgrade

Теперь подключаем репозиторий unstable ветки Debian'а, т.к. wireguard в testing еще не перебрался, и тем более в stable.

echo "deb http://httpredir.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list
apt-get update

Указываем параметры для пакетного менеджера, что бы он не тянул все подряд с unstable ветки. При таких настройках он будет тянуть с unstable только то, чего нет ни в одной другой ветки, случай с wireguard как раз такой.

cat >> /etc/apt/preferences.d/limit-unstable << EOF
Package: *
Pin: release a=unstable
Pin-Priority: 150
EOF

Устанавливаем сам wireguard.

apt-get install wireguard -y

Подгружаем модуль и добавляем его в автозагрузку.

modprobe wireguard
echo "wireguard" >> /etc/modules

Проверяем, что модуль загрузился.

lsmod | grep wireguard

Конфигурация

Теперь самое интересное, конфигурация. Сконфигурировать можно двумя способами, вручную создав и настроив интерфейс, а затем накинуть на него конфиг wireguard или используя скрипт wg-quick, последний вариант все сделает автоматически, а это не так интересно, поэтому сделаем все вручную. В первую очередь сделаем ключи на обеих машинах.
Создаем ключи на VPS.

cd /etc/wireguard
umask 077
wg genkey | tee vps.privkey | wg pubkey > vps.pubkey

И тоже самое на BOT.

cd /etc/wireguard
umask 077
wg genkey | tee bot.privkey | wg pubkey > bot.pubkey

Перейдем к конфигурации интерфейса, начнем с VPS.
Создаем интерфейс, вешаем на него адрес который будет адресом внутри VPN. Имя интерфейса может быть любым набором букв английского алфавита, цифр и символов _=+.-, к примеру: wg0, wg-vpn.0, super_vpn. Я буду использовать следующие имена интерфейсов - wgvps0 для VPS и wgbot0 для машины BOT.

ip link add dev wgvps0 type wireguard
ip address add dev wgvps0 10.15.15.1/24

Вашем на него конфигурацию wireguard.

wg set wgvps0 private-key /etc/wireguard/vps.privkey listen-port 32000 peer "тут указываем ключ из файла bot.pubkey" allowed-ips 10.15.15.0/24,149.154.0.0/16

Несколько комментариев по указанным опциям. Peer - это публичный ключ, закодированный base64, клиента который будет подключаться к нашему серверу VPN, в данном случае нам нужно подключить машину BOT, поэтому указываем для этого параметра в качестве аргумента строку из файла bot.pubkey. allowed-ips - это IP-адреса с которых и на которые разрешено отправлять пакеты указанному пиру. Разрешаем в фаерволе трафик к нашему VPN-серверу, а конкретно порт UDP/32000, а так же повесим маскарад на внешний интерфейс (например eth0), т.к. мы будем пересылать пакеты из приватной сети в глобальную. Сделаем это с помощью iptables пока они окончательно не депрекейтнулись.

iptables -t filter -I INPUT -p udp -m udp --dport 31000 -m comment --comment "wg vpn server" -j ACCEPT
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

Поднимаем интерфейс.

ip link set up wgvps0

Ну и делаем из VPS собственно маршрутизатор, разрешая форвардить пакеты.

echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
sysctl -p

На этом настройка на стороне VPS закончена, переходим к BOT, серьезных отличий тут не будет.

ip link add dev wgbot0 type wireguard
ip address add dev wgbot0 10.15.15.2/24
wg set wgbot0 private-key /etc/wireguard/bot.privkey peer "тут указываем ключ из файла vps.pubkey" allowed-ips 10.15.15.0/24,149.154.0.0/16 endpoint x.x.x.x:32000 persistent-keepalive 10
ip link set up wgbot0

Обратите внимание на отличия, мы не указали listen-port, т.к. мне не важно на каком порту будет висеть клиентская сторона, wireguard случайным образом выберет порт из доступных. Так же добавился параметр endpoint, по контексту, я полагаю, уже понятно, что тут указывается адрес и порт сервера к которому должен подключиться клиент. Параметр persistent-keepalive указывается в секундах и отвечает за регулярную отправку keepalive пакета, т.к. мой клиент находится за NAT, а особенность wireguard в его немногословности, он сам не отправляет никаких пакетов и если не указывать данный параметр, то при отсутствии траффика в туннеле сопоставление порта в NAT исчезнет по таймауту и сервер не сможет достучаться до клиента если нужно будет что-то передать.
Добавим маршрут к сети телеги через нашу VPSку.

ip route add 149.154.0.0/16 via 10.15.15.1

На этом непосредственная настройка закончена. Осталось сохранить конфигурацию интерфейсов. На VPS.

wg showconf wgvps0 > /etc/wireguard/wgvps0.conf

На BOT.

wg showconf wgbot0 > /etc/wireguard/wgbot0.conf

Автоматическое восстановление при перезагрузке

Осталось только сделать эту конфигурацию постоянной, что бы она автоматически восстанавливалась при загрузке. Сделаем это с помощью конфигурационного файла interfaces. Это конфигурация для VPS.

cat >> /etc/network/interfaces << 'EOF'
auto wgvps0
iface wgvps0 inet static
    address 10.15.15.1
    netmask 255.255.255.0
    pre-up ip link add $IFACE type wireguard
    pre-up wg setconf $IFACE /etc/wireguard/$IFACE.conf
    post-down ip link del $IFACE
EOF

Конфиг для клиента - BOT, будет отличаться только добавлением маршрутов.

cat >> /etc/network/interfaces << 'EOF'
auto wgbot0
iface wgbot0 inet static
    address 10.15.15.2
    netmask 255.255.255.0
    pre-up ip link add $IFACE type wireguard
    pre-up wg setconf $IFACE /etc/wireguard/$IFACE.conf
    post-up ip route add 149.154.0.0/16 via 10.15.15.1
    pre-down ip route delete 149.154.0.0/16 via 10.15.15.1
    post-down ip link del $IFACE
EOF

Полезные ссылки

Ваш комментарий. Вики-синтаксис разрешён:
W O L D N