UMGUM.COM 

Функции выделенного IP для web-прокси ( Библиотека функций назначения фронтальному web-прокси выделенного IP-адреса для приёма через него запросов к тестовым стендам "Docker + Bash". )

4 мая 2019  (обновлено 17 июня 2019)

Эта публикация скрыта. Она доступна только по прямой ссылке.

OS: "Linux Debian 9 (Stretch)", "Linux Ubuntu 18.04 LTS (Bionic Beaver)".
Apps: "Bash", "Docker" & etc.

В этой заметке описан один из этапов реализации поставленной в вышестоящей публикации задачи автоматизации процедур развёртывания тестовых стендов из docker-контейнеров.

Дополнительный конфигурационный файл для включения поддержки использования фронтальным web-прокси выделенного IP-адреса:

# vi /usr/local/etc/devops/conf/front-nginx.conf

# Имя контейнера фронтального web-прокси
FRONTNAME="front-nginx"

# Имя сетевого интерфейса и IP-адрес для приёма трафика
# (если указаны эти два параметра, то весь трафик к Docker будет пущен через них)
# (если параметры не использовать, то трафик к Docker пойдёт через несущую систему)
WARPINT="eth0:1"
EXTERNIP="10.20.30.45/24"

Библиотека функций назначения фронтальному web-прокси выделенного IP-адреса:

# vi /usr/local/etc/devops/lib/front-ip-dedicated.sh.snippet


#!/bin/bash
# This file contains the code snippet for the shell Bash v.4 (Bourne again shell).
# Файл содержит фрагмент кода для командного интерпретатора Bash v.4 (Bourne again shell).

# Функция активация пересылки трафика к фронтальному web-прокси
function front-ip-start() {

  # Вычленяем значение IP-адреса фронтального web-прокси, откидывая маску сети
  EXTERNIPWOM=$(echo ${EXTERNIP} | awk -F "/" '{print $1}')

  # Выясняем IP-адрес, выданный фронтальному web-прокси для внешней сети "frontnet"
  INNERIPWOM=$(docker inspect ${FRONTNAME} 2> /dev/null | jq -r '.[0].NetworkSettings.Networks["frontnet"].IPAddress' | awk -F "/" '{print $1}')
  if [ ! -z "${INNERIPWOM}" ] ; then

    # Проверяем возможное наличие активного IP-адреса
    if [ "$(ip addr show | grep -c -i ${EXTERNIPWOM})" -eq "0" ] ; then

      # Активируем дополнительный IP-адрес
     ip addr add ${EXTERNIP} dev ${WARPINT}

      # После активации IP-адреса добавляем правила Iptables
      if [ "${?}" -eq "0" ] ; then
        echo "${DATE}: Заданный внешний IP-адрес \"${EXTERNIP}\" успешно активирован."

        # Задаём правила перехвата, перенаправления и допуска трафика извне и обратно между внешним и внутренним IP
        # (предварительно зачищаем возможно имеющиеся правила от предыдущего запуска)
        iptables -t nat -S PREROUTING | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
        iptables -t nat -I PREROUTING 1 -d ${EXTERNIPWOM} -j DNAT --to-destination ${INNERIPWOM}
        #
        iptables -t nat -S OUTPUT | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
        iptables -t nat -I OUTPUT 1 -d ${EXTERNIPWOM} -j DNAT --to-destination ${INNERIPWOM}
        #
        iptables -t nat -S POSTROUTING | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
        iptables -t nat -I POSTROUTING 1 -s ${INNERIPWOM} -j SNAT --to-source ${EXTERNIPWOM}
        #
        iptables -t filter -S FORWARD | grep -i ${INNERIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t filter -D ${RULE}; done
        iptables -t filter -I FORWARD 1 --source 0.0.0.0/0 --destination ${INNERIPWOM} -j ACCEPT

      else
        FORTH=false
        echo "${DATE}: Сбой при добавлении внешнего IP-адреса \"${EXTERNIP}\"."
      fi
    else
      echo "${DATE}: Добавление внешнего IP-адреса не требуется: заданный IP-адрес \"${EXTERNIP}\" уже активен на сетевом интерфейсе \"$(ip -o addr show scope global | grep -i ${EXTERNIPWOM} | awk '{print $2}')\"."
    fi
  else
    FORTH=false
    echo "${DATE}: Сбой при добавлении внешнего IP-адреса: не получен внутренний IP-адрес фронтального web-прокси."
  fi

return ${?}
}

# Функция выключения пересылки трафика к фронтальному web-прокси
function front-ip-stop() {

  # Удаляем заданный внешний IP-адрес
  ip addr del ${EXTERNIP} dev ${WARPINT} 2>/dev/null

  # Вычленяем значение IP-адреса фронтального web-прокси, откидывая маску сети
  EXTERNIPWOM=$(echo ${EXTERNIP} | awk -F "/" '{print $1}')

  # Выясняем IP-адрес, выданный фронтальному web-прокси для внешней сети "frontnet"
  INNERIPWOM=$(docker inspect ${FRONTNAME} 2> /dev/null | jq -r '.[0].NetworkSettings.Networks["frontnet"].IPAddress' | awk -F "/" '{print $1}')

  # Удаляем все связанные с фронтальным web-прокси правила Iptables
  iptables -t nat -S PREROUTING | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
  iptables -t nat -S OUTPUT | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
  iptables -t nat -S POSTROUTING | grep -i ${EXTERNIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t nat -D ${RULE}; done
  iptables -t filter -S FORWARD | grep -i ${INNERIPWOM} | sed 's/^-A //' | while read RULE; do iptables -t filter -D ${RULE}; done

  # Проверяем успешность удаления заданного внешнего IP-адреса
  if [ "$(ip addr show | grep -c -i ${EXTERNIPWOM})" -eq "0" ] ; then
    echo "${DATE}: Заданный внешний IP-адрес \"${EXTERNIP}\" успешно удалён."
  else
    FORTH=false
    echo "${DATE}: Сбой при удалении внешнего IP-адреса \"${EXTERNIP}\" с заданного интерфейса \"{WARPINT}\" (он всё ещё привязан к интерфейсу \"$(ip -o addr show scope global | grep -i ${EXTERNIPWOM} | awk '{print $2}')\")."
  fi

return ${?}
}


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )