В одной из прошлых статей я уже описывал установку SoftEther VPN Server из исходников, а также рассказывал что он из себя представляет и как работает.
Сегодня речь пойдет о установке SoftEther VPN из ppa-репозитория на операционную систему Ubuntu 18.04.
Установка SoftEther
По умолчанию Softether не присутствует в репозиториях Ubuntu. Поэтому сначала необходимо добавить репозиторий в систему.
add-apt-repository ppa:paskal-07/softethervpn
Если после добавления репозитория выполнить поиск пакетов Softether, то можно увидеть следующий результат.
apt-cache search softether softether-vpnbridge - VPN Bridge daemon softether-vpnclient - VPN Client daemon softether-vpncmd - Command line utils softether-vpnserver - VPN Server daemon softether-common - SoftEther VPN is an open-source cross-platform multi-protocol VPN program, created as an academic project in the University of Tsukuba.
На данный момент нас интересует только два пакета: softether-vpnserver и softether-vpncmd. Это сам сервер и набор консольных утилит для управления.
Устанавливаем softether-vpnserver и softether-vpncmd.
apt install -y softether-vpnserver softether-vpncmd
Проверим как работает.
systemctl status softether-vpnserver ● softether-vpnserver.service - LSB: SoftEther VPN service Loaded: loaded (/etc/init.d/softether-vpnserver; generated) Active: active (running) since Mon 2019-06-17 18:10:50 UTC; 1min 9s ago Docs: man:systemd-sysv-generator(8) Process: 880 ExecStart=/etc/init.d/softether-vpnserver start (code=exited, status=0/SUCCESS) Tasks: 33 (limit: 504) CGroup: /system.slice/softether-vpnserver.service +-1016 /usr/libexec/softether/vpnserver/vpnserver execsvc L-1017 /usr/libexec/softether/vpnserver/vpnserver execsvc Jun 17 18:10:43 home-18 systemd[1]: Starting LSB: SoftEther VPN service... Jun 17 18:10:50 home-18 softether-vpnserver[880]: Starting SoftEtherVPN Server: vpnserverThe SoftEther VPN Server service has been Jun 17 18:10:50 home-18 softether-vpnserver[880]: . Jun 17 18:10:50 home-18 systemd[1]: Started LSB: SoftEther VPN service. lines 1-14/14 (END)
Настройка VPN-сервера
Переходим к настройке сервера. Для вызова консоли управления выполняем команду vpncmd.
# Входим в консоль управления vpncmd # Предлагаются три раздела на выбор 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) # Выбираем раздел настройки сервера (Management of VPN Server or VPN Bridge) вводим 1 и нажимаем Enter Select 1, 2 or 3: 1 # Выбираем настройку локального сервера - вводим localhost и нажимаем Enter Hostname of IP Address of Destination: localhost # Вместо имени локального хаба, просто нажимаем Enter Specify Virtual Hub Name:
Мы оказались в консоли управления сервером.
You have administrator privileges for the entire VPN Server. VPN Server>
Задаем пароль администратора сервера. Команда — ServerPasswordSet.
serverpasswordset ServerPasswordSet command - Set VPN Server Administrator Password Please enter the password. To cancel press the Ctrl+D key. Password: ****** Confirm input: ****** The command completed successfully.
Удаляем дефолтный виртуальный хаб (что это такое читаем здесь). Команда — HubDelete.
hubdelete # Чтобы удалить хаб нужно ввести его имя — DEFAULT HubDelete command - Delete Virtual Hub Name of Virtual Hub to delete: DEFAULT The command completed successfully.
Создаем свой (новый) виртуальный хаб. Команда — HubCreate.
hubcreate # Указываем имя хаба (у меня Home_VPN) HubCreate command - Create New Virtual Hub Name of Virtual Hub to be created: Home_VPN # Задаем пароль хаба Please enter the password. To cancel press the Ctrl+D key. Password: ****** Confirm input: ****** The command completed successfully.
Просмотреть список доступных хабов можно выполнив команду HubList.
hublist # Кроме списка хабов команда показывает еще и статистику HubList command - Get List of Virtual Hubs Item |Value ------------------+------------------- Virtual Hub Name |Home_VPN Status |Online Type |Standalone Users |0 Groups |0 Sessions |0 MAC Tables |0 IP Tables |0 Num Logins |0 Last Login |2019-06-23 18:39:54 Last Communication|2019-06-23 18:39:54 Transfer Bytes |0 Transfer Packets |0 The command completed successfully.
Настраиваем новый хаб. Команда — Hub, через пробел нужно указать имя настраиваемого хаба.
hub Home_VPN Hub command - Select Virtual Hub to Manage The Virtual Hub "Home_VPN" has been selected. The command completed successfully.
Мы оказались в консоли управления хабом.
VPN Server/Home_VPN>
Создаем пользователя (группа, полное имя, описание — по желанию). Команда — UserCreate.
usercreate # Имя пользователя UserCreate command - Create User User Name: Denni # Группа (сначала нужно создать), полное имя, описание - по желанию # Можно пропустить нажав Enter Assigned Group Name: User Full Name: User Description: The command completed successfully.
Задаем пароль пользователя. Команда — UserPasswordSet.
userpasswordset UserPasswordSet command - Set Password Authentication for User Auth Type and Set Password User Name: Denni Please enter the password. To cancel press the Ctrl+D key. Password: ****** Confirm input: ****** The command completed successfully.
Создаем локальный мост (Что это такое читаем здесь). Команда — BridgeCreate. Синтаксис команды выглядит следующим образом.
bridgecreate Home_VPN -device:home_vpn -tap:yes Home_VPN - имя хаба -device:home_vpn - имя для tap-устройства (указать свое после двоеточия) -tap:yes - активировать tap-устройство
Успешное выполнение команды выглядит так.
VPN Server/Home_VPN>bridgecreate Home_VPN -device:home_vpn -tap:yes BridgeCreate command - Create Local Bridge Connection While in the condition that occurs immediately after a new bridge connection is made when bridging to a physical network adapter, depending on the type of network adapter, there are cases where it will not be possible to communicate using TCP/IP to the network adapter using a bridge connection from a computer on the virtual network. (This phenomenon is known to occur for Intel and Broadcom network adapters.) If this issue arises, remedy the situation by restarting the computer on which VPN Server / Bridge is running. Normal communication will be possible after the computer has restarted. Also many wireless network adapters will not respond to the sending of packets in promiscuous mode and when this occurs you will be unable to use the Local Bridge. If this issue arises, try using a regular wired network adapter instead of the wireless network adapter. Instructions for Local Bridge on VM It has been detected that the VPN Server might be running on a VM (Virtual Machine) suchlike VMware or Hyper-V. Read the following instructions carefully. If you are not using a VM, please ignore this message. Some VMs prohibit the "Promiscuous Mode" (MAC Address Spoofing) on the network adapters by default. If the Promiscuous Mode (MAC Address Spoofing) is administratively disabled, the Local Bridge function between a Virtual Hub on the VPN Server and a physical network adapter on the physical computer does not work well. You should allow the Promiscuous Mode (MAC Address Spoofing) by using the configuration tool of the VM. For details please refer the documents of your VM. If it is a shared-VM and administrated by other person, please request the administrator to permit the use of the Promiscuous (MAC Address Spoofing) Mode to your VM. The command completed successfully.
Просмотреть локальные мосты можно командой — Bridgelist.
bridgelist BridgeList command - Get List of Local Bridge Connection Number|Virtual Hub Name|Network Adapter or Tap Device Name|Status ------+----------------+----------------------------------+--------- 1 |Home_VPN |home_vpn |Operating The command completed successfully.
После создания локального моста в системе должен появиться интерфейс tap-устройства.
ip a 6: tap_home_vpn: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000 link/ether 5e:ed:db:91:6d:fb brd ff:ff:ff:ff:ff:ff Или ifconfig tap_home_vpn: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 5e:ed:db:91:6d:fb txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Интерфейсу пока еще не присвоен локальный ip-адрес. Это нормально — его зададим позже.
Установка и настройка DHCP для локального моста
Softether поддерживает два механизма передачи трафика: SecureNAT и Local Bridge. Подробнее можно прочитать здесь. Я использую Local Bridge.
Поскольку Local Bridge не имеет своего DHCP-сервера, то приходится устанавливать сторонний. Например — isc-dhcp-server.
apt install -y isc-dhcp-server
Приведем файл настроек /etc/dhcp/dhcpd.conf к следующему виду.
option domain-name "SoftEther_Home_VPN"; option domain-name-servers 10.0.10.1; default-lease-time 43200; max-lease-time 86400; log-facility local7; subnet 10.0.10.0 netmask 255.255.255.0 { range 10.0.10.10 10.0.10.100; option routers 10.0.10.1; }
Запускаем tap-интерфейс, попутно назначая ему адрес и маску подсети — 10.0.10.1/24. Таким образом интерфейс становится шлюзом указанной подсети.
ifconfig tap_home_vpn 10.0.10.1/24
У интерфейса должен появиться назначенный адрес.
ip a 6: tap_home_vpn: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000 link/ether 5e:ed:db:91:6d:fb brd ff:ff:ff:ff:ff:ff inet 10.0.10.1/24 brd 10.0.10.255 scope global tap_home_vpn valid_lft forever preferred_lft forever Или ifconfig tap_home_vpn: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.10.1 netmask 255.255.255.0 broadcast 10.0.10.255 ether 5e:ed:db:91:6d:fb txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Запускаем DHCP-сервер.
systemctl start isc-dhcp-server
Проверяем.
systemctl status isc-dhcp-server ● isc-dhcp-server.service - ISC DHCP IPv4 server Loaded: loaded (/lib/systemd/system/isc-dhcp-server.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2019-06-23 19:52:45 MSK; 1s ago Docs: man:dhcpd(8) Main PID: 2379 (dhcpd) Tasks: 1 (limit: 1109) CGroup: /system.slice/isc-dhcp-server.service └─2379 dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcp-server/dhcpd.pid -cf /etc/dhcp/dhcpd.conf Jun 23 19:52:45 anode dhcpd[2379]: Sending on LPF/tap_home_vpn/5e:ed:db:91:6d:fb/10.0.10.0/24 Jun 23 19:52:45 anode dhcpd[2379]: Sending on Socket/fallback/fallback-net Jun 23 19:52:45 anode dhcpd[2379]: Server starting service.
Запуск tap-интерфейса с назначением адреса и запуск DHCP придется повторять вручную после каждого включения или перезагрузки машины. Чтобы этого избежать, нужно добавить выполнение команд в автозапуск. Как я это делаю читаем ниже.
В каталоге /root/scripts/ я создаю скрипт softether-dhcp-start.sh (каталог и имя скрипта могут быть другими, необязательно делать как у меня).
nano /root/scripts/softether-dhcp-start.sh
Добавляю в скрипт следующее содержимое.
#!/bin/bash # Запуск tap-интерфейса и dhcp-сервера с интервалом в 2-е секунды ifconfig tap_home_vpn 10.0.10.1/24 wait 2s systemctl start isc-dhcp-server exit
Делаю скрипт исполняемым.
chmod u+x /root/scripts/softether-dhcp-start.sh
Создаю юнит-файл для Systemd с помощью которого буду запускать выполнение скрипта при запуске системы.
nano /lib/systemd/system/softetherdhcpstart.service
Добавляю в юнит-файл следующее содержимое (если ваш скрипт в другом месте, то изменить путь до скрипта на свой).
[Unit] Description=My Script Service After=multi-user.target [Service] Type=idle ExecStart=/root/scripts/softether-dhcp-start.sh [Install] WantedBy=multi-user.target
Выставляю права на файл softetherdhcpstart.service.
chmod 644 /lib/systemd/system/softetherdhcpstart.service
Обновляю конфигурацию и добавляю файл в автозагрузку.
systemctl daemon-reload systemctl enable softetherdhcpstart.service
Если все сделано правильно, то tap-интерфейс и dhcp-сервер будут автоматически стартовать с заданными параметрами во время загрузки системы.
Настройка фаервола
Включаем форвардинг пакетов в ядре. Добавляем в /etc/sysctl.conf строку net.ipv4.ip_forward = 1 и применяем изменения.
echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf sysctl -p
Добавляем правила iptables для маршрутизации трафика.
# Разрешаем обращения на 443 порт (по умолчанию softether слушает на нем) iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT # Натируем трафик из подсети 10.0.10.0/24 на основной IP сервера iptables -t nat -A POSTROUTING -s 10.0.10.0/24 -j SNAT --to-source IP.СЕР.ВЕ.РА # Разрешаем проходящие пакеты из подсети 10.0.10.0/24 iptables -A FORWARD -s 10.0.10.0/24 -j ACCEPT # Разрешаем проходящие пакеты для уже установленных соединений iptables -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
На этом все. Если возникнут вопросы задавайте в комментариях.