192 lines
8.7 KiB
Markdown
192 lines
8.7 KiB
Markdown
вступление...
|
||
|
||
В ИНСТРУКЦИИ ПРЕПОЛАГАЕТСЯ, ЧТО ВЫ РАБОТАЕТЕ ОТ РУТА.
|
||
## Подготовка
|
||
ОБНОВИТЬ СИСТЕМУ (отдельный гайд)
|
||
Поскольку многм линуксовые утилиты привычнее, установим знакомый редактор
|
||
```
|
||
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 должен быть направлен в сторону шлюза провайдера. Поэтому далее создадим альтернативную таблицу маршрутизации (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
|
||
```
|
||
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
|
||
```
|
||
На этом настройку сервера можно считать завершённой. |