From f4fbc0366789f515ed4eae7582d5f53cb38abf74 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 17 Apr 2025 08:58:21 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BE=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=B2=D0=B8=D0=B3=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ip-tables-navigation.sh | 62 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 ip-tables-navigation.sh diff --git a/ip-tables-navigation.sh b/ip-tables-navigation.sh new file mode 100644 index 00000000..af0281dc --- /dev/null +++ b/ip-tables-navigation.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash + +## Скрипт предназначен для настройки дублирования udp-пакетов +## назначенных на порт IP_PORT_IN на заданный порт IP_PORT_OUT. + +INI_FILE="/opt/5p28/device.ini" ## Путь к NI-файлу п528 +SECTION_NAME="navigat" ## Название секции +IP_PORT_NAME="port" ## Имя поля в котором хранится номер порта назначения +IP_PORT_OUT="60000" ## Порт на который направлять дублированные пакеты +SUDO_PASS="12345678" ## Пароль администратора + +set -e + +if [[ -n "$1" ]]; then + INI_FILE="$1" +fi + +if [[ -n "$2" ]]; then + SUDO_PASS="$2" +fi + +if [[ -n "$3" ]]; then + IP_PORT_OUT="$3" +fi + +# Возвращает значение из INI-файла +read_ini() { + local section="$1" + local key="$2" + # Игнорируем комментарии (# и ;), обрезаем пробелы + awk -F '=' -v section="$section" -v key="$key" ' + /^\[/ { current_section = substr($0, 2, length($0)-2) } + current_section == section && $1 ~ /^[[:space:]]*'$key'[[:space:]]*$/ { + gsub(/^[[:space:]]+|[[:space:]]+$/, "", $2) + gsub(/^"|"$/, "", $2) # Удаляем кавычки, если есть + print $2 + exit + } + ' "${INI_FILE}" +} + +# Проверка существования файла +if [[ ! -f "${INI_FILE}" ]]; then + echo "ошибка: файл \"${INI_FILE}\" не найден" + exit 1 +fi + +# Чтение значений из ini-файла +IP_PORT_IN=$(read_ini "${SECTION_NAME}" "${IP_PORT_NAME}") + +# Проверка достоверности +if [[ -z "$IP_PORT_IN" ]]; then + echo "ошибка: параметр \"${IP_PORT_NAME}\" не найден в секции [${SECTION_NAME}]" + exit 1 +fi + +# Дублирование трафика на другой порт. Перенаправить копии входящих UDP-пакетов +# с порта ${IP_PORT_IN} на порт ${IP_PORT_OUT} (или любой другой), чтобы оригинальная программа +# продолжала работать с портом ${IP_PORT_IN}, а копии пакетов отправлялись на ${IP_PORT_OUT}: +echo "${SUDO_PASS}" | sudo -S iptables -t nat -A PREROUTING -p udp --dport "${IP_PORT_IN}" -j REDIRECT --to-ports "${IP_PORT_OUT}" +echo "${SUDO_PASS}" | sudo -S iptables -A INPUT -p udp --dport "${IP_PORT_IN}" -j ACCEPT +echo "${SUDO_PASS}" | sudo -S iptables -t nat -L -n -v и iptables -L -n -v