Установка и настройка VPN-демона GoVPN 5.10

Состоялся релиз свободного VPN-демона GoVPN 5.10, предназначенного для создания шифрованных, аутентифицированных и цензуроустойчивых каналов связи поверх UDP или TCP. Реализация ориентирована на высокую безопасность, простоту реализации и лёгкость чтения исходного кода. Программа полностью написана на языке Go и распространяется под лицензией GPLv3. Поддерживается работа в GNU/Linux и FreeBSD.

Для двусторонней несбалансированной (augmented) аутентификации сторон и согласования ключей используется аутентифицируемый по парольной фразе протокол DH-A-EKE (Diffie-Hellman Augmented Encrypted Key Exchange). Протокол имеет свойство нулевого неразглашения при котором невозможна offline атака по словарю. Даже при компрометации БД сервера злоумышленник не сможет замаскироваться под клиента.

Также имеется защита от атак повторного воспроизведения, дешифровки перехваченного трафика даже при компрометации парольной фразы (свойство совершенной прямой секретности). Кроме обеспечения конфиденциальности есть возможность скрывать размер сообщения и время их возникновения, путём генерирования постоянного шумового трафика.

Компиляция и установка VPN-демона GoVPN 5.10

Готовых пакетов для установки GoVPN не существует, так-что компилировать и устанавливать придется самому. Для этого нам понадобится свежая версия языка программирования Go в системе и собственно последняя версия VPN-демона GoVPN.

У меня в качестве сервера будет выступать машина с Centos 7 на борту. Давайте сначала поставим Go и чуть-чуть настроем среду окружения.

cd ~ 
mkdir go
cd go
wget https://storage.googleapis.com/golang/go1.6.3.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.6.3.linux-amd64.tar.gz
cd ~ 
mkdir go
cd go
wget https://storage.googleapis.com/golang/go1.6.3.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.6.3.linux-amd64.tar.gz

Итак, скачали, распаковали и установили в нужное место. Теперь надо добавить в PATH:

vim ~/.bashrc
...
export PATH=$PATH:/usr/local/go/bin
...
exec bash -l
go version
vim ~/.bashrc
...
export PATH=$PATH:/usr/local/go/bin
...
exec bash -l
go version

Теперь нужно скачать VPN-демона, установить его зависимости и скомпилировать его:

cd ~
mkdir govpn && cd govpn
wget http://www.cypherpunks.ru/govpn/download/govpn-5.10.tar.xz
echo bc624265cfcda8ce1c1bbf9d016683c50ec6cba5aeccf33d93fca4e5d52098bd govpn-5.10.tar.xz | sha256sum -c
govpn-5.10.tar.xz: OK
tar xvf govpn-5.10.tar.xz && cd govpn-5.10
cd ~
mkdir govpn && cd govpn
wget http://www.cypherpunks.ru/govpn/download/govpn-5.10.tar.xz
echo bc624265cfcda8ce1c1bbf9d016683c50ec6cba5aeccf33d93fca4e5d52098bd govpn-5.10.tar.xz | sha256sum -c
govpn-5.10.tar.xz: OK
tar xvf govpn-5.10.tar.xz && cd govpn-5.10

Собственно сама компиляция:

make -C govpn-5.10 all
cd govpn-5.10
ls -l
...
govpn-client 
govpn-server 
govpn-verifier
...
make -C govpn-5.10 all
cd govpn-5.10
ls -l
...
govpn-client 
govpn-server 
govpn-verifier
...

Настраиваем server-side для VPN-демона

Создаем нового клиента:

cd govpn-5.10
./utils/newclient.sh alex
cd govpn-5.10
./utils/newclient.sh alex

Все настройки, всех клиентов хранятся в файле peers.yml, в формате yml:

vim peers.yml
 
alex:
    iface: tap0
    timeout: 60
    mtu: 1514
    timesync: 0
    noise: No
    cpr: 64
    encless: No
    verifier: $argon2d$m=4096,t=128,p=1$RctYs8djNNQ7FAgg/xZNIg$dybXGDEdIVb0BgC1KkXxTXfJl8Da5gXHCHmJOIMwIRc
vim peers.yml

alex:
    iface: tap0
    timeout: 60
    mtu: 1514
    timesync: 0
    noise: No
    cpr: 64
    encless: No
    verifier: $argon2d$m=4096,t=128,p=1$RctYs8djNNQ7FAgg/xZNIg$dybXGDEdIVb0BgC1KkXxTXfJl8Da5gXHCHmJOIMwIRc

Создаем сетевой интерфейс tap0 и конфигурируем его:

ip tuntap add mode tap tap0
ip link set mtu 1432 dev tap0
ip addr add 172.16.0.1/24 dev tap0
ip link set up dev tap0
ifconfig tap0 up
ip tuntap add mode tap tap0
ip link set mtu 1432 dev tap0
ip addr add 172.16.0.1/24 dev tap0
ip link set up dev tap0
ifconfig tap0 up

Не забудьте открыть файрвол:

## GoVPN
-A INPUT -p udp --dport 1194 -j LOG --log-level 4 --log-prefix "GoVPN connection: "
-A INPUT -p udp --dport 1194 -j ACCEPT
## GoVPN
-A INPUT -p udp --dport 1194 -j LOG --log-level 4 --log-prefix "GoVPN connection: "
-A INPUT -p udp --dport 1194 -j ACCEPT

Запускаем демон:

/root/govpn/govpn-5.10/govpn-server -conf peers.yml
/root/govpn/govpn-5.10/govpn-server -conf peers.yml

Настраиваем client-side для VPN-демонa

Нам снова понадобится язык Go и скомпилированная версия VPN-демона, просто повторите шаги с установкой и настройкой Go и GoVPN 5.10.
Нам так-же нужно настроить сетевой интерфейс tap0:

ip tuntap add mode tap tap0
ip link set mtu 1432 dev tap0
ip addr add 172.16.0.2/24 dev tap0
ip link set up dev tap0
ifconfig tap0 up
ip tuntap add mode tap tap0
ip link set mtu 1432 dev tap0
ip addr add 172.16.0.2/24 dev tap0
ip link set up dev tap0
ifconfig tap0 up

В этот раз обратите внимание на адрес, для клиента он 172.16.0.2/24

Пришло время запустить демон на клиенте:

/root/govpn/govpn-5.10/govpn-client -verifier '$argon2d$m=4096,t=128,p=1$RcGss8djNMQ7ZAhg/xZNIg' -remote 181.42.3.21:1194 -iface tap0
/root/govpn/govpn-5.10/govpn-client -verifier '$argon2d$m=4096,t=128,p=1$RcGss8djNMQ7ZAhg/xZNIg' -remote 181.42.3.21:1194 -iface tap0

Вы должны увидеть вывод:

2016/08/14 17:38:13.426791 identity.go:75: Adding key RcGss8djNMQ7ZAhg/xZNIg
2016/08/14 17:38:13.429455 main.go:126: GoVPN version 5.10 built with go1.6.2
2016/08/14 17:38:13.430804 logger.go:43: [connected remote="181.42.3.21:1194"]
2016/08/14 17:38:13.661012 logger.go:43: [handshake-completed remote="181.42.3.21:1194"]
2016/08/14 17:38:13.426791 identity.go:75: Adding key RcGss8djNMQ7ZAhg/xZNIg
2016/08/14 17:38:13.429455 main.go:126: GoVPN version 5.10 built with go1.6.2
2016/08/14 17:38:13.430804 logger.go:43: [connected remote="181.42.3.21:1194"]
2016/08/14 17:38:13.661012 logger.go:43: [handshake-completed remote="181.42.3.21:1194"]

И на сервере:

2016/08/14 17:38:04.672603 logger.go:43: [handshake-completed bind="[::]:1194" addr="129.209.141.23:34217" peer="RctЕs8djNNQ0FAgg/xZNIg"]
2016/08/14 17:38:04.672842 logger.go:43: [peer-created bind="[::]:1194" peer="RctЕs8djNNQ0FAgg/xZNIg"]
2016/08/14 17:38:04.672603 logger.go:43: [handshake-completed bind="[::]:1194" addr="129.209.141.23:34217" peer="RctЕs8djNNQ0FAgg/xZNIg"]
2016/08/14 17:38:04.672842 logger.go:43: [peer-created bind="[::]:1194" peer="RctЕs8djNNQ0FAgg/xZNIg"]

Все! Туннель работает и готов к передаче данных, можете к примеру запустить ping:

ping 172.16.0.1
64 bytes from 172.16.0.1: icmp_seq=1 ttl=64 time=120 ms
64 bytes from 172.16.0.1: icmp_seq=2 ttl=64 time=113 ms
64 bytes from 172.16.0.1: icmp_seq=3 ttl=64 time=132 ms
64 bytes from 172.16.0.1: icmp_seq=4 ttl=64 time=129 ms
64 bytes from 172.16.0.1: icmp_seq=5 ttl=64 time=121 ms
ping 172.16.0.1
64 bytes from 172.16.0.1: icmp_seq=1 ttl=64 time=120 ms
64 bytes from 172.16.0.1: icmp_seq=2 ttl=64 time=113 ms
64 bytes from 172.16.0.1: icmp_seq=3 ttl=64 time=132 ms
64 bytes from 172.16.0.1: icmp_seq=4 ttl=64 time=129 ms
64 bytes from 172.16.0.1: icmp_seq=5 ttl=64 time=121 ms

Теперь ваш трафик надежно защищен!