У меня настроен Kubernetes с модулем, содержащим следующие контейнеры:
- Контейнер для кальмаров
- 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.