Transparentes Proxying zum Nodeport in Kubernetes

Transparentes Proxying zum Nodeport in Kubernetes

Ich habe ein Kubernetes mit einem Pod eingerichtet, der die folgenden Container enthält:

  1. Tintenfischbehälter
  2. transocks (wie redsocks); ein transparenter SOCKS-Proxy

Ich führe dies lokal in k3s auf einem Linux-PC aus und möchte den gesamten ausgehenden Datenverkehr vom PC transparent über diesen transparenten Proxy leiten. Der ausgehende Host-Datenverkehr wird also zum Transocks-Port auf dem Kubernetes-Pod gezwungen. Im Moment funktioniert es nicht, die Verbindung läuft einfach ab.

Ich weiß, dass die von mir verwendeten iptables-Regeln gut sind, weil sie funktionierten, als ich die oben genannten Container direkt in Docker unter Verwendung des Host-Netzwerks ausführte. Die Benutzer von Squid und Transocks hatten die UIDs 31 und 32. Ich habe die folgenden iptables-Regeln erstellt:

#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

Wobei 12345 der Port ist, auf dem Transocks lauscht. Auch diese Regeln funktionieren unter Docker mit Host-Netzwerk hervorragend. Transocks leitet an 127.0.0.1:3128 (Squid-Port) weiter und wird transparent geproxied. Wenn ich es jedoch mit einem Kubernetes-Pod mit einem Nodeport (30345 für Transocks, 30128 für Squid) versuche, scheint es nicht zu funktionieren. Die Verbindung bleibt einfach hängen, bis sie abläuft.

Ich sollte erwähnen, dass ich dasselbe auch mit DNS versucht habe, wo ich den für 53 bestimmten Ausgangsverkehr auf Port 9053 umleite (in Docker zugeordneter DNS-Port), und es funktioniert, aber wenn ich es in Kubernetes verwende und auf den Knotenport (30053) umleite, hängt es auf die gleiche Weise. Aus irgendeinem Grund scheinen Knotenports also nicht zu funktionieren, wenn Sie den Verkehr auf sie umleiten. Ich habe mich gefragt, ob mir jemand sagen kann, was ich hier übersehe. Ich verstehe wohl nicht viel von Kubernetes-Netzwerken.

Falls jemand mein Kuebrnetes-Manifest sehen möchte, hier ist es.

Einsatz

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

Service

{
  "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-Regeln

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

Nochmals vielen Dank für die Hilfe.

Antwort1

Falls es jemanden interessiert: Ich fand den Versuch, einen Knotenport zu verwenden, zu schwierig und habe mich stattdessen dafür entschieden, Transocks einfach in seinen eigenen Pod zu verschieben und Host-Netzwerke zusammen mit den oben genannten Weiterleitungsregeln zu verwenden, damit dies funktioniert. Hier ist das Manifest, das ich für den Transocks-Pod verwendet habe:

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

Dies ist das Transocks-Toml, das ich verwende:

listen = "0.0.0.0:12345"

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

[log]
level = "error"

30128 ist der Knotenport für den Squid-Proxy.

verwandte Informationen