Files
openvpn_infrastructure/README.md

189 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

вступление...
В ИНСТРУКЦИИ ПРЕПОЛАГАЕТСЯ, ЧТО ВЫ РАБОТАЕТЕ ОТ РУТА.
## Подготовка
ОБНОВИТЬ СИСТЕМУ (отдельный гайд)
Поскольку многм линуксовые утилиты привычнее, установим знакомый редактор
```
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
```
ВАЖНОЕ ЗАМЕЧАНИЕ.
Далее мы сталкиваемся с дилеммой. OpenVPN в режиме DCO не имеет встроенной маршрутизации, а смотрит только системную таблицу маршрутизации. Значит мы должны направить default gateway в сторону клиента-шлюза. Но тогда сервер перестанет отвечать на запросы с основного (физического) интерфейса. Точнее, отвечать будет, но в интерфейс OpenVPN. Значит для трафика, входящего с физического интерфейса, default gateway должен быть направлен в сторону шлюза провайдера. Поэтому далее будет применена магия FreeBSD - FIBs (таблицы маршрутизации), в которой будут запущены демоны 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
```
Вывод не должен содержать маршрута по-умолчанию. При этом вывод есть, значит доступ к серверу мы не потеряли.
Если потеряли, перезагрузка вернёт маршрут по-умолчанию.
*Поскольку сам процесс OpenVPN ничего не знает об альтернативной таблице маршрутизации, он будет пытаться добавлять маршруты в основную (FIB 0). Значит будем добавлять маршруты скриптом, запускающимсся вместе с туннелем.
```
echo 'script-security 2' >> /usr/local/etc/openvpn/openvpn.conf
echo 'up "/usr/local/etc/openvpn/up.sh"' >> /usr/local/etc/openvpn/openvpn.conf
```
```
cat << 'EOF' > /usr/local/etc/openvpn/up.sh
#!/bin/sh
# Добавляем локальный маршрут подсети в FIB 1, чтобы ядро понимало интерфейс
setfib 1 route add 10.210.0.0/24 -iface ovpn0
# Добавляем две половины интернета в FIB 1
setfib 1 route add 0.0.0.0/1 -iface ovpn0
setfib 1 route add 128.0.0.0/1 -iface ovpn0
EOF
```
```
chmod +x /usr/local/etc/openvpn/up.sh
```
конец*
#### Шаг 4. Включаем OpenVPN.
```
service openvpn start
```
SSH-сессия должна остаться активной, так как дефолтная таблица маршрутизации (FIB 0) сервера не изменилась. Проверить, что интерфейс поднялся, можно стандартно: `ifconfig ovpn0`
Проверить, как выглядят маршруты внутри изолированной таблицы, можно командой:
```
netstat -rn -F 1
```
Осталось добавить директивы для нашего клиента-шлюза:
```
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
```
На этом настройку сервера можно считать завершённой.