SOCKS Proxy và ứng dụng cho System Admin

22/01/2021

Hiện nay có hai loại proxy phổ biến là HTTP Proxy và Socks Proxy. Mỗi loại có những đặc điểm riêng và được tạo ra để phục vụ các mục đích khác nhau. HTTP Proxy thì khá phổ biến, có lẽ ai cũng hiểu rõ chúng, tuy nhiên Socks Proxy thì ít phổ biến hơn. Trong bài viết hôm nay, Bo sẽ chia sẻ kinh nghiệm của Bo về Socks Proxy và ứng dụng của chúng trong lĩnh vực quản trị hệ thống.

1. Proxy là gì? Các đặc điểm quan trọng của Proxy

Proxy là một máy chủ nằm giữa bạn (client) và máy chủ bạn muốn kết nối (server), có nhiệm vụ nhận dữ liệu (data) từ client và sau đó “đại diện” client để gửi dữ liệu cho server. Kết nối của client khi đi qua proxy sẽ có các đặc điểm sau:

  • Do proxy đại diện client để gửi dữ liệu nên proxy sẽ khởi tạo kết nối đến server. Vì vậy, dữ liệu phía server nhận được sẽ có source IP là IP của Proxy chứ không phải là IP của client.
  • Client gửi dữ liệu đến proxy là một kết nối, proxy gửi dữ liệu đến server thông qua một kết nối khác. Do đó, kết nối giữa proxy và server sẽ sử dụng network, băng thông của Proxy.
  • Kết nối từ Proxy đến Server sử dụng Network của Proxy nên sẽ sử dụng các config trên proxy như: Routing table, DNS Server, /etc/hosts file, Firewall rules…
  • Một vài loại Proxy cũng có cơ chế cache lại response của server để tăng performance cho các kết nối sau của client.

2. Socks là gì?

SOCKS là một giao thức hoạt động ở layer 5 (session layer) của mô hình OSI, nó không quan tâm đến những gì xảy ra ở layer bên dưới. Điều này nghĩa là bạn không thể sử dụng socks để tunnel cho các protocol hoạt động dưới layer 5 như ping, arp … 

Và vì nằm ở layer 5 nên socks có thể handle request của các protocol hoạt động ở layer 7 (Application) phía trên nó như HTTP, HTTPS, SSH, FTP, SMTP, SNMP…

Socks chỉ có 2 version: version 4 (SOCKS4) và version 5 (SOCKS5). Điểm khác biệt chính:

– SOCKS4: Không hỗ trợ authen và không hỗ trợ giao thức UDP.

– SOCKS5: hỗ trợ authen và hỗ trợ cả TCP lẫn UDP.

3. So sánh HTTP Proxy và Socks Proxy

  • Khác nhau
HTTP ProxySocks Proxy
Cơ chế hoạt độngChỉ hỗ trợ giao thức HTTP/HTTPSSử dụng được cho nhiều giao thức khác nhau.
CachingKhi user sử dụng HTTP, có thể triển khai caching để tăng tốc cho lần truy cập tiếp theo.Không hỗ trợ caching
Tool kết nốiĐược hỗ trợ rộng rãi, có thể được kết nối bằng nhiều tool khác nhau.Ít phổ biến hơn. Đa phần các ứng dụng phải có tính năng hỗ trợ Socks riêng biệt mới có thể sử dụng.
  • Giống nhau: cả HTTP Proxy và Socks Proxy đều không mã hóa dữ liệu. Chúng chỉ có nhiệm vụ trung chuyển dữ liệu, do đó việc mã hóa sẽ do ứng dụng sử dụng chúng chịu trách nhiệm.

4. Ứng dụng Socks vào công việc của System Admin

Socks là một công cụ ưa thích của mình, mình thường sử dụng chúng để:

  • Quản lý truy cập thay cho VPN: 
    • Chỉ cho phép IP của Socks Server truy cập vào các khu vực quan trọng như admin, internal website, private location… 
    • Chỉ cho phép IP của Socks sử dụng các services quan trọng như: SSH, DB Access.
  • Verify Captcha Gmail: một số trường hợp, khách hàng sử dụng Gmail để gửi mail trong code, khi deploy lên server bị Google bắt xác minh captcha. Trường hợp này sử dụng IP server làm Socks và truy cập vào Gmail bằng browser để xác minh Captcha và Google sẽ cho phép IP server truy cập Gmail.
  • Truy cập các local services: Dùng Socks để truy cập các local services nằm phía sau Socks server.
  • Tăng tốc độ kết nối quốc tế:
    • Những server nằm ở những Datacenter khác nhau sẽ có tốc độ kết nối quốc tế khác nhau. Trong trường hợp cần thiết, có thể đẩy các câu lệnh/ứng dụng qua server có kết nối quốc tế tốt thông qua socks để tăng tốc độ xử lý.
    • Ở nhà giờ cao điểm buổi tối thì thôi … khỏi giải thích anh em nhé!
  • Bypass Firewall:
    • Trường hợp firewall chặn IP của mình, có thể load socks để truy cập bằng IP khác vào xử lý.
    • Nhiều firewall chặn kết nối dựa trên payload của gói tin, có thể dùng socks để bypass filter payload (mình có show case cái này trên Group 1 lần để bypass việc chặn SNI bị lỗi dẫn tới không truy cập được Google Storage)
    • Các firewall chặn kết nối theo destination port: setup Socks chạy ở port 80 hoặc 443.

5. Thiết lập Socks Proxy Server

Có thể dùng các package như:

Nhưng anh em Sysadmin mình thì có thể dùng SSH cho chất. Ngoài tiện lợi, sử dụng SSH để làm Socks có thêm lợi ích mã hóa vì dữ liệu được chạy trong SSH Tunnel. Cần thực hiện 2 bước:

  • Thiết lập SSH Tunnel đển Server cần dùng làm socks
socks ssh tunnel
Nguồn: ma.ttias.be
  • Thiết lập client/browser connect đến IP:Port mà SSH client đã expose ở bước trên.
socks ssh tunnel
Nguồn: ma.ttias.be

Lệnh thực hiện

[[email protected] ~]$ ssh -D 127.0.0.1:50000 -q -C -N [email protected]
  • -D 127.0.0.1:50000: Chỉ định ssh client sẽ mở socks proxy ở local listen trên socket 127.0.0.1:50000
  • -C: nén dữ liệu tăng tốc độ
  • -q: quite mode
  • -N: không thực thi lệnh, chỉ làm nhiệm vụ port forwarding
  • [email protected]: server sẽ dùng để làm socks

Khi chạy lệnh trên, mở 1 terminal mới trên máy, kiểm tra bằng netstat và curl để đảm bảo Socks đã hoạt động, dữ liệu được kết nối ra ngoài bằng IP của server:

Kiểm tra socks5 bằng curl
Lệnh kiểm tra IP trả về IP của server

Lúc này, dữ liệu khi gửi ra ngoài sẽ được mã hóa, điều này cũng khá tiện lợi khi anh em ra ngoài làm việc ở các mạng wifi public, không sử dụng VPN nhưng vẫn đảm bảo an toàn.

socks5 ssh tunnel
Nguồn: ma.ttias.be

Trường hợp trên sẽ open local socket từ máy thực hiện lệnh SSH và chỉ có máy đó mới xài được Socks. Nếu bạn muốn tạo 1 socks public thì dùng trick sau:

  • SSH vào server bạn muốn làm socks
  • Tạo 1 user mới để chạy socks, set password và set login shell là /sbin/nologin (vì chỉ cần chạy port forwarding thôi)
  • Mở “screen” trên server và thực hiện lệnh sau để server SSH vào chính nó bằng user vừa tạo
[[email protected] ~]$ ssh -D 0.0.0.0:50000 -C -q -N socks@localhost

Lúc này, trên server sẽ có 1 socket listen trên 0.0.0.0:50000, đây là socks server của chúng ta, có thể dùng Socks client kết nối đến để sử dụng

Kiểm tra socks5 bằng curl

Lưu ý: với cách làm này thì:

  • Không có chứng thực khi connect vào socks, bạn phải tự control access chỗ này.
  • Dữ liệu từ client gửi lên socks server sẽ không được mã hóa, do việc mã hóa bằng SSH tunnel chỉ xảy ra giữa local socket chạy trên server và chính nó.

Bạn còn kinh nghiệm khác thú vị về việc sử dụng socks? Hãy join Group Telegram Quản Trị Linux để chia sẻ với mình và các sysadmin khác nhé!