вступление... В ИНСТРУКЦИИ ПРЕПОЛАГАЕТСЯ, ЧТО ВЫ РАБОТАЕТЕ ОТ РУТА. ## Подготовка ОБНОВИТЬ СИСТЕМУ (отдельный гайд) Поскольку многм линуксовые утилиты привычнее, установим знакомый редактор ``` pkg install nano ``` Установим OpenVPN и easy-rsa: ``` pkg install openvpn easy-rsa ``` Загрузим модуль ядра для поддержки DCO: ``` kldload if_ovpn ``` Чтобы модуль ядра подгружался автоматически, выполним: ``` echo 'if_ovpn_load="YES"' >> /boot/loader.conf ``` Разрешим использование OpenVPN в системе: ``` echo 'openvpn_enable="YES"' >> /etc/rc.conf ``` Разрешим маршрутизацию трафика: ``` sysctl net.inet.ip.forwarding=1 ``` Чтобы это делалось автоматически при загрузке, выполним: ``` echo 'gateway_enable="YES"' >> /etc/rc.conf ``` И создадим структуру папок OpenVPN: ``` mkdir -p /usr/local/etc/openvpn/ccd ``` ## Ключи и сертификаты Создадим структуру: ``` mkdir /root/openvpn-ca && cd /root/openvpn-ca && easyrsa init-pki ``` По-умолчанию сроки действия сертификатов невелики, создадим файл с переменными: ``` cat << 'EOF' > vars set_var EASYRSA_CERT_EXPIRE 3650 set_var EASYRSA_CA_EXPIRE 7300 EOF ``` Далее создадим CA: ``` easyrsa build-ca ``` И теперь создадим сертификаты сервера и шлюза: ``` easyrsa build-server-full server nopass ``` ``` easyrsa build-client-full gateway-client nopass ``` Скопируем сертификаты в рабочую папку OpenVPN: ``` cp pki/ca.crt pki/issued/server.crt pki/private/server.key /usr/local/etc/openvpn/ ``` ## Настройка сервера Создаём конфиг сервера: ``` cat << 'EOF' > /usr/local/etc/openvpn/openvpn.conf dev ovpn0 dev-type tun proto udp port 1443 topology subnet server 10.210.0.0 255.255.255.0 client-config-dir /usr/local/etc/openvpn/ccd push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 1.1.1.1" client-to-client cipher AES-128-GCM data-ciphers AES-128-GCM ca /usr/local/etc/openvpn/ca.crt cert /usr/local/etc/openvpn/server.crt key /usr/local/etc/openvpn/server.key dh none keepalive 10 120 explicit-exit-notify 1 persist-key persist-tun status /var/log/openvpn-status.log verb 3 EOF ``` Добавим директивы для нашего клиента-шлюза: ``` cat << 'EOF' > /usr/local/etc/openvpn/ccd/gateway-client ifconfig-push 10.210.0.254 255.255.255.0 iroute 0.0.0.0 0.0.0.0 push-remove "redirect-gateway def1 bypass-dhcp" EOF ``` #### ВАЖНОЕ ЗАМЕЧАНИЕ. Далее мы сталкиваемся с дилеммой. OpenVPN в режиме DCO не имеет встроенной маршрутизации, а смотрит только системную таблицу маршрутизации. Значит мы должны направить default gateway в сторону клиента-шлюза. Но тогда сервер перестанет отвечать на запросы с основного (физического) интерфейса. Точнее, отвечать будет, но в интерфейс OpenVPN. Значит для трафика, входящего с физического интерфейса, default gateway должен быть направлен в сторону шлюза провайдера. Поэтому далее создадим альтернативную таблицу маршрутизации (FIB=Forwarding information base), в которой будут запущены демоны sshd и openvpn. На линуксе нельзя направить процессу талицу маршрутизации, только долгая и мучительная возня с iptables. Лично я убил гору времени, не получив результата. #### Шаг 1. Настройка ядра FreeBSD на работу с двумя таблицами (FIB) По умолчанию во FreeBSD одна таблица маршрутизации. Добавим вторую: ``` echo 'net.fibs="2"' >> /boot/loader.conf ``` *Чтобы применить это без перезагрузки всего сервера, выполните команду в консоли:* ``` sysctl net.fibs=2 ``` #### Шаг 2. Заполним альтернативную таблицу (FIB 1) при старте. Узнайте имя своего физического интерфейса, а также локальную сеть и адрес шлюза сс помощью команды `ifconfig` и `netstat -rn` ``` nano /etc/rc.local ``` Если файл уже существует, добавьте туда две команды (без шебанга). Но на чистой системе он должен отсутствовать. И естественно, **замените имя интерфейса, сеть и адрес шлюза на свои**. ``` #!/bin/sh /sbin/route add -fib 1 -net 157.22.241.0/24 -interface vtnet0 route add -fib 1 default 157.22.241.1 ``` Перезагрузимся и проверим обе таблицы маршрутизации. ``` netstat -rn -F 0 ``` ``` netstat -rn -F 1 ``` Вторая таблица должна приссутствовать и в ней должны быть два маршрута из */etc/rc.local* #### Шаг 3. Перемещение нужных процессов в FIB 1 Выполним команду: ``` setfib service sshd restart ``` Это единоразово переместит ssh в fib 1. **Переподключимся к серверу по ssh**. Проверим, какую таблицу ммаршрутизации использует наш демон. ``` ps -ax -o pid,fib,command | grep -E 'sshd' ``` Если во второй колонке мы видим единицы, значит мы вссё сделали правильно, и доступ к серверу через FIB 1 есть. Можно модифицировать FIB 0 под наши цели. Применим изменения перманентно. Для этого добавим в `/etc/rc.conf` следующие строки: ``` sshd_fib="1" openvpn_fib="1" ``` Перезагрузимся и проверим, что мы точно имеем доступ к серверу именно благодаря альтернативной таблице. ``` ps -ax -o pid,fib,command | grep -E 'sshd|openvpn' ``` Должна показывать единицы во второй колонке, ессли это так, удалим маршрут по-умолчанию в основной таблице: ``` route del -fib 0 default ``` И проверим саму таблицу: ``` netstat -rnF 0 ``` Вывод не должен содержать маршрута по-умолчанию. При этом вывод есть, значит доступ к серверу мы не потеряли. Если потеряли, перезагрузка вернёт маршрут по-умолчанию. #### Шаг 4. Настраиваем FIB 0 при включении openvpn. Для этого создадим два скрипта. Они будут выполняться при включении и выключении openvpn. ``` cat << 'EOF' > /usr/local/etc/openvpn/route-up.sh #!/bin/sh /sbin/route change -fib 0 default 10.210.0.254 echo "FIB 0 default route changed to 10.210.0.254" EOF ``` ``` cat << 'EOF' > /usr/local/etc/openvpn/route-down.sh #!/bin/sh /sbin/route change -fib 0 default 157.22.241.1 echo "FIB 0 default route restored to provider gateway" EOF ``` Сделаем скрипты исполняемыми: ``` chmod +x /usr/local/etc/openvpn/route-up.sh chmod +x /usr/local/etc/openvpn/route-down.sh ``` ``` service openvpn start ``` Осталось добавить директивы для нашего клиента-шлюза: ``` cat << 'EOF' > /usr/local/etc/openvpn/ccd/gateway-client ifconfig-push 10.210.0.254 255.255.255.0 iroute 0.0.0.0 0.0.0.0 push-remove "redirect-gateway def1 bypass-dhcp" EOF ``` На этом настройку сервера можно считать завершённой.