Hỏi về sử dụng proxy

Xin chào cả nhà,

Hiện tại mình đang test app của mình để đảm bảo nó hoạt động tốt với proxy. Thú thật hiện tại mình chẳng biết gì về proxy hết. Mình có tìm hiểu và setup thành công squid proxy trên docker. Mình kiểm tra thì thấy ok (proxy mình setup tạm thời, không block hay whitelist gì cả):
image

Setup xong proxy, mình start app của mình truyền thêm biến proxy:

docker run -d --name=apache --restart=always \
 -p 80:80 -p 443:443 \
 --env HTTP_PROXY="http://192.168.1.30:3130" \
 --env HTTPS_PROXY="https://192.168.1.30:3130" \
 my-app:apache2-ssl

Tới đây thì container chứa app của mình start được nhưng kết nối ngỏm củ tỏi. Coi log của app thì báo không thể kết nối proxy server. Mình chưa hiểu vấn đề nó đang nằm ở chỗ nào. Squid container và App container của mình start chung 1 máy một IP. Có vấn đề gì đó app không kết nối được nữa.
Đây là file cấu hình của mình:

root@1bd81dc813b1:/apps# cat squid.conf.https_port 

always_direct allow all


acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8
acl localnet src 10.0.0.0/8	# RFC1918 possible internal network
acl localnet src 172.16.0.0/12	# RFC1918 possible internal network
acl localnet src 192.168.0.0/16	# RFC1918 possible internal network
acl SSL_ports port 443
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443		# https
acl Safe_ports port 70		# gopher
acl Safe_ports port 210		# wais
acl Safe_ports port 1025-65535	# unregistered ports
acl Safe_ports port 280		# http-mgmt
acl Safe_ports port 488		# gss-http
acl Safe_ports port 591		# filemaker
acl Safe_ports port 777		# multiling http
acl CONNECT method CONNECT

http_access allow all
http_access allow manager localhost
http_access deny manager

htcp_access allow localnet
htcp_access deny all

visible_hostname squid.test
https_port 3128 cert=/apps/server_crt.pem key=/apps/server_key.pem

always_direct allow all  

access_log /apps/squid/var/logs/access.log squid

debug_options ALL,1

refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern (cgi-bin|\?)	0	0%	0
refresh_pattern .		0	20%	4320

coredump_dir /apps/squid/var/cache

Mình không biết đang bị rối ở đâu nên lên đây hỏi mọi người cách gỡ rối. Cần thêm thông tin gì để có thể giúp đỡ mình mọi người cứ nói nhé. Có gì sai sót cả nhà cứ nói, mình sẽ ghi nhận để cải thiện.

Cảm ơn cả nhà.

Có vẻ như bạn muốn test reverse proxy
Chuyển qua dùng nginx thôi, sample trên trang chủ cực kì đầy đủ

6 Likes

Ý tưởng app của mình là dùng quản lý trong môi trường doanh nghiệp nhỏ. Thường thấy các doanh nghiệp sử dụng proxy để quản lý kết nối của client, mình thì thực sự không biết nó là dạng proxy gì và cũng thật sự là chưa có miếng kiến thức nào về proxy. Đi loanh quanh tìm hiểu thì có Squid nên mình có tìm hiểu thử. Không biết Nginx nó có tương tự không bác? Nhờ bác giải ngố

Vậy là bạn còn không biết cái vạn muốn là gì, thì làm sao mà research được

Bạn đã thấy họ “quản lý” kết nối như thế nào? Thao tác ra sao?
Ít nhất bạn cũng phải tự định nghĩa được “quản lý” là làm gì

4 Likes

Nginx thường dùng làm reverse proxy và load balancer. Cơ mà, tớ nghĩ cậu không test reverse proxy, mà chỉ test 1 web proxy thông thường, tức là cậu thử kết nối từ app của cậu tới một host khác thông qua proxy thôi.

Trong hình ảnh của cậu, có vẻ như proxy của cậu đã up, và forward traffic tới google.com giúp cậu. Tớ nghĩ proxy của cậu đã được setup thành công.
Về phần app của cậu bị thất bại khi kết nối, tớ không có nhiều thông tin cách cậu sử dụng environment variable trong code của cậu lắm, nhưng có một vài giả thiết có thể xảy ra như này:

  • App của cậu không nhìn thấy proxy container.
    Cậu có thể xác nhận điều này bằng cách ping proxy container từ app container.
  • App của cậu không sử dụng environment variable đúng cách.
    Cậu có thể debug để xác nhận điều này.

Trước mắt, cậu thử làm theo mấy gợi ý trên xem :smile:

4 Likes

Chân thành cảm ơn @library , bạn nói đúng thứ mình đang tìm hiểu. Mình cung cấp thêm thông tin:
Đúng là giờ app mình trong tình trạng không thể thấy proxy container, dưới đây là chi tiết các bước mình đã thực hiện.

Đầu tiên, mình tạo một máy ảo Ubuntu với network adapter là NAT (thói quen, mình thường vọc phá trong máy ảo)
Tiếp theo đó trong máy ảo này mình thực hiện các bước:
Mình start proxy container bằng lệnh (container này public, bạn có thể coi được):

docker run -d --name=squid -p 3130:3128 quay.io/vuongnguyenit/private:squid-ok-2

Sau đó, mình chạy lệnh curl để kiểm tra kết nối đã thông qua proxy hay chưa như post 1

curl -v -x 192.168.1.30:3130 https://google.com

Thấy proxy đã hoạt động ổn, mình start container chứa app của mình, dùng biến HTTT_PROXY và HTTPS_PROXY (image test public, bạn có thể coi được)

docker run -d --name=apache --restart=always \
 -p 80:80 -p 443:443 \
 --env HTTP_PROXY="http://192.168.1.30:3130" \
 --env HTTPS_PROXY="https://192.168.1.30:3130" \
 my-app:apache2-ssl

Note: 192.168.1.30 là địa chỉ máy ảo của mình

test@ubuntu:~$ docker ps
CONTAINER ID   IMAGE                                       COMMAND                  CREATED        STATUS         PORTS                                                                      NAMES
4f3131939b8f   quay.io/vuongnguyenit/private:apache2-ssl   "apache2-foreground"     10 hours ago   Up 10 hours    0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   apache2
461cedf02805   quay.io/vuongnguyenit/private:squid-ok-2    "/usr/bin/supervisord"   10 hours ago   Up 4 minutes   0.0.0.0:3130->3128/tcp, :::3130->3128/tcp                                  squid

Sau khi start thành công, mình exec vào trong container vừa start, dùng lệnh printenv để kiểm tra các biến môi trường:

test@ubuntu:~$ docker exec -it 4f bash
root@4f3131939b8f:/# printenv
HOSTNAME=4f3131939b8f
PWD=/
TZ=UTC
FPT_PROXY=http://192.168.1.30:3130
HOME=/root
TERM=xterm
SHLVL=1
HTTPS_PROXY=http://192.168.1.30:3130
HTTP_PROXY=http://192.168.1.30:3130
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/printenv
root@4f3131939b8f:/# 

Thấy proxy đã được truyền vô biến môi trường thành công, mình kết nối app thử bằng firefox thì nó nghẹo (http://192.168.1.30, https://192.168.1.30)

Mình vào trong app container, tiến hành thử kết nối ra ngoài kiểm tra thì nó có thể kết nối ra ngoài internet nhưng không kết nối được proxy container thì phải

root@4f3131939b8f:/# ping google.com
PING google.com (172.217.24.238) 56(84) bytes of data.
64 bytes from kul06s17-in-f238.1e100.net (172.217.24.238): icmp_seq=1 ttl=127 time=29.4 ms
64 bytes from hkg12s34-in-f14.1e100.net (172.217.24.238): icmp_seq=2 ttl=127 time=31.2 ms
64 bytes from kul06s17-in-f238.1e100.net (172.217.24.238): icmp_seq=3 ttl=127 time=28.7 ms
64 bytes from del03s05-in-f14.1e100.net (172.217.24.238): icmp_seq=4 ttl=127 time=36.7 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 28.716/31.510/36.727/3.147 ms

root@4f3131939b8f:/# ping 192.168.1.30
PING 192.168.223.130 (192.168.1.30) 56(84) bytes of data.
^C
--- 192.168.1.30 ping statistics ---
9 packets transmitted, 0 received, 100% packet loss, time 8195ms

root@4f3131939b8f:/# 

Tới đoạn này mình đang tìm nguyên nhân và biện pháp khắc phục mà chưa có gì khả quan cả. Mình vẫn đang tiếp tục tìm hiểu.

2 Likes

À, vậy cậu cần thiết lập network để 2 container đó có thể nhìn thấy nhau.
Cậu cũng có thể dùng docker-compose để chạy cả 2 container (cậu sẽ cần docker-compose.yml file để định nghĩa 2 container). Docker compose sẽ tạo network cho cậu để 2 container nhìn thấy nhau, và start 2 container luôn (cậu không phải gõ đi gõ lại 3 lệnh để setup network + run 2 container).

Cậu thử làm xem nhé!

4 Likes

Cảm ơn @library rất nhiều, mình docker compose đã giải quyết được vấn đề của mình rồi.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?