6.1 Tại sao bạn cần proxy?
Giờ đây, mỗi quốc gia có một Internet riêng của mình. Không chỉ người dùng riêng lẻ bị chặn mà còn cả các trang web, tên miền, ứng dụng và thậm chí là các quốc gia. Không tốt chút nào. Nhưng nếu bạn là lập trình viên, thì điều này không phải là vấn đề — trên Internet có rất nhiều proxy...
Proxy server (hay chỉ là proxy) — là một máy chủ trung gian, đóng vai trò như người trung gian giữa client (ví dụ: máy tính của bạn) và server mà bạn đang cố gắng truy cập. Proxy server nhận các request từ client, chuyển tiếp chúng tới server mục tiêu, nhận phản hồi và gửi lại cho client.
Mỗi sản phẩm lớn đều có ít nhất vài proxy server thực hiện nhiều chức năng hữu ích khác nhau. Ví dụ như:
- Ẩn danh: Proxy server có thể giấu địa chỉ IP thực của client, cung cấp quyền truy cập ẩn danh tới các tài nguyên Internet. Địa chỉ IP là định danh duy nhất của thiết bị trong mạng, và việc giấu nó giúp bảo vệ quyền riêng tư của người dùng.
- Cache: Proxy server có thể lưu cache các tài nguyên được yêu cầu thường xuyên, điều này giúp truy cập nhanh hơn và giảm tải tài nguyên mạng. Ví dụ, nếu nhiều người dùng yêu cầu cùng một trang web, proxy server có thể lưu một bản sao và cung cấp trực tiếp mà không cần phải truy cập server gốc mỗi lần.
- Lọc nội dung: Proxy server có thể chặn quyền truy cập tới các trang web hoặc loại nội dung cụ thể, đảm bảo kiểm soát và an toàn.
- Vượt qua hạn chế truy cập: Proxy server có thể giúp vượt qua các hạn chế truy cập nội dung khu vực, cung cấp quyền truy cập tới các tài nguyên bị chặn ở những vùng địa lý nhất định.
- Ghi lại và giám sát: Proxy server có thể ghi nhật ký tất cả các yêu cầu và phản hồi, giúp theo dõi và phân tích lưu lượng mạng.
Nguyên tắc hoạt động của proxy server
- Client gửi yêu cầu: Thiết bị client (ví dụ: máy tính hay smartphone) gửi yêu cầu tới proxy server.
- Proxy server xử lý yêu cầu: Proxy server nhận yêu cầu, có thể thay đổi nó (ví dụ, thêm hoặc xóa tiêu đề) và chuyển tiếp nó tới server mục tiêu.
- Server mục tiêu phản hồi: Server mục tiêu xử lý yêu cầu và gửi phản hồi tới proxy server.
- Proxy server trả lại phản hồi cho client: Proxy server nhận phản hồi từ server mục tiêu, có thể cache nó để sử dụng sau và chuyển tiếp nó tới client.
Ưu điểm của việc sử dụng proxy server
- Nâng cao bảo mật: Proxy server có thể giấu các mạng nội bộ khỏi thế giới bên ngoài, giảm nguy cơ tấn công.
- Tăng tốc truy cập: Cache các tài nguyên được yêu cầu thường xuyên giảm thời gian truy cập tới chúng.
- Kiểm soát truy cập: Proxy server có thể giới hạn quyền truy cập tới các trang web hoặc loại nội dung cụ thể, đảm bảo kiểm soát việc sử dụng mạng.
- Giảm tải mạng: Nhờ vào cache và lọc lưu lượng, proxy server có thể giảm tổng lượng dữ liệu truyền tải và tải mạng.
Nhiều chương trình server vì lý do bảo mật không có quyền truy cập trực tiếp vào Internet. Thay vào đó, chúng truy cập thông qua proxy, nơi đã có danh sách các trang web và tài nguyên được cho phép. Vì vậy, các chương trình của bạn cũng cần phải biết làm việc với proxy.
Dù có nhiều ưu điểm, việc sử dụng proxy server cũng có thể có nhược điểm. Ví dụ, điều này có thể làm giảm tốc độ kết nối, vì các yêu cầu phải đi qua một khâu trung gian. Bên cạnh đó, một số trang web có thể chặn quyền truy cập từ các proxy server đã biết.
6.2 Proxy và module requests
Thư viện requests hỗ trợ sử dụng proxy server thông qua tham số proxies.
HTTP (Hypertext Transfer Protocol) và HTTPS (HTTP Secure) là các giao thức truyền tải dữ liệu trên Internet. HTTPS là phiên bản bảo mật của HTTP. Chúng có thể sử dụng các proxy server khác nhau, vì chúng có thể yêu cầu xử lý khác nhau do đặc điểm mã hóa của HTTPS.
Ví dụ sử dụng HTTP-proxy
Thường thì khi sử dụng proxy, người ta không chỉ dùng một proxy mà là cả một danh sách. Điều này rất tiện lợi nếu một số proxy bị cấm hoặc không khả dụng.
Ví dụ gọi hàm requests.get() với việc gửi yêu cầu qua proxy.
import requests
# URL mà đang được thực hiện yêu cầu
url = 'http://httpbin.org/ip'
# Cài đặt proxy server
proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080', }
# Gửi yêu cầu GET qua proxy
response = requests.get(url, proxies=proxies)
print(response.json())
Các yêu cầu http sẽ đi qua proxy server đầu tiên, còn https — qua cái thứ hai.
Ví dụ sử dụng proxy có xác thực
Nhiều proxy server yêu cầu phải xác thực trước, sau đó mới cho phép sử dụng. Chúng ta sẽ dùng một thứ khá thú vị...
Khi URL mới được phát minh, thì trong tiêu chuẩn URL đã được dự kiến rằng có thể truyền ngay login và password đến tài nguyên trong URL. Nó trông như sau:
http://user:password@domain/path
Do đó, nếu proxy server yêu cầu xác thực, ta có thể nhúng thông tin tài khoản vào URL.
Ví dụ:
import requests
# URL mà đang được thực hiện yêu cầu
url = 'http://httpbin.org/ip'
# Cài đặt proxy server có xác thực
proxies = { 'http': 'http://user:password@10.10.1.10:3128',
'https': 'http://user:password@10.10.1.10:1080', }
# Gửi yêu cầu GET qua proxy
response = requests.get(url, proxies=proxies)
print(response.json())
Tôi chưa thấy việc này được sử dụng thực tế đâu, nhưng nếu bạn dựng lên một proxy server thử nghiệm của riêng mình, thì tại sao không?
Tuy nhiên, nên nhớ rằng việc truyền login và password qua URL có thể không an toàn, vì URL có thể được lưu trong lịch sử của trình duyệt hoặc log trên server. Trong các ứng dụng thực tế, nên sử dụng các phương pháp xác thực an toàn hơn.
Quan trọng là phải nhớ việc lưu trữ thông tin tài khoản cho proxy server ở các ứng dụng thực tế. Không bao giờ lưu mật khẩu dưới dạng plain text trong code hoặc file cấu hình. Thay vào đó, sử dụng biến môi trường hoặc lưu trữ bí mật bảo mật.
6.3 Proxy và http.client
Để làm việc với proxy server trong module http.client, cần cấu hình kết nối và tiêu đề yêu cầu thủ công.
Bạn chỉ cần chỉ định host và port khi tạo kết nối.
Ví dụ:
# Cài đặt proxy server
proxy_host = '10.10.1.10'
proxy_port = 3128
# Tạo kết nối với proxy server
conn = http.client.HTTPConnection(proxy_host, proxy_port)
Sau đó, cần thiết lập tunneling với proxy server, và chỉ sau đó gửi yêu cầu tới nó:
dest_url = 'httpbin.org'
dest_path = '/ip'
# Tạo và gửi yêu cầu
conn.set_tunnel(dest_url)
conn.request('GET', dest_path)
Để kiểm tra proxy server hoạt động đúng, bạn có thể so sánh địa chỉ IP của mình trước và sau khi sử dụng proxy. Để làm điều này, bạn có thể sử dụng các dịch vụ cho thấy địa chỉ IP hiện tại của bạn, chẳng hạn như httpbin.org/ip.
Mọi thứ rất "đơn giản". Ví dụ hoàn chỉnh về việc sử dụng HTTP-proxy với http.client sẽ trông như thế này:
import http.client
# Cài đặt proxy server
proxy_host = '10.10.1.10'
proxy_port = 3128
dest_url = 'httpbin.org'
dest_path = '/ip'
# Tạo kết nối với proxy server
conn = http.client.HTTPConnection(proxy_host, proxy_port)
# Tạo và gửi yêu cầu
conn.set_tunnel(dest_url)
conn.request('GET', dest_path)
# Nhận phản hồi
response = conn.getresponse()
print(response.status, response.reason)
print(response.read().decode('utf-8'))
# Đóng kết nối
conn.close()
Phải nói sao đây? Sử dụng module requests sẽ dễ dàng hơn nhiều. Tuy nhiên! Nhiều module và framework sử dụng dưới nắp là http.client cấp thấp. Bạn cần biết cách làm việc với nó, để bạn có thể cấu hình chính xác hoạt động của chúng.
Dù có nhiều ưu điểm, việc sử dụng proxy server cũng có thể có nhược điểm. Ví dụ, điều này có thể làm giảm tốc độ kết nối, vì các yêu cầu phải đi qua một khâu trung gian. Bên cạnh đó, một số trang web có thể chặn quyền truy cập từ các proxy server đã biết. Vì vậy khi sử dụng proxy luôn cần cân nhắc cả ưu điểm và những hạn chế tiềm tàng.
GO TO FULL VERSION