Установка и настройка безопасного VPN-демона GoVPN 3.2

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

Для аутентификации участников соединения используется аутентифицируемый по парольным фразам протокол обмена ключами DH-A-EKE (Diffie-Hellman Augmented Encrypted Key Exchange) Готовых пакетов программы пока что не существует. По этому собирать и компилировать все необходимо самому ручкачми. Ниже я представлю точный step-by-step мануал для систем Ubuntu 14.04, Centos 6.6 Final и FreeBSD 10.1.

Установка и компиляция пакета

Данные инструкции необходимо выполнить на сервере и клиенте
Для примера я использую связку двух VM машин с Ubuntu 14.04 на борту:
Server EXT IP: 172.25.60.62
Client EXT IP: 172.25.60.63

Так как VPN-демон написан на языке Go, язык необходимо добавить в систему

apt-get install uml-utilities
apt-get install golang
apt-get install uml-utilities
apt-get install golang

Лучше всего скачать официальный пакет с сайта разработчика.

wget http://www.cypherpunks.ru/govpn/download/govpn-3.2.tar.xz
wget http://www.cypherpunks.ru/govpn/download/govpn-3.2.tar.xz

После чего, распаковать и скомпилировать

tar xvf govpn-3.2.tar.xz
cd govpn-3.2
mkdir -p peers
make
tar xvf govpn-3.2.tar.xz
cd govpn-3.2
mkdir -p peers
make

Конфигурация сервер и клиента

На стороне сервера выполните
Задайте колличество CPU

export GOMAXPROC=4
cd govpn-3.2
export GOMAXPROC=4
cd govpn-3.2

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

./utils/newclient.sh Alice
Place verifier to peers/6d4ac605ce8dc37c2f0bf21cb542a713/verifier
./utils/newclient.sh Alice
Place verifier to peers/6d4ac605ce8dc37c2f0bf21cb542a713/verifier

Где номер 6d4ac605ce8dc37c2f0bf21cb542a713 – это ID клиента

На стороне клиента

./utils/storekey.sh /tmp/passphrase
Enter passphrase:[my secure passphrase is here]
 
govpn-verifier -id 6d4ac605ce8dc37c2f0bf21cb542a713 -key /tmp/passphrase
562556cc9ecf0019b4cf45bcdf42706944ae9b3ac7c73ad299d83f2d5a169c55
rm /tmp/passphrase
./utils/storekey.sh /tmp/passphrase
Enter passphrase:[my secure passphrase is here]

govpn-verifier -id 6d4ac605ce8dc37c2f0bf21cb542a713 -key /tmp/passphrase
562556cc9ecf0019b4cf45bcdf42706944ae9b3ac7c73ad299d83f2d5a169c55
rm /tmp/passphrase

Помним что номер 6d4ac605ce8dc37c2f0bf21cb542a713 это ID клиента сформированный на сервере.
562556cc9ecf0019b4cf45bcdf42706944ae9b3ac7c73ad299d83f2d5a169c55 – это номер для verifier

На стороне сервера выполните

cd govpn-3.2
vim peers/6d4ac605ce8dc37c2f0bf21cb542a713/verifier
562556cc9ecf0019b4cf45bcdf42706944ae9b3ac7c73ad299d83f2d5a169c55
cd govpn-3.2
vim peers/6d4ac605ce8dc37c2f0bf21cb542a713/verifier
562556cc9ecf0019b4cf45bcdf42706944ae9b3ac7c73ad299d83f2d5a169c55

Теперь, когда с пользователями покончено, на сервере выполните

echo "echo tap10" >> peers/6d4ac605ce8dc37c2f0bf21cb542a713/up.sh
tunctl -t tap10
ip link set mtu 1432 dev tap10
ip addr add 172.16.0.1/24 dev tap10
ip link set up dev tap10=
ifconfig tap10 up
ifup tap10
echo "echo tap10" >> peers/6d4ac605ce8dc37c2f0bf21cb542a713/up.sh
tunctl -t tap10
ip link set mtu 1432 dev tap10
ip addr add 172.16.0.1/24 dev tap10
ip link set up dev tap10=
ifconfig tap10 up
ifup tap10

Запустите демон

govpn-server -bind 172.25.60.62:1194 -mtu 1472
govpn-server -bind 172.25.60.62:1194 -mtu 1472

На стороне клиента

umask 066
utils/storekey.sh key.txt
tunctl -t tap10
ip link set mtu 1432 dev tap10
ip addr add 172.16.0.2/24 dev tap10
ip link set up dev tap10
ip route add default via 172.16.0.1
ifconfig tap10 up
ifup tap10
umask 066
utils/storekey.sh key.txt
tunctl -t tap10
ip link set mtu 1432 dev tap10
ip addr add 172.16.0.2/24 dev tap10
ip link set up dev tap10
ip route add default via 172.16.0.1
ifconfig tap10 up
ifup tap10

Запускаем демон что-бы подключиться к серверу

govpn-client -key key.txt -id 6d4ac605ce8dc37c2f0bf21cb542a713 -iface tap10 -remote 172.25.60.62:1194 -mtu 1472
govpn-client -key key.txt -id 6d4ac605ce8dc37c2f0bf21cb542a713 -iface tap10 -remote 172.25.60.62:1194 -mtu 1472

Проверьте, что тоннель работает:

ping 172.16.0.1
PING 172.16.0.1 (172.16.0.1) 56(84) bytes of data.
64 bytes from 172.16.0.1: icmp_seq=1 ttl=64 time=1.15 ms
64 bytes from 172.16.0.1: icmp_seq=2 ttl=64 time=2.24 ms
64 bytes from 172.16.0.1: icmp_seq=3 ttl=64 time=4.36 ms
ping 172.16.0.1
PING 172.16.0.1 (172.16.0.1) 56(84) bytes of data.
64 bytes from 172.16.0.1: icmp_seq=1 ttl=64 time=1.15 ms
64 bytes from 172.16.0.1: icmp_seq=2 ttl=64 time=2.24 ms
64 bytes from 172.16.0.1: icmp_seq=3 ttl=64 time=4.36 ms

На скриншоте можно увидеть слева – сервер, справо – клиент.
LinuxSpace

Так же, существует возможность запуска VPN-демона с мини-веб сервером, который показывает статистику, подкюченных клиентов, колличество переданного через туннель трафика. К соажеления пока-что только в формате JSON, что не очень читабельно.

./govpn-server -bind 172.25.60.62:1194 -mtu 1472 -stats 172.25.60.62:80
./govpn-server -bind 172.25.60.62:1194 -mtu 1472 -stats 172.25.60.62:80

Опция -stats говорит демону запустить мини веб-сервер со статистикой в формате host:port
screeee

Тестирование GoVPN 3.2

Я так же провел не большой тест на пропускную способность туннеля с помощью утилиты iperf, стоит отметить, что машины имеют скромный 1CPU по этому требовать много от них не стоит, тем не менее результат тестов очень даже не плохой. Тесты делались для протокола UDP. Если вы хотите повторить тест выполните следующее.

Сервер

[email protected]:~# iperf -s -c 172.16.0.1 -u
------------------------------------------------------------
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[email protected]:~# iperf -s -c 172.16.0.1 -u
------------------------------------------------------------
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------

Клиент

[email protected]:~# iperf -c 172.16.0.1 -u -b 1000m
------------------------------------------------------------
Client connecting to 172.16.0.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local 172.16.0.2 port 39069 connected with 172.16.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   295 MBytes   248 Mbits/sec
[  3] Sent 210692 datagrams
[  3] WARNING: did not receive ack of last datagram after 10 tries.
[email protected]:~# iperf -c 172.16.0.1 -u -b 1000m
------------------------------------------------------------
Client connecting to 172.16.0.1, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local 172.16.0.2 port 39069 connected with 172.16.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   295 MBytes   248 Mbits/sec
[  3] Sent 210692 datagrams
[  3] WARNING: did not receive ack of last datagram after 10 tries.

Скриншот сервера
Server_side

Скриншот клиента
Client_side