Gần đây Telegram bị chặn ở Việt Nam. Mình không dùng nhiều Telegram nhưng có một vài cuộc trò chuyện trên đó nên thỉnh thoảng cần truy cập vào.
Như đã kể lần trước, mình đã chạy một proxy server trên con EC2 để truy cập được vào Google Stitch. Tiện thể mình cũng dùng để truy cập Telegram luôn.
Nhưng mình gặp một vấn đề. Với cách thiết lập proxy cũ cho máy Mac, tất cả các request đều được proxied. Đó là điều không hay cho lắm. Một số ứng dụng bắt đầu gửi cảnh báo về hành vi bất thường, cụ thể là có người truy cập từ Singapore.
Mình hỏi Github Copilot để tìm cách thiết lập proxy cho một số domain nhất định mà thôi. Và phương án được đưa ra là sử dụng file PAC (Proxy Auto-Configuration).
§1File PAC
File PAC là một file JavaScript có một hàm FindProxyForURL. Trình duyệt gọi hàm này cho mỗi request, và hàm trả về đi qua proxy nào hoặc đi thẳng (DIRECT).
Dưới đây là một file mẫu: chỉ Telegram và Stitch đi qua proxy, còn lại đi thẳng. Thay <ip-ec2> bằng IP của server chạy proxy, và thêm bớt domain theo nhu cầu.
// proxy.pac
function FindProxyForURL(url, host) {
var proxied = ['telegram.org', 't.me', 'stitch.withgoogle.com'];
for (var i = 0; i < proxied.length; i++) {
if (host === proxied[i] || dnsDomainIs(host, '.' + proxied[i])) {
return 'PROXY <ip-ec2>:3128';
}
}
return 'DIRECT';
}dnsDomainIs(host, '.telegram.org') khớp với mọi subdomain như web.telegram.org, còn host === 'telegram.org' khớp với chính domain đó.
File PAC không chứa được username và password. Nếu proxy có xác thực, trình duyệt sẽ tự hỏi tài khoản ở lần đầu đi qua proxy.
§2Serve file PAC qua HTTP
Đây là chỗ mình mất hơn một tiếng. Lúc đầu mình khai báo đường dẫn tới file trên máy, file:///Users/me/proxy.pac, và Chrome không hề nhận proxy config. Trên các bản macOS gần đây, cấu hình PAC bằng đường dẫn file:// không được hỗ trợ, nên phải serve file qua HTTP.
Mình chạy một static server ngay trong thư mục chứa file PAC:
npx http-server -p 4040Kiểm tra file đã được serve:
curl http://127.0.0.1:4040/proxy.pacServer này cần chạy mỗi khi dùng proxy. Nếu tắt nó đi, macOS không lấy được file PAC.
§3Khai báo trong macOS
Vào System Settings → Network → (Wi-Fi hoặc Ethernet) → Details → Proxies, bật Automatic proxy configuration và điền URL:
http://127.0.0.1:4040/proxy.pacBấm OK để lưu.
§4Khởi động lại Chrome
Sau khi đổi sang URL HTTP, mình vẫn chưa thấy Chrome dùng proxy ngay. Mình đoán là do chưa khởi động lại Chrome sau khi đổi cấu hình. Vì vậy sau mỗi lần đổi URL file PAC, mình thoát hẳn Chrome (Cmd + Q) rồi mở lại. Khi đã nhận cấu hình, Chrome hỏi tài khoản proxy ở lần đầu vào Telegram, nhập xong là vào được.
Muốn xem Chrome đang dùng cấu hình proxy nào, mở chrome://net-internals/#proxy. Trang này cũng có nút Re-apply settings để Chrome đọc lại cấu hình mà không cần khởi động lại.
Lần đầu mình tưởng thành công là do may, vì Chrome bỗng dưng hỏi tài khoản trong lúc mình đang đọc tài liệu. Kiểm tra lại mới thấy nguyên nhân chính nằm ở đường dẫn file PAC: đổi từ file:// sang URL HTTP thì Chrome mới nhận cấu hình.
§5Lưu ý
- Cấu hình PAC áp dụng cho các ứng dụng dùng proxy hệ thống như Chrome, Safari. Lệnh trong terminal như
curlkhông đọc file PAC; muốn đi qua proxy thì đặthttps_proxycho lệnh đó. - Ứng dụng Telegram cho desktop có phần cài proxy riêng trong Settings → Advanced → Connection type, không dùng file PAC.