Рейтинг:0

Прозрачное проксирование на nodeport в kubernetes

флаг in

У меня есть kubernetes с модулем, содержащим следующие контейнеры:

  1. Контейнер для кальмаров
  2. трансоксы (например, красные носки); прозрачный SOCKS-прокси

Я запускаю это в k3s локально на ПК с Linux и хочу прозрачно проксировать весь исходящий трафик с ПК через этот прозрачный прокси. Таким образом, исходящий трафик хоста направляется на порт транзакций в модуле kubernetes. Прямо сейчас он не работает, соединение просто истекло.

Я знаю, что правила iptables, которые я использую, хороши, потому что они работали, когда я запускал вышеуказанные контейнеры непосредственно в докере, используя сеть хоста. Пользователи squid и transocks имели uid 31 и 32. Я создал следующие правила iptables:

#iptables -t nat -A ВЫВОД -m владелец --uid-владелец 31 -j ПРИНЯТЬ
#iptables -t nat -A ВЫВОД -m владелец --uid-владелец 32 -j ПРИНЯТЬ
#iptables -t nat -A ВЫВОД -p tcp --dport 80 -j ПЕРЕНАПРАВЛЕНИЕ --на порт 12345
#iptables -t nat -A ВЫВОД -p tcp --dport 443 -j ПЕРЕНАПРАВЛЕНИЕ --на порт 12345

Где 12345 - трансок порта, который прослушивается. Опять же, эти правила отлично работают в докере с использованием хост-сети.Transocks перенаправляет на 127.0.0.1:3128 (порт squid) и прозрачно проксирует. Однако, когда я пытаюсь использовать модуль kubernetes с портом узла (30345 для трансоков, 30128 для кальмара), похоже, он не работает. Соединение просто зависает, пока не истечет время ожидания.

Я должен упомянуть, что я также пробовал то же самое с dns, где я перенаправляю исходящий трафик, привязанный к 53, на порт 9053 (порт dns отображается в докере), и это работает, но когда я использую его в kubernetes и перенаправляю на nodeport (30053 ) висит так же. Поэтому по какой-то причине порты узлов не работают, когда вы перенаправляете на них трафик. Мне было интересно, может ли кто-нибудь сказать мне, что мне здесь не хватает. Должно быть, я не очень хорошо понимаю сеть kubernetes.

Если кто-то захочет увидеть мои kuebrnetes, вот они.

Развертывание

{
  "apiVersion": "приложения/v1",
  "вид": "Развертывание",
  "метаданные": {
    "имя": "веб-фильтр",
    "метки": {
      "приложение": "веб-фильтр"
    }
  },
  "спецификация": {
    «реплики»: 1,
    "селектор": {
      "матчлабелс": {
        "приложение": "веб-фильтр"
      }
    },
    "шаблон": {
      "метаданные": {
        "метки": {
          "приложение": "веб-фильтр"
        }
      },
      "спецификация": {
        "контейнеры": [
          {
            "имя": "кальмар",
            "image": "jusschwa/squid-ssl: последний",
            "порты": [
              {
                "контейнерный порт": 3128
              }
            ]
          }, {
            "название": "трансок",
            "image": "jusschwa/transocks-proxy:latest",
            "порты": [
              {
                "контейнерный порт": 12345
              }
            ]
          }
        ]
      }
    }
  }
}

Оказание услуг

{
  "апиВерсия": "v1",
  "вид": "Сервис",
  "метаданные": {
    "имя": "веб-фильтр",
    "метки": {
      "приложение": "веб-фильтр"
    }
  },
  "спецификация": {
    "тип": "Порт узла",
    "селектор": {
      "приложение": "веб-фильтр"
    },
    "порты": [
      {
        "имя": "кальмар",
        "протокол": "TCP",
        "порт": 3128,
        "целевой порт": 3128,
        "порт узла": 30128
      },
      {
        "название": "трансок",
        "протокол": "TCP",
        "порт": 12345,
        "целевой порт": 12345,
        "порт узла": 30345
      }
    ]
  }
}

правила iptables

iptables -t nat -A ВЫВОД -m владелец --uid-владелец root -j ПРИНЯТЬ
iptables -t nat -A OUTPUT -m owner --uid-owner 31 -j ACCEPT # пользователь squid
iptables -t nat -A OUTPUT -m owner --uid-owner 32 -j ACCEPT # трансокк пользователя
iptables -t nat -A OUTPUT -m owner --uid-owner 32 -j ACCEPT # непривязанный пользователь
iptables -t nat -A ВЫВОД -p tcp --dport 80 -j ПЕРЕНАПРАВЛЕНИЕ --to-ports 30345
iptables -t nat -A ВЫВОД -p tcp --dport 443 -j ПЕРЕНАПРАВЛЕНИЕ --to-ports 30345
iptables -t nat -A ВЫВОД -p udp --dport 53 -j ПЕРЕНАПРАВЛЕНИЕ --to-ports 30053

Спасибо еще раз за помощь.

Рейтинг:1
флаг in

Если кому-то интересно, я обнаружил, что попытка использовать порт узла слишком сложна, и вместо этого решил просто переместить трансокки в свой собственный модуль и использовать сеть хоста вместе с приведенными выше правилами переадресации, чтобы это работало. Вот манифест, который я использовал для модуля Transocks:

{
  "апиВерсия": "v1",
  "вид": "стручок",
  "метаданные": {
    "имя": "трансок"
  },
  "спецификация": {
    "hostNetwork": правда,
    "dnsPolicy": "Кластерфирствисхостнет",
    "контейнеры": [
      {
        "название": "трансок",
        "image": "jusschwa/transocks-proxy"
      }
    ]
  }
}

Это трансок томл, который я использую:

слушать = "0.0.0.0:12345"

# Подключиться к HTTP-прокси
proxy_url = "http://127.0.0.1:30128"

[журнал]
уровень = "ошибка"

30128 — это порт узла для прокси-сервера squid.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.