Table of Contents

No table of contents
Join CloudFly's Telegram channel to receive more offers and never miss any promotions from CloudFly

Cách thiết lập Squid Proxy cho các Private Connection trên Ubuntu 20.04

Posted on: 24 tháng 10 năm 2022

Ubuntu

Giới thiệu

Máy chủ proxy là một loại ứng dụng máy chủ có chức năng như một cổng kết nối giữa người dùng cuối và tài nguyên internet. Thông qua máy chủ proxy, người dùng cuối có thể kiểm soát và giám sát lưu lượng truy cập web của họ cho nhiều mục đích khác nhau, bao gồm quyền riêng tư, bảo mật và bộ nhớ đệm. Ví dụ: bạn có thể sử dụng máy chủ proxy để thực hiện các yêu cầu web từ một địa chỉ IP khác với địa chỉ IP của riêng bạn. Bạn cũng có thể sử dụng máy chủ proxy để nghiên cứu cách trang web được phục vụ khác nhau giữa các khu vực pháp lý này sang khu vực pháp lý khác, hoặc tránh một số phương pháp giám sát hoặc điều tiết lưu lượng truy cập web.

Squid là một proxy HTTP mã nguồn mở, phổ biến, ổn định. Trong hướng dẫn này, bạn sẽ cài đặt và cấu hình Squid để cung cấp proxy HTTP trên máy chủ Ubuntu 20.04.

Điều kiện

Để hoàn thành hướng dẫn này, bạn sẽ cần:

  • Máy chủ Ubuntu 20.04 với non-root user có đặc quyền sudo. Bạn có thể tìm hiểu thêm về cách thiết lập user có các đặc quyền này trong hướng dẫn Thiết lập máy chủ ban đầu với Ubuntu 20.04 của chúng tôi.

Bạn sẽ sử dụng tên miền your_domain trong hướng dẫn này, nhưng bạn nên thay thế tên miền này bằng tên miền hoặc địa chỉ IP của riêng bạn.

Bước 1: Cài đặt Squid Proxy

Squid có nhiều trường hợp sử dụng ngoài việc định tuyến lưu lượng đi của một người dùng cá nhân. Trong bối cảnh triển khai máy chủ quy mô lớn, nó có thể được sử dụng như một cơ chế bộ nhớ đệm phân tán (distributed caching), bộ cân bằng tải (load balancer) hoặc một thành phần khác của ngăn xếp định tuyến (routing stack). Tuy nhiên, một số phương pháp chia tỷ lệ lưu lượng truy cập máy chủ theo chiều ngang thường liên quan đến máy chủ proxy đã bị vượt qua phổ biến bởi các khung chứa đựng như Kubernetes, nơi phân phối nhiều thành phần hơn của ứng dụng. Đồng thời, việc sử dụng máy chủ proxy để chuyển hướng các yêu cầu web với tư cách người dùng cá nhân, ngày càng trở nên phổ biến để bảo vệ quyền riêng tư của bạn. Điều này rất hữu ích để ghi nhớ khi làm việc với các máy chủ proxy nguồn mở có nhiều tính năng trong chế độ bảo trì lower-priority. Các trường hợp sử dụng cho proxy đã thay đổi theo thời gian, nhưng công nghệ cơ bản thì không.

Bắt đầu bằng cách chạy các lệnh sau với tư cách là non-root user để cập nhật danh sách gói của bạn và cài đặt Squid Proxy:

  1. sudo apt update
  2. sudo apt install squid

Squid sẽ tự động thiết lập một dịch vụ nền và bắt đầu sau khi được cài đặt. Bạn có thể kiểm tra xem dịch vụ có đang chạy đúng cách hay không:

  1. systemctl status squid.service
Output
● squid.service - Squid Web Proxy Server Loaded: loaded (/lib/systemd/system/squid.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-12-15 21:45:15 UTC; 2min 11s ago

Theo mặc định, Squid không cho phép bất kỳ máy khách nào kết nối với nó từ bên ngoài máy chủ này. Để thực hiện điều đó, bạn sẽ cần thực hiện một số thay đổi đối với tệp cấu hình, tệp này được lưu trữ trong /etc/squid/squid.conf. Mở nó bằng nano hoặc trình soạn thảo văn bản yêu thích của bạn:

  1. sudo nano /etc/squid/squid.conf

Xin lưu ý rằng tệp cấu hình mặc định của Squid rất rất dài và chứa một số lượng lớn các tùy chọn đã tạm thời bị vô hiệu hóa bằng cách đặt dấu # ở đầu dòng mà chúng đang ở, còn được gọi là bị nhận xét. Rất có thể bạn sẽ phải tìm kiếm trong tệp để tìm các dòng bạn muốn chỉnh sửa. Trong nano, điều này được thực hiện bằng cách nhấn Ctrl + W, nhập cụm từ tìm kiếm của bạn, nhấn Enter, sau đó nhấn Alt + W liên tục để tìm phiên bản tiếp theo của cụm từ đó nếu cần.

Bắt đầu bằng cách điều hướng đến dòng có chứa cụm từ http_access deny all. Bạn sẽ thấy một khối văn bản giải thích các quy tắc truy cập mặc định của Squid:

/etc/squid/squid.conf
. . . 
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
include /etc/squid/conf.d/*
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
http_access allow localhost

# And finally deny all other access to this proxy
http_access deny all
. . . 

Từ đó, bạn có thể thấy hành vi hiện tại - localhost được cho phép; các kết nối khác thì không. Lưu ý rằng các quy tắc này được phân tích cú pháp tuần tự, vì vậy bạn nên giữ quy tắc deny all ở cuối khối cấu hình này. Bạn có thể thay đổi quy tắc đó để allow all, cho phép bất kỳ ai kết nối với máy chủ proxy của bạn, nhưng bạn có thể bạn không làm điều đó. Thay vào đó, bạn có thể thêm một dòng phía trên http_access allow localhost bao gồm địa chỉ IP của riêng bạn, như sau:

/etc/squid/squid.conf
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
include /etc/squid/conf.d/*
# Example rule allowing access from your local networks.
acl localnet src your_ip_address
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
http_access allow localhost
  • acl có nghĩa là Access Control List (Danh sách Kiểm soát Truy cập), một thuật ngữ chung cho các chính sách về quyền
  • localnet trong trường hợp này là tên ACL của bạn.
  • src là nơi yêu cầu bắt nguồn từ ACL này, tức là địa chỉ IP của bạn.

Nếu bạn không biết địa chỉ IP cục bộ của mình, cách nhanh nhất là truy cập một trang web như What’s my IP, trang này có thể cho bạn biết bạn đã truy cập nó từ đâu. Sau khi thực hiện thay đổi đó, hãy lưu và đóng tệp. Nếu bạn đang sử dụng nano, hãy nhấn Ctrl + X, sau đó hãy nhấn Y rồi nhấn Enter.

Tại thời điểm này, bạn có thể khởi động lại Squid và kết nối với nó, nhưng bạn có thể làm nhiều việc khác để bảo vệ nó trước.

Bước 2: Bảo mật Squid

Hầu hết các proxy và các ứng dụng phía máy khách kết nối với proxy (ví dụ: trình duyệt web) hỗ trợ nhiều phương pháp xác thực. Chúng có thể bao gồm các key được chia sẻ hoặc các máy chủ xác thực riêng biệt, nhưng hầu hết thường bao gồm các cặp tên người dùng-mật khẩu thông thường. Squid cho phép bạn tạo các cặp username-password bằng chức năng tích hợp sẵn của Linux, như một bước bổ sung hoặc thay thế để hạn chế quyền truy cập vào proxy của bạn bằng địa chỉ IP. Để làm được điều đó, bạn sẽ tạo một tệp có tên /etc/squid/passwords và trỏ cấu hình của Squid tới đó.

Trước tiên, bạn sẽ cần cài đặt một số tiện ích từ dự án Apache để có quyền truy cập vào trình tạo mật khẩu mà Squid thích.

  1. sudo apt install apache2-utils

Gói này cung cấp lệnh htpasswd, bạn có thể sử dụng lệnh này để tạo mật khẩu cho người dùng Squid mới. Username của Squid sẽ không trùng lặp với username hệ thống theo bất kỳ cách nào, vì vậy bạn có thể sử dụng cùng một tên mà bạn đã đăng nhập nếu muốn. Bạn cũng sẽ được nhắc thêm mật khẩu:

  1. sudo htpasswd -c /etc/squid/passwords your_squid_username

Điều này sẽ lưu trữ username của bạn cùng với một hash của mật khẩu mới của bạn trong /etc/squid/passwords, sẽ được Squid sử dụng làm nguồn xác thực. Sau đó, bạn có thể cat tệp để xem nó trông như thế nào:

  1. sudo cat /etc/squid/passwords
Output
sammy:$apr1$Dgl.Mtnd$vdqLYjBGdtoWA47w4q1Td.

Sau khi xác minh rằng username và password của bạn đã được lưu trữ, bạn có thể cập nhật cấu hình của Squid để sử dụng tệp /etc/squid/passwords mới của mình. Sử dụng nano hoặc trình soạn thảo văn bản yêu thích của bạn, mở lại tệp cấu hình Squid và thêm các dòng được đánh dấu sau:

  1. sudo nano /etc/squid/squid.conf
/etc/squid/squid.conf
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
include /etc/squid/conf.d/*
auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid/passwords
auth_param basic realm proxy
acl authenticated proxy_auth REQUIRED
# Example rule allowing access from your local networks.
acl localnet src your_ip_address
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
http_access allow localhost
http_access allow authenticated
# And finally deny all other access to this proxy
http_access deny all
…

Các lệnh bổ sung này yêu cầu Squid kiểm tra tệp passwords mới của bạn để tìm các password hash có thể được phân tích cú pháp bằng cơ chế basic_ncsa_auth và yêu cầu xác thực để truy cập vào proxy của bạn. Bạn có thể xem lại tài liệu của Squid để biết thêm thông tin về phương pháp xác thực này hoặc các phương pháp xác thực khác. Sau đó, cuối cùng bạn có thể khởi động lại Squid với các thay đổi cấu hình của mình. Quá trình này có thể mất một chút thời gian để hoàn thành.

  1. sudo systemctl restart squid.service

Và đừng quên mở cổng 3128 trong tường lửa của bạn nếu bạn đang sử dụng ufw:

  1. sudo ufw allow 3128

Trong bước tiếp theo, cuối cùng bạn sẽ kết nối với proxy của mình.

Bước 3: Kết nối thông qua Squid

Để chứng minh máy chủ Squid của mình, bạn sẽ sử dụng một chương trình dòng lệnh được gọi là curl, chương trình này phổ biến để thực hiện các loại yêu cầu web khác nhau. Nói chung, nếu bạn muốn xác minh xem liệu một kết nối nhất định có hoạt động trong một trình duyệt trong những trường hợp lý tưởng hay không, trước tiên bạn nên kiểm tra bằng curl. Bạn sẽ sử dụng curl trên máy local của mình để thực hiện việc này - nó được cài đặt theo mặc định trên tất cả các môi trường Windows, Mac và Linux hiện đại, vì vậy bạn có thể mở bất kỳ local shell nào để chạy lệnh này:

  1. curl -v -x http://your_squid_username:your_squid_password@your_server_ip:3128 http://www.google.com/

Đối số -x chuyển một máy chủ proxy để cuộn lại và trong trường hợp này, bạn đang sử dụng giao thức http: //, chỉ định username và password của bạn cho máy chủ này, sau đó kết nối với một trang web hoạt động đã biết như google.com. Nếu lệnh thành công, bạn sẽ thấy kết quả sau:

Output
* Trying 138.197.103.77... * TCP_NODELAY set * Connected to 138.197.103.77 (138.197.103.77) port 3128 (#0) * Proxy auth using Basic with user 'sammy' > GET http://www.google.com/ HTTP/1.1

Bạn cũng có thể truy cập trang web https: // bằng Squid proxy của mình mà không cần thực hiện thêm bất kỳ thay đổi cấu hình nào. Chúng sử dụng một chỉ thị proxy riêng biệt được gọi là CONNECT để duy trì SSL giữa máy khách và máy chủ:

  1. curl -v -x http://your_squid_username:your_squid_password@your_server_ip:3128 https://www.google.com/
Output
* Trying 138.197.103.77... * TCP_NODELAY set * Connected to 138.197.103.77 (138.197.103.77) port 3128 (#0) * allocate connect buffer! * Establish HTTP proxy tunnel to www.google.com:443 * Proxy auth using Basic with user 'sammy' > CONNECT www.google.com:443 HTTP/1.1 > Host: www.google.com:443 > Proxy-Authorization: Basic c2FtbXk6c2FtbXk= > User-Agent: curl/7.55.1 > Proxy-Connection: Keep-Alive > < HTTP/1.1 200 Connection established < * Proxy replied OK to CONNECT request * CONNECT phase completed!

Thông tin đăng nhập mà bạn đã sử dụng cho curl giờ sẽ hoạt động ở bất kỳ nơi nào khác mà bạn có thể muốn sử dụng máy chủ proxy mới của mình.

Kết luận

Trong hướng dẫn này, bạn đã học cách triển khai một điểm cuối API nguồn mở, phổ biến cho lưu lượng truy cập ủy quyền với chi phí thấp hoặc không tốn phí. Nhiều ứng dụng có hỗ trợ proxy tích hợp (thường ở cấp hệ điều hành) từ nhiều thập kỷ trước, làm cho proxy stack này có khả năng tái sử dụng cao.

Tiếp theo, bạn có thể tìm hiểu cách triển khai Dante, một SOCKS proxy có thể chạy cùng với Squid để proxy các loại lưu lượng web khác nhau.

Vì một trong những trường hợp sử dụng phổ biến nhất đối với máy chủ proxy là ủy quyền lưu lượng truy cập đến và đi từ các khu vực toàn cầu khác nhau, bạn có thể xem lại cách sử dụng Ansible để tự động triển khai máy chủ tiếp theo, trong trường hợp bạn muốn sao chép cấu hình này trong các trung tâm dữ liệu khác .

Join CloudFly's Telegram channel to receive more offers and never miss any promotions from CloudFly
Share

0 replies