WireGuard — инструмент для построения виртуальных сетей. Многие называют его этаким «VPN нового поколения».
В рамках этой заметки, мы запустим в работу простой WireGuard VPN сервер и настроим подключение из Linux клиента к нему. Работать мы будем в Fedora (это мой основной дистрибутив), но инструкция вполне подойдёт и для других дистрибутивов, разве что пакетные менеджеры будут отличаться.
Подготовка и установка.
Актуально и для сервера, и для клиента:
1. Для начала, ставим доступные обновления и запускаем систему с новым ядром. Далее, и на сервере, и на клиенте мы подключаем репозиторий с WireGuard и ставим оттуда нужное:
# dnf update -y # reboot
# dnf copr enable jdoss/wireguard # dnf install wireguard-dkms wireguard-tools
В процессе установки, система собирает модуль ядра. Как только всё будет готово, проверяем, что модуль загружен:
# modprobe wireguard && lsmod | grep wireguard wireguard 225280 0 ip6_udp_tunnel 16384 1 wireguard udp_tunnel 16384 1 wireguard
2. Для работы нам потребуется iptables. В некоторых установках Fedora его может не быть, так что ставим:
# dnf install iptables
3. Создаём открытый и закрытый ключи для сервера и для клиента. Я это предпочитаю делать сразу же на сервере:
# mkdir ~/wireguard # cd ~/wireguard # umask 077 # wg genkey | tee server_private_key | wg pubkey > server_public_key # wg genkey | tee client_private_key | wg pubkey > client_public_key
В результате, у нас будет создано четыре файла:
# cat server_private_key YCx3VIFu1/X+plFw6fssvWGKB6jWC4YH2YNOf2lf9Xk=
# cat server_public_key AaXZwcRC8dLX9qn69KX1ovyW4IA+GALS2R/j0bbuBCI=
# cat client_private_key +DSyGsiN6x047Xizw8b8abt3f/F3DaQqz7MVpPBPpWc=
# cat client_public_key vKiJ0ldgxI2z7a5J3/llB3qTs7QI7hofXvRpMYvCdEQ=
Настройка wireguard сервера.
1. Включаем форвардинг в sysctl.conf:
# cat /etc/sysctl.conf net.ipv4.ip_forward = 1 # sysctl -p
2. Создаём директорию /etc/wireguard, а в ней конфигурационный файл /etc/wireguard/wg0.conf со следующим содержимым:
# cat /etc/wireguard/wg0.conf [Interface] Address = 10.8.0.1/24 PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE ListenPort = 51820 PrivateKey = SERVER_PRIVATE_KEY [Peer] PublicKey = CLIENT_PUBLIC_KEY AllowedIPs = 10.8.0.2/32
Разумеется, вместо SERVER_PRIVATE_KEY и CLIENT_PUBLIC_KEY мы прописываем ключи, из созданных ранее файлов. Далее, комментарии по конфигу:
- Address — адрес виртуального интерфейса wg0 на сервере.
- PostUp и PostDown — команды, которые будут выполнены при включении и отключении интерфейса.
- ListenPort — порт, на котором будет работать VPN.
- AllowedIPs — виртуальные IP клиентов, которые будут подключаться к нашему серверу.
3. Сохраняем изменения, делаем файл доступным только для root, включаем и запускаем сервис:
# chmod 600 /etc/wireguard/wg0.conf # systemctl enable wg-quick@wg0.service # systemctl restart wg-quick@wg0.service
Если всё сделано верно, на сервере у нас поднимается интерфейс wg0, с IP адресом 10.8.0.1.
Настройка wireguard клиента.
1. Создаём директорию /etc/wireguard, а в ней конфигурационный файл /etc/wireguard/wg0-client.conf со следующим содержимым:
# cat /etc/wireguard/wg0-client.conf [Interface] Address = 10.8.0.2/32 PrivateKey = CLIENT_PRIVATE_KEY DNS = 8.8.8.8 [Peer] PublicKey = SERVER_PUBLIC_KEY Endpoint = SERVER_REAL_IP:51820 AllowedIPs = 0.0.0.0/0 PersistentKeepalive = 21
В данном случае, вместо CLIENT_PRIVATE_KEY и SERVER_PUBLIC_KEY мы опять же, подставляем ключи, сгенерированные ранее, а вместо SERVER_REAL_IP прописываем IP адрес нашего сервера, на котором установлен VPN.
2. Сохраняем файл, и пробуем подключиться командой wg-quick up wg0-client:
# wg-quick up wg0-client [#] ip link add wg0-client type wireguard [#] wg setconf wg0-client /dev/fd/63 [#] ip address add 10.8.0.2/32 dev wg0-client [#] ip link set mtu 1420 dev wg0-client [#] ip link set wg0-client up [#] mount `8.8.8.8' /etc/resolv.conf [#] wg set wg0-client fwmark 51820 [#] ip -4 route add 0.0.0.0/0 dev wg0-client table 51820 [#] ip -4 rule add not fwmark 51820 table 51820 [#] ip -4 rule add table main suppress_prefixlength 0
Проверяем подключение, и если всё сделано верно, то весь наш трафик теперь будет проходить через VPN сервер.
Для отключения от VPN просто выполняем команду wg-quick down wg0-client:
# wg-quick down wg0-client [#] ip -4 rule delete table 51820 [#] ip -4 rule delete table main suppress_prefixlength 0 [#] ip link delete dev wg0-client [#] umount /etc/resolv.conf
При необходимости, мы можем управлять сервисом через systemd:
# systemctl restart wg-quick@wg0-client.service
И, собственно, всё. Вот так, очень просто (куда проще чем тот же OpenVPN) мы можем настроить защищённый VPN туннель и использовать его в повседневной работе.
В дополнение — на видео ещё один пример быстрой настройки WireGuard, но уже вручную:
Буквально с месяц назад пробовал, понравилось. НО всегда есть одно «но»:
Не могу повесить несколько клиентов на один интерфейс сервера, работает по принципу «кто ПЕРВЫЙ встал того и тапки». остальные подключаются но с сетью не работают, даже сервер не пингуют, не говоря уже о том чтобы между собой по ssh гулять или ещё что. Может ты подскажешь как это исправить?
Хм, как появится время — протестирую это дело и отпишусь либо тут, либо как-то в отдельной заметке.
Так и не дошли руки?
Сам нашел косяк, у клиента в конфиге обязательно должна быть маска /32
Tinc ?
Проблема в том, что он только UDP.
А почему это проблема?
Возможно ли с помощью WireGuard создать VPN между
точкой с реальным IP адресом и точкой без реального IP адреса ( роутер+OpenWRT+3G/4G internet)? При этом требуется доступ к компьютерам, находящимся за роутером с OpenWRT.
возможно
как отключить логи?