Собственный 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 подписчика

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

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

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

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

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

ТС, вот вы вроде бы подкованный в IT человек? А что мешало вам поменять ttl пакетов на единицу меньше чем на устройстве раздачи и не платить за раздачу? К чему нужны такие страшные и даже опасные сложности?

раскрыть ветку (20)
1
Автор поста оценил этот комментарий
Много других проблем, которые vpn решает, включая постоянный белый ip.
раскрыть ветку (12)
DELETED
Автор поста оценил этот комментарий
Ну это да, это плюс конечно.
DELETED
Автор поста оценил этот комментарий
Комментарий удален. Причина: данный аккаунт был удалён
раскрыть ветку (10)
1
Автор поста оценил этот комментарий
Одна строчка iptables решает вопрос, если надо. Адреса добавляются тоже, докупаются у провайдера.
раскрыть ветку (9)
DELETED
Автор поста оценил этот комментарий
Комментарий удален. Причина: данный аккаунт был удалён
раскрыть ветку (8)
1
Автор поста оценил этот комментарий

Вот пример из рабочего

#default nat

iptables -t nat -A POSTROUTING -j SNAT -s 10.0.16.2 --to-source 91.X.X.001


#nat for user

iptables -t nat -A POSTROUTING -j SNAT -s 10.0.16.21 --to-source 91.X.X.002

iptables -t nat -A PREROUTING -d 91.X.X.002 -j DNAT --to-destination 10.0.16.21


значение имеют две последние строчки, через & складываются в одну, если принципиально. Адрес, ессно, должен быть дополнительным (на eth0:0 например)

раскрыть ветку (2)
DELETED
Автор поста оценил этот комментарий
Комментарий удален. Причина: данный аккаунт был удалён
раскрыть ветку (1)
1
Автор поста оценил этот комментарий
>Одна строчка iptables решает вопрос, если надо. Адреса добавляются тоже
>проброс с внешнего ip на внутренний делается одним правилом.

Было заявлено сразу, читайте внимательнее)
Автор поста оценил этот комментарий
Конечно. Вылезу с ванны и возьму из файлика.
Я обслуживаю для некоторых клиентов vpn-сервер, им нужен один и тот же ip из любой точки мира, их работа требует этого.
На одном сервере находятся несколько клиентов, у каждого отдельный ip, и все что попадает на него один к одному форвардится на машину клиента.
раскрыть ветку (4)
DELETED
Автор поста оценил этот комментарий
Комментарий удален. Причина: данный аккаунт был удалён
раскрыть ветку (3)
1
Автор поста оценил этот комментарий
Окей, я продул - правил два.
Хотя, проброс с внешнего ip на внутренний делается одним правилом.
То есть - я не продул. Так?
#comment_77853556
раскрыть ветку (2)
DELETED
Автор поста оценил этот комментарий
Комментарий удален. Причина: данный аккаунт был удалён
раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Тогда мы имели ввиду одно и тоже.
Конечно, я не являюсь прям гуру в центоси, опенвпн. До многого руки не доходят, нагрузка немалая по основной работе - asterisk и связанное так или иначе с voip.
Приходится и в php, bootstrap, js/jquery, сам астериск, гипервизор обслуживать и много других мелочей.
Все не успеть.
1
Автор поста оценил этот комментарий
Это не все задачи решает: ёта режет торренты видео. Шифровать всё равно надо.
раскрыть ветку (3)
DELETED
Автор поста оценил этот комментарий
Торрент я гоню через видалию бридж, ну то есть тор, а видео йота не жрет. По мтс у меня скорость 4.5-6.2 мбит, по йоте(но подмосковье) 2.2-3.3 мбит. Откуда такая инфа?
раскрыть ветку (2)
Автор поста оценил этот комментарий
По видео у них видимо приоритет очень низкий.

Онлайн смотреть в HD уже нереально.

Тоже подмосковье.

А вот про Vidalia Bridge не знал.

раскрыть ветку (1)
1
DELETED
Автор поста оценил этот комментарий
В настройках видали выставляешь порт 9051, и адрес маршрутизации 127.0.0.1. А настройках торрент-клиента ставишь принудительно проход через порт 9050 и Socks5 и вуаля привет быстрые торренты.
Автор поста оценил этот комментарий
Друже, кинь ссыль для чайника, что где менять?
раскрыть ветку (2)
DELETED
Автор поста оценил этот комментарий
https://rednager.xyz/obhod-ogranichenij-yota-na-razdachu-wi-.... Читай очень внимательно, все инструкции полностью актуальны для всех оператороа(мтс, билайн и т. д.).
раскрыть ветку (1)
Автор поста оценил этот комментарий
Ооооо, спасибо!!!
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку