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