Как отключить firewall openwrt

Обновлено: 03.07.2024

Сокращение UCI значит Unified Configuration Interface и направлен на централизованную настройку OpenWrt. Настройка должна быть простой, понятной и документированной.

Многие программы имеют собственный конфигурационный файл, например /etc/network/interfaces или /etc/exports или /etc/dnsmasq.conf /etc/samba/samba.conf и иногда они используют несколько отличающуюся структуру синтаксиса. В OpenWRT вам не нужно мучиться с ними, мы только заменяем файлы настроек UCI!

Вам не нужно перезагружать свою систему для изменения настроек! Перейдите по ссылке command.line.utility:,чтобы знать как это делается. И, пожалуйста, не забывайте, что некоторые демоны уже имеются в системе, но по умолчанию они отключены! К примеру, демон cron отключён по умолчанию, следовательно, редактирование crontab не даст результата. Вам необходимо либо запустить демона при помощи /etc/init.d/cron start или включить его /etc/init.d/cron enable . Вы можете disable (отключить), stop (остановить) и restart (перезапустить) большинство демонов. Возможно документация по notuci.config поможет вам.

Общие принципы

Централизованная конфигурация OpenWrt находится в нескольких файлах, расположенных в каталоге /etc/config/ . Каждый файл относится к части системы, который он настраивает. Вы можете редактировать файлы конфигурации в текстовом редакторе или с помощью утилиты командной строки uci , или через различные интерфейсы программирования (например, Shell, Lua и C).

Конфигурационные Файлы

Синтакс Файлов

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

Ниже приведен пример простого конфигурационного файла:

В строках начинающихся с дескриптора list определены опции с множественными значениями. Все определения list , которые используют одинаковое имя ( collection в нашем примере), будут объединены в один список значений в том порядке, в котором они были в конфигурационном файле. Наличие отступов в строчках с определениями option и list является соглашением для улучшения читаемости конфигурационного файла, но синтаксически не обязательно.

Все приведенные ниже примеры являются синтаксически корректными в uci:

В противовес, следующий пример синтаксически неверен:

option example some value with space (кавычки отсутствуют вокруг значения)

Важно знать, что идентификаторы UCI и имена конфигурационных файлов могут содержать только символы a-z , 0-9 и _ . Значения опций могут содержать любые символы (пока они в кавычках).

Утилита Командной Строки (UCI)

Использование awk и grep для парсинга конфигурационных файлов OpenWrt является избыточным, неумным и неэффективным. Вместо этого используйте утилиту uci для получения того что Вам нужно.

Ниже приведено описание, а также некоторые полезные примеры использования этой мощной утилиты. Запомните, друзья не позволяют друзьям парсить собственные конфигурационные файлы!

Использование

Команда Цель Описание
commit [<config>] Сохраняет изменения данного конфигурационного файла, либо, если он не указан, всех конфигурационных файлов в файловую систему. Все команды “uci set”, “uci add”, “uci rename” и “uci delete” сохраняют результаты во временное хранилище и сохраняются сразу скопом во флэш-память с помощью “uci commit”. Это не нужно делать после редактирования конфигурационного файла в текстовом редакторе, но необходимо для скриптов, GUI и других программ работающих непосредственно с UCI файлами.
batch - Запускает многострочный UCI скрипт, который обычно выполнен в форме here-документа).
export [<config>] Экспорт конфигурации в машино-читаемый формат. Используется внутренне для преобразования конфигурационных файлов в shell-скрипты.
import [<config>] Импорт конфигурационных файлов в синтаксисе UCI.
changes [<config>] Список зарезервированных (пер. но еще не сохраненных) изменений данного конфигурационного файла или, если файл не указан, всех конфигурационных файлов.
add <config> <section-type> Добавить анонимную секцию типа section-type в данную конфигурацию.
add_list <config>.<section>.<option>=<string> Добавить данную строку в существующий список опций.
show [<config>[.<section>[.<option>]]] Отобразить данную опцию, секцию или конфигурацию в компактном виде.
get <config>.<section>[.<option>] Получить значение данной опции или тип данной секции.
set <config>.<section>[.<option>]=<value> Установить значение данной опции, или добавить новую секцию с типом равным указанному значению.
delete <config>[.<section[.<option>]] Удалить данную секцию или опцию.
rename <config>.<section>[.<option>]=<name> Переименовать данную секцию или опцию.
revert <config>[.<section>[.<option>]] Отменить изменения данной опции, секции или конфигурационного файла.

Примеры:

Нет необходимости рестарта всей системы

Все сделано. Перезагрузка не требуется.

Экспорт всей конфигурации

Отобразить в древовидном виде данную конфигурацию


Утилита uci, входящая в состав openwrt, позволяет редактировать конфигурационные файлы, считывать из них информацию и «налету» применять изменения.

Работа с этой утилитой — тема достаточно большая и хорошо описана на официальном сайте, русская версия и английская (более детальная), здесь же я приведу лишь небольшой пример.

В файле /etc/config/system изменим значения hostname и timezone



Здесь мы использовали только два параметра get и set, обо всём остальном читайте по указанным выше ссылкам.


Чтобы изменения времени тотчас вступили в действие, дайте команду.

Firewall

Изначально, файрволл настроен пропускать весь трафик через LAN и блокировать весь входящий WAN-трафик, кроме портов используемых для NAT и портов открытых для сессий созданных изнутри.

Открыть какой-либо порт для доступа через WAN можно прописав команды iptables в файл /etc/rc.local…

Командой ifconfig можно посмотреть названия интерфейсов (wlan0).

Открываем 80-ый и 22-ой порты. Если нужен UDP протокол, то меняем tcp на udp.

Правила вступят в действие после перезагрузки.

OpenSSH

Меняем урезанный dropbear на полноценный openssh.

Пароль для root должен быть установлен.

Следующими командами переносим dropbear на другой порт (2222) и перезапускаем его:

Закрываем текущую сессию и открываем новую на новом порту (2222):

Устанавливаем openssh-server

Ставим его в автозагрузку и стартуем:

Снова закрываем текущую сессию и открываем новую на стандартном порту (22):

Отключаем dropbear

Всё готово. Если нужно, то устанавливаем openssh-sftp-server для передачи файлов:

Конфиг-файл openssh — /etc/ssh/sshd_config.

Допустим нам нужно выполнять некий скрипт, который будет перегружать роутер каждые пять минут, тогда делаем следующее…

Создаём скрипт rebwrt.sh в папке bin

Проверяем всё ли правильно:

Даём ему права на исполнение:


Если он уже остановлен, то выдаст ошибку.

И стартуем cron:


Откроется в редакторе vi (см. ниже).

Подробности и примеры смотрите в wiki.

Редактор vi

Для редактирования файла нажимаем символ "i".
Вносим изменения.
Нажимаем Esc.
Вводим последовательно символы :wq (w-сохранить, q-выйти).
Нажимаем Enter.
Файл отредактирован.

Установка программ в RAM

Порядок действий таков: по идее, чтоб установить пакет в «память» надо использовать флаг -d ram…

Resistance Dog Good Boy

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

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

Стоит отметить, что если вам нужен обход блокировок только на одном устройстве, там вам намного проще будет настроить VPN именно на нём. У многих провайдеров VPN есть программы-клиенты, которые в несколько кликов по красивым кнопкам настроят вам всё, что нужно — просто погуглите, сравните цены и условия. Ещё можете посмотреть в сторону таких бесплатных проектов, как АнтиЗапрет.

Опишу свой процесс настройки роутера на OpenWRT с точечным обходом блокировок. Мне уже приходилось делать это пару раз (то переезд со сменой провайдера, то смена роутера), и вот на третий раз я решил наконец задокументировать этот процесс, чтобы в следующие разы было легче. Может и ещё кому пригодится.

Роутер и прошивка

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

Мой нынешний роутер — это Xiaomi Mi WiFi Router 3G. Выбрал его, потому что в нём достаточно мощи, чтобы на нём хорошо работала OpenWRT. Да и вообще, Mir3G — это, похоже, один из самых популярных девайсов в тусовке людей, которые занимаются дрессировкой роутеров, так что в сети по нему уже есть много мануалов и обсуждений на форумах. Если захотите купить такой же, то будьте аккуратны с конкретной моделью — их две под одним названием, а хорошая только та, у которой есть порт USB3. Такой роутер должно быть несложно купить на Авито или других досках объявлений.

У меня на данный момент установлена почти последняя версия прошивки:

Прошивка OpenWRT и базовая настройка роутера выходит за рамки этой статьи. Поищите мануалы для вашего роутера. Далее предполагается, что у вас уже есть роутер с OpenWRT, подключенный к интернету, и к нему настроен доступ по SSH.

Блокировки

Грубо говоря, существует два типа блокировок:

Нам нужно победить оба. Разберёмся с каждым из них по порядку.

Шаг 1. Шифрованный DNS

DNS (Domain Name System) — это распределенная система (нет, это не сеть магазинов), состоящая из множества серверов по всему миру, которая позволяет вашему компьютеру преобразовать человекочитаемое имя сайта в машиночитаемый IP-адрес, например, из github.com получить 140.82.121.3 . Этот процесс называется "разрешением" или "резолвингом" доменного имени.

Блокировка по доменным именам зачастую реализуется провайдером следующим образом: ваш роутер по умолчанию использует DNS-сервер, который контролируется провайдером и для заблокированных доменных имён возвращает специальный адрес сайта-заглушки. Именно это происходит, когда вы видите в браузере "доступ к ресурсу ограничен в соответствии со 149-ФЗ".

Доступ ограничен

Кажется, что решение очевидно — просто не пользоваться DNS-сервером провайдера, а использовать, например, Google DNS, IP-адреса которого уже стоит знать наизусть как считалку — 8.8.8.8, 8.8.4.4 . Раньше это действительно работало, но сегодня провайдеры уже не дадут вам так просто себя обмануть.

Поскольку DNS — это очень старый протокол, в котором никак не было предусмотрено шифрование от слова "вообще", у провайдеров есть возможность перехватывать ваши запросы и подменять ответы, вставляя свой сайт-заглушку, даже если запрос шёл, например, к Google DNS. Именно этим они и занимаются. По сути, провайдер проводит против вас атаку DNS hijacking.

Вот как это работает, если всё хорошо. В таком сценарии можно даже не заметить этого "человека посередине" в лице вашего провайдера:

DNS-запрос к незаблокированному домену

А вот так это работает, когда всё плохо. Провайдер наверняка даже не отправляет запрос к DNS-серверу, которому он предназначался, а просто сразу же возвращает ответ, подставляя адрес своей заглушки:

DNS-запрос к заблокированному домену

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

Обновим список пакетов. Эту команду нужно выполнять после каждой перезагрузки роутера перед установкой пакетов:

Чтобы плагин для LuCI заработал, нужно сделать выполнить вот такую команду:

Готово! Теперь на компьютере, подключенном к роутеру, можно проверить как это работает:

Обратите внимание, что адреса возвращаются разные: до настройки DoH — неправильный, это результат подмены адресов провайдером, а после — правильный. Можно считать это маленькой победой!

OpenWRT LuCI DoH settings

Сам по себе обход блокировок по DNS вряд ли даст ожидаемый эффект, потому что, как правило, в довесок к доменному имени, ресурс блокируется еще и по IP-адресам — видимо, для надежности. Это следующий тип блокировок, которые нужно победить.

Стоит упомянуть про побочные эффекты от такой настройки — могут стать недоступными различные внутренние ресурсы провайдера. Например, когда у меня кончается интернет и я забываю его оплатить, провайдер просто не может меня переадресовать на страницу, куда он обычно направляет своих забывчивых абонентов. Для меня выглядит это всё так, будто интернет просто пропал, без каких-либо объяснений. Я даже первый раз из-за этого чуть не поругался с поддержкой, а оказалось, что это я сам дурак. Что ж, просто приходится платить заранее.

Если нравится статья, то подпишитесь на уведомления о новых постах в блоге, чтобы ничего не пропустить! А ещё читайте другие мои посты!

Шаг 2. Настройка VPN WireGuard

Для того, чтобы обходить блокировки по IP-адресам, придётся настроить VPN — другого способа нет. VPN "спрячёт" от провайдера ваши IP-пакеты так, что он не будет знать куда именно они направляются и что в себе содержат. В качестве протокола предлагаю использовать WireGuard — легковесный VPN-протокол, который к тому же довольно легко настраивать.

Всё описанное дальше вдохновлено и по сути является пересказом вот этой замечательной статьи на Хабре с некоторыми (минимальными) дополнениями от меня.

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

В последнее время появляется очень много VPN-сервисов, которые работают по протоколу WireGuard — это нынче горячая тема. Недавно поддержка WireGuard была добавлена в основной состав ядра Linux. Погуглите, выбор сервисов действительно есть. Сейчас я пользуюсь RedShieldVPN, и меня пока что всё устраивает.

Бонус для читателей: при регистрации по этой ссылке вам подарят месяц бесплатного VPN.

Дальше буду описывать процесс для RedShieldVPN, но, думаю, для других подобных сервисов процесс должен быть похожим.

Переходим в раздел WireGuard, авторизуемся, выбираем страну и скачиваем конфиг. Я обычно выбираю какую-нибудь европейскую страну, чтобы пинг был приемлемым. В этот раз возьму Финляндию.

Вот примерно такой файл конфигурации скачался (ключи я заменил):

Переключимся на роутер и установим там нужную зависимость:

Дальше нужно настроить сеть. Это происходит в файле /etc/config/network . Открываем его при помощи vi (если не умеете пользоваться этим редактором, то лучше предварительно почитайте что-нибудь для подготовки психики) и дописываем в конец две секции вот такого содержания:

Приватный и публичный ключи замените соответствующими значениями из конфига. Поле list addresses заполняется IPv4-адресом из строчки Address в конфиге, а IPv6 адрес мы просто игнорируем — позже станет понятно почему. Поле Endpoint из конфига WireGuard распадается, соответственно, в поля endpoint_host и endpoint_port в конфиге OpenWRT. Остальные поля статичные.

Перезапустим сеть на роутере:

Если команда wg show выводит что-то подобное, то всё идёт хорошо.

Шаг 3. Скрипт для сбора списков заблокированных адресов

Это возможно благодаря крутейшему сервису antifilter.download, который обрабатывает выгрузки Роскомнадзора и отдает их в виде списков IP-адресов в машиночитаемых форматах. Мы настроим периодическую выгрузку списков заблокированных адресов с antifilter.download, чтобы всегда иметь актуальную информацию о блокировках. По моему опыту обновлять этот список раз в сутки (например, ночью) вполне достаточно.

Кроме того, нам нужно настроить файрволл роутера, чтобы он помечал пакеты, которые направляются к заблокированным адресам, специальным маркером. Такие маркированные пакеты должны маршрутизироваться роутером через VPN.

Начнём со скрипта, который реализует эту логику по обновлению списков заблокированных адресов.

Создадим файл /etc/init.d/hirkn со скриптом следующего содержания:

Этот скрипт скачивает два списка заблокированных адресов — один в виде сетей (иногда РКН блокирует адреса целыми подсетями), другой — обобщенный список отдельных заблокированных адресов. За счёт обобщения в небольшие подсети он содержит не миллионы строк, а всего лишь что-то около 15 тысяч. Нам нужны оба списка, они не пересекаются между собой. Файлы сохраняются в каталог /tmp , который в OpenWRT хранится в оперативной памяти — это должно работать быстро. В конце скрипт перезапускает файлволл. Настройка файлволла будет происходит позже.

Добавим этому скрипту права на выполнение:

Добавим скрипт в "автозапуск", чтобы он выполнялся при включении роутера после всех остальных скриптов:

Через cron запланируем выполнение этого скрипта раз в сутки:

В открывшемся редакторе нужно добавить на новой строке:

На crontab.guru можно посмотреть объяснение этой строчки.

Включим cron , потому что по умолчанию в OpenWRT он выключен:

Убедимся, что скрипт работает.

Если файлы со списками заблокированных адресов появились, то всё ок:

Шаг 4. Дальнейшая настройка

Теперь осталось настроить роутер так, чтобы он правильно маршрутизировал пакеты через VPN-туннель.

Создадим таблицу маршрутизации для VPN, добавив в файл /etc/iproute2/rt_tables строчку следующего вида:

Добавим дефолтный маршрут для VPN через туннельный интерфейс:

Чтобы сделать это изменение постоянным, чтобы оно переживало перезагрузки роутера, создадим файл /etc/hotplug.d/iface/30-rknroute с вот таким содержимым:

В файл /etc/config/network , который мы уже редактировали в процессе настройки WireGuard, добавим правило, которое будет перенаправлять маркированные пакеты в таблицу маршрутизации VPN:

Теперь приступим к настройке файрволла. Это самая важная часть логики, которая просматривает списки заблокированных адресов, и маркирует пакеты. В файл /etc/config/firewall допишем несколько абзацев:

Первый из них настраивает зону для VPN — из неё разрешён лишь выход пакетов и включён маскарадинг.

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

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

Пятый и шестой абзацы отвечают за маркировку пакетов: "если пакет направляется на заблокированный адрес, то добавим ему пометку 0x1 ".

И запустим наш скрипт:

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

Шаг 5. Отключаем IPv6

Этот шаг мой самый нелюбимый, потому что я за всё новое и против всего старого. По моему глубокому убеждению IPv4 уже давно должен умереть и быть вытеснен шестой версией протокола. К сожалению, дела у IPv6 пока идут не так гладко, как хотелось бы (сейчас он занимает всего около 30% процентов трафика).

Проблема в том, что antifilter.download выдаёт только заблокированные IPv4 адреса. Это значит, что наш обход блокировок не будет работать по IPv6. Если разрешить вашему роутеру работать по IPv6, то многие ваши устройства предпочтут открывать сайты по IPv6 либо напарываясь на страницы с блокировками от провайдеров, либо просто получая ошибки подключения по таймауту.

Отключаем IPv6 (команды взяты отсюда):

После этого может потребоваться ещё одна перезагрузка роутера, чтобы он перестал раздавать вновь подключенным устройствам IPv6-адреса.

Вот как-то так можно при помощи несложных (ладно, сложных) манипуляций настроить свой роутер на точечный обход блокировок. Все незаблокированные сайты работают как обычно, а заблокированные — через VPN. С такой конфигурацией можно полностью забыть про мелкие пакости от Роскомнадзора и начать, наконец, жить :)

Полное отключение IPv6 в OpenWRT

Вообще отключать IPv6 все начали с тех времен, когда он мог освободить несколько заветных килобайт в rom памяти роутера. Сейчас же его отключают потому, что большинству он бесплатно не сдался при работе в домашней сети. Независимо от того, какие у вас на это причины - о том, как вырезать поддержку данного протокола на корню и вычистить любое упоминание о нем в вашей OpenWRT коробке вы узнаете под катом данного поста.

1. Отключение IPv6 на этапе сборки прошивки OpenWRT

Ну естественно, чтобы конкретно вырезать поддержку IPv6 вам придется собрать свою прошивку OpenWRT. В make menuconfig вам потребуется отключить следующие пункты:

1. Отключаем поддержку IPv6 при компиляции всех пакетов сборки

Global build settings > Enable IPv6 support in packages

2. Отключаем поддержку IPv6 в командном интерфейсе Busybox

Отключаем поддержку IPv6 в командном интерфейсе Busybox

Global build settings > Base system > busybox > Networking Utilities > Enable IPv6 support

3. Отключаем поддержку фильтров IPv6 на уровне ядра

Отключаем поддержку фильтров IPv6 на уровне ядра

Kernel modules > Netfilter Extensions > kmod-nf-ipt6

4. Отключаем библиотеку IPv6 для правил фаервола

Отключаем библиотеку IPv6 для правил фаервола

Libraries > Firewall > libip6tc

5. Отключаем демонов работающих с протоколом IPv6

Отключаем демонов работающих с протоколом IPv6

2. Очистка конфигов на роутере

Как показывает практика, после успешной сборки и заливки прошивки на роутер, у него все равно в конфигах присутствуют кое-какие отсылки к использованию IPv6. Чтобы продолжить начатое требуется:

Читайте также: