Назад | Перейти на главную страницу

Прозрачный прокси между контейнерами докеров через iptables

Я пытаюсь добиться прозрачного прокси-сервера http между двумя контейнерами докеров.

Я установил прокси-сервер squid. Назовем это КАЛЬМАР, Также есть еще один контейнер, назовем его ПРИЛОЖЕНИЕ

Я хочу, чтобы каждое http-соединение, запрошенное из приложения, было над контейнером SQUID

Ожидаемый поток данных - APP ---> SQUID ---> http://example.com -> SQUID -> APP -> УСПЕХ

Используя tcpdump, я могу доказать, что я правильно выполнил всю необходимую конфигурацию, и я могу видеть страницу с командой curl, если использую -x

Доказательство того, что squid работает через -x

curl -x SQUID_IP:3128 -L http://www.example.com

Эта команда curl дает правильный результат.

tcpdump -i any host www.example.com

Все коммуникации между SQUID_IP и EXAMPLECOM_IP.

14:02:04.213608 IP $SQUID_IP.48808 > $EXAMPLECOM_IP..http: Flags [S], seq 2965828629, win 64240, options [mss 1460,sackOK,TS val 2305017503 ecr 0,nop,wscale 7], length 0
14:02:04.213608 IP $SQUID_IP.48808 > $EXAMPLECOM_IP..http: Flags [S], seq 2965828629, win 64240, options [mss 1460,sackOK,TS val 2305017503 ecr 0,nop,wscale 7], length 0
14:02:04.213634 IP $LINUX_NAME.48808 > $EXAMPLECOM_IP..http: Flags [S], seq 2965828629, win 64240, options [mss 1460,sackOK,TS val 2305017503 ecr 0,nop,wscale 7], length 0
14:02:04.335400 IP $EXAMPLECOM_IP..http > $LINUX_NAME.48808: Flags [S.], seq 1004826113, ack 2965828630, win 65535, options [mss 1460], length 0
14:02:04.335454 IP $EXAMPLECOM_IP..http > $SQUID_IP.48808: Flags [S.], seq 1004826113, ack 2965828630, win 65535, options [mss 1460], length 0
14:02:04.335465 IP $EXAMPLECOM_IP..http > $SQUID_IP.48808: Flags [S.], seq 1004826113, ack 2965828630, win 65535, options [mss 1460], length 0
14:02:04.335595 IP $SQUID_IP.48808 > $EXAMPLECOM_IP..http: Flags [.], ack 1, win 64240, length 0
14:02:04.335595 IP $SQUID_IP.48808 > $EXAMPLECOM_IP..http: Flags [.], ack 1, win 64240, length 0
14:02:04.335627 IP $LINUX_NAME.48808 > $EXAMPLECOM_IP..http: Flags [.], ack 1, win 64240, length 0
14:02:04.336027 IP $SQUID_IP.48808 > $EXAMPLECOM_IP..http: Flags [P.], seq 1:200, ack 1, win 64240, length 199: HTTP: GET / HTTP/1.1
14:02:04.464797 IP $EXAMPLECOM_IP..http > $LINUX_NAME.48808: Flags [P.], seq 1:1421, ack 200, win 65535, length 1420: HTTP: HTTP/1.1 200 OK
14:02:04.464871 IP $EXAMPLECOM_IP..http > $SQUID_IP.48808: Flags [P.], seq 1:1421, ack 200, win 65535, length 1420: HTTP: HTTP/1.1 200 OK
14:02:04.464888 IP $EXAMPLECOM_IP..http > $SQUID_IP.48808: Flags [P.], seq 1:1421, ack 200, win 65535, length 1420: HTTP: HTTP/1.1 200 OK
14:02:04.465051 IP $SQUID_IP.48808 > $EXAMPLECOM_IP..http: Flags [.], ack 1421, win 63900, length 0
14:02:04.465051 IP $SQUID_IP.48808 > $EXAMPLECOM_IP..http: Flags [.], ack 1421, win 63900, length 0
14:02:04.465109 IP $LINUX_NAME.48808 > $EXAMPLECOM_IP..http: Flags [.], ack 1421, win 63900, length 0
14:02:04.465879 IP $EXAMPLECOM_IP..http > $LINUX_NAME.48808: Flags [P.], seq 1421:1614, ack 200, win 65535, length 193: HTTP

журнал доступа squid

1581166924.466    253 $APP_IP TCP_MISS/200 1751 GET http://www.example.com/ - HIER_DIRECT/$EXAMPLECOM_IP text/html

Прозрачная прокси-часть

Я хочу создать такое же поведение без -x или переменной окружения.

Правило iptables, которое я написал на виртуальной машине

iptables -t nat -I PREROUTING 1 -s $APP_IP -p tcp --dport 80 -j DNAT --to-destination $PROXY_IP:3128

PS: Docker пишет некоторые правила в начале, поэтому я всегда пишу свои правила iptables вверху.

Неудачи

Команда Curl без -X

curl http://www.example.com/

вывод tcpdump, который показывает, что мой APP_IP достигает $ EXAMPLECOM_IP

tcpdump -i any host www.example.com

Странно, что tcpdump показывает связь между APP_IP и EXAMPLECOM_IP.


14:10:27.069971 IP $APP_IP.36286 > $EXAMPLECOM_IP.http: Flags [S], seq 2733675015, win 64240, options [mss 1460,sackOK,TS val 3465975630 ecr 0,nop,wscale 7], length 0
14:10:27.070010 IP $EXAMPLECOM_IP.http > $APP_IP.36286: Flags [S.], seq 121743720, ack 2733675016, win 65160, options [mss 1460,sackOK,TS val 3186379669 ecr 3465975630,nop,wscale 7], length 0
14:10:27.070019 IP $APP_IP.36286 > $EXAMPLECOM_IP.http: Flags [.], ack 1, win 502, options [nop,nop,TS val 3465975630 ecr 3186379669], length 0
14:10:27.070145 IP $APP_IP.36286 > $EXAMPLECOM_IP.http: Flags [P.], seq 1:80, ack 1, win 502, options [nop,nop,TS val 3465975630 ecr 3186379669], length 79: HTTP: GET / HTTP/1.1
14:10:27.070159 IP $EXAMPLECOM_IP.http > $APP_IP.36286: Flags [.], ack 80, win 509, options [nop,nop,TS val 3186379669 ecr 3465975630], length 0
14:10:27.070297 IP $EXAMPLECOM_IP.http > $APP_IP.36286: Flags [P.], seq 1:3887, ack 80, win 509, options [nop,nop,TS val 3186379669 ecr 3465975630], length 3886: HTTP: HTTP/1.1 400 Bad Request
14:10:27.070348 IP $EXAMPLECOM_IP.http > $APP_IP.36286: Flags [F.], seq 3887, ack 80, win 509, options [nop,nop,TS val 3186379669 ecr 3465975630], length 0


Журнал кальмаров и ошибка

1581168827.687      0 $APP_IP NONE/400 3886 GET / - HIER_NONE/- text/html 
<p>The following error was encountered while trying to retrieve the URL: <a href="/">/</a></p>

Это доказательство того, что мой трафик правил iptables, но?

Вопрос

Какие должны быть правильные iptables между SQUID и APP чтобы он вел себя как прозрачный прокси.

ИНФОРМАЦИОННОЕ ПРИМЕЧАНИЕ

Нет никаких дополнительных правил iptables, которые я написал, все здесь

iptables  -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-N NO_PROXY
-A PREROUTING -s 172.17.0.2/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.3:3128
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
iptables  -t filter -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN

export SQUID_IP=172.17.0.3
export APP_IP=172.17.0.2