├── .gitignore ├── README.md ├── group_vars └── keenetic.yml └── keenetik_vpn_routing.yml /.gitignore: -------------------------------------------------------------------------------- 1 | hosts -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## ⚠️ Пакет устарел (Not maintained) 2 | Данный пакет устарел и более не обновляется. 3 | 4 | Ему на замену пришёл [keenetic-pbr](https://github.com/maksimkurb/keenetic-pbr), который умеет быстро импортировать большие списки в ipset, а также суммаризирует их перед импортом. 5 | 6 | [keenetic-pbr](https://github.com/maksimkurb/keenetic-pbr) в отличие от данного набора скриптов также поддерживает настройку разных маршрутов для разных списков адресов, напр. адреса из списка 1 идут на VPN1, адреса из списка 2 идут на VPN2, а адреса из списка 3 идут всегда напрямую. 7 | 8 | # Описание 9 | Shell скрипт и роль для Ansible. 10 | Автоматизируют настройку роутера Keenetic для маршрутизации по доменам и спискам IP-адресов через определённый интерфейс. 11 | 12 | Это может быть нужно, если у вас есть отдельный сервер со внутренними доменами, к которым нужно получить доступ. 13 | 14 | Списки берутся с [antifilter.download](https://antifilter.download/) 15 | 16 | Использованные ресурсы: 17 | 1. https://habr.com/ru/articles/767464/ 18 | 1. https://4pda.ru/forum/index.php?s=&showtopic=883101&view=findpost&p=93198674 19 | 20 | # Использование 21 | 22 | Для работы необходимо настроенное на роутере подключение к VPN-серверу 23 | 24 | Скачать playbook и темплейты в 25 | 26 | ``` 27 | git clone https://github.com/maksimkurb/ansible-keenetic-domain-routing 28 | cd ansible-keenetic-domain-routing/ 29 | ``` 30 | 31 | Добавить роутер в файл hosts в группу keenetic 32 | ``` 33 | [keenetic] 34 | 192.168.1.1 ansible_port=2222 ansible_user=root ansible_password=keenetic 35 | ``` 36 | 37 | Подставить переменные в **group_vars/keenetic.yml** 38 | ``` 39 | vpn_interface_name: nwg0 # имя интерфейса VPN (можно посмотреть с помощью ifconfig) 40 | lists_dir: "{{ prefix }}/tmp/lst" # Папка, в которую будут сохраняться скачанные списки маршрутов 41 | custom_unblock_hosts: "{{ prefix }}/etc/unblock.txt" # Файл с собственными адресами, которые будут идти через VPN 42 | custom_direct_hosts: "{{ prefix }}/etc/direct.txt" # [NEW!] Файл с собственными адресами, которые всегда будут идти напрямую 43 | 44 | ipset_name: rublock # Название списка ip сетей в netfilter (для опытных пользователей) 45 | prefix: /opt # Префикс корневой системы OPKG (для опытных пользователей) 46 | shell: /opt/bin/sh # Оболочка в которой будут запускаться скрипты (для опытных пользователей) 47 | ``` 48 | 49 | Запуск playbook 50 | ``` 51 | ansible-playbook keenetik_vpn_routing.yml -i hosts 52 | ``` 53 | 54 | После выполнения playbook перезагрузите роутер, после чего он начнёт пробрасывать выбранные домены и подсети через VPN сервер. 55 | 56 | ### Свои правила маршрутизации 57 | Дополительные адреса можно прописать в следующие файлы: 58 | 59 | | Приоритет | Файл | Описание | 60 | | --------- | ---- | -------- | 61 | | 993 | `/opt/etc/routing-direct.txt` | Список адресов, которые **НИКОГДА** не будут идти через VPN, _даже если они есть в файле `routing-vpn.txt` или списках antifilter_ | 62 | | 1000 | `/opt/etc/routing-vpn.txt` | Список адресов, которые будут перенаправлены через VPN, _даже если их нет в списках antifilter_ | 63 | 64 | Приоритет: 0 - самый высокий приоритет, 32767 - самый низкий приоритет 65 | 66 | ## Протестировано на 67 | 1. Keenetic Viva KN-1910 68 | 1. Zyxel Keenetic Giga II 69 | -------------------------------------------------------------------------------- /group_vars/keenetic.yml: -------------------------------------------------------------------------------- 1 | ######################################### 2 | ## Основные настройки ## 3 | ######################################### 4 | 5 | # имя интерфейса VPN (можно посмотреть с помощью ifconfig) 6 | vpn_interface_name: ppp2 7 | 8 | # Папка, в которую будут сохраняться скачанные списки маршрутов 9 | lists_dir: "{{ prefix }}/tmp/lst" 10 | 11 | # Файл с собственными адресами, которые будут идти через VPN 12 | custom_vpn_hosts: "{{ prefix }}/etc/routing-vpn.txt" 13 | 14 | # [NEW!] Файл с собственными адресами, которые всегда будут идти напрямую 15 | custom_direct_hosts: "{{ prefix }}/etc/routing-direct.txt" 16 | 17 | ######################################### 18 | ## Настройки для опытных пользователей ## 19 | ######################################### 20 | 21 | # Название списка ip сетей в netfilter, которые будут идти через VPN (для опытных пользователей) 22 | ipset_vpn_name: routing_vpn 23 | 24 | # Название списка ip сетей в netfilter, которые будут идти всегда напрямую (для опытных пользователей) 25 | ipset_direct_name: routing_direct 26 | 27 | # Префикс корневой системы OPKG (для опытных пользователей) 28 | prefix: /opt 29 | 30 | # Оболочка в которой будут запускаться скрипты (для опытных пользователей) 31 | shell: /opt/bin/sh 32 | -------------------------------------------------------------------------------- /keenetik_vpn_routing.yml: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | - hosts: keenetic 4 | gather_facts: False 5 | 6 | remote_user: root 7 | 8 | # Packages installation 9 | 10 | tasks: 11 | - name: Install required software 12 | raw: opkg install ipset curl iptables cron bind-dig 13 | 14 | - name: Create /bin/routing-update.sh script 15 | raw: | 16 | tee {{ prefix }}/bin/routing-update.sh > /dev/null < Domain routing: Checking for network availability before updating IP sets" 19 | 20 | until ADDRS=\$(dig +short google.com @localhost) && [ -n "\$ADDRS" ] > /dev/null 2>&1; do sleep 5; done 21 | 22 | IPSET_VPN="{{ ipset_vpn_name }}" 23 | IPSET_DIRECT="{{ ipset_direct_name }}" 24 | LISTS_DIR="{{ lists_dir }}" 25 | 26 | {{ prefix }}/bin/routing-update-lists.sh 27 | 28 | echo "|==> Domain routing: Clearing ipset '\$IPSET_VPN'" 29 | ipset flush \$IPSET_VPN 30 | 31 | echo "|==> Domain routing: Clearing ipset '\$IPSET_DIRECT'" 32 | ipset flush \$IPSET_DIRECT 33 | 34 | echo "|==> Domain routing: Importing lists into ipset '\$IPSET_VPN'" 35 | {{ prefix }}/bin/routing-apply-list.sh "\$LISTS_DIR/subnet.routing.lst" 36 | {{ prefix }}/bin/routing-apply-list.sh "\$LISTS_DIR/ipsum.routing.lst" 37 | 38 | echo "|==> Domain routing: Importing custom unblock lists into ipset '\$IPSET_VPN'" 39 | {{ prefix }}/bin/routing-apply-custom-list.sh "\$IPSET_VPN" "{{ custom_vpn_hosts }}" 40 | 41 | echo "|==> Domain routing: Importing custom direct lists into ipset '\$IPSET_DIRECT'" 42 | {{ prefix }}/bin/routing-apply-custom-list.sh "\$IPSET_DIRECT" "{{ custom_direct_hosts }}" 43 | EOF 44 | 45 | - name: Create /bin/routing-update-lists.sh script 46 | raw: | 47 | tee {{ prefix }}/bin/routing-update-lists.sh > /dev/null < Domain routing: Downloading block lists" 55 | curl -z \$LISTS_DIR/subnet.routing.lst https://antifilter.download/list/subnet.lst --output \$LISTS_DIR/subnet.routing.lst 56 | curl -z \$LISTS_DIR/ipsum.routing.lst https://antifilter.download/list/ipsum.lst --output \$LISTS_DIR/ipsum.routing.lst 57 | EOF 58 | 59 | - name: Create /bin/routing-apply-list.sh script 60 | raw: | 61 | tee {{ prefix }}/bin/routing-apply-list.sh > /dev/null < /dev/null < /dev/null < Domain routing: Create ip set '{{ ipset_vpn_name }}' for blocked IPs" 119 | ipset create "{{ ipset_vpn_name }}" hash:net -exist 120 | 121 | echo "|==> Domain routing: Create ip set '{{ ipset_direct_name }}' for always direct IPs" 122 | ipset create "{{ ipset_direct_name }}" hash:net -exist 123 | 124 | # Dirty hack 125 | echo "|==> Domain routing: Sleeping 10 secs to allow filesystem to fully mount" 126 | sleep 10 127 | 128 | # update list 129 | {{ prefix }}/bin/routing-update.sh & 130 | 131 | exit 0 132 | EOF 133 | 134 | - name: Create /etc/ndm/netfilter.d/100-routing-fwmarks.sh 135 | raw: | 136 | tee {{ prefix }}/etc/ndm/netfilter.d/100-routing-fwmarks.sh > /dev/null < /dev/null < Domain routing: \$id change: \$change to - up:\$up link:\$link connected:\$connected" 165 | 166 | case \${change}-\${connected}-\${link}-\${up} in 167 | link-yes-up-up) 168 | ### Create routing tables for marked packets 169 | if [ -z "\$(ip rule show | grep 1000:)" ]; then 170 | echo "|==> Domain routing: add rule to \$VPN_INTERFACE" 171 | ip rule add fwmark 1 table 1 priority 1000 172 | fi 173 | 174 | if [ -z "\$(ip route list table 1)" ]; then 175 | echo "|==> Domain routing: add route to \$VPN_INTERFACE" 176 | ip route add default dev \$VPN_INTERFACE table 1 177 | fi 178 | 179 | if [ -z "\$(ip rule show | grep 993:)" ]; then 180 | echo "|==> Domain routing: add rule for direct access" 181 | ip rule add fwmark 2 table main priority 993 182 | fi 183 | 184 | ### Disable HW NAT 185 | sysctl -w net.ipv4.netfilter.ip_conntrack_fastnat=0 || true # NDMS2 186 | sysctl -w net.netfilter.nf_conntrack_fastnat=0 || true # NDMS3 187 | ;; 188 | link-no-down-down) 189 | ### Delete routing tables for marked packets 190 | if [ -n "\$(ip rule show | grep 1000:)" ]; then 191 | echo "|==> Domain routing: del rule to \$VPN_INTERFACE" 192 | ip rule del table 1 193 | fi 194 | 195 | if [ -n "\$(ip route list table 1)" ]; then 196 | echo "|==> Domain routing: del route to \$VPN_INTERFACE" 197 | ip route flush table 1 198 | fi 199 | 200 | if [ -z "\$(ip rule show | grep 993:)" ]; then 201 | echo "|==> Domain routing: del rule for direct access" 202 | ip rule del fwmark 2 table main priority 993 203 | fi 204 | 205 | ### Enable HW NAT 206 | sysctl -w net.ipv4.netfilter.ip_conntrack_fastnat=1 || true # NDMS2 207 | sysctl -w net.netfilter.nf_conntrack_fastnat=1 || true # NDMS3 208 | ;; 209 | esac 210 | EOF 211 | 212 | - name: Create /etc/cron.daily/100-routing-update.sh 213 | raw: | 214 | tee {{ prefix }}/etc/cron.daily/100-routing-update.sh > /dev/null < /dev/null < /dev/null <