После установки нового сервера, подключаемся по SSH и обновляем список пакетов
pkg update
Устанавливаем пакет mpd5
pkg install mpd5
Добавляем mpd5 в автозапуск
echo 'mpd_enable="YES"' >> /etc/rc.conf
Добавляем конфигурационный файл /usr/local/etc/mpd5/mpd.conf
startup: default: load l2tp_server l2tp_server: # # Define dynamic IP address pool. set ippool add pool1 10.10.2.20 10.10.2.254 # Create clonable bundle template named B create bundle template B set iface enable proxy-arp set iface idle 1800 set iface enable tcpmssfix set iface route 10.10.2.1 set iface up-script /usr/local/etc/mpd5/l2tp_server_up.py set iface down-script /usr/local/etc/mpd5/l2tp_server_down.py set ipcp yes vjcomp # Specify IP address pool for dynamic assigment. set ipcp ranges 10.10.2.1/24 ippool pool1 set ipcp dns 10.10.2.1 # The five lines below enable Microsoft Point-to-Point encryption # (MPPE) using the ng_mppc(8) netgraph node type. set bundle enable compression set ccp yes mppc set mppc yes e40 set mppc yes e128 set mppc yes stateless # Create clonable link template named L create link template L l2tp # Set bundle template to use set link action bundle B # Multilink adds some overhead, but gives full 1500 MTU. set link enable multilink set link yes acfcomp protocomp set link no pap chap set link enable chap set link enable chap-msv1 set link enable chap-msv2 set link keep-alive 10 60 # We reducing link mtu to avoid GRE packet fragmentation set link mtu 1460 # Configure l2tp # IP set l2tp self 0.0.0.0 # Allow to accept calls set link enable incoming
Добавляем тестового пользователя в файл /usr/local/etc/mpd5/mpd.secret
user password
Дополнительных пользователей добавляем сюда же следующими строками
Устанавливаем интерпретатор Python 3.6 для работы скриптов. Это необязательный шаг, но работать через Python удобнее
pkg install python36
Добавить скрипты
Скрипт, выполняемый при подключении к серверу клиента: /usr/local/etc/mpd5/l2tp_server_up.py
#!/usr/bin/env python3.6 # -*- coding: UTF-8 -*- __author__ = 'RemiZOffAlex' __copyright__ = '(c) RemiZOffAlex' __license__ = 'MIT' __email__ = 'remizoffalex@mail.ru' __url__ = 'http://remizoffalex.ru' import sys import logging logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) handler = logging.FileHandler( '/var/log/vpn-users.log', encoding = "UTF-8" ) formatter = logging.Formatter('[%(asctime)s] %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.info( 'Пользователь [{}] подключился и получил IP: {}'.format( sys.argv[5], sys.argv[4] ) )
Скрипт, выполняемый при отключении от сервера клиента: /usr/local/etc/mpd5/l2tp_server_down.py
#!/usr/bin/env python3.6 # -*- coding: UTF-8 -*- __author__ = 'RemiZOffAlex' __copyright__ = '(c) RemiZOffAlex' __license__ = 'MIT' __email__ = 'remizoffalex@mail.ru' __url__ = 'http://remizoffalex.ru' import sys import logging logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) handler = logging.FileHandler( '/var/log/vpn-users.log', encoding = "UTF-8" ) formatter = logging.Formatter('[%(asctime)s] %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.info( 'Пользователь [{}] отключился'.format( sys.argv[5] ) )
Устанавливаем права выполнения на скрипты
chmod +x /usr/local/etc/mpd5/l2tp_server_up.py /usr/local/etc/mpd5/l2tp_server_down.py
Правила межсетевого экрана в файле /etc/firewall.sh
#!/bin/sh fwcmd="/sbin/ipfw" ${fwcmd} -f flush ${fwcmd} add allow ip from any to any via lo0 ${fwcmd} add deny ip from any to 127.0.0.0/8 ${fwcmd} add deny ip from 127.0.0.0/8 to any ${fwcmd} add deny ip from any to ::1 ${fwcmd} add deny ip from ::1 to any ${fwcmd} add allow ipv6-icmp from :: to ff02::/16 ${fwcmd} add allow ipv6-icmp from fe80::/10 to fe80::/10 ${fwcmd} add allow ipv6-icmp from fe80::/10 to ff02::/16 ${fwcmd} add allow ipv6-icmp from any to any ip6 icmp6types 1 ${fwcmd} add allow ipv6-icmp from any to any ip6 icmp6types 2,135,136 ${fwcmd} nat 1 config ip XXX.XXX.XXX.XXX ${fwcmd} add nat 1 ip from 10.10.2.1/24 to any out via vtnet0 ${fwcmd} add nat 1 ip from any to XXX.XXX.XXX.XXX in via vtnet0 ${fwcmd} add allow ip from any to any ${fwcmd} add deny ip from any to any
Устанавливаем права выполнения на скрипт
chmod +x /etc/firewall.sh
Автозапуск межсетевого экрана
echo 'firewall_enable="YES"' >> /etc/rc.conf echo 'firewall_script="/etc/firewall.sh"' >> /etc/rc.conf
Включить прохождение пакетов через шлюз при следующей загрузке
echo 'gateway_enable="YES"' >> /etc/rc.conf
Включить межсетевой экран и NAT после перезагрузки
cat << EOF > /boot/loader.conf ipfw_load="YES" ipfw_nat_load="YES" EOF
Перезагружаем VPS