Обсудим создание своего 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="[email protected]" 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 будет попросту проще, вот и все… без всяких там лишних мостов и других заморочек.
Сейчас можно сделать попроще через Docker:
# Установка Docker
$ apt install docker.io
$ systemctl start docker
$ systemctl enable docker
# Установка и настройка OpenVPN
$ docker volume create --name $OVPN_DATA
$ docker run -v $OVPN_DATA:/etc/openvpn --log-driver=none --rm kylemanna/openvpn ovpn_genconfig -u udp://vpn.YOUR.SITE
$ docker run -v $OVPN_DATA:/etc/openvpn --log-driver=none --rm -it kylemanna/openvpn ovpn_initpki
$ docker run -v $OVPN_DATA:/etc/openvpn -d -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn
$ docker run -v $OVPN_DATA:/etc/openvpn --log-driver=none --rm -it kylemanna/openvpn easyrsa build-client-full YOUR_NAME nopass
# Сохраняем настройки своего нового VPN подключения в файл и пользуемся этим файлом на своем компьютере для подключения к VPN
$ docker run -v $OVPN_DATA:/etc/openvpn --log-driver=none --rm kylemanna/openvpn ovpn_getclient furletov-gv > /home/YOUR_NAME/YOUR_NAME.ovpn
# Разрешаем серверу принимать клиентов для OpenVPN порта
$ ufw allow 1194
$ ufw reload
# YOUR_NAME - заменяйте на ваш юзернейм
P.S. инструкции брал отсюда: https://hub.docker.com/r/kylemanna/openvpn