#!/usr/bin/env bash ## Скрипт настраивает дублирование udp-пакетов передаваемых ## в порт IP_PORT_IN на заданный порт IP_PORT_OUT. ## Предназначен для работы в среде Астра 1.6 Смоленск: ## ```bash ## iptables --version ## ``` ## > iptables v1.8.2 (nf_tables) INI_FILE="/opt/5p28/device.ini" ## Путь к INI-файлу 5п28 SECTION_NAME="navigat" ## Название секции INI-файла 5п28 IP_PORT_NAME="port" ## Имя поля INI-файла 5п28 в котором хранится номер порта назначения 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