Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 204/sshd
tcp6 0 0 :::22 :::* LISTEN 204/sshd
Но обычно может быть запущен какой-нибудь веб-сервер, mail-server, еще что-то... Не знаю, что запущено у вас, поэтому по-очереди вводите следующие команды:
/etc/init.d/apache2 stop
update-rc.d apache2 disable
/etc/init.d/postfix stop
update-rc.d postfix disable
/etc/init.d/nginx stop
update-rc.d nginx disable
/etc/init.d/exim4 stop
update-rc.d exim4 disable
/etc/init.d/rpcbind stop
update-rc.d rpcbind disable
/etc/init.d/nfs-common stop
update-rc.d nfs-common disable
/etc/init.d/rsyslog stop
update-rc.d rsyslog disable
Это должно отключить то, что обычно запущено уже при создании сервера.
Далее, можно настроить sshd. Из соображений безопасности поменяем порт со стандартного на нестандартный и запретим коннект от root.
Редактируем файл /etc/ssh/sshd_config при помощи nano:
nano /etc/ssh/sshd_config
Вкратце расскажу основные горячие клавиши при работе с консольным редактором nano.
nano <путь до файла> - открываем файл в nano.
Ctrl+O - сохранить. Записать изменения в файл. Жмем Ctrl+O, потом Enter.
Ctrl+X - выйти из nano.
Ctrl+K - вырезать целую строку. Будет скопировано в буфер обмена.
Ctrl+U - вставить вырезанную строку, которая находится в буфере обмена.
Ctrl+W - поиск по файлу. Поиск в редаткоре, вводим че нужно -> жмем интер.
Если хотим скопировать часть текста, в самом редакторе выделяем мышкой нужный текст и жмем комбинацию Ctrl+Shift+C. Это скопировать.
Для того того чтобы вставить текст, который сейчас находится в буфере обмена, жмем комбинацию Ctrl+Shift+V.
Не забывайте вводить sudo nano если редактируете файл, к которому у вас нет прав на запись.
Ищем строку Port (будет где-то наверху), и меняем ее значение на другое, отличное от 22, в диапазоне от 1024 до 64000.
Port 1488
Далее, ищем строку PermitRootLogin и меняем ее значение с yes на no:
PermitRootLogin no
Ищем строку PermitEmptyPasswords и проверяем, чтобы там было no:
PermitEmptyPasswords no
Можно еще, но не обязательно, запретить коннект всем пользователям по SSH кроме того, которого мы создали выше. Для этого где-нибудь в файле, например внизу, пишем следующее:
AllowUsers pp-ruloh
После AllowUsers имя юзера.
Внимательно проверяем, запоминаем порт, сохраняем, закрываем. Важно все сделать нормально, потому что-то если вы где-то накосячите в этом файле, например напишите один порт, а потом его забудите, или запретите логин от рута, а другого пользователя у вас нет, то вы просто не сможете подключиться к серверу.
Обычно данная проблема решается в личном кабинете, там можно законектиться по SSH, далее залогиниться под рутом и изменить в файле все что нужно. В крайнем случае выполните переустановку.
После всех манипуляций в файле /etc/ssh/sshd_config, перезапускаем:
systemctl restart sshd
или
service sshd restart
Изменения применятся.
Следующий ваш коннект по SSH будет выглядить следующим образом:
ssh -p 1488 user@ip
где:
-p 1488 - порт SSH, который вы указывали в /etc/ssh/sshd_config
user - пользователь, отличный от root. Под рутом не получится подключиться.
Если у вас винда, то в PUTTY/KITTY тоже меняете порт. Теперь вы будете коннектиться по SSH на сервер через этого юзера. У него нет почти никаких прав, он даже не суперпользователь. Поэтому, для того чтобы производить какие-то манипуляции на сервера, нужно залогиниться под рутом. Для этого под обычным юзером вводим:
su -
И вводим пароль от root. Все - можете делать что хотите. Чтобы выйти из-под рута, вводите exit.
Поднимаем OpenVPN вручную
Итак, собственно, поднимаем OpenVPN-server.
Начнем с установки каких-то пакетов. Некоторые из них вы уже могли ставить, если производили первичную настройку из раздела выше.
Обновим систему:
apt-get update && apt-get dist-upgrade -y
apt-get install -y sudo nano htop curl perl python wget git openssl ca-certificates iptables
И три основных пакета:
apt-get install -y openvpn easy-rsa ufw
После установки пакетов, разархивируем пример конфигурационного файла в папку /etc/openvpn/:
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf
Файл /etc/openvpn/server.conf - основной серверный конфигурационный файл OpenVPN.
Теперь немного отредактируем его:
nano /etc/openvpn/server.conf
Файл длиный, с большим количесвом комментариев (все, что идет в строчке после символа # - комментарий). Строки, которые начинаются с символа ; в данном файле - тоже комментарии.
Частичный разбор конфига будет ниже в статье.
Редактируем. В самом верху сразу будет port:
port 1194
Я поменяю порт на какой-нибудь совсем не стандартный:
port 16122
(Диапазон от 0 до 65000), я выбрал рандомно. Не займите порт, который слушает другой сервис, например в моем случае sshd случает 1488.
Идем дальше. Выбираем протокол - пара строк ниже:
proto udp
И видим, что она никак не закоментированная. Потому что по-умолчанию OpenVPN будет работать по UDP. Если вам нужен TCP, выше есть строчка proto tcp - раскоментируйте ее, удалите символ ; в нчале строки, а proto udp закоментируйте, добавив символ #. Оба нельзя, или то или другое. Я буду показывать на примере UDP, поэтому оставляю как есть.
Опускаемся ниже в конфиге и находим строку:
dh dh1024.pem
Меняем на dh2048.pem:
dh dh2048.pem
Идем ниже и находим закоментированную строку:
;push "redirect-gateway def1 bypass-dhcp"
Раскоментируем:
push "redirect-gateway def1 bypass-dhcp"
Еще чуть ниже находим две раскоментированные строки рядом:
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
Это то, какой DNS будет использоваться. По-умолчанию прописаны сервера OpenDNS, но можем прописать публичные сервера Google:
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
Можете оставить и OpenDNS.
Идем дальше и натыкаемся на строку
;tls-auth ta.key 0 # This file is secret
Просто раскоментируем:
tls-auth ta.key 0 # This file is secret
Листаем ниже и находим строку:
;cipher AES-128-CBC # AES
Это шифрование. Раскоментируем строку и переделаем на AES-256-CBC:
cipher AES-256-CBC
Еще чуть ниже в файле находим две закоментированные строки:
;user nobody
;group nogroup
Раскоментим их:
user nobody
group nogroup
Далее, ниже находим строку, которая начинается со слова status и переделываем ее в следующий вид:
#status /dev/null 2>&1
Закоментированная.
Еще чуть ниже, находим строку, которая начинается со слова log, и придаем ей такой вид:
log /dev/null 2>&1
Не закоментированная. Это логи. Отключить логирование OpenVPN нельзя в привычном понимании, поскольку если закоментировать строку, то по-умолчанию будет писаться в syslog файл (/var/log/syslog).
Строку
;log-append
не трогаем
Еще чуть ниже, verb 3 меняем на:
verb 0
Сохраняем, закрываем. Мы еще вернемся к этому файлу позже.
Теперь включаем перенаправление пакетов, вводим команду:
echo 1 > /proc/sys/net/ipv4/ip_forward
Затем:
cat /proc/sys/net/ipv4/ip_forward
Если возвращает единицу, значит все ОК.
Теперь надо чтобы изменения были и при перезагрузке сервера, поэтому редактирум файл /etc/sysctl.conf:
nano /etc/sysctl.conf
Ищем строку:
#net.ipv4.ip_forward=1
Раскоментируем ее:
net.ipv4.ip_forward=1
Если такой строки в файле нет вообще, добавьте вручную.
Настроим Firewall
Ранее мы установили пакет ufw. Теперь нам нужно добавить некоторые правила. Во-первых, нам нужно дать разрешить траффик на SSH. Я ввожу:
ufw allow 1488
Поскольку у меня sshd слушает порт 1488, если вы не меняли и у вас sshd слушает 22 порт, то вводите:
ufw allow ssh
Далее, нам нужно разрешить траффик на порт, который будет слушать OpenVPN, в моем случае это port 16122, потому что я менял его в конфиг. файле (выше):
ufw allow 16122/udp
Поскольку OpenVPN будет слушать UDP порт, я в конце добавил /udp. Если у вас OpenVPN настроен не на UDP, а на TCP, без слеша на конце (или /tcp).
Если вы ничего не меняли в конфиге, то у вас слушает порт 1194 UDP, а значит:
ufw allow 1194/udp
Теперь нужно изменить Forward Policy, редактируем файл /etc/default/ufw:
nano /etc/default/ufw
Ищем строку:
DEFAULT_FORWARD_POLICY="DROP"
И меняем ее значение на:
DEFAULT_FORWARD_POLICY="ACCEPT"
Теперь нам нужно разобраться с сетевыми интерфейсами, вводим команду:
ip addr
Команда выведет ваши интерфейсы. Там будет интерфейс lo и еще какой-нибудь, например eth0 или venet0. В моем случае интерфейс называется venet0 (ибо OpenVZ). У меня такой вывод:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/void
inet 127.0.0.2/32 scope host venet0
inet МОЙ IP/32 brd МОЙ IP scope global venet0:0
Вам нужен интерфейс, который показывает ваш внешний IP. Из кода выше понятно, что venet0 показывает внешний IP. (inet МОЙ IP)
Далее, что нужно редактировать файл /etc/ufw/before.rules:
nano /etc/ufw/before.rules
И куда-нибудь наверх, вставляем следующее:
# START
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o <ВАШ ИНТЕРФЕЙС> -j MASQUERADE
COMMIT
# END
где вместо <ВАШ ИНТЕРФЕЙС> пишем интерфейс, в моем случае это venet0 и получилось так:
# START
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o venet0 -j MASQUERADE
COMMIT
# END
После всего этого включаем ufw:
ufw enable
Cмотрим на наши правила:
ufw status
Выводом покажет правила, которые вы создавали выше, у меня так:
root@ppVPS:~# ufw status
Status: active
To Action From
-- ------ ----
1488 ALLOW Anywhere
16122/udp ALLOW Anywhere
1488 ALLOW Anywhere (v6)
16122/udp ALLOW Anywhere (v6)
где 1488 - для SSH и 16122 - UDP опенвпн.
Отключить ufw можно так:
ufw disable
Генерируем ключи для сервера. Ранее мы ставили пакет easy-rsa. Теперь копируем папку со скриптами easy-rsa в папку openvpn:
cp -r /usr/share/easy-rsa/ /etc/openvpn
внутри папки easy-rsa создаем папку keys:
mkdir /etc/openvpn/easy-rsa/keys
Теперь сгенерируем Diffie-Hellman длиной 2048 и поместим его в /etc/openvpn:
openssl dhparam -out /etc/openvpn/dh2048.pem 2048
Еще сгенерируем файл ta.key в папку /etc/openvpn, для tls-auth:
openvpn --genkey --secret /etc/openvpn/ta.key
Далее...
Переходим в папку easy-rsa:
cd /etc/openvpn/easy-rsa
Тут лежит файл vars с какими-то переменными, редактируем его:
nano vars
Крутим вниз пока не наткнемся на блок:
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="
[email protected]"
export KEY_OU="MyOrganizationalUnit"
# X509 Subject Field
export KEY_NAME="EasyRSA"
В первых 6 строках можете менять значения, можете оставить как есть. Я оставлю как есть. Пофиг. Главное нельзя оставлять их пустыми.
Но конкретно здесь нас интересует строка
export KEY_NAME="EasyRSA"
Здесь значение меняем на server, что бы было вот так:
export KEY_NAME="server"
Можно поменять на любое другое, но не ебем мозг и меняем как я, потому что иначе вам придется менять значения в server.conf.
Если дали название отличное от server - запомните его.
Вот так. Сохраняем, закрываем файл.
Далее вводим следующее:
source vars
Далее, вводим:
./clean-all && ./build-ca
Будет предлогать вводить какие-то значения, но мы их меняли (или не меняли) в файле vars. Просто везде жмем Enter и все. При этом, дойдя до пункта Name, нажимая Enter будет то имя, которое вы указывали ранее в KEY_NAME у меня это server.
Следующим делом вводим:
./build-key-server <ИМЯ В KEY_NAME>
где: <ИМЯ В KEY_NAME> - это то имя, которое вы давали в файле vars. Если ничего не давали, то по-умолчанию там было Easy-RSA. Я давал имя server, поэтому:
./build-key-server server
Точно таким же образом, везде жмем Enter. Даже там, где предложит ввести 'A challenge password', жмем enter.
Потом дважды вводим символ y, где попросит:
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
В конце вы увидите:
Write out database with 1 new entries
Data Base Updated
Теперь нам нужно переместить все сгенерированные ключи и сертификаты в папку /etc/openvpn.
Всё добро находится в папке /etc/oepnvpn/easy-rsa/keys. Нас интересуют 3 файла (исплючая dh2048.pem и ta.key, которые мы сгенерировали ранее) - ca.crt, server.crt, server.key,
где файлы server.crt и server.key - имеют название, которое вы указывали в KEY_NAME, я указывал server, помним да.
Перемещаем их следующим образом:
cp /etc/openvpn/easy-rsa/keys/{ca.crt,server.crt,server.key} /etc/openvpn/
Идем обратно в папку openvpn:
cd /etc/openvpn
Вводим к консоли ls и смотрим, какие файлы лежат. На данный момент должны быть следующие файлы: ca.crt, dh2048.pem (который мы генерировали ранее), server.conf (основной конфиг), server.crt, server.key и ta.key Еще может быть файл update-resolv-conf.
root@ppVPS:/etc/openvpn# ls
ca.crt dh2048.pem easy-rsa server.conf server.crt server.key update-resolv-conf
Теперь запускаем openvpn:
systemctl start openvpn
или
/etc/init.d/openvpn start
Проверяем, запустился ли:
systemctl status openvpn
или
/etc/init.d/openvpn status
Должно гореть зелененьким (лол), вы увидите надпись:
Active: active (exited) since
Проверяем, слушает ли порт:
netstat -tulpn | grep vpn
Должно вывести один сервис, который слушает на порту, который вы указывали.
У меня вывод такой:
udp 0 0 0.0.0.0:16122 0.0.0.0:* 484/openvpn
Все проверили, молодцы. Теперь остановим:
systemctl stop openvpn
или
/etc/init.d/openvpn stop
Делаем клиента, генерируем ключи.
Для начала нам нужно скопировать пример конфиг. файла для клиента.
Скопируем его в папочку /etc/openvpn/easy-rsa/keys и переименуем (даем расширение .ovpn):
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn
Редактируем файл клиента:
nano /etc/openvpn/easy-rsa/keys/client.ovpn
Листаем файл вниз, натыкаемся на строку
remote my-server-1 1194
где: my-server-1 - IP адрес вашего сервера. Тот, что пришел вам на почту или смотрите по команде ip addr | grep inet и ищите. 1194 - Порт, на котором слушает OpenVPN на вашем сервере, в моем случа это 16122.
Меняйте эту строку, я меняю:
remote 111.222.111.222 16122
Листаем ниже, находим строку:
ns-cert-type server
стираем ее и меняем на:
remote-cert-tls server
Еще чуть ниже строка:
;cipher x
Меняем шифрование на то, которое вы указывали в server.conf. Я указывал AES-256-CBC:
cipher AES-256-CBC
Если вы в server.conf ничего не указывали, то эту строку не трогайте.
Все. Сохраняем и закрываем.
Теперь нужно сгенерировать ключи и серты для клиента.
Перейдем в папку easy-rsa:
cd /etc/openvpn/easy-rsa
Генерим:
./build-key client1
где: client1 - название клиента. Может быть любым. Я сделал client1.
Таким же образом, как и с сервом, везде жмем Enter. И соглашаемся, нажимая y, там где это нужно.
Клиентский конфиг состоит из:
.ovpn файла. В моем случае это client.ovpn.
файла ca.crt - который общий для сервера и все клиентов.
файл ta.key - тоже общий для сервера и клиента. Это для tls-auth, что не обязательно.
файлов client1.crt и client1.key - которые индивидуальные для каждого клиента.
Дело в том, что все эти файлы нужны .ovpn конфигу, без них он не будет работать. Но не будем же мы их везде вместе таскать! Поэтому есть возможность все эти файлы строить в .ovpn конфиг, чтобы был один единый файл и все.
Нужно проделать кое-какие манипуляции, поэтому для удобства создаем папку client1:
mkdir /etc/openvpn/easy-rsa/keys/client1
Нужно скопировать туда конфиг.файл .ovpn и все серты и ключи,
по аналогии с сервером, файлы client1.crt и client1.key имеют названия специфические, в зависимости от того, какое вы указывали имя клиента, выполняя команду выше. Я назвал client1 поэтому у меня они называются именно так.
Копируем:
cp /etc/openvpn/easy-rsa/keys/{ca.crt,client1.crt,client1.key} /etc/openvpn/easy-rsa/keys/client1
За одно копируем client.ovpn (называться может как угодно, хоть xuy.ovpn):
cp /etc/openvpn/easy-rsa/keys/client.ovpn /etc/openvpn/easy-rsa/keys/client1
И не забываем про ta.key, которые лежит в папке openvpn:
cp /etc/openvpn/ta.key /etc/openvpn/easy-rsa/keys/client1/
Переходим в папку client1:
cd /etc/openvpn/easy-rsa/keys/client1
На данный момент там находится 5 файлов:
ca.crt client.ovpn (конфиг файл) client1.crt client1.key ta.key
Теперь нужно быть внимательнее! В особенности с именами файлов.
Внедряем содержимое нужных файлов в наш конфиг .ovpn.
По очереди, в том порядке, в котором это у меня, выполняем следующие команды.
Для ca.crt:
echo '' >> client.ovpn
cat ca.crt >> client.ovpn
echo '' >> client.ovpn
где client.ovpn название конфиг файла.
Теперь для client1.crt:
echo '' >> client.ovpn
cat client1.crt >> client.ovpn
echo '' >> client.ovpn
где client1.crt - серт. файл, которые генерировали выше.
Теперь для client1.key:
echo '' >> client.ovpn
cat client1.key >> client.ovpn
echo '' >> client.ovpn
Теперь для ta.key, нужно для tls-auth:
echo 'key-direction 1' >> client.ovpn
echo '' >> client.ovpn
cat ta.key >> client.ovpn
echo '' >> client.ovpn
Таким образом, все ключи и сертификаты теперь в одном файле .ovpn, и он может работать сам по себе.
Теперь нужно еще немного отредактировать файл client.ovpn:
nano client.ovpn
Листаем, пока не наткнемся на блок:
ca ca.crt
cert client.crt
key client.key
Нам это не нужно, поэтому закоментируем их:
#ca ca.crt
#cert client.crt
#key client.key
Собственно, конфиг клиента готов. Он будет работать, если вы запустите его на OpenVPN клиенте вашего устройства.
Можем запускать OpenVPN:
systemctl start openvpn
или
/etc/init.d/openvpn start
После любых манупуляций в файле server.conf, для того что бы применились изменения, нужно перезапускать OpenVPN:
systemctl restart openvpn
или
/etc/init.d/openvpn restart
Но я хочу еще проделать какие-то модификации на server.conf и client.ovpn
Для начала я хотел бы привести оба конфига в более читабельный и простой вид, а именно, удалить все комментарии и пустые строки.
Сделать это легко. Но для начала, на всякий случай, сделаем backup:
server.conf
cp /etc/openvpn/server.conf /etc/openvpn/server.conf.bak
и client.ovpn:
cp /etc/openvpn/easy-rsa/keys/client1/client.ovpn /etc/openvpn/easy-rsa/keys/client1/client.ovpn.bak
теперь одной командой удаляем все комментарии (# и ; в начале строки) и пустые строки:
server.conf
sed -i '/^[#;]\|^$/ d' /etc/openvpn/server.conf
client.ovpn
sed -i '/^[#;]\|^$/ d' /etc/openvpn/easy-rsa/keys/client1/client.ovpn
И оба наших конфига примут более читабельный вид.
Открываем server.conf
nano /etc/openvpn/server.conf
И куда-нибудь в середину прихерачим следующее:
sndbuf 0
rcvbuf 0
topology subnet
auth SHA512
И на клиенте.
nano /etc/openvpn/easy-rsa/keys/client1/client.ovpn
Куда-нибудь в конфиг, до начала сертификатов и ключей:
sndbuf 0
rcvbuf 0
keepalive 10 120
auth SHA512
Таким образом, мой конфиг server.conf выглядит так:
port 16122
proto udp
dev tun
sndbuf 0
rcvbuf 0
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
dh dh2048.pem
tls-auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
keepalive 10 120
cipher AES-256-CBC
auth SHA512
comp-lzo
persist-key
persist-tun
log /dev/null 2>&1
verb 0
А client.ovpn так (Безключей и сертификатов):
client
dev tun
proto udp
sndbuf 0
rcvbuf 0
remote 111.222.111.222 14500
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
auth SHA512
keepalive 10 120
comp-lzo
verb 3
Можете использовать эти конфиги.
Разберем немного конфиг.
proto udp
Какой протокол юзать, TCP или UDP?
UDP обычно работает быстрее.
TCP более надежный, стабильный, лучше обходит фаерволл - например можно повестить на порт 443.
UDP, также можно повесить на порт, который обычно не блокируют - 53.
Если вас не блокируют, то лучше я думаю UDP. Сам юзаю UDP. На сервере и клиенте должен быть указан один протокол.
Port 16122
На какой порт повесить? Лучше на нестандартный, как у меня. Или замаскировать под какой-то сервис - 443/ssl для tcp и 53/dns для udp
cipher AES-256-CBC
Какое шифрование использовать?
Используйте AES-256-CBC или AES-128-CBC. Если явно не задать, то по-умолчанию будет исопльзоваться Blowfish (cipher BF-CBC).
Этот параметр должен быть и на сервере и на клиенте. Если на сервере есть, на клиенте нет или они отличаются, может не законнектить.
auth SHA512
Если не задавать, будет использоваться auth SHA1. Используйте auth SHA512 или auth SHA256. Этот параметр должен быть и на сервере и на клиенте. Если на сервере есть, на клиенте нет или они отличаются, может не законнектить.
#status /dev/null 2>&1
По умолчанию будет записываться в файл какой-то, какие клиенты сейчас онлайн. Чтобы ничего не писало, нужно закомментировать строку. Я также ЗАЧЕМ то написал /dev/null 2>&1 ...
log /dev/null 2>&1
Это то самое логирование OpenVPN которое для безопасности лучше выключить. Дело в том, что выключить его нельзя, а если закоментировать, то логи будут писаться в /var/log/syslog
Поэтому я раскоментировал и сказал писать в /dev/null.
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
Какие DNS юзать?
Юзайте паблик DNS от Google (8.8.8.8 и 8.8.4.4.) или от OpenDNS (208.67.222.222 и 208.67.220.220).
Утечка DNS под Windows и Linux
Если вы будете юзать этот конфиг на Windows, в конфиг добавляем следующую строку:
setenv opt block-outside-dns
Да, вот так просто. Под MacOS с Tunnelblick все норм.
А под Linux есть файл update-resolv-conf, который находится в папке /etc/openvpn на клиентской машине. Файл может иметь название или update-resolv-conf или update-resolv-conf.sh. Поэтому на клиентском Линукс вводим в терминале:
ls /etc/openvpn | grep update
И узнаем название файла.
Далее, в конфиг .ovpn нужно вставить следующие строки:
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
где update-resolv-conf - название файла, которое вы получили выше.
Перекидываем конфиг .ovpn с серва на клиент.
Можете просто открыть клиентский конфиг, скопировать все полностью и вставить у себя на машине, окда.
Если вы создавали пользователя и запрещали ssh коннект от рута, то первым делом нужно поместить .ovpn конфиг в домашнюю папку созданного пользователя. У меня это был pp-ruloh
cp /etc/openvpn/easy-rsa/keys/client1/client.ovpn /home/pp-ruloh
Изменить права у файла:
chown pp-ruloh:pp-ruloh /home/pp-ruloh/client.ovpn
Linux. Будем юзать sftp.
sftp -P 1488 pp-ruloh@ip
где 1488 - порт на котором слушает sshd.
Как законнектились, мы уже будем в домашней папке pp-ruloh. Можем посмотреть файлы - вводим ls.
копируем конфиг:
get client.ovpn ~/
Windows, linux, MacOS: скачиваем программу для работы по FTP - FileZilla
и подключаемся к серву по sftp. Нужено будет указать port sftp (у меня 1488), пользователя (pp-ruloh, ибо руту зарпетили). Копируем файл куда хотим и радуемся. Как пользоваться программой разберетесь сами.
Поднимаем OpenVPN скриптом
Поднять OpenVPN вручную вам не под силу? Не отчаивайтесь, у меня для вас хорошие новости!
На Github существует Open Source скрипт, который позволяет быстро и легко поднять OpenVPN сервер на вашем VPS. Скрипт называтся openvpn-install, и вот ссылка на
Github. И этого скрипта есть куча форков, которые вы можете изучить.
Посмотреть исходный код можно
здесь. Приступим. Работаем под пользователем root или суперпользователем.
Для начала, обновим систему:
apt-get update && apt-get dist-upgrade -y
Если вы уже пытались поднять OpenVPN вручную, но у вас ничего не получилось, то нужно сначала его полностью снести. Удаляем openvpn:
apt-get remove --purge openvpn
удаляем папку:
rm -rf /etc/openvpn/
выключаем ufw:
ufw disable
и установим нужные пакеты:
apt-get install -y sudo nano curl perl python wget git iptables openvpn openssl ca-certificates
Скачиваем скрипт в домашнюю папку root:
git clone
https://github.com/Nyr/openvpn-install.git ~/nyr-openvpn
Переходим туда:
cd ~/nyr-openvpn/
Запускаем скрипт:
bash openvpn-install.sh
И вы попадете в так называемый Инсталятор. Где нужно будет отвечать на вопросы или что-то вписывать. Для перехода на следующий этап установки жмите Enter.
Первый делом, предложит ввести внешний IP адрес, но вероятнее всего скрипт сам его определит:
IP address: 111.222.111.222
Следующий этап, выбрать протокол. Я жму 1 и выбираю UDP. Далее, выбираете порт. Я поставлю, например 14000. После этого предложит выбрать DNS сервера. Выбор будет из Google, OpenDNS или текущих, которые на VPS и еще каких-то. Я выбираю OpenDNS, жму 3. После этого предложит ввести имя клиента. Я введу "pp-ruloh". Далее начнется скачивание-утановка пакетов, генерация ключей, сертификатов и конфигурационных файлов. когда все закончится, он поместит конфиг. в домашнюю папку юзера, от имени которого запсукался скрипт. То есть, сейчас конфиг лежит по адресу:
/root/
Собственно, на этом конфигурация OpenVPN скриптом завершается. Можно уже сейчас взять новый конфиг и использовать. Интересно, чего он там такого сгенерировал вам, посмотрим на конфиг pp-ruloh.ovpn:
nano ~/pp-ruloh.ovpn
(без ключей и сертификатов)
client
dev tun
proto udp
sndbuf 0
rcvbuf 0
remote 111.222.111.222 14000
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
comp-lzo
setenv opt block-outside-dns
key-direction 1
verb 3
Все вроде бы нормально, да лучше auth SHA512 явно указать. Поэтому добавим
auth SHA512
Вот так:
client
dev tun
proto udp
sndbuf 0
rcvbuf 0
remote 111.222.111.222 14000
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
auth SHA512
comp-lzo
setenv opt block-outside-dns
key-direction 1
verb 3
Обратите внимание, что скрипт уже запихнул фичу для предотвращения утечки DNS под клиент Windows:
setenv opt block-outside-dns
Если у вас Linux или MacOS - эту строку лучше закомментировать.
Теперь посмотрим на серверный конфиг server.conf:
nano /etc/openvpn/server.conf
port 14000
proto udp
dev tun
sndbuf 0
rcvbuf 0
ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
keepalive 10 120
cipher AES-256-CBC
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
crl-verify crl.pem
Здесь также добавляем auth SHA512 (а то работать не будет, если на клиенте указан а на серве нет), делаем verb 0. Также нужно проделать следующее. Нужно закомментировать строку.
status openvpn-status.log
И добавить log:
log /dev/null 2>&1
Где-то выше писал, зачем он нужен. Получилось так:
port 14000
proto udp
dev tun
sndbuf 0
rcvbuf 0
ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
keepalive 10 120
cipher AES-256-CBC
auth SHA512
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
#status openvpn-status.log
log /dev/null 2>&1
verb 0
crl-verify crl.pem
Берем клиентский файл-конфиг и помещаем на ваше устройство. Об этом я писал выше.
При повторном запуске скрипта из-под рута:
bash /root/nyr-openvpn/openvpn-install.sh
Скрипт предложит создать нового клиент, удалить существующего (не сможет больше коннектиться) или удалить OpenVPN.
Клиенты OpenVPN под разные ОС
Поскольку OpenVPN не встроен по-умолчанию ни в одну популярную ОС, то требуется установить сторонее ПО - клиент OpenVPN.
Windows
Под Windows есть официальный клиент, называется OpenVPN GUI.
Скачать его можно на офф. сайте
OpenVPN. Скачиваете, устанавливаете. Появится ярлык на раб. столе, после запуска - иконка в трее.
Далее, помещаете ваш .ovpn файл в папку config, в установленной папке OpenVPN. В общем, если устанавливать OpenVPN GUI по-умолчанию в папку Program Files, то адрес такой:
C:\Program Files\OpenVPN\config
В эту папку кидаем конфиги .ovpn. Потом из трея можно запускать VPN. Все достаточно просто.
Linux
На Линукс в репозиориях вашего дистрибутива пакет скорее всего будет называется "openvpn" (еще может openvpn-client), и ставится следующим образом:
sudo apt-get install openvpn
Если у вас Debian-подобные дистрибутивы (Debian, Ubuntu, Mint). Если у вас дистрибутив другой линейки - сами разберетесь как ставить.
Работает это следующим образом. У вас есть .ovpn файл, далее вы в терминале вводите команду:
sudo openvpn --config <путь до файла .ovpn>
где <путь до файла .ovpn>, собственно, путь до файла .ovpn.
Или можете скормить файл network-manager ' у.
MacOS
Под MacOS из клиентов OpenVPN я знаю только Tunnelblick. Скачать его можно
здесь. Устанавливается просто, требует права суперпользователя. По-умолчанию будет отпрыать файлы с расширением .ovpn. Будет иконка в трее, там конектимся. Можно настроить, что бы коннектился к OpenVPN сразу при загрузке системы. Когда соеденение обрывается с VPN, интернет пропадает. В этом случае нужно вручную отсоеденяться от VPN.
Android
Официальный клиент OpenVPN Connect под Android доступен для скачивания на
Google Play
iOS
Для iOS клиент скачиваем из
AppStore.
Клиенты, предоставляемые провайдером VPN. Некоторые провайдеры предоставляеют свой собственный OpenVPN клиент под разные ОС и платформы. Использовать их или нет, решать вам. Но это потенциально не очень безопасно.
Запрещаем весь траффик не через OpenVPN на клиенте
Правила iptables. Только для адептов Луникса. Что делать если VPN внезапно отключился? Или вы забыли его включить вообще? Обычно, когда внезапно обнаруживаешь, что траффик идет не через VPN, и при этом ты не используешь Whonix, то через 3 секунды понимаешь что твои штаны полны говна. Что нужно делать чтобы явно ограничить весь траффик?
А вот и сами правила:
# запрещаем все входящие и исходящие
iptables -P INPUT DROP
iptables -P OUTPUT DROP
# разрешаем уже установленные соединения и локалхост
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# разрешаем соединения до VPN (VPN_IP заменить на ip вашего VPN сервера)
iptables -A OUTPUT -d VPN_IP -j ACCEPT
# разрешаем любые соединения через VPN
iptables -A OUTPUT -o tun+ -j ACCEPT
В конце:
# разрешаем любые соединения через VPN
iptables -A OUTPUT -i tun+ -j ACCEPT
Было изменено на:
# разрешаем любые соединения через VPN
iptables -A OUTPUT -i tun+ -j ACCEPT
Есть у нас правила, че дальше? Теперь открываем терминал в вашем Линуксе
И создаем файл, который назовем vpn.rules:
touch ~/vpn-rules.sh
Поместим туда все правила:
nano ~/vpn-rules.sh
В самом верху файла пишем:
#!/bin/sh
Далее, правила из кода выше. Копируете - вставляете, меняете
# разрешаем соединения до VPN (VPN_IP заменить на ip вашего VPN сервера)
iptables -A OUTPUT -d VPN_IP -j ACCEPT
там где VPN_IP на IP вашего сервера (указан в .ovpn конфиге).
Сохраняете - закрываете.
Запсукае скрипт из под рута или sudo:
sudo sh ~/vpn-rules.sh
Теперь у нас применились правила. Можете проверить - без VPN инет работать не будет. Этот скрипт можно запускать каждый раз. А можно сохранить правила:
sudo iptables-save > /etc/iptables/iptables.rules
И сделать сервис iptables автозапускающимся при загрузки системы:
systemctl enable iptables
На этом все.
Боремся с детектом OpenVPN
VPN может детектироваться конечным ресурсом (например сайт) какими-то хитро-выебанными способами. Для начала можете читануть статью на
хабре
Заходим на
browserleaks.com
И смотрим строку "TCP/IP OS Fingerprinting"
Что делать?
Если у вас, как у меня, конфиг UDP, то можно проделать следующее. Мне помогает, если прописать
mssfix 0
На клиенте .ovpn и сервере server.conf