Давно было пора завести свой канал.
Я автор этой статьи https://habr.com/ru/post/440030/
Видео по ней https://youtu.be/GMvEF0PXN-w
И ansible плейбука https://github.com/itdoginfo/domain-routing-openwrt с помощью которого это настраивается за пару минут
За 3.5 года существования этой статьи я добавлял, исправлял, удалял лишнее из статьи и плейбука. 3.5 года я держу эту тему актуальной. И конечно не просто так, помимо меня, этим пользуются много людей. Я постоянно нахожу ссылки и упоминания на форумах и в других статьях или же просто узнаю свои конфиги. А в репе на гитхабе 15 звёздочек! Вообщем, в этом канале я буду выкладывать апдейты по этой теме. Это будет не часто, но будет полезно для тех кто пользуется
Я автор этой статьи https://habr.com/ru/post/440030/
Видео по ней https://youtu.be/GMvEF0PXN-w
И ansible плейбука https://github.com/itdoginfo/domain-routing-openwrt с помощью которого это настраивается за пару минут
За 3.5 года существования этой статьи я добавлял, исправлял, удалял лишнее из статьи и плейбука. 3.5 года я держу эту тему актуальной. И конечно не просто так, помимо меня, этим пользуются много людей. Я постоянно нахожу ссылки и упоминания на форумах и в других статьях или же просто узнаю свои конфиги. А в репе на гитхабе 15 звёздочек! Вообщем, в этом канале я буду выкладывать апдейты по этой теме. Это будет не часто, но будет полезно для тех кто пользуется
Хабр
Точечная маршрутизация на роутере с OpenWrt. WireGuard и DNSCrypt
Данный материал не является призывом к действию и публикуется исключительно в образовательных целях. UPD 14.10.2023 Эта статья немного устарела. Здесь можно узнать, как использовать готовые списки...
И так, много проблем доставил переход на nftables, не работали списки. Потому что использовался ipset, который является придатком iptables. Сейчас в стабильной версии 22.03 ipset работает. Это уже не ipset конечно, а nftable sets, но название параметра пока оставлено, видимо, для совместимости.
Когда 22 версия была в dev, sets не было реализовано и многие люди просто не могли пользоваться списками. Накатывайте последний стабильный OpenWrt и пройдитесь по вашей конфигурации, для ipset нужно убрать options:
- storage
- maxelem
- hashsize
Но даже с ними будет работать, просто выкидывать warning.
Ну а если под ваш роутер нет официальной прошивки, то накатывайте последнюю сборку
Changelog:
- Конфиги ipset для версии 22
- Добавил community.lst от antifilter.download - оч классная инициатива, попробуйте. Расскажу о ней попозже
- Была проблема, что в каких-то случаях при запуске роутера, когда уже отрабатывал скрипт hivpn, curl не мог сразу выкачать файлы. Добавил проверки в скрипт
- Заменил DNSCrypt v1 на DNSCrypt v2. Он более простой "из коробки" и более продуманный. Отказоусточивость идёт прям из коробки
https://habr.com/ru/post/440030/
https://itdog.info/tochechnaya-marshrutizaciya-na-routere-s-openwrt-wireguard-i-dnscrypt/
https://github.com/itdoginfo/domain-routing-openwrt
Когда 22 версия была в dev, sets не было реализовано и многие люди просто не могли пользоваться списками. Накатывайте последний стабильный OpenWrt и пройдитесь по вашей конфигурации, для ipset нужно убрать options:
- storage
- maxelem
- hashsize
Но даже с ними будет работать, просто выкидывать warning.
Ну а если под ваш роутер нет официальной прошивки, то накатывайте последнюю сборку
Changelog:
- Конфиги ipset для версии 22
- Добавил community.lst от antifilter.download - оч классная инициатива, попробуйте. Расскажу о ней попозже
- Была проблема, что в каких-то случаях при запуске роутера, когда уже отрабатывал скрипт hivpn, curl не мог сразу выкачать файлы. Добавил проверки в скрипт
- Заменил DNSCrypt v1 на DNSCrypt v2. Он более простой "из коробки" и более продуманный. Отказоусточивость идёт прям из коробки
https://habr.com/ru/post/440030/
https://itdog.info/tochechnaya-marshrutizaciya-na-routere-s-openwrt-wireguard-i-dnscrypt/
https://github.com/itdoginfo/domain-routing-openwrt
В версии 22.03.2 обнаружена проблема с nftables sets
Что-то они сломали в этой версии, надо разбираться.
Используйте 22.03.0 и 22.03.1 - на них всё ок
UPD: Исправлено в новом пакете, обновите firewall4 или все пакеты сразу
Firewall restartПоявляется при рестарте фаервола, когда применяются sets.
Killed
/dev/stdin:112:19-19: Error: syntax error, unexpected end of file, expecting comma or '}'
185.60.216.0/22
^
The rendered ruleset contains errors, not doing firewall restart.
Syntax: /etc/init.d/hirkn [command]
Что-то они сломали в этой версии, надо разбираться.
Используйте 22.03.0 и 22.03.1 - на них всё ок
UPD: Исправлено в новом пакете, обновите firewall4 или все пакеты сразу
opkg update
opkg list-upgradable | cut -f 1 -d ' ' | xargs -r opkg upgrade
Сделал вторую часть про маршрутизацию на OpenWrt. Рассказываю, почему она может не работать. И как понять в чём проблема на роутере
Видео
https://youtu.be/jJSsGO5RrKw
Статья в блоге
https://itdog.info/tochechnaya-marshrutizaciya-na-routere-s-openwrt-chast-2-poisk-i-ispravlenie-oshibok/
Статья на хабре
https://habr.com/ru/post/702388/
Видео
https://youtu.be/jJSsGO5RrKw
Статья в блоге
https://itdog.info/tochechnaya-marshrutizaciya-na-routere-s-openwrt-chast-2-poisk-i-ispravlenie-oshibok/
Статья на хабре
https://habr.com/ru/post/702388/
YouTube
Точечная маршрутизация на роутере с OpenWrt. Часть 2: Поиск и исправление ошибок
Данное видео не является призывом к действию и публикуется исключительно в образовательных целях.
Рассказываю как искать и исправлять ошибки на роутере с OpenWrt, настроенным на точечную маршрутизацию.
00:00 Введение
02:20 Как понять, что трафик к ресурсам…
Рассказываю как искать и исправлять ошибки на роутере с OpenWrt, настроенным на точечную маршрутизацию.
00:00 Введение
02:20 Как понять, что трафик к ресурсам…
Последнее видео довольно тяжелое для восприятия, если смотреть целиком. Я сделал его для дополнения к тексту, если непонятно как делать - смотришь кусок видео. Добавил тайм-коды, чтоб было удобнее искать нужный раздел:
00:00 Введение
02:20 Как понять, что трафик к ресурсам идёт через туннель на роутере
04:16 Как выключить машрутизацию
07:41 Проблемы с DNS
12:45 Разбираемся с WireGuard
36:06 Что-то не отработало в скрипте
41:00 Не хватает памяти на роутере
42:50 Проблемы на роутерах, которые официально не поддерживаются OpenWRT
45:27 Проблема c firewall на версии 22.03.2
47:08 Заключение
00:00 Введение
02:20 Как понять, что трафик к ресурсам идёт через туннель на роутере
04:16 Как выключить машрутизацию
07:41 Проблемы с DNS
12:45 Разбираемся с WireGuard
36:06 Что-то не отработало в скрипте
41:00 Не хватает памяти на роутере
42:50 Проблемы на роутерах, которые официально не поддерживаются OpenWRT
45:27 Проблема c firewall на версии 22.03.2
47:08 Заключение
YouTube
Точечная маршрутизация на роутере с OpenWrt. Часть 2: Поиск и исправление ошибок
Данное видео не является призывом к действию и публикуется исключительно в образовательных целях.
Рассказываю как искать и исправлять ошибки на роутере с OpenWrt, настроенным на точечную маршрутизацию.
00:00 Введение
02:20 Как понять, что трафик к ресурсам…
Рассказываю как искать и исправлять ошибки на роутере с OpenWrt, настроенным на точечную маршрутизацию.
00:00 Введение
02:20 Как понять, что трафик к ресурсам…
Как сделать маршрутизацию определённых доменов?
На данный момент это работает только для OpenWrt 21. За наводку по реализации спасибо viloncool
Логика работы такая:
- Мы запрашиваем ip адрес у dns сервера роутера, по умолчанию на Openwrt это dnsmasq
- Dnsmasq отдаёт нам адрес и видит, что мы хотим, чтоб этот адрес он добавил в ipset
- Добавляет этот адрес в указанный ipset
- Весь трафик, который идёт через ip адреса, находящиеся в ipset, теперь идёт через wg0 интерфейс
Необходим пакет dnsmasq-full.
Чтобы его установить, нужно удалить стандартный dnsmasq. Но если его удалить, не будет работать DNS на роутере, и не будут резолвится адреса репозитория openwrt, и не сможем установить dnsmasq-full.
Поэтому немного заморочимся:
Устанавливаем пакет, который будет преобразовывать домены в ip адреса для связки dnsmasq+ipset
В секцию
Имейте в виду, чтоб ip появился в списке, к dnsmasq должен прийти запрос. Зафорсить можно так
На данный момент это работает только для OpenWrt 21. За наводку по реализации спасибо viloncool
Логика работы такая:
- Мы запрашиваем ip адрес у dns сервера роутера, по умолчанию на Openwrt это dnsmasq
- Dnsmasq отдаёт нам адрес и видит, что мы хотим, чтоб этот адрес он добавил в ipset
- Добавляет этот адрес в указанный ipset
- Весь трафик, который идёт через ip адреса, находящиеся в ipset, теперь идёт через wg0 интерфейс
Необходим пакет dnsmasq-full.
Чтобы его установить, нужно удалить стандартный dnsmasq. Но если его удалить, не будет работать DNS на роутере, и не будут резолвится адреса репозитория openwrt, и не сможем установить dnsmasq-full.
Поэтому немного заморочимся:
opkg updateЕсли что-то пошло не так, и вы остались без dnsmasq, то, соответственно, не сможете установить пакеты из репозитория. Узнайте ip
cd /tmp/ && opkg download dnsmasq-full
opkg install libc librt libpthread libnettle8 kmod-ipt-ipset libnetfilter-conntrack3
opkg remove dnsmasq
opkg install dnsmasq-full --cache /tmp/ && rm -f /tmp/dnsmasq-full*.ipk
downloads.openwrt.org
с вашего компьютераdig downloads.openwrt.orgОткройте
/etc/hosts
на роутере и вставьте туда строку с полученным ip168.119.138.211 downloads.openwrt.orgТеперь opkg будет работать. Не забудьте убрать\закомментировать строку, как почините dnsmasq.
Устанавливаем пакет, который будет преобразовывать домены в ip адреса для связки dnsmasq+ipset
opkg install resolveipДобавляем ещё один ipset и правило в /etc/config/firewall
config ipsetПосле этого нужен рестарт
option name 'vpn_domains'
option match 'dst_net'
option storage 'hash'
config rule
option name 'mark_domains'
option src 'lan'
option dest '*'
option proto 'all'
option ipset 'vpn_domains'
option set_mark '0x1'
option target 'MARK'
option family 'ipv4'
/etc/init.d/firewall restartДобавляем необходимые домены в /etc/config/dhcp
В секцию
dnsmasq
добавляемlist ipset '/itdog.info/vpn_domains'Если нужно несколько доменов, их нужно перечислять через /. Запись будет выглядеть так
list ipset '/graylog.org/terraform.io/openai.com/vpn_domains'Или можно так
list ipset '/graylog.org/vpn_domains'После добавления записей, нужно рестартовать dnsmasq
list ipset '/terraform.io/vpn_domains'
list ipset '/openai.com/vpn_domains'
/etc/init.d/dnsmasq restartПроверим, что ip адреса добавляются в ipset. На 21ой версии это делается так
ipset list vpn_domains
Имейте в виду, чтоб ip появился в списке, к dnsmasq должен прийти запрос. Зафорсить можно так
dig graylog.org @192.168.1.1В выводе после Members должны быть ip адреса ресурсов
root@OpenWrt:/tmp# ipset list vpn_domainsДля работы с nftables нужна версия dnsmasq 2.87. Сейчас на Openwrt 22.03.2 версия 2.86. Ждём Openwrt 22.03.3
Name: vpn_custom
Type: hash:net
Revision: 6
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 768
References: 1
Number of entries: 5
Members:
188.114.99.224
188.114.98.224
76.76.21.21
Использование OpenVPN заместо Wireguard на OpenWrt
Суть та же. Есть интерфейс, в который пересылается часть трафика, но настройка немного отличается.
Устанавливаем
В клиентские файлы конфигурации обычно складываются сразу настройки подключения, сертификаты и ключи. Проверьте, что там это всё есть.
Так же обычно openvpn серверы, которые используются для перенаправления трафика полностью (например VPN в общественном понимании), прописывают дефолтные маршруты при подключении к ним. Чтоб весь трафик шёл через туннель. Вот, например
Стартуем openvpn
Ну и последний штрих. В файле /etc/hotplug.d/iface/30-vpnroute меняем интерфейс с wg0 на tun0.
У меня при тестах не всегда поднимался маршрут при рестарте роутера. Это означает, что интерфейс openvpn поднимался после того, как отрабатывал hotplug. Решается это простой задержкой
Суть та же. Есть интерфейс, в который пересылается часть трафика, но настройка немного отличается.
Устанавливаем
opkg updateКонфиг клиента openvpn копируем в /etc/openvpn/client.conf
opkg install openvpn-openssl
В клиентские файлы конфигурации обычно складываются сразу настройки подключения, сертификаты и ключи. Проверьте, что там это всё есть.
Так же обычно openvpn серверы, которые используются для перенаправления трафика полностью (например VPN в общественном понимании), прописывают дефолтные маршруты при подключении к ним. Чтоб весь трафик шёл через туннель. Вот, например
root@OpenWrt:~# ip rДля выборочного роутинг это не нужно, поэтому в конфиге клиента добавляем строку
0.0.0.0/1 via 10.8.0.1 dev tun0
pull-filter ignore redirect-gatewayВ моём конфиге это выглядит так
verb 3А если в клиентском конфиге присутствует
pull-filter ignore redirect-gateway
<ca>
-----BEGIN CERTIFICATE-----
redirect-gateway
, то нужно выпилить эту директиву.Стартуем openvpn
/etc/init.d/openvpn startПроверяем, что интерфейс поднялся и что трафик идёт
ip aВ /etc/config/firewall необходимо добавить зону для интерфейса openvpn и разрешить forwarding из lan зоны
ping -I tun0 itdog.info
config zoneЛогика точно такая же, как для wg, но есть одно но. Для wg мы указываем интерфейс через опцию network, потому что wg интерфейс определен в /etc/config/network. А для openvpn указываем device, потому что openvpn сам создаёт этот интерфейс, и в network его нет.
option name 'tun'
option forward 'REJECT'
option output 'ACCEPT'
option input 'REJECT'
option masq '1'
option mtu_fix '1'
option device 'tun0'
option family 'ipv4'
config forwarding
option name 'lan-tun'
option dest 'tun'
option src 'lan'
option family 'ipv4'
Ну и последний штрих. В файле /etc/hotplug.d/iface/30-vpnroute меняем интерфейс с wg0 на tun0.
У меня при тестах не всегда поднимался маршрут при рестарте роутера. Это означает, что интерфейс openvpn поднимался после того, как отрабатывал hotplug. Решается это простой задержкой
#!/bin/shПосле этого рестартуем сеть и роутинг теперь осуществляется через openvpn
sleep 10
ip route add table vpn default dev tun0
/etc/init.d/network restart
А что, если Wireguard и OpenVPN заблочат? А? Поднимаем Shadowsocks на OpenWRT
Пакет shadowsocks есть в репах openwrt, но:
- На 22-й версии openwrt ss у меня не завёлся
- Что бы управлять трафиком, нужно делать конфигурацию, которая будет перенаправлять трафик на порт ss (127.0.0.1:1100). То есть, у нас нет сетевого интерфейса, на который можно направить трафик на уровне таблицы маршрутизации, как я это делал с wg и openvpn
Проблемы эти решает пакет tun2socks. Он цепляется к сетевому интерфейсу и переводит трафик в прокси. Что только не сделаешь, чтобы обойти китайский firewall.
Установка
Пакета tun2socks нет в репозиториях openwrt, поэтому его нужно скачивать с гитхаба проекта. Благо он собирается под множество архитектур.
Глянуть архитектуру процессора на вашем роутере
Например, у моего Xioami mi3g архитектура mipsle.
Скачиваем на компьютер, разархивируем и перекидываем на роутер
Перекидываем в /usr/bin/ и заодно переименовываем
tun2socks не создаёт интерфейс сам. Нужно самим создать интерфейс и присвоить ему ip
Добавляем в /etc/config/network
Учтите, что если у вас настроен какой-нибудь vpn, то tun0 может быть занят. Можно поменять на tun1 тут и далее.
Так же как для wg и openvpn, создаём зону и правило в
Накидал простой сценарий, кладём его в /etc/init.d/tun2socks
Если будет кушать много памяти, то у проекта есть целая страница с описанием флагов, которые можно подкрутить.
Пакет shadowsocks есть в репах openwrt, но:
- На 22-й версии openwrt ss у меня не завёлся
- Что бы управлять трафиком, нужно делать конфигурацию, которая будет перенаправлять трафик на порт ss (127.0.0.1:1100). То есть, у нас нет сетевого интерфейса, на который можно направить трафик на уровне таблицы маршрутизации, как я это делал с wg и openvpn
Проблемы эти решает пакет tun2socks. Он цепляется к сетевому интерфейсу и переводит трафик в прокси. Что только не сделаешь, чтобы обойти китайский firewall.
Установка
Пакета tun2socks нет в репозиториях openwrt, поэтому его нужно скачивать с гитхаба проекта. Благо он собирается под множество архитектур.
Глянуть архитектуру процессора на вашем роутере
cat /proc/cpuinfoВ большинстве случаев будет написано просто MIPS. Скорее всего, вам нужна будет либо mipsle, либо mips.
Например, у моего Xioami mi3g архитектура mipsle.
Скачиваем на компьютер, разархивируем и перекидываем на роутер
wget https://github.com/xjasonlyu/tun2socks/releases/download/v2.4.1/tun2socks-linux-mipsle-softfloat.zipПосле этого заходим на роутер и проверяем, что точно скачали нужный бинарник
unzip tun2socks-linux-mipsle-softfloat.zip
scp tun2socks-linux-mipsle-softfloat root@192.168.70.2:/tmp/
root@OpenWrt:~# /tmp/tun2socks-linux-mipsle-softfloat --helpHelp вывелся, значит, всё ок. Но если выводится такая ошибка
Usage of ./tun2socks-linux-mipsle-softfloat:
-config string
/tmp/tun2socks-linux-mips-softfloat: line 1: syntax error: unexpected "("значит, архитектура выбрана неверно.
Перекидываем в /usr/bin/ и заодно переименовываем
mv tun2socks-linux-mipsle-softfloat /usr/bin/tun2socksНастройка интерфейса и firewall
tun2socks не создаёт интерфейс сам. Нужно самим создать интерфейс и присвоить ему ip
Добавляем в /etc/config/network
config interface 'tun0'Имейте в виду, что
option device 'tun0'
option proto 'static'
option ipaddr '172.16.250.1'
option netmask '255.255.255.0'
ip a
покажет его только при запуске tun2socks.Учтите, что если у вас настроен какой-нибудь vpn, то tun0 может быть занят. Можно поменять на tun1 тут и далее.
Так же как для wg и openvpn, создаём зону и правило в
/etc/config/firewall
config zoneМеняем интерфейс в маршруте /etc/hotplug.d/iface/30-vpnroute
option name 'tun'
option forward 'REJECT'
option output 'ACCEPT'
option input 'REJECT'
option masq '1'
option mtu_fix '1'
option device 'tun0'
option family 'ipv4'
config forwarding
option name 'lan-tun'
option dest 'tun'
option src 'lan'
option family 'ipv4'
ip route add table vpn default dev tun0Рестартуем сеть
/etc/init.d/network restartАвтозапуск при старте роутера
Накидал простой сценарий, кладём его в /etc/init.d/tun2socks
#!/bin/sh /etc/rc.commonДелаем исполняемым
USE_PROCD=1
# starts after network starts
START=40
# stops before networking stops
STOP=89
PROG=/usr/bin/tun2socks
IF="tun0"
PROTO="ss"
METHOD_USER="$METHOD/USER"
PASS="$PASS"
HOST="$HOST"
PORT="$PORT"
start_service() {
procd_open_instance
procd_set_param command "$PROG" -device "$IF" -proxy "$PROTO"://"$METHOD_USER":"$PASS"@"$HOST":"$PORT"
procd_set_param stdout 1
procd_set_param stderr 1
procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}
procd_close_instance
}
chmod +x /etc/init.d/tun2socksДелаем автозапуск
ln -s /etc/init.d/tun2socks /etc/rc.d/S90tun2socksНадо подставить свои переменные, например
METHOD_USER="aes-256-gcm"Стартуем
PASS="ochslozniyparol"
HOST="tech-domain.club"
PORT="8388"
/etc/init.d/tun2socks startПотестить без сценария инициализации можно так
tun2socks -device tun0 -proxy ss://aes-256-gcm:ochslozniyparol@tech-domain.club:8388 -loglevel debugПри
-loglevel debug
выводится трафик, который ходит через tun2socksЕсли будет кушать много памяти, то у проекта есть целая страница с описанием флагов, которые можно подкрутить.
Поднимаем socks5/socks4/http прокси на OpenWRT
Для использования socks5 тоже воспользуемся tun2socks, только переменные надо подкорректировать
Для socks5 прокси без пароля так
После редактирования перезапустите tun2socks
tun2socks также поддерживает http и socks4, логика та же.
Не советую использовать бесплатные публичные прокси. Перенаправлять даже часть своего трафика на такие прокси опасно.
Для использования socks5 тоже воспользуемся tun2socks, только переменные надо подкорректировать
Для socks5 прокси без пароля так
PROTO="socks5"Для socks5 прокси с логином и паролем вот так
#METHOD_USER="aes-256-gcm"
#PASS="ochslozniyparol"
HOST="1.1.1.1"
PORT="46202"
PROTO="socks5"Переменную METHOD_USER назвал так, потому что для ss - это метод шифрования, а в socks5 - это логин
METHOD_USER="user"
PASS="ochslozniyparol"
HOST="1.1.1.1"
PORT="1080"
После редактирования перезапустите tun2socks
/etc/init.d/tun2socks restart
tun2socks также поддерживает http и socks4, логика та же.
Не советую использовать бесплатные публичные прокси. Перенаправлять даже часть своего трафика на такие прокси опасно.
Telegram
ITDog
А что, если Wireguard и OpenVPN заблочат? А? Поднимаем Shadowsocks на OpenWRT
Пакет shadowsocks есть в репах openwrt, но:
- На 22-й версии openwrt ss у меня не завёлся
- Что бы управлять трафиком, нужно делать конфигурацию, которая будет перенаправлять трафик…
Пакет shadowsocks есть в репах openwrt, но:
- На 22-й версии openwrt ss у меня не завёлся
- Что бы управлять трафиком, нужно делать конфигурацию, которая будет перенаправлять трафик…