Собственный vpn?

Собственный vpn? VPN, Openvpn, Обход, Ограничения, Длиннопост

Начну, пожалуй, с причин, по которым я захотел его. Живу я с недавних пор в районе, где проводного интернета нет, а мобильный по LTE представлен только одним оператором. После переезда я расчехлил свой старый TP-LINK MR 3020, припаял разъем под антенну wifi и накрутил саму антенну, в usb вставил купленный у друга huawei m150-2 (E3372s). Все было замечательно, пока единственный доступный оператор с единственным "безлимитным" тарифом не решил брать 200% сверху за факт "раздачи" интернета. Итого - 300%. Я такие вещи обычно называю - "о***ли".

На все это наложилось нежелание постоянно видеть сообщение, что такой-то сайт закрыт по решению каких-то там дядек, знающих лучше меня, как мне жить. А интернет нужен для работы. И привык я смотреть фильмы и сериалы онлайн, а то и в UO на FW погонять изредка.

То есть скорость скачивания и задержки должны быть приемлимыми.

К тому же, я заметил, что вечерами явно присутствует ограничение на число соединений. то есть - открываем 10 вкладок, 11-я уже говорит об ошибке - "соединение сброшено". Закрываем какую-либо, обновляем 11-ю - все открывается.


Я хотел установить клиента VPN сразу в роутере, что позволило бы не заморачиваться с клиентами на конечных устройствах (два андроид-фона, медиацентр на pi2/openelec, пара ноутов) и скрыть от провайдера сам факт раздачи. Провайдер должен видеть один шифрованный канал на подходящий для этого порт.


Популярных технологий, имеющих возможность стартануть на роутере, было две. Это L2TP и OpenVPN. Для первой даже была вебморда, но, как я ни старался - клиентская часть не поднималась. А, да. В "родной" прошивке отсутствовала возможность использовать L2TP через usb 3g/4g, только как авторизационная составляющая для WAN-порта (ethernet). С openwrt я был на "вы", и осторожно, поэтому предпочел поискать готовую прошивку, которой можно было бы прошиться через стандартную вебморду. И я ее нашел.


Построена она на openwrt, поэтому сия инструкция сгодится для любой openwrt - прошивки с установленным пакетом openvpn, да и для других кастомных прошивок тоже.


Итак - OpenVPN. Серверная часть. Опыт работы с ним уже был, пусть и без клиентской части в роутере. Я много работаю с дистрибутивами CentOS, преимущественно 6.X, поэтому её и выбрал. Нам понадобится vps/vds сервер, который можно относительно недорого арендовать. У меня была возможность протестировать три площадки, и по итогам я сделал свой выбор. Рассматривал площадки исключительно в РФ, хотелось комфортной скорости в рунете. Как ни крути, с зарубежными площадками есть такие проблемы.


Первая площадка - недорогой VDS на kvm (более подходящая технология виртуализации), 129р/мес, 400мб ОЗУ, ssd, MSK. Пинги радуют, но общая скорость маловата.

Вторая площадка - kvm, Новосибирск. 400р. Ресурсы сервера хорошие. Пинги не радуют, скорость по итогу тоже.

Третья площадка - OpenVZ, MSK, 1Gb ОЗУ, ssd, 299р. (UDP: полез проверять цены и выяснил, что тарифы подняли, но ресурсов значительно больше. Подробнее в самом конце поста). Пришлось попросить техподдержку подключить tun/tap девайсы, сделайте это сразу, если у Вас OpenVZ. Перед покупкой уточните, что это возможно. Ссылку на эту площадку я отправлю попросившему пикабушнику в электропочту, но запросы пишите мне на мойник_собака_майлру. Приложите ссылку на свой профиль, буду проверять каждого, пикабушникам 1 день не высылаю :)


Как Вы уже поняли, ограничения на доступы к сайтам не распространяются на хостинги и ДЦ, не предназначенные для розничной доставки интернета населению. Это хорошо.


Итак, у Вас есть VDS, это либо KVM, либо OpenVZ с подключенными tun/tap девайсами. Заказываем операционку - CentOS 6.x [minimal i686]. Скачиваем клиент ssh - например, putty. Логинимся по ip сервера на порт 22 по протоколу ssh, вводим имя root и пароль. Мы в консоли!

Собственный vpn? VPN, Openvpn, Обход, Ограничения, Длиннопост

Также нужно качнуть WinSCP либо другой файл-менеджер, поддерживающий SSH, и залогинится похожим образом. В первом клиенте мы вбиваем команды, во втором оперируем с файлами. Поехали устанавливать серверную часть.


Обновляем все пакеты

yum update -y

Устанавливаем репозиторий

cd /usr/src/ && wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8... && wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm


Устанавливаем нужные пакеты

yum install mc wget unzip ntp
yum -y install openvpn

Настраиваем автообновление даты и времени, правильные значения нам нужны для работы openvpn-сервера

ntpdate pool.ntp.org && service ntpd start && chkconfig ntpd on && rm -f /etc/localtime && cp -uf /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Разрешаем форвард пакетов

sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
sudo sysctl -p

Возможно, на kvm также понадобится отключить selinux

sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
reboot


Сервер перезагрузится, логинимся заново. Далее нам нужно скачать easyrsa3, распаковать его и сгенерировать несколько сертификатов, нужных для работы как сервера, так и клиента:

cd /usr/src && wget http://hldns.ru/dnld/ovpn/master.zip
unzip master.zip && rm -f master.zip && ln -s /usr/src/easy-rsa-master/easyrsa3 /etc/openvpn/
cd /etc/openvpn/easyrsa3 && ./easyrsa init-pki && ./easyrsa build-ca nopass && ./easyrsa build-server-full server nopass
cd /etc/openvpn/easyrsa3 && ./easyrsa gen-dh
cp /etc/openvpn/easyrsa3/openssl-1.0.cnf /etc/openvpn/
cd /etc/openvpn/easyrsa3/ && ./easyrsa build-client-full client nopass

Также нам понадобится ключ TA:

cd /etc/openvpn && openvpn --genkey --secret ta.key


Скачивание идет с моего сайта, ибо я не помню, где брать оригинал и не знаю, будет ли подходящая версия. Последней строкой генерируется сертификат клиента. Следующие файлы нужно пока сохранить себе на комп через WinSCP: /etc/openvpn/easyrsa3/pki/private/client.key, /etc/openvpn/easyrsa3/pki/ca.crt, client.crt, /etc/openvpn/ta.key


Далее создаем файл /etc/openvpn/server.conf следующего содержимого:

mode server
tls-server
dev tap
port 664
script-security 2
tls-auth /etc/openvpn/ta.key 0
ca easyrsa3/pki/ca.crt
cert easyrsa3/pki/issued/server.crt
key easyrsa3/pki/private/server.key
dh easyrsa3/pki/dh.pem
crl-verify easyrsa3/pki/crl.pem
ifconfig 10.8.0.1 255.255.255.0
ifconfig-pool 10.8.0.2 10.8.0.254
ifconfig-pool-persist ipp.txt 0
push "route-gateway 10.8.0.1"
push "redirect-gateway def1"
push "dhcp-option DNS 77.88.8.88"
push "dhcp-option DNS 8.8.8.8"
push "sndbuf 393216"
push "rcvbuf 393216"
sndbuf 393216
rcvbuf 393216
cipher BF-CBC
tls-timeout 120
keepalive 10 120
persist-key
persist-tun
tun-mtu 1500
fragment 1300
mssfix
fast-io
verb 3
status openvpn-status.log
log openvpn.log
log-append openvpn.log

Краткое резюме конфига сервера. TAP вместо TUN я выбрал, потому что хотел соединять через этот же сервер несколько мест в одну локальную сеть - это по работе. Для этого достаточно сгенерировать дополнительные клиентские сертификаты и их настроить в клиенте вместо client.key/client.crt. Строчка выше, где присутствует build-client-full.

Режим udp (протокол udp) позволяет работать тоннелю с минимальными задержками, минуя ненужные на данном этапе процедуры гарантированной доставки, которые имеются в TCP. Пусть этим занимаются протоколы и приложения уже внутри тоннеля.

Порт 664/udp позволяет слегка "прикинуться" протоколом ASF-SECURE-RMCP. Я не знаю, зачем он нужен, но в нем есть слово SECURE, и наш тоннель зашифрован. Лучшего я не придумал. 443 (https) работает по TCP, нам неподходит. Шифрование BF-CBC является простым и легким, минимально нагружающим процессор как сервера, так и клиента. Напомню, клиент у нас - роутер, и сложное шифрование очень значительно снижает скорость работы.


Далее создадим в каталоге /etc/openvpn файл ipp.txt, и будем в него прописывать внутренние адреса наших клиентов. Пока клиент у нас один. Не то, чтобы это было необходимо, но так будет проще в будущем, если клиентов несколько.

client,10.8.0.250

Настраиваем права:

chown -R openvpn. /etc/openvpn


Включаем автозагрузку openvpn и стартуем серверную часть:

chkconfig openvpn on
service openvpn start

Если старт не удался - лезем в лог и читаем, думаем. Можно выложить ошибку в комменты, подумаем вместе. Лог у нас задан в конфиге сервера: log openvpn.log, располагается в /etc/openvpn.


Для работы в SSH-консоли пригодится уже установленный нами файл-менеджер, запускаемый одноименной командой: mc. Если кто знаком с norton commander, far или хотя бы total commander - то он проблем с использованием испытывать не будет.


Итак, серверная часть запущена. Но у нас есть только подключение к серверу, а нам надо, чтобы сервер прикинулся роутером и NAT-ил трафик. Тут нам поможет iptables, и у нас два варианта. Более классический, но не всегда работающий на OpenVZ:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

где нужно eth0 заменить на имеющийся интерфейс, который видно командой ifconfig. Если не прокатило, то удаляем правило (-A меняем на -D) и пробуем такой вариант:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -d 0/0 -j SNAT --to-source ВАШ_ВНЕШНИЙ_IP


Возможно, включить "таблицу nat" также нужно посредством обращения в техподдержку, если у вас OpenVZ!


Внешний ip видно все той же командой ifconfig, да и в ПУ хостера тоже. Все эти манипуляции с iptables имеет смысл делать после подключения клиента, чтобы было чем проверять результат. Когда все получилось - сохраняем конфиг iptables: service iptables save


Теперь клиент. Лезем на роутер все теми же putty и winscp. Создадим в каталоге /root каталог openvpn, скопируем в него ранее сохраненные с сервера файлы:

Собственный vpn? VPN, Openvpn, Обход, Ограничения, Длиннопост

Файл client.ovpn нужно создать, его содержимое:

client
proto udp
remote СЕРВЕРА_IP 664
resolv-retry infinite
dev tap
remote-cert-tls server
script-security 2
tls-auth /root/openvpn/ta.key 1
ca /root/openvpn/ca.crt
cert /root/openvpn/client.crt
key /root/openvpn/client.key
cipher BF-CBC
persist-key
persist-tun
tun-mtu 1500
fragment 1300
mssfix
fast-io
verb 0
tls-timeout 120
keepalive 20 360


Если вдруг на вашем openwrt не установлен openvpn - то установите его

opkg update
opkg install openvpn-openssl

Далее приводим файл /etc/config/openvpn к виду:

package openvpn
config openvpn custom_config
option enabled 1
option config /root/openvpn/client.ovpn


И в вебморде luci включаем его:

Собственный vpn? VPN, Openvpn, Обход, Ограничения, Длиннопост

Проверяем, изменился ли наш ip-адрес например на myip.ru. Должен быть адрес сервера vds.
Если что не так - по прежнему читаем и анализируем лог на сервере.


Теперь дополнение. Если вдруг Вам нужно пробросить какой-либо порт внутрь локалки - то пробрасывать дважды - на сервере и в роутере. С роутером сами разберетесь, а вот как на сервере, для примера:

iptables -t nat -A PREROUTING -p ПРОТОКОЛ(tcp/udp) -d ВНЕШНИЙ_IP --dport ВНЕШНИЙ_ПОРТ -j DNAT --to-destination 10.8.0.250:ПОРТ_КУДА


Не забываем service iptables save после проверки.


Писалось по памяти, что то мог забыть или где то незначительно ошибиться. Готов в комментах оказать поддержку. Также, при возникновении проблемы  прошерстите комменты, вдруг ее уже решили?


Спасибо!

UPD: Выяснил, что с момента аренды сервера на самой "быстрой" по итогам тестов площадке изменились цены, но и выросли ресурсы. Теперь она за 420 р/мес предлагает 4гб озу и два быстрых ядра. В связи с чем могу абсолютно бесплатно помочь настроить серверную часть для ряда пикабушников, изъявивших данное желание.


То есть - платить Вы будете за сервер вскладчину. Но вам нужно организоваться, т.е. нужен человек, который будет собирать ежемесячно оплату и собсно оплачивать сервер, отвечать за него и т.д. Мне нехочется этим заниматься. Но настроить сервер и наделать сертификатов с конфигами я могу, повторюсь, бесплатно.


Итоги через OpenVPN:

Собственный vpn? VPN, Openvpn, Обход, Ограничения, Длиннопост
Собственный vpn? VPN, Openvpn, Обход, Ограничения, Длиннопост

Без OpenVPN:

Собственный vpn? VPN, Openvpn, Обход, Ограничения, Длиннопост
Собственный vpn? VPN, Openvpn, Обход, Ограничения, Длиннопост

GNU/Linux

1K постов15.5K подписчик

Добавить пост

Правила сообщества

Все дистрибутивы хороши.

Будьте людьми.

Вы смотрите срез комментариев. Показать все
132
Автор поста оценил этот комментарий

Бля, на секунду подвис пытаясь понять на какую вкладку я зашёл - пикабу или хабр.

раскрыть ветку (21)
91
Автор поста оценил этот комментарий

на хабре это бы назвали "детской песочницой" и обложили бы уями)

там я пощу по работе

https://habrahabr.ru/users/whoim/topics/

раскрыть ветку (20)
33
DELETED
Автор поста оценил этот комментарий
Комментарий удален. Причина: данный аккаунт был удалён
раскрыть ветку (1)
Автор поста оценил этот комментарий

То, что вы называете React "хипстерской херотой" говорит лишь о том, что вы его не знаете.

77
Автор поста оценил этот комментарий
обложили бы уями
И правильно бы сделали! Хотя Хабр уже не тот. По пунктам, что не так:

- сборка OpenWrt из недоверенного источника

- неактуальная версия CentOS

- исходники easy-rsa из недоверенного источника (причем easy-rsa вообще есть в репах)

- отключение SElinux

- репозиторий Remi? серьезно? мы тут PHP хостинг организуем или VPN?

- стоит добавить описание опций OpenVPN и описание работы с easy-rsa, вместо скриншота с файликами в WinSCP


Ну и шедевр:

> Я не знаю, зачем он нужен, но в нем есть слово SECURE, и наш тоннель зашифрован

раскрыть ветку (11)
88
Автор поста оценил этот комментарий

Ну вот, обложили таки)

раскрыть ветку (10)
12
Автор поста оценил этот комментарий

На хабре вряд ли обложили бы. Потому что сейчас на хабре есть даже статьи об обновлении Ubuntu. И даже не заминусованные

раскрыть ветку (3)
3
DELETED
Автор поста оценил этот комментарий
Комментарий удален. Причина: данный аккаунт был удалён
раскрыть ветку (2)
Автор поста оценил этот комментарий

Есть ссылка?

раскрыть ветку (1)
DELETED
Автор поста оценил этот комментарий
Комментарий удален. Причина: данный аккаунт был удалён
6
Автор поста оценил этот комментарий
Это не обложили. Это конструктивная критика, справедливая кстати, я поддерживаю
раскрыть ветку (5)
2
Автор поста оценил этот комментарий
Что конкретно поддерживаете? С автором комментария я не стал сраться, с вами - могу.
Соглашусь только с пунктом про Реми - затесался, планировал только епел.
раскрыть ветку (4)
2
Автор поста оценил этот комментарий
Весь комментарий целиком. Если для себя, то в принципе и так сойдёт. Но учить такому людей - ну я хз. Секурные вещи только из первоисточников и только с проверкой подписи т.д., иначе может плохо быть
раскрыть ветку (3)
1
Автор поста оценил этот комментарий

да, да, хорошо)

все мнения важны, конечно
>- сборка OpenWrt из недоверенного источника
этой сборкой пользуются десятки тысяч, автор - очень известный человек на 4pda например

>- неактуальная версия CentOS
win7 тоже неактуальная, причем более - но именно она используется на сегодняшний день чаще всего. А еще winxp встречается, прикиньте!

> исходники easy-rsa из недоверенного источника (причем easy-rsa вообще есть в репах)
Чукча явно был читателем. В посте описаны причины использования этой версии - она работает с имеющейся в репах openvpn и подходит к текущей инструкции.

>отключение SElinux
Там написано - "ВОЗМОЖНО, потребуется". Чем это может быть чревато? Ничем.


>репозиторий Remi?
Это да, скопипастил из "другого" своего файлика. Планировался только epel. И что?

>стоит добавить описание опций OpenVPN и описание работы с easy-rsa
А еще можно выложить исходники OpenVPN Community, че уж там. Чтобы вообще все было понятно.

раскрыть ветку (2)
3
Автор поста оценил этот комментарий

> человек на 4pda


4PDA и есть недоверенный источник. Дело даже не в том, что в сборке намеренно могут быть оставлены бэкдоры. Такие сборки делаются как правило "для себя и другим не жалко", зачастую авторы вообще не являются профессионалами и могут просто напортачить по невнимательности или из-за недостатка навыков.


Вы пишете статью про VPN, нельзя допускать такое халатное отношение к безопасности и средствам криптографии.


> win7 тоже неактуальная, причем более - но именно она используется на сегодняшний день чаще всего. А еще winxp встречается, прикиньте!


И что с того? Выше правильно сказали — для себя вы можете использовать любой дистрибутив, но для публикации (даже на пикабу) нужно более тщательно прорабатывать материал. Устаревшая информация никому не нужна.


> Чукча явно был читателем. В посте описаны причины использования этой версии - она работает с имеющейся в репах openvpn и подходит к текущей инструкции.


Это вообще набор bash-скриптов, там просто нечему ломаться. Тем более OpenVPN из репов, easy-rsa из репов — наиболее совместимый вариант, или вам так не кажется?


> подходит к текущей инструкции


Это как? Инструменты подгоняются под имеющуюся статью? :) Статья ваша хоть?


> Там написано - "ВОЗМОЖНО, потребуется". Чем это может быть чревато? Ничем.


Возможно? А проверить не пробовали? Перед тем как публиковать статью.


> Это да, скопипастил из "другого" своего файлика. Планировался только epel. И что?


Все то же — сторонний репозиторий это потенциальная угроза безопасности. Как минимум вызывает вопросы "зачем этот пункт инструкции".


> А еще можно выложить исходники OpenVPN Community, че уж там. Чтобы вообще все было понятно.


Вы пишите статью, в которой рассказываете об установке OpenVPN. Скопипастить готовый конфиг я могу и из `/usr/share/doc/openvpn/sample`. В чем тогда ценность инструкции?

ещё комментарии
4
DELETED
Автор поста оценил этот комментарий
А тут люди виснут!
1
DELETED
Автор поста оценил этот комментарий
Бро, есть же pritunl, попробуй
Все генерится само, никаких экскурсов по diffie-hellman
Остается только подключить клиентский девайс, ovpn-конфиг оно тоже само предложит скачать

Это я к тому пишу, что на этом ресурсе логичней было бы рецепт "в 1 клик" предложить :)
раскрыть ветку (2)
Автор поста оценил этот комментарий
@agrrh можно инструкцию как ставить притунл? Пожалуйста
раскрыть ветку (1)
DELETED
Автор поста оценил этот комментарий
ещё комментарии
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку