Все настройки выполнены в VPS от hostsailor.com
Ранее мы рассмотрели, как построить собственную VPN сеть на основе решения OpenVPN. Это очень хорошее решение, но есть ряд общих недостатков для конечного пользователя:
- относительно сложные установка и настройка;
- обязательное наличие на сервере TUN/TAP;
- трафик OpenVPN легко детектируется всякими Роскомнадзорами.
При этом OpenVPN является безусловным лидером с подтвержденной криптоустойчивостью. И если у вас нет необходимости маскировать VPN трафик под «обычный», то пользуйтесь OpenVPN.
А теперь отличная новость для тех кто в России/Украине/Казахстане/Китае и других странах, с контролем сети интернет на государственном уровне.
Встречайте решение от наших японских товарищей: SoftEther VPN.
SoftEther VPN — это мощный мультипротокольный VPN-сервер под лицензией CPLv2 (т.е. совершенно свободный к распространению и использованию).
Решение обладает огромным спектром возможностей:
- собственный протокол SSL-VPN, который не отличим от HTTPS траффика. При этом он может работать не только по TCP, но и по UDP, и, даже, ICMP.
- Поддерживает большинство существующих протоколов VPN: L2TP/IPsec, MS-SSTP, OpenVPN, L2TPv3 и EtherIP, причем для L2TP указана строгая совместимость со встроенными клиентами в iOS и Android. Т.е. к серверу SoftEther VPN вы можете подключить клиента OpenVPN или подключиться с использованием встроенных VPN-механизмов Windows. Причем одновременно.
- Сервер может быть установлен на Windows, Linux, OS X, FreeBSD и Solaris.
- И теоретически и практически работает быстрее OpenVPN.
- Имеет GUI через который можно управлять несколькими серверами.
- Ему не нужно TUN/TAP.
- Имеет встроенный NAT и DHCP. Не нужно настраивать iptables.
Нужно понимать, что хотя SoftEther VPN достаточно стабильное и надежное решение, но оно всё еще в стадии beta. А значит, теоретически, в его работе возможны неожиданные ошибки.
Хватит читать, нужно пробовать. Арендуем себе дешёвенький VPS, выполним его предварительную настройку. Исходим из того, что вы подключились к серверу по SSH через putty и WinCSP.
Идём на страницу загрузки SoftEther VPN и выбираем нужный дистрибутив.
Получив ссылку на нужный дистрибутив, переходим к консоли
cd /tmp/ wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.32-9731-beta/softether-vpnserver-v4.32-9731-beta-2020.01.01-linux-x64-64bit.tar.gz
Также нам понадобиться некоторой набор инструментов:
yum -y groupinstall "Development Tools" yum -y install gcc zlib-devel openssl-devel readline-devel ncurses-devel yum -y install system-config-network-tui system-config-firewall-tui yum -y install policycoreutils-python yum -y install net-tools which
Переведем SELinux в разрешающий (permissive) режим:
setenforce 0
Отключим файрвол:
system-config-firewall-tui
Убедимся, что в строчке «Firewall: [ ] Enabled нет звездочки *
Если она там есть, то используя кнопку TAB дл перемещения и пробел для «нажатия» убираем её. Затем переходим на кнопку ОК и нажимаем её. Если звёздочки нет, то сразу на ОК. В появившейся форме
«нажимаем» Yes.
Создадим папку для нашего сервера:
mkdir /etc/sevpn/
Теперь распакуем скачанный ранее архив с VPN-сервером, установим права на папку и перейдём в неё:
tar xzvf softether-vpnserver-v4.32-9731-beta-2020.01.01-linux-x64-64bit.tar.gz -C /etc/sevpn/
chmod -R 744 /etc/sevpn cd /etc/sevpn/vpnserver
Скомпилируем наш сервер:
make
На все вопросы о лицензионных соглашениях вводим 1 и жмём Enter.
Сделаем скрипт запуска. Для этого в папке /etc/rc.d/init.d создадим файл sevpnserver со следующим содержимым:
#!/bin/sh # # chkconfig: 2345 20 80 # description: SoftEther VPN Server # # # # DAEMON=/etc/sevpn/vpnserver/vpnserver LOCK=/var/lock/vpnserver/vpnserver test -x $DAEMON || exit 0 case "$1" in start) echo Starting SoftEther VPN Server... $DAEMON start touch $LOCK ;; stop) echo Stopping SoftEther VPN Server... $DAEMON stop rm $LOCK ;; restart|reload) echo Reloading SoftEther VPN Server... $DAEMON stop sleep 3 $DAEMON start ;; *) echo Usage: $0 "{start|stop|restart}" exit 1 esac exit 0
И установим ему права 0755
Создадим папку /var/lock/vpnserver
mkdir /var/lock/vpnserver
Проверим работу сервера.
Введём команды:
/etc/sevpn/vpnserver/vpncmd
В появившемся запросе введём 3 и нажмём Enter.
Далее введём команду
check
Будет выполнено шесть тестов и в ответ на каждый мы должны получить Pass
Отлично. Выходим из VPN Tools командой
exit
Запустим наш сервер
/etc/rc.d/init.d/sevpnserver start
Опять вводим
/etc/sevpn/vpnserver/vpncmd
Вводим 1, а потом два раза жмём Enter. Появится приглашение:
VPN Server>
Вводим
ServerPasswordSet
И вводим два раза пароль. Это административный пароль сервера. Он открывает доступ ко всем настройкам и управлению. Пароль должен быть стойким к перебору: не менее 10 символов, верхний и нижний регистр, цифры, спецсимволы.
Чтобы выйти из режима администрирования (когда приглашение командной строки имеет вид VPN Server> ) введите
exit
Теперь установим на свой компьютер консоль управления для настройки сервера. Опять идём на страницу проекта и выбираем
Скачиваем Server Manager по получившейся ссылке и запускаем установку.
Затем всё время «Далее» и «Готово». В появившемся окне
Жмём «New Setting» и заполняем параметры Setting Name (любое понравившееся имя) и HostName (IP-адрес вашего сервера)
Жмём Connect и вводим административный пароль VPN сервера. Если пароль введен правильно, консоль подключится и запросит первоначальную конфигурацию. Выбираем как на скриншоте:
Соглашаемся
Придумываем имя виртуальному хабу
На следующем шаге мы можем выбрать имя для нашего VPN сервера. Это позволит в дальней, благодаря службе Dynamic DNS, обращаться к нашему серверу не только по IP-адресу, но и по имени (обведено зелёным цветом).
Выберем протокол и придумаем PSK ключ (т.е. еще один стойкий пароль). Этот ключ, по сути, секретная фраза необходимая для первоначального соединения между клиентом и сервером VPN. SoftEther не рекомендует делать его больше 9 символов, так это вроде вызывает баги в Android.
И откажемся от VPN Azure
На следующем шаге создадим нового пользователя
Настраиваем пользователя. Этот пользователь будет у нас для подключения с компьютера/ноутбука (т.е. Windows или Linux). Обязательно заполняем поле User Name. Поля Full Name и Note не обязательны. Выбираем аутентификацию по сертификатам (Individual Certificate Authentication) и жмём Create Certificate
Заполняем необходимые поля. Поля Organization, Country, State, Locale заполняем любыми значениями. Длительность действия сертификата рекомендую ставить 365 дней (но тут уж как сами захотите), длину ключа 4096 бит.
Жмём ОК и выбираем формат и место сохранения ключей. Также вы можете указать пароль для сертификата (обведено зелёным). Тогда при каждом подключении клиента к серверу нужно будет вводить пароль. Так, несомненно, лучше, но не очень удобно. Выбирать вам. Я всегда рекомендую делать сертификаты с паролями для тех устройств, которые вы не можете полностью контролировать (рабочий компьютер) или которые можно легко потерять, т.е. носимые устройства (ноутбук, смартфон).
Нажимаем ОК и указываем имя файла сертификатов (будут сформированы открытый и закрытый сертификаты) и куда сохранить . В окне создания пользователя жмём ОК.
В окне VPN Easy Setup Tasks жмём Close.
Теперь выбираем наш хаб и жмём Manage Virtual Hub
Зайдем в настройки NAT
Проверяем, что SecureNAT выключен (обведённая зелёным кнопка не активна) и жмём SecureNAT Configuration
Настраиваем как на скриншоте и жмём OK и Exit
Теперь настроим Local Bridge (мост, по которому VPN будет общаться с внешним миром).
Если появится предупреждение о недоступности физического LAN адаптера, просто жмём OK
И жмём Exit
Проверим, что наш виртуальный интерфейс действительно создался. В консоли putty выполним команду
ifconfig tap_softether
Должны получить примерно такой вывод
[root@vps00000 ~]# ifconfig tap_softether
tap_softether: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::2ac:ceff:fec4:484f prefixlen 64 scopeid 0x20<link>
ether 00:ac:ce:c4:49:4f txqueuelen 500 (Ethernet)
RX packets 158 bytes 10938 (10.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 136 bytes 11232 (10.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Установим DNSMasq
yum -y install dnsmasq
Создадим файл /etc/dnsmasq.conf со следующим содержимым
interface=tap_softether dhcp-range=tap_softether,10.8.0.2,10.8.0.200,12h dhcp-option=tap_softether,3,10.8.0.1 server=8.8.8.8
IP адреса вписываете те, которые мы запомнили из настроек SecureNAT (см. выше). Сохраняем и закрываем файл.
Пробуем запустить dnsmasq
systemctl restart dnsmasq
и смотрим состояние
systemctl status dnsmasq
Должно быть типа такого:
Если не так, то смотрим в лог /var/log/messages
Если есть ошибка «warning: interface tap_softether does not currently exist», то либо вы ошиблись где-то в настройках ранее, либо не запущен VPN-сервер. Как запустить, написано выше.
Если ошибка «failed to bind DHCP server socket: Address already in use», то смотрим вывод команды
netstat -anlp | grep -w LISTEN
Скорее всего увидим что-то типа
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/init tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN 19819/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 110/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 196/sendmail: accep tcp6 0 0 :::111 :::* LISTEN 15492/rpcbind tcp6 0 0 :::80 :::* LISTEN 104/httpd tcp6 0 0 :::53 :::* LISTEN 19819/dnsmasq tcp6 0 0 :::22 :::* LISTEN 110/sshd
Видим, что висит процесс dnsmasq и занимает интерфейс. Запоминаем число перед /dnsmasq (в моём случае это 19819) и используем его в команде
kill 19819
После этого пробуем
systemctl start dnsmasq systemctl status dnsmasq
Всё должно стать хорошо.
Теперь открываем наш скрипт запуска VPN-сервера /etc/rc.d/init.d/sevpnserver и редактируем по образцу (можно просто очистить содержимое и вставить отсюда):
#!/bin/sh # # chkconfig: 2345 20 80 # description: SoftEther VPN Server # # # # DAEMON=/etc/sevpn/vpnserver/vpnserver LOCK=/var/lock/vpnserver/vpnserver TAP_ADDR=10.8.0.1 test -x $DAEMON || exit 0 case "$1" in start) echo Starting SoftEther VPN Server... $DAEMON start touch $LOCK sleep 3 /sbin/ifconfig tap_softether $TAP_ADDR sleep 3 systemctl restart dnsmasq ;; stop) echo Stopping SoftEther VPN Server... $DAEMON stop rm $LOCK ;; restart|reload) echo Reloading SoftEther VPN Server... $DAEMON stop sleep 5 $DAEMON start sleep 3 /sbin/ifconfig tap_softether $TAP_ADDR sleep 3 systemctl restart dnsmasq ;; *) echo Usage: $0 "{start|stop|restart}" exit 1 esac exit 0
Сохраняем.
Добавим скрипт в автозагрузку
chkconfig sevpnserver on
Проверить, что скрипт добавился можно командой
chkconfig --list
В выводе команды должна присутствовать строчка
sevpnserver 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Теперь идём в статью про файрволл и маршрутизацию и делаем всё, как там написано, но с единственным отличием: содержимое файла ipt-set взять указанное ниже.
В переменную IP_EXT вместо 123.123.123.123 вписываем IP-адрес своего VPS.
#!/bin/sh IF_EXT="venet0" IF_VPN="tap_softether" VPN_PORT="443" IPT="/sbin/iptables" IPT6="/sbin/ip6tables" IP_EXT="123.123.123.123" # flush $IPT --flush $IPT -t nat --flush $IPT -t mangle --flush $IPT -X $IPT6 --flush # loopback $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT # default $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP $IPT6 -P INPUT DROP $IPT6 -P OUTPUT DROP $IPT6 -P FORWARD DROP # allow forwarding echo 1 > /proc/sys/net/ipv4/ip_forward # NAT # ######################################### # SNAT - local users to out internet $IPT -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source $IP_EXT # INPUT chain # ######################################### $IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # ssh $IPT -A INPUT -i $IF_EXT -p tcp --dport 22 -j ACCEPT # DNS $IPT -A INPUT -i $IF_VPN -p udp --dport 53 -s 10.8.0.0/24 -j ACCEPT # vpn $IPT -A INPUT -i $IF_VPN -p icmp -s 10.8.0.0/24 -j ACCEPT $IPT -A INPUT -i $IF_EXT -p tcp --dport $VPN_PORT -j ACCEPT $IPT -A INPUT -p udp --dport 500 -j ACCEPT $IPT -A INPUT -p udp --dport 4500 -j ACCEPT $IPT -N syn_flood $IPT -A INPUT -p tcp --syn -j syn_flood $IPT -A syn_flood -m limit --limit 500/s --limit-burst 2000 -j RETURN $IPT -A syn_flood -j DROP # FORWARD chain # ######################################### $IPT -A FORWARD -i $IF_VPN -o $IF_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -i $IF_EXT -o $IF_VPN -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -s 10.8.0.0/24 -d 10.8.0.0/24 -j ACCEPT # OUTPUT chain # ######################################### $IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
В Server Manager откроем «Encryption and Network»
И выставляем опции как на скриншоте (обведено красным)
Жмём Ок.
Перезагрузим VPS командой из консоли
reboot
Открываем окно
И жмём кнопку Enable SecureNAT.
Теперь наш сервер готов принимать подключения.
Теперь отключим логи SoftEther VPN-сервера (не делайте этого, пока не убедитесь, что сервер правильно работает).
Открываем настройки виртуального хаба
И убираем галочки
Жмём ОК.
Отлично, мы отключили логи виртуального хаба (если у вас несколько хабов, отключите их также во всех). Но сам VPN сервер продолжает вести подробные логи и штатной возможности их отключить нет (по крайней мере в документации это не описано). Разработчики SoftEther преподносят это как преимущество: если администратор хаба отключит логи, администратор сервера всё равно получит их. Но нам оно не нужно. Мы воспользуемся документированной функцией SoftEther по отправке логов на стронний агрегаторо логов (SysLog). Как сказано в документации:
Once the Syslog Transmission function is activated, the sent logs are no longer saved on the local hard disk. Therefore, please be aware that when the syslog server does not launch or when problems arise between the communicating syslog servers, or when the processing capacity of the syslog server and any intermediate networks or protocol stacks is insufficient, the contents of these logs which should essentially be saved will instead be lost, regardless of whether the syslog function is enabled.
Т.е. если мы включим Syslog, но агрегатор логов отправляемые логи по какой-то причине не примет, то логи будут потеряны. Сервер не будет писать их на диск. Отлично! Включим Syslog и настроим отправку логов на localhost (т.е. самим себе). А поскольку на нашем VPS никаких служб по сбору сторонних логов нет, логи будут уходить в никуда.
Открываем консоль и вводим команду:
/etc/sevpn/vpnserver/vpncmd
На запрос
By using vpncmd program, the following can be achieved.
1. Management of VPN Server or VPN Bridge
2. Management of VPN Client
3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool)Select 1, 2 or 3:
Вводим 1
На запросы
Hostname of IP Address of Destination:
Specify Virtual Hub Name:
Просто жмём Enter. Появится приглашение:
VPN Server>
Вводим команду
SyslogEnable
На запрос
SyslogEnable command — Set syslog Send Function
Setting to Use syslog Send Function (1-3):
Вводим 3
На запрос
Specify syslog Server:
вводим
localhost
Получим ответ
The command completed successfully.
Отлично. Вводим команду
exit
и выходим из режима упраления VPN-сервером.
Останавливаем сервер
/etc/rc.d/init.d/sevpnserver stop
Открываем файл /etc/sevpn/vpnserver
Находим строчки
bool SavePacketLog true
bool SaveSecurityLog true
и исправляем их на
bool SavePacketLog false
bool SaveSecurityLog false
Сохраняем и закрываем файл (убедитесь, что он сохранён в UTF-8).
С помощью WinSCP удаляем все файлы из папок и их вложенных подпапок
/etc/sevpn/vpnserver/packet_log/
/etc/sevpn/vpnserver/security_log/
/etc/sevpn/vpnserver/server_log/
Запускаем сервер
/etc/rc.d/init.d/sevpnserver start
После запуска в папке /etc/sevpn/vpnserver/server_log/ появятся логи. Но это будут логи именно запуска сервера. О работе сервера и его клиентов никаких логов писаться не будет.