Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

blog:настройка_wireguard_на_debian_9 [2018/09/23 13:33] (текущий)
admin создано
Строка 1: Строка 1:
 +====== Настройка wireguard на Debian 9 ======
 +Почему wireguard? Мне очень понравилась концепция,​ быстрая и простая настройка,​ представляет собой обычный сетевой интерфейс в системе,​ использует современные алгоритмы шифрования.
 +
 +На самом деле [[https://​www.wireguard.com/​install/​|установка]] и [[https://​www.wireguard.com/​quickstart/​|настройка]] простая и доступно описана в официальной документации,​ но я по неопытности столкнулся с неочевидными моментами и решил себе это все задокументировать.\\
 +
 +В связи с блокировками РКН мне нужно было завернуть бота Telegram в VPN, использовать проксю в данном случае было нельзя,​ решил завернуть всю сеть телеги в туннель. Входные данные следующие:​\\
 +1) Виртуальная машина за NATом с ботом телеги на борту, назовем ее ''​BOT''​\\
 +2) Зарубежная VPSка с белым внешним IP //​x.x.x.x//,​ назовем ее ''​VPS''​
 +
 +====Установка====
 +Сперва нужно полностью обновить систему,​ т.к. я при установке столкнулся с тем, что wireguard скачал модуль для ядра версии выше чем у меня была установлена. Наверняка это можно обойти,​ но ядро все равно нужно было обновить,​ так почему бы не совместить.
 +<​code>​apt-get dist-upgrade</​code>​
 +Теперь подключаем репозиторий //​unstable//​ ветки Debian'​а,​ т.к. //​wireguard//​ в //testing// еще не перебрался,​ и тем более в //stable//.
 +<​code>​echo "deb http://​httpredir.debian.org/​debian/​ unstable main" > /​etc/​apt/​sources.list.d/​unstable.list
 +apt-get update</​code>​
 +Указываем параметры для пакетного менеджера,​ что бы он не тянул все подряд с //​unstable//​ ветки. При таких настройках он будет тянуть с //​unstable//​ только то, чего нет ни в одной другой ветки, случай с //​wireguard//​ как раз такой.
 +<​code>​cat >> /​etc/​apt/​preferences.d/​limit-unstable << EOF
 +Package: *
 +Pin: release a=unstable
 +Pin-Priority:​ 150
 +EOF</​code>​
 +Устанавливаем сам //​wireguard//​.
 +<​code>​apt-get install wireguard -y</​code>​
 +Подгружаем модуль и добавляем его в автозагрузку.
 +<​code>​modprobe wireguard
 +echo "​wireguard"​ >> /​etc/​modules</​code>​
 +Проверяем,​ что модуль загрузился.
 +<​code>​lsmod | grep wireguard</​code>​
 +====Конфигурация====
 +Теперь самое интересное,​ конфигурация. Сконфигурировать можно двумя способами,​ вручную создав и настроив интерфейс,​ а затем накинуть на него конфиг //​wireguard//​ или используя скрипт //​wg-quick//,​ последний вариант все сделает автоматически,​ а это не так интересно,​ поэтому сделаем все вручную. В первую очередь сделаем ключи на обеих машинах.\\
 +Создаем ключи на ''​VPS''​.
 +<​code>​cd /​etc/​wireguard
 +umask 077
 +wg genkey | tee vps.privkey | wg pubkey > vps.pubkey</​code>​
 +И тоже самое на ''​BOT''​.
 +<​code>​cd /​etc/​wireguard
 +umask 077
 +wg genkey | tee bot.privkey | wg pubkey > bot.pubkey</​code>​
 +Перейдем к конфигурации интерфейса,​ начнем с ''​VPS''​.\\
 +Создаем интерфейс,​ вешаем на него адрес который будет адресом внутри VPN. Имя интерфейса может быть любым набором букв английского алфавита,​ цифр и символов ''​_=+.-'',​ к примеру:​ //wg0//, //​wg-vpn.0//,​ //​super_vpn//​. Я буду использовать следующие имена интерфейсов - wgvps0 для ''​VPS''​ и wgbot0 для машины ''​BOT''​.
 +<​code>​ip link add dev wgvps0 type wireguard
 +ip address add dev wgvps0 10.15.15.1/​24</​code>​
 +Вашем на него конфигурацию //​wireguard//​.
 +<​code>​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</​code>​
 +Несколько комментариев по указанным опциям. ''​Peer''​ - это публичный ключ, закодированный base64, клиента который будет подключаться к нашему серверу VPN, в данном случае нам нужно подключить машину ''​BOT'',​ поэтому указываем для этого параметра в качестве аргумента строку из файла //​bot.pubkey//​. ''​allowed-ips''​ - это IP-адреса **с** которых и **на** которые разрешено отправлять пакеты указанному пиру.
 +Разрешаем в фаерволе трафик к нашему VPN-серверу,​ а конкретно порт UDP/32000, а так же повесим маскарад на внешний интерфейс (например //eth0//), т.к. мы будем пересылать пакеты из приватной сети в глобальную. Сделаем это с помощью //​iptables//​ пока они окончательно не депрекейтнулись.
 +<​code>​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</​code>​
 +Поднимаем интерфейс.
 +<​code>​ip link set up wgvps0</​code>​
 +Ну и делаем из ''​VPS''​ собственно маршрутизатор,​ разрешая форвардить пакеты.
 +<​code>​echo "​net.ipv4.ip_forward=1"​ > /​etc/​sysctl.conf
 +sysctl -p</​code>​
 +На этом настройка на стороне ''​VPS''​ закончена,​ переходим к ''​BOT'',​ серьезных отличий тут не будет.
 +<​code>​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</​code>​
 +Обратите внимание на отличия,​ мы не указали ''​listen-port'',​ т.к. мне не важно на каком порту будет висеть клиентская сторона,​ //​wireguard//​ случайным образом выберет порт из доступных. Так же добавился параметр ''​endpoint'',​ по контексту,​ я полагаю,​ уже понятно,​ что тут указывается адрес и порт сервера к которому должен подключиться клиент. Параметр ''​persistent-keepalive''​ указывается в секундах и отвечает за регулярную отправку //​keepalive//​ пакета,​ т.к. мой клиент находится за NAT, а особенность //​wireguard//​ в его немногословности,​ он сам не отправляет никаких пакетов и если не указывать данный параметр,​ то при отсутствии траффика в туннеле сопоставление порта в NAT исчезнет по таймауту и сервер не сможет достучаться до клиента если нужно будет что-то передать.\\
 +Добавим маршрут к сети телеги через нашу ''​VPS''​ку.
 +<​code>​ip route add 149.154.0.0/​16 via 10.15.15.1</​code>​
 +На этом непосредственная настройка закончена. Осталось сохранить конфигурацию интерфейсов.
 +На ''​VPS''​.
 +<​code>​wg showconf wgvps0 > /​etc/​wireguard/​wgvps0.conf</​code>​
 +На ''​BOT''​.
 +<​code>​wg showconf wgbot0 > /​etc/​wireguard/​wgbot0.conf</​code>​
 +
 +====Автоматическое восстановление при перезагрузке====
 +Осталось только сделать эту конфигурацию постоянной,​ что бы она автоматически восстанавливалась при загрузке. Сделаем это с помощью конфигурационного файла //​interfaces//​. Это конфигурация для ''​VPS''​.
 +<​code>​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</​code>​
 +Конфиг для клиента - ''​BOT'',​ будет отличаться только добавлением маршрутов.
 +<​code>​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</​code>​
 +====Полезные ссылки====
 +    * [[https://​www.wireguard.com|Официальный сайт wireguard]]\\
 +    * [[https://​wiki.debian.org/​Wireguard|Официальная WiKi Debian с настройкой wg]], обязательно к ознакомлению,​ там есть вариант настройки через //​systemd//,​ а так же простая настройка для мобильных клиентов с помощью QRCode.
 +    * [[https://​wiki.archlinux.org/​index.php/​WireGuard| ArchWiki > Wireguard]]
 +
 +{{tag>​vpn linux wireguard}}
 +
 +
 +{{tag>}}
 +
 +
 +~~DISCUSSION~~