Giter Club home page Giter Club logo

domain-routing-openwrt's Introduction

English role README

Описание

Shell скрипт и роль для Ansible. Автоматизируют настройку роутера на OpenWrt для роутинга по доменам и спискам IP-адресов.

Полное описание происходящего:

Скрипт для установки

sh <(wget -O - https://raw.githubusercontent.com/itdoginfo/domain-routing-openwrt/master/getdomains-install.sh)

Скрипт для проверки конфигурации

Написан для OpenWrt 23.05 и 22.03. На 21.02 работает только половина проверок.

[x] - не обязательно означает, что эта часть не работает. Но это повод для ручной проверки.

Запуск

wget -O - https://raw.githubusercontent.com/itdoginfo/domain-routing-openwrt/master/getdomains-check.sh | sh

Запустить с проверкой на подмену DNS

wget -O - https://raw.githubusercontent.com/itdoginfo/domain-routing-openwrt/master/getdomains-check.sh | sh -s dns

Запустить с созданием dump

Все чувствительные переменные затираются.

wget -O - https://raw.githubusercontent.com/itdoginfo/domain-routing-openwrt/master/getdomains-check.sh | sh -s dump

Поиск ошибок вручную: https://habr.com/ru/post/702388/

Ansible

Установить роль

ansible-galaxy role install itdoginfo.domain_routing_openwrt

Примеры playbooks

Wireguard, only domains, stubby, Russia, acces from wg network (пример 192.168.80.0/24), host 192.168.1.1

- hosts: 192.168.1.1
  remote_user: root

  roles:
    - itdoginfo.domain_routing_openwrt

  vars:
    tunnel: wg
    dns_encrypt: stubby
    country: russia-inside

    wg_server_address: wg-server-host
    wg_private_key: privatekey-client
    wg_public_key: publickey-client
    wg_preshared_key: presharedkey-client
    wg_listen_port: 51820
    wg_client_port: 51820
    wg_client_address: ip-client

    wg_access: true
    wg_access_network: wg-network

Sing-box, stubby, Russia

- hosts: 192.168.1.1
  remote_user: root

  roles:
    - itdoginfo.domain_routing_openwrt

  vars:
    tunnel: singbox
    dns_encrypt: stubby
    country: russia-inside

  tasks:
  - name: sing-box config
    template:
      src: "templates/openwrt-sing-box-json.j2"
      dest: "/etc/sing-box/config.json"
      mode: 0644
    notify:
      - Restart sing-box
      - Restart network

В inventory файле роутер обязательно должен быть в группе [openwrt]

[openwrt]
192.168.1.1

Для работы Ansible c OpenWrt необходимо, чтоб было выполнено одно из условий:

  • Отсутствие пароля для root (не рекомендуется)
  • Настроен доступ через публичный SSH-ключ в конфиге dropbear

После выполнения playbook роутер сразу начнёт роутить необходмые домены в туннель/прокси.

Если у вас были ошибки и они исправились при повторном запуске playbook, но при этом роутинг не заработал, сделайте рестарт сети и скрипта:

service network restart
service getdomains start

Тестировалось с

  • Ansible 2.10.8
  • OpenWrt 21.02.7
  • OpenWrt 22.03.5
  • OpenWrt 23.05.2

Выбор туннеля

  • Wireguard настраивается автоматически через переменные
  • OpenVPN устанавливается пакет, настраивается роутинг и зона. Само подключение (скопировать конфиг и перезапустить openvpn) нужно настроить вручную
  • Sing-box устанавливает пакет, настраивается роутинг и зона. Также кладётся темплейт в /etc/sing-box/config.json. Нужно настроить config.json и сделать service sing-box restart Не работает под 21ой версией. Поэтому при его выборе playbook выдаст ошибку. Для 22ой версии нужно установить пакет вручную.
  • tun2socks настраивается только роутинг и зона. Всё остальное нужно настроить вручную

Для tunnel четыре возможных значения:

  • wg
  • openvpn
  • singbox
  • tun2socks

В случае использования WG:

    wg_server_address: wg-server-host
    wg_private_key: privatekey-client
    wg_public_key: publickey-client
    wg_preshared_key: presharedkey-client
    wg_client_port: 51820
    wg_client_address: ip-client

Если ваш wg сервер не использует preshared_key, то просто не задавайте её.

wg_access и wg_access_network для доступа к роутеру через WG. Переменная wg_access_network должна иметь значение подсети, например 192.168.10.0/24.

    wg_access_network: wg-network
    wg_access: true

Шифрование DNS

Если ваш провайдер не подменяет DNS-запросы, ничего устанавливать не нужно.

Для dns_encrypt три возможных значения:

  • dnscrypt
  • stubby
  • false/закомментировано - пропуск, ничего не устанавливается и не настраивается

Выбор страны

Выбор списка доменов. Для county три возможных значения:

  • russia-inside
  • russia-outside
  • ukraine

Списки IP-адресов

Списки IP-адресов берутся с antifilter.download Переменные list_ обозначают, какие списки нужно установить. true - установить, false - не устанавливать и удалить, если уже есть

Доступные переменные

  list_domains: true
  list_subnet: false
  list_ip: falses
  list_community: false

Я советую использовать только домены

    list_domains: true

Если вам требуются списки IP-адресов, они также поддерживаются.

При использовании list_domains нужен пакет dnsmasq-full.

Для 23.05 dnsmasq-full устанавливается автоматически.

Для OpenWrt 22.03 версия dnsmasq-full должна быть => 2.87, её нет в официальном репозитории, но можно установить из dev репозитория. Если это условие не выполнено, плейбук завершится с ошибкой.

Инструкция для OpenWrt 22.03

Инструкция для OpenWrt 21.02

Текстовый редактор nano

Устанавливается по умолчанию. Можно выключить

  nano: false

Telegram-канал с обновлениями

domain-routing-openwrt's People

Contributors

itdoginfo avatar hotsezus avatar

Stargazers

Efimenkov Vyacheslav avatar  avatar Spot avatar Danil Nikolaev avatar  avatar Eugene Ivanov avatar  avatar Andrey Solyar avatar AMD Boii avatar  avatar Alexey Popov avatar Алексей avatar Nikita Vstovsky avatar Egor avatar  avatar banvasten avatar V avatar  avatar  avatar Yan Pivnev avatar  avatar  avatar Dima Gunkin avatar  avatar  avatar elik senm avatar  avatar  avatar Alexey Evseev avatar  avatar jivoy1988 avatar  avatar Kirill Sobolev avatar Alexey Zudenkov avatar dementeb avatar  avatar  avatar  avatar  avatar  avatar  avatar Pavel Miroshnichenko avatar  avatar Dmitry Tarasov avatar  avatar  avatar  avatar Eugen avatar  avatar  avatar  avatar VESpersio avatar PiketZ avatar Satoshkin avatar  avatar  avatar DaNuk (DNk) avatar  avatar Evgeny Istratov avatar Nicetas avatar  avatar Alexander avatar Telema avatar Anton Savoskin avatar Dmitry Shvedov avatar A C avatar Sergei Sergeev avatar  avatar Eugene Klimov avatar  avatar

Watchers

Eugene Klimov avatar Eugene Prokopiev avatar jivoy1988 avatar  avatar  avatar  avatar Dmitriy avatar  avatar  avatar

domain-routing-openwrt's Issues

Возможность добавить юзерские ip/ip_range в игнор

Здравствуйте, а есть какой-то удобный вариант добавить определённые ip и ip_range в какой-то список чтоб маршрутизация на них была не через vpn? А то есть определённые адреса к которым хотелось бы иметь доступ мимо впн-а, а суммаризованый список к сожалению захватывает эти адреса по случайности.
Вчера пытался настроить маркировку своего списка "исключений" другой меткой (0x2) и направлять все файлы с таким пакетом в нормальную таблицу маршрутизации (не vpn), но что-то ничего не получилось (Я к сожалению в сетях и настройках FW не силён).
Может есть какие-то более удобные варианты?

Ошибка при копировании настроек

Получаю следующие ошибки:
fatal: [192.168.1.1]: FAILED! => {"changed": true, "checksum": "638f04858d5887b50c61b7c9a41ad8a068ce7385", "dest": "/etc/hotplug.d/iface/30-rknroute", "md5sum": "db11dee959eb32d01d34b35c24195d21", "msg": "chmod (/etc/hotplug.d/iface/30-rknroute) failed: chmod: invalid mode 'False'", "src": "/root/.ansible/tmp/ansible-tmp-1550921521.83-94202376827463/source"}
fatal: [192.168.1.1]: FAILED! => {"changed": true, "checksum": "ffe1b15697030e4be45349840923a773806c9cbc", "dest": "/etc/config/dnscrypt-proxy", "md5sum": "d833f620cf01f61e2c5697f61f14df6c", "msg": "chmod (/etc/config/dnscrypt-proxy) failed: chmod: invalid mode 'False'", "src": "/root/.ansible/tmp/ansible-tmp-1550922152.67-233527556261273/source"}

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

P.S. Спасибо за то, что поделились своим трудом.

Out of memory на старых роутерах когда используется ip.lst вместо ipsum.lst

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

Я тут попользовался вашим конфигом (не ansible, в основном брал с хабра).
Всё отлично, через неделю понял что суммаризованым списком немного неудобно пользоваться.
Начал пытаться использовать ip.lst вместо ipsum.lst, и разумеется на моём картофельном роутере начал лететь OOM при рестарте фаерволла. Я не понимаю что там этот фаерволл делает, но жрёт память при рестарте он дико.
В итоге я таки победил свой роутер и теперь пользуюсь более точным списоком ip.lst.

Роутер у меня TP-Link TL-WR842N v3
Пишет что 56MiB оперативы всего.
OpenWRT 22.03

Идея моих изменений такая: Не грузим никакие списки при рестарте фаерволла, загружаем все айпишники уже после рестарта. Перед рестартом желательно ресетнуть всё тоже.

Во-первых надо:

opkg update
opkg install zram-swap

Это чуть-чуть "добавит" оперативы.

Мои изменённые конфиги:
(/etc/init.d/hirkn)

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

START=99

dir=/tmp/lst
SUBNET=https://antifilter.download/list/subnet.lst
IP=https://antifilter.download/list/ip.lst
COMMUNITY=https://community.antifilter.download/list/community.lst

mkdir -p $dir

echo "Run download lists"
rm -f /$dir/subnet.lst && wget -P $dir $SUBNET
rm -f /$dir/ip.lst && wget -P $dir $IP
rm -f /$dir/community.lst && wget -P $dir $COMMUNITY

# Check file at reboot
if [ ! -f $dir/subnet.lst ]
then
    wget -P $dir $SUBNET
fi

if [ ! -f $dir/ip.lst ]
then
    wget -P $dir $IP
fi

if [ ! -f $dir/community.lst ]
then
    wget -P $dir $COMMUNITY
fi

echo "Flushing old ruleset (Because otherwise firewall restart can be killed by OOM)"
nft flush ruleset
echo "Restarting firewall"
/etc/init.d/firewall restart
# nft list ruleset
echo "Adding community.lst"
cat /tmp/lst/community.lst | xargs -r -n1000 | sed 's/ /,/g' | xargs -n1 sh -c 'nft add element inet fw4 vpn_community { "$@" }' dummy
echo "Adding subnet.lst"
cat /tmp/lst/subnet.lst | xargs -r -n1000 | sed 's/ /,/g' | xargs -n1 sh -c 'nft add element inet fw4 vpn_subnets { "$@" }' dummy
echo "Adding ip.lst"
cat /tmp/lst/ip.lst | xargs -r -n1000 | sed 's/ /,/g' | xargs -n1 sh -c 'nft add element inet fw4 vpn_ip { "$@" }' dummy

(/etc/config/firewall)
Как видим в конфиге я не использую loadfile (он закомменчен)

config ipset
        option name 'vpn_ip'
        option match 'dst_ip'
        #option loadfile '/tmp/lst/ip.lst'

config ipset
        option name 'vpn_subnets'
        option match 'dst_net'
        #option loadfile '/tmp/lst/subnet.lst'

config ipset
        option name 'vpn_community'
        option match 'dst_net'
        #option loadfile '/tmp/lst/community.lst'

config rule
        option name 'mark_subnet'
        option src 'lan'
        option dest '*'
        option proto 'all'
        option ipset 'vpn_subnets'
        option set_mark '0x1'
        option target 'MARK'

config rule
        option name 'mark_ip'
        option src 'lan'
        option dest '*'
        option proto 'all'
        option ipset 'vpn_ip'
        option set_mark '0x1'
        option target 'MARK'
        option family 'ipv4'

config rule
        option name 'mark_community'
        option src 'lan'
        option dest '*'
        option proto 'all'
        option ipset 'vpn_community'
        option set_mark '0x1'
        option target 'MARK'
        option family 'ipv4'

Ошибка при загрузке страницы uci в startup

изображение

выходит ошибка

XHR request timed out

Роутер: Redmi AX6
FW: OpenWrt SNAPSHOT r20813-bfb4f545a8 / LuCI Master git-22.260.19132-34dd31a

В ручную не завелось. запустил через ansible всё завелось.

У меня решилось поместив код hirkn в start() { ** }
и запускать через /etc/init.d/hirkn start
не знаю как актуально для других версий.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.