OpenVPN для интернета на Ubuntu Server 16.04

openvpn

Обсудим создание своего VPN канала для работы в интернете (с полным заворачиваем всего трафика через него). Будем настраивать свой сервер. Целью может быть анонимайзер или такой шлюз для безопасности.. при работе в публичных Wi-Fi сетях, также тоннель для доступа в удаленную сеть + защищенный интернет. Вариантов может быть много всяких.

Ну поехали, давайте максимально кратко. Накатили Ubuntu Server 16.04 LTS, обновили ее.. после приступаем уже непосредственно к установке VPN-сервера.

 

Ставим OpenVPN и утилиту для генерации ключей:

sudo apt-get install openvpn easy-rsa

 

После чего, правим главный конфиг (1.2.3.4 — наш «серый» IP):

sudo nano /etc/openvpn/server.conf
# DF: local address
local 1.2.3.4

# DF: local port
port 1194

# DF: TCP or UDP
proto tcp
;proto udp

# DF: device tun (NAT) or tap (bridge)
;dev tap0
dev tun

# DF: keys
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret

# DF: Diffie-Hellman param
dh dh2048.pem

# DF: NAT network
server 10.8.0.0 255.255.255.0

# DF: Persist NAT IP (optional)
ifconfig-pool-persist ipp.txt

# DF: direct all internet via VPN
push "redirect-gateway def1 bypass-dhcp"

# DF: DNS server (OpenDNS)
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

# DF: ping every 10 sec, total 180 sec
keepalive 10 180

# DF: no compression
;comp-lzo

# DF: process privilege in system + other options
user nobody
group nogroup
persist-key
persist-tun

# DF: actual connection log
status openvpn-status.log

# DF: log activity
verb 3

В текстовом виде: server

 

После чего, надо поправить конфиг ядра системы, выставить параметр:

sudo nano /etc/sysctl.conf
...
net.ipv4.ip_forward = 1

Ребутимся.

 

Дальнейшие действия выполняем напрямую под root, настраиваем ключи и правим параметры:

cp -r /usr/share/easy-rsa/ /etc/openvpn
mkdir /etc/openvpn/easy-rsa/keys

 

Правим конфиг с главными переменными:

nano /etc/openvpn/easy-rsa/vars
# DF: easy-rsa config
export EASY_RSA="`pwd`"
export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
export KEY_DIR="$EASY_RSA/keys"

# Issue rm -rf warning
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR

# PKCS11 fixes
export PKCS11_MODULE_PATH="dummy"
export PKCS11_PIN="dummy"

# Increase this to 2048 if you are paranoid.
export KEY_SIZE=2048

# In how many days should the root CA key expire?
export CA_EXPIRE=3650

# In how many days should certificates expire?
export KEY_EXPIRE=3650

# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="RU"
export KEY_PROVINCE="MSK"
export KEY_CITY="Moscow"
export KEY_ORG="DarkFess"
export KEY_EMAIL="darkfess@darkfess.ru"
export KEY_OU="DFUnit"

# X509 Subject Field
export KEY_NAME="EasyRSA"

В текстовом виде: vars

 

Далее генерируем «параметр для параноиков»))

openssl dhparam -out /etc/openvpn/dh2048.pem 2048

 

Генерация ключей сервера

Выполняется единоразово в самом начале. Укажите при вопросах что это «сервер» и соответствующий почтовый адрес. Изначальные данные будут взяты с шаблона «vars»:

cd /etc/openvpn/easy-rsa
. ./vars
./clean-all
./build-ca
./build-key-server server

После чего скопировать полученные ключи с /etc/openvpn/easy-rsa в /etc/openvpn

 

Далее запускаем сервис и смотрим его статус:

sudo systemctl start openvpn.service
sudo systemctl status openvpn.service

 

Проброс NAT

Это главный момент. Не особо люблю NAT, но что поделать. Пробрасываем VPN подключение с внутренней сети 10.8.0.0 наружу, для автозапуска занесите правила в rc.local:

iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
sudo nano /etc/rc.local

 

Генераций ключей клиентов

Каждому клиенту необходимо сгенерировать свои ключи. В нашем случае

cd /etc/openvpn/easy-rsa
. ./vars
./build-key df1

После чего необходимо скопировать все новые ключи с /etc/openvpn/easy-rsa в /etc/openvpn, также с сервера нам надо забрать ключи клиентские и один серверный: ca.crt, df1.crt, df1.key. Они пригодятся нам для создания основного клиентского профайла. У каждого клиента он будет свой, как и свои ключи.

 

Создание клиентского профайла

После генерации, у нас будет 2 сертификата и 1 ключ. Еще нужен файлик .ovpn, для каждого клиента он свой. Мы засунем все сертификаты (2 шт) и ключи (1 шт) внутрь, чтобы было удобно. Открываем все в текстовом редакторе, а потом составляем (CA будет один на всех). По итогу, мы имеем один профайл. Образец (где 11.22.122.123 — «белый» IP сервера):

# DF: we are
client

# DF: device tun (NAT) or tap (bridge)
;dev tap
dev tun

# DF: TCP or UDP
proto tcp
;proto udp

# DF: our server IP and PORT
remote 11.22.122.123 1194

# DF: other options
resolv-retry infinite
nobind
persist-key
persist-tun

# # # # # # # # # # # # # # # # # # # #

##### DF: keys
### DF: CA server
<ca>
===INSERT HERE CERT "CA"===
</ca>

### DF: client cert
<cert>
===INSERT HERE CERT "CLIENT"===
</cert>

### DF: client key
<key>
===INSERT HERE KEY "CLIENT"===
</key>

# # # # # # # # # # # # # # # # # # # #

# DF: check cert
remote-cert-tls server

# DF: no compression
;comp-lzo

# DF: log
verb 3

В текстовом виде: client

 

Подключение

Ставим клиента, скачать можно тут. Потом нужно просто закинуть файлик в папку OpenVPN/config. Подключение заработает автоматом. Есть такие мобильные приложения (в Google Play или AppStore), принцип тот же (просто закинуть профайл). В Ubuntu Desktop можно поставить расширение для network-manager-openvpn. А для подключения напрямую через командную строку, используйте команду:

openvpn --config client.ovpn

 

Проверить список текущих подключений на сервере можно так:

sudo cat /etc/openvpn/openvpn-status.log

 

Итог

Ну вот и все. Сгенерируйте ключи и профили для нужного количества устройств. После, достаточно лишь закинуть профайл в приложение.. и вуаля! Все работает. Наслаждайтесь секьюрным тоннелем.

PS. изначально я пробовал настроить VPN через полюбившийся мне «белый мост», посредством linux-bridge. Но наткнулся на баг, когда подключение устанавливалось по итогу (device tap), мост исправно работал.. однако выйти за его пределы не удавалось (во внутреннюю сеть или Интернет). Гугл лечить это предлагал с помощью все тех же правил iptables через NAT.. а смысл? В общем я решил, что напрямую через NAT будет попросту проще, вот и все… без всяких там лишних мостов и других заморочек.

Добавить комментарий