Proxy transparente a nodeport en kubernetes

Proxy transparente a nodeport en kubernetes

Tengo un Kubernetes configurado con un pod que contiene los siguientes contenedores:

  1. Contenedor de calamares
  2. transocks (como calcetines rojos); un proxy SOCKS transparente

Estoy ejecutando esto en k3s localmente en una PC con Linux y quiero enviar de forma transparente todo el tráfico saliente desde la PC a través de este proxy transparente. Por lo tanto, el tráfico del host saliente se fuerza al puerto de transocks en el módulo de Kubernetes. En este momento no funciona, simplemente se agota el tiempo de conexión.

Sé que las reglas de iptables que estoy usando son buenas porque funcionaron cuando ejecuté los contenedores anteriores directamente en la ventana acoplable usando la red de host. Los usuarios de squid y transocks eran uid 31 y 32. Creé las siguientes reglas de 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

Donde 12345 es el puerto que está escuchando Transocks. Nuevamente, estas reglas funcionan muy bien en Docker utilizando la red de host. transocks reenvía a 127.0.0.1:3128 (puerto calamar) y se representa de forma transparente. Sin embargo, cuando lo intento usando un pod de Kubernetes usando un nodeport (30345 para transocks, 30128 para squid), no parece funcionar. La conexión simplemente se cuelga hasta que se agota el tiempo de espera.

Debo mencionar que también intenté lo mismo con dns, donde redirijo el tráfico de salida con destino 53 al puerto 9053 (puerto dns mapeado en la ventana acoplable), y funciona, pero cuando lo uso en kubernetes y redirijo al nodeport (30053 ) cuelga de la misma manera. Entonces, por alguna razón, los puertos de los nodos no parecen funcionar cuando se redirige el tráfico a ellos. Me preguntaba si alguien podría decirme lo que me falta aquí. No debo entender muy bien las redes de Kubernetes.

Por si alguien quiere ver mis kuebrnetes manifestados, aquí los tienen.

Despliegue

{
  "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
              }
            ]
          }
        ]
      }
    }
  }
}

Servicio

{
  "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
      }
    ]
  }
}

reglas de 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

Gracias de nuevo por la ayuda.

Respuesta1

Si alguien está interesado, me resultó demasiado difícil intentar usar un puerto de nodo y, en su lugar, opté por simplemente mover los transocks a su propio pod y usar la red de host, junto con las reglas de reenvío anteriores para que esto funcione. Aquí está el manifiesto que utilicé para el módulo transocks:

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

Este es el toml de transocks que estoy usando:

listen = "0.0.0.0:12345"

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

[log]
level = "error"

30128 es el puerto de nodo para el proxy Squid.

información relacionada