透明代理到 kubernetes 中的 nodeport

透明代理到 kubernetes 中的 nodeport

我設定了一個 kubernetes,其中包含一個包含以下容器的 pod:

  1. 魷魚容器
  2. 橫襪(如紅襪);透明的 SOCKS 代理

我在 Linux PC 上本地的 k3s 中運行此程序,並希望透過此透明代理透明代理來自 PC 的所有傳出流量。因此,傳出主機流量被迫流向 kubernetes pod 上的 transocks 連接埠。現在它不起作用,連接逾時。

我知道我使用的 iptables 規則很好,因為當我使用主機網路直接在 docker 中運行上述容器時,它們起作用了。 squid 和 transocks 使用者的 uid 為 31 和 32。

#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 連接埠),它是透明代理的。但是,當我使用帶有節點連接埠的 kubernetes pod 進行嘗試時(transocks 為 30345,squid 為 30128),它似乎不起作用。連接會一直掛起,直到逾時。

我應該要提到的是,我也嘗試過與dns 相同的操作,其中我將綁定到53 的輸出流量重定向到端口9053(在docker 中映射的dns 端口),並且它有效,但是當我在kubernetes 中使用它並重定向到節點連接埠(30053 )它以相同的方式懸掛。因此,由於某種原因,當您將流量重定向到節點連接埠時,節點連接埠似乎不起作用。我想知道是否有人可以告訴我我在這裡缺少什麼。我一定不太了解 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 並使用主機網路以及上述轉發規則來完成這項工作。這是我用於 transocks pod 的清單:

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

這是我正在使用的 transocks toml:

listen = "0.0.0.0:12345"

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

[log]
level = "error"

30128是squid代理的節點埠。

相關內容