我設定了一個 kubernetes,其中包含一個包含以下容器的 pod:
- 魷魚容器
- 橫襪(如紅襪);透明的 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代理的節點埠。