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

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

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

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

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

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

#iptables -t nat -A OUTPUT -m owner --uid-owner 31 -j ACCEPT
#iptables -t nat -A OUTPUT -m owner --uid-owner 32 -j ACCEPT
#iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 12345
#iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-port 12345

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

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

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

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

{
  "apiVersion": "apps/v1",
  "kind": "Deployment",
  "metadata": {
    "name": "webfilter",
    "labels": {
      "app": "webfilter"
    }
  },
  "spec": {
    "replicas": 1,
    "selector": {
      "matchLabels": {
        "app": "webfilter"
      }
    },
    "template": {
      "metadata": {
        "labels": {
          "app": "webfilter"
        }
      },
      "spec": {
        "containers": [
          {
            "name": "squid",
            "image": "jusschwa/squid-ssl:latest",
            "ports": [
              {
                "containerPort": 3128
              }
            ]
          }, {
            "name": "transocks",
            "image": "jusschwa/transocks-proxy:latest",
            "ports": [
              {
                "containerPort": 12345
              }
            ]
          }
        ]
      }
    }
  }
}

Услуга

{
  "apiVersion": "v1",
  "kind": "Service",
  "metadata": {
    "name": "webfilter",
    "labels": {
      "app": "webfilter"
    }
  },
  "spec": {
    "type": "NodePort",
    "selector": {
      "app": "webfilter"
    },
    "ports": [
      {
        "name": "squid",
        "protocol": "TCP",
        "port": 3128,
        "targetPort": 3128,
        "nodePort": 30128
      },
      {
        "name": "transocks",
        "protocol": "TCP",
        "port": 12345,
        "targetPort": 12345,
        "nodePort": 30345
      }
    ]
  }
}

правила iptables

iptables -t nat -A OUTPUT -m owner --uid-owner root -j ACCEPT
iptables -t nat -A OUTPUT -m owner --uid-owner 31 -j ACCEPT # squid user
iptables -t nat -A OUTPUT -m owner --uid-owner 32 -j ACCEPT # transocks user
iptables -t nat -A OUTPUT -m owner --uid-owner 32 -j ACCEPT # unbound user
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 30345
iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-ports 30345
iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 30053

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

решение1

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

{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
    "name": "transocks"
  },
  "spec": {
    "hostNetwork": true,
    "dnsPolicy": "ClusterFirstWithHostNet",
    "containers": [
      {
        "name": "transocks",
        "image": "jusschwa/transocks-proxy"
      }
    ]
  }
}

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

listen = "0.0.0.0:12345"

# Connect to HTTP Proxy
proxy_url = "http://127.0.0.1:30128"

[log]
level = "error"

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

Связанный контент