К контенту
habrforever
СКРЫТА #openvpn ≈2016 · ~6 мин чтения

OpenWRT + OpenVPN: точечный обход блокировок — актуализация 2026

автор оригинала: Vitaliy (vitalegkhua)

оригинал на Хабре habr.com/…/317354
снимок Wayback web.archive.org
статус на Хабре (ноябрь 2026) скрыта (403/451)
права © автор, переиздание в архивных целях с указанием источника

OpenWRT + OpenVPN: точечный обход блокировок

Архивное переиздание с актуализацией. Оригинал опубликован на Habr (≈2016), автор — Vitaliy (vitalegkhua). оригинал скрыт на Habr (HTTP 403/451), доступен только через Wayback Machine Снимок: Wayback Machine. Ниже — редакция ноября 2026: что работает сейчас, что изменилось и как правильно повторить рецепт сегодня. Полный текст оригинала — в конце, без купюр.

TL;DR — версия 2026

OpenVPN для обхода блокировок в 2026 не годится — сигнатуры известны DPI. Но как корпоративный remote-access за TLS-фронтендом или на порту 443/tcp он жив и поддерживается.

Оригинал был написан, когда OpenVPN был синонимом слова «VPN». В 2026 у него узкая, но честная роль: корпоративный доступ, там, где обфускация не нужна, а нужна зрелость — PKI, MFA, аудиты, клиент под каждую платформу. Для обхода цензуры он проигрывает по всем пунктам: ТСПУ (DPI-боксы) стоят у всех крупных российских провайдеров и умеют резать VPN-хендшейки WireGuard, OpenVPN и «голый» Shadowsocks, а классический OpenVPN-хендшейк — первый в их списке: Египет, Иран, Китай и РФ режут его годами. фактическим стандартом антицензурного туннелирования в 2026 стал VLESS + REALITY (Xray-core): он маскируется под обычный HTTPS-трафик к крупному сайту и не требует собственного домена и сертификата.

Статус оригинала

Куда мигрировать, если задача — антицензура

Простая табличка 2026: обфусцированный туннель = AmneziaWG; маскировка под HTTPS = VLESS+REALITY; корпоративный remote access = OpenVPN/TLS или Headscale/Tailscale поверх WG; мобильные сотрудники = AmneziaVPN self-hosted. Оригинальные shell-скрипты «openvpn-do-安装» в 2026 почти все мертвы — авторы их удалили вместе со статьями.

Что оставить из оригинального гайда

Всё про PKI честно и сейчас: корневой CA, сертификаты сервера/клиента, CRL — та же связка easy-rsa 3, что и в статье. tls-crypt вместо tls-auth (скрывает сам факт OpenVPN на порту), data-ciphers AES-256-GCM:CHACHA20-POLY1305, топология subnet, push "block-outside-dns" для Windows-клиентов — базовый скелет 2026 тот же.

Что менять срочно

  • UDP/1194 → TCP/443 за nginx/stunnel, либо shared secret в cloaking;
  • tls-auth → tls-crypt (метаданные рукопожатия больше не видны);
  • директивы cipher в старых конфигах игнорируются OpenVPN 2.6+ — всё задаётся data-ciphers;
  • добавьте MFA (pam + TOTP или Keycloak), парольные фразы сертификатов в 2026 не защита;
  • Docker-сети из «админ удаленку облегчал»-статей — проверяйте --cap-add NET_ADMIN и подсеть не конфликтует с k8s CNI.

Что изменилось с ≈2016 года

  • OpenVPN 2.6/2.7: data-ciphers, tls-crypt по умолчанию ожидаемо, поддержка DCO (ускорение в ядре)
  • EasyRSA 3.2, /etc/openvpn/easy-rsa переехал — пути из старых статей не совпадают
  • провайдеры VPS массово закрывают 1194/udp для новых аккаунтов
  • старые клиенты OpenVPN Connect не понимают современные конфиги без обновления
  • в тексте оригинала: классический OpenVPN легко детектится DPI (используется в корпсредах, но не для обхода блокировок)
  • в тексте оригинала: роутеры TP-Link не раз попадали в ботнет-волны (Mirai-подобные) — прошивайте OpenWrt и закрывайте WAN

Чек-лист 2026

  • TCP/443 + tls-crypt
  • data-ciphers без устаревших CBC
  • MFA на подключение
  • CRL и автоматический отзыв
  • логи — минимум, и не в РФ-юрисдикцию

Вердикт

Если вы читаете это, чтобы «настроить VPN как в статье» — не надо: берите WireGuard/AWG или VLESS. Если вы админ и вам нужен remote-access с PKI и аудитом — оригинальная статья после микро-правок выше всё ещё рабочий документ.


ОРИГИНАЛ СТАТЬИ (без изменений)

Как человек постоянно работающий в интернете, я привык к полному и беспрепятственному доступу ко всем его ресурсам независимо от содержания данных ресурсов, а в силу того, что обеспечиваю работу части ресурсов (работаю в хостинг-провайдере), мне просто необходим такой доступ.

Обойти блокировки не так сложно, есть множество способов. Наиболее распространенный и стабильный из них — VPN. Но у VPN большой недостаток — это потеря скорости, завышается пинг и т.д. Исходя из этого, у меня возникла идея, использовать VPN только для обхода блокировок, а на остальные ресурсы ходить через провайдера.

[]

Делать я это все буду на роутере TP-Link WR841N, чтобы обеспечить беспрепятственный доступ в интернет для всех сетевых устройств, а не только для рабочего компьютера.

Для начала нам потребуется поднять OpenVPN сервер или воспользоваться услугами VPN провайдера. Если же вы решите поднять собственный сервер, я бы рекомендовал использовать OpenVPN Access Server, т.к. с помощью него можно просто и быстро его развернуть, а также имеет веб-интерфейс. Достаточно просто установить пакет и задать пароль на учетную запись openvpn.

Я не буду описывать как прошить роутер под OpenWRT, уже есть такая статья. Я скажу даже больше, есть даже решение проблемы с отсутствием OpenVPN в прошивке OpenWRT под TP-Link WR841N — вот эта статья. Единственное, из этой статьи мне пришлось немного подправить init-скрипт, т.к. возникла проблема с автозапуском, а также я добавил условие при котором скрипт не будет скачивать дистрибутив OpenVPN при каждом запуске, а только при первом.

Вот этот скрипт

#!/bin/sh /etc/rc.common

START=99

start() {
    local TMPPATH=/tmp/openvpn
    if [ ! -f "${TMPPATH}/usr/sbin/openvpn" ]; then
    sleep 60;
    [ ! -d ${TMPPATH} ] && mkdir ${TMPPATH}
    cd ${TMPPATH}
    opkg update || exit 1
    tar xzf $(opkg download libopenssl | grep Downloaded | cut -d\  -f4 | sed '$s/.$//')
    tar xzf data.tar.gz
    tar xzf $(opkg download openvpn-openssl | grep Downloaded | cut -d\  -f4 | sed '$s/.$//')
    tar xzf data.tar.gz
    rm -f pkg.tar.gz data.tar.gz control.tar.gz debian-binary getopenvpn.sh
    for i in $(ls ${TMPPATH}/usr/lib)
        do
        [ ! -f /usr/lib/$i ] && ln -s  /tmp/openvpn/usr/lib/$i  /usr/lib/$i
        done
    fi

        	${TMPPATH}/usr/sbin/openvpn  --writepid /tmp/ovpn_ciberterminal.pid --daemon --cd /etc/openvpn --config my.conf
        }

stop() {
       PIDOF=$(ps | egrep openvpn | egrep  -v grep | awk '{print $1}')
       kill ${PIDOF}
       }

Итак, допустим у нас есть роутер с установленной прошивкой OpenWRT и OpenVPN. Правим файл-конфигурации подключения OpenVPN, у меня он находится в /etc/openvpn/my.cnf. Добавляем в него следующие параметры:

route-noexec #Этот параметр не дает перезаписать default route.
auth-user-pass login.conf #Для автоматической авторизации
keepalive 3 10 #Перезапуск соединения при разрыве
persist-tun #Не ложить tun/tap интерфейс про разрыве
persist-key #Не считывать ключи при разрыве

Создаем файл /etc/openvpn/login.conf в следующем формате:

yourlogin
yourpassword

Соответственно yourlogin и yourpassword нужно заменить на ваши авторизационные данные, если кто не понял.

Создаем скрипт /etc/openvpn/unban.sh, который будет выгружать список заблокированных IP и прописывать маршруты:

unban.sh

#!/bin/sh

TUN=`ifconfig | grep tun | awk '{print $1}'`
MIN_ROUTES="15"

if [ "$TUN" == "" ]; then
	exit;
fi

CHECK_ROUTES=`route | wc -l`

if [ "$CHECK_ROUTES" -gt "$MIN_ROUTES" ]; then
	exit;
fi

route add 8.8.8.8/32 dev $TUN;
route add 8.8.4.4/32 dev $TUN;
route add 77.88.8.8/32 dev $TUN;

wget "http://reestr.rublacklist.net/api/ips" -O /tmp/ip_list;
LIST=`cat /tmp/ip_list | sed 's/;/\n/g' | grep -v '"' | awk -F. '{print $1"."$2"."$3".0/24"}' | sort | uniq`

for IP in $LIST
do
	echo "Adding $IP..."
	route add -net $IP dev $TUN;
done

REMOTE_IP=`cat /etc/openvpn/my.conf | grep remote | tail -n1 | awk '{print $2}'`;
DEFAULT_GW=`route | grep default | awk '{print $2}'`

route add ${REMOTE_IP}/32 gw $DEFAULT_GW;

rm -rf /tmp/ip_list;

Опишу некоторые нюансы:

1. Мой провайдер, как оказалось, перехватывает DNS запросы и выдает мне ложный IP заблокированных сайтов, соответственно, чтобы этого избежать необходимо направить DNS запросы через VPN. Если Вы используете другие DNS серверы, стоит поправить строки:

route add 8.8.8.8/32 dev $TUN;

route add 8.8.4.4/32 dev $TUN;

route add 77.88.8.8/32 dev $TUN;

заменив IP Google и Yandex DNS на IP своих DNS серверов.

2. В переменной MIN_ROUTES задано минимальное количество существующих маршрутов при котором возможно дальнейшее выполнение скрипта. Обычно, до запуска данного скрипта, у меня не больше 15 маршрутов в таблице, если у вас больше маршрутов, следует изменить значение переменной MIN_ROUTES до минимального, но количество должно быть не менее существующих. Проверить это можно выполнив команду route | wc -l.

3. Т.к. роутер у меня очень слабенький, он не может осилить все 30000 с лишним маршрутов, бывает сбрасывает их, а также, чтобы прописать все 30к маршрутов уходило порядка 5 минут, а то и больше. Поэтому мне пришлось придумать как сократить список маршрутов. Решением стало добавление маршрутов подсетями по /24, это позволило сократить список до 8000 с лишним. Если ваш роутер позволяет прописывать большое количество маршрутов, то замените переменную LIST на:

LIST=`cat /tmp/ip_list | sed 's/;/\n/g' | grep -v '"' | sort | uniq`

4. Подсеть в которой находился мой VPN сервер была в списке блокировок, из-за этого у меня сбрасывался маршрут на сам VPN сервер, пришлось добавить в скрипт строки:

REMOTE_IP=`cat /etc/openvpn/my.conf | grep remote | tail -n1 | awk '{print $2}'`;
DEFAULT_GW=`route | grep default | awk '{print $2}'`
route add ${REMOTE_IP}/32 gw $DEFAULT_GW;

Если у вас такой проблемы нет, то это можно убрать из скрипта.

Далее включаем планировщик задач cron и активируем автозапуск:

/etc/init.d/cron start
/etc/init.d/cron enable

Выполняем команду crontab -e и добавляем в планировщик задание:

*/5 * * * * /bin/sh /etc/openvpn/unban.sh

Скрипт будет запускаться раз в 5 минут и проверять нужно ли прописывать маршруты. Частоту запуска можете изменить по своему усмотрению.

Возможно многие захотят спросить, зачем использовать cron, если можно просто добавить в конфиг подключения OpenVPN что-то вроде «up unban.sh» и скрипт будет выполняться сразу после подключения. Отвечу: при перезапуске VPN соединения маршруты сбрасываются, а скрипт повторно не выполняется.

P.S. На всякий случай: весь материал в данной статье приведен в ознакомительных целях и не является призывом к действию.

по теме #openvpn