ITDog
12.6K subscribers
10 photos
2 videos
8 files
102 links
Download Telegram
Channel created
Давно было пора завести свой канал.

Я автор этой статьи https://habr.com/ru/post/440030/
Видео по ней https://youtu.be/GMvEF0PXN-w
И ansible плейбука https://github.com/itdoginfo/domain-routing-openwrt с помощью которого это настраивается за пару минут

За 3.5 года существования этой статьи я добавлял, исправлял, удалял лишнее из статьи и плейбука. 3.5 года я держу эту тему актуальной. И конечно не просто так, помимо меня, этим пользуются много людей. Я постоянно нахожу ссылки и упоминания на форумах и в других статьях или же просто узнаю свои конфиги. А в репе на гитхабе 15 звёздочек! Вообщем, в этом канале я буду выкладывать апдейты по этой теме. Это будет не часто, но будет полезно для тех кто пользуется
И так, много проблем доставил переход на 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.03.2 обнаружена проблема с nftables sets
Firewall restart
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]
Появляется при рестарте фаервола, когда применяются sets.
Что-то они сломали в этой версии, надо разбираться.

Используйте 22.03.0 и 22.03.1 - на них всё ок

UPD: Исправлено в новом пакете, обновите firewall4 или все пакеты сразу
opkg update
opkg list-upgradable | cut -f 1 -d ' ' | xargs -r opkg upgrade
Последнее видео довольно тяжелое для восприятия, если смотреть целиком. Я сделал его для дополнения к тексту, если непонятно как делать - смотришь кусок видео. Добавил тайм-коды, чтоб было удобнее искать нужный раздел:
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 Заключение
Как сделать маршрутизацию определённых доменов?

На данный момент это работает только для OpenWrt 21. За наводку по реализации спасибо viloncool

Логика работы такая:
- Мы запрашиваем ip адрес у dns сервера роутера, по умолчанию на Openwrt это dnsmasq
- Dnsmasq отдаёт нам адрес и видит, что мы хотим, чтоб этот адрес он добавил в ipset
- Добавляет этот адрес в указанный ipset
- Весь трафик, который идёт через ip адреса, находящиеся в ipset, теперь идёт через wg0 интерфейс

Необходим пакет dnsmasq-full.
Чтобы его установить, нужно удалить стандартный dnsmasq. Но если его удалить, не будет работать DNS на роутере, и не будут резолвится адреса репозитория openwrt, и не сможем установить dnsmasq-full.
Поэтому немного заморочимся:
opkg update
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

Если что-то пошло не так, и вы остались без dnsmasq, то, соответственно, не сможете установить пакеты из репозитория. Узнайте ip downloads.openwrt.org с вашего компьютера
dig downloads.openwrt.org

Откройте /etc/hosts на роутере и вставьте туда строку с полученным ip
168.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'
list ipset '/terraform.io/vpn_domains'
list ipset '/openai.com/vpn_domains'

После добавления записей, нужно рестартовать dnsmasq
/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
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

Для работы с nftables нужна версия dnsmasq 2.87. Сейчас на Openwrt 22.03.2 версия 2.86. Ждём Openwrt 22.03.3
Использование OpenVPN заместо Wireguard на OpenWrt

Суть та же. Есть интерфейс, в который пересылается часть трафика, но настройка немного отличается.

Устанавливаем
opkg update
opkg install openvpn-openssl

Конфиг клиента openvpn копируем в /etc/openvpn/client.conf
В клиентские файлы конфигурации обычно складываются сразу настройки подключения, сертификаты и ключи. Проверьте, что там это всё есть.

Так же обычно 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
ping -I tun0 itdog.info

В /etc/config/firewall необходимо добавить зону для интерфейса openvpn и разрешить forwarding из lan зоны
config zone
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'

Логика точно такая же, как для wg, но есть одно но. Для wg мы указываем интерфейс через опцию network, потому что wg интерфейс определен в /etc/config/network. А для openvpn указываем device, потому что openvpn сам создаёт этот интерфейс, и в network его нет.

Ну и последний штрих. В файле /etc/hotplug.d/iface/30-vpnroute меняем интерфейс с wg0 на tun0.

У меня при тестах не всегда поднимался маршрут при рестарте роутера. Это означает, что интерфейс openvpn поднимался после того, как отрабатывал hotplug. Решается это простой задержкой
#!/bin/sh

sleep 10
ip route add table vpn default dev tun0


После этого рестартуем сеть и роутинг теперь осуществляется через openvpn
/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, поэтому его нужно скачивать с гитхаба проекта. Благо он собирается под множество архитектур.

Глянуть архитектуру процессора на вашем роутере
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 --help
Usage of ./tun2socks-linux-mipsle-softfloat:
-config string

Help вывелся, значит, всё ок. Но если выводится такая ошибка
/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
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
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 прокси без пароля так
PROTO="socks5"
#METHOD_USER="aes-256-gcm"
#PASS="ochslozniyparol"
HOST="1.1.1.1"
PORT="46202"

Для socks5 прокси с логином и паролем вот так
PROTO="socks5"
METHOD_USER="user"
PASS="ochslozniyparol"
HOST="1.1.1.1"
PORT="1080"
Переменную METHOD_USER назвал так, потому что для ss - это метод шифрования, а в socks5 - это логин

После редактирования перезапустите tun2socks
/etc/init.d/tun2socks restart


tun2socks также поддерживает http и socks4, логика та же.

Не советую использовать бесплатные публичные прокси. Перенаправлять даже часть своего трафика на такие прокси опасно.