Как программно обновить правило перенаправления брандмауэра в OpenWrt с помощью UCI, зная только имя

Вопрос или проблема

Моя программа ранее создала правило перенаправления..

uci add firewall redirect
uci set firewall.@redirect[-1].dest="lan"
uci set firewall.@redirect[-1].target="DNAT"
uci set firewall.@redirect[-1].name="transmission"
uci set firewall.@redirect[-1].src="https://serverfault.com/questions/1167277/wan"
uci set firewall.@redirect[-1].src_dport=""$port""
uci set firewall.@redirect[-1].dest_ip='192.168.1.5'
uci set firewall.@redirect[-1].dest_port=""$port""
uci commit firewall
service firewall restart

Мне нужно программно обновлять это правило периодически, но я не понимаю, где ручка. Я не могу быть уверенным, что это будет последнее правило [-1], добавленное. Конечно, есть способ создать ручку при создании правила? Единственная информация, которая будет постоянной, это имя, которое я дал правилу, но это не кажется ручкой.

Ответ или решение

Чтобы программно обновить правило перенаправления (redirect rule) в OpenWrt с использованием UCI, используя только имя, вам необходимо следовать нескольким шагам. Это решение основано на эффективном извлечении и настройке правила в зависимости от его имени, что позволит вам избежать неопределенности, связанной с использованием последнего добавленного элемента (-1) в списке.

Шаг 1: Поиск правила по имени

Для начала вам нужно найти ID вашего правила, основываясь на заданном вами имени. Вы можете использовать команду uci get, чтобы получить список всех правил перенаправления и выявить нужное по имени.

rule_name="transmission"
rule_id=$(uci show firewall | grep "firewall.@redirect[.*].name='$rule_name'" | cut -d. -f2 | cut -d' ' -f1)

Объяснение:

  • uci show firewall — показывает все настройки фаервола.
  • grep "firewall.@redirect[.*].name='$rule_name'" — находит строку, содержащую имя вашего правила.
  • cut — используется для извлечения ID правила.

Шаг 2: Обновление параметров правила

Сейчас, когда у вас есть ID правила, вы можете использовать его для обновления нужных параметров. Допустим, вам нужно обновить порт и IP-адрес назначения (dest_ip). Вы можете использовать следующую последовательность команд:

new_port="8080"  # Замените на ваш новый порт
new_dest_ip="192.168.1.10"  # Замените на новый IP-адрес назначения

if [ -n "$rule_id" ]; then
    uci set firewall.$rule_id.src_dport="$new_port"
    uci set firewall.$rule_id.dest_ip="$new_dest_ip"
    uci commit firewall
    service firewall restart
else
    echo "Правило с именем $rule_name не найдено."
fi

Шаг 3: Команда для выполнения

Как итог, вам нужно собрать все вышеописанные команды в один скрипт, чтобы он выполнялся периодически (например, через cron или другой планировщик задач). Вот пример простого скрипта:

#!/bin/bash

rule_name="transmission"
new_port="8080"
new_dest_ip="192.168.1.10"

# Найти ID правила по имени
rule_id=$(uci show firewall | grep "firewall.@redirect[.*].name='$rule_name'" | cut -d. -f2 | cut -d' ' -f1)

# Обновить параметры правила
if [ -n "$rule_id" ]; then
    uci set firewall.$rule_id.src_dport="$new_port"
    uci set firewall.$rule_id.dest_ip="$new_dest_ip"
    uci commit firewall
    service firewall restart
else
    echo "Правило с именем $rule_name не найдено."
fi

Заключение

Таким образом, у вас есть способ программного обновления правила перенаправления в OpenWrt, основываясь на заданном имени. Это не только упрощает процесс изменения параметров, но и уменьшает риск ошибок, связанных с поиском и использованием последнего добавленного элемента. Успехов в вашем проекте!

Оцените материал
Добавить комментарий

Капча загружается...