Wireproxy: Trình khách WireGuard được cung cấp dưới dạng proxy HTTP/SOCKS5
(github.com/pufferffish)- Wireproxy là một trình khách WireGuard chạy hoàn toàn trong không gian người dùng, kết nối tới peer WireGuard rồi cung cấp ra máy cục bộ dưới dạng proxy SOCKS5/HTTP hoặc tunnel
- Nhắm tới các trường hợp chỉ muốn gửi lưu lượng của một số trang web cụ thể qua peer WireGuard mà không cần thiết lập giao diện mạng mới, hoặc không muốn dùng quyền root để thay đổi cấu hình WireGuard
- Các tính năng gồm định tuyến tĩnh TCP, proxy SOCKS5/HTTP, và proxy TLS trong suốt dựa trên TLS SNI; proxy HTTP hiện chỉ hỗ trợ CONNECT
- Cấu hình tuân theo ý nghĩa của
[Interface],[Peer]trongwg-quick, có thể nhập tệp cấu hình WireGuard hiện có bằngWGConfighoặc định tuyến nhiều peer bằngAllowedIPs - Với mục đích vận hành, công cụ cung cấp health endpoint dựa trên
--info/-i; có thể kiểm tra trạng thái WireGuard và tình trạng sẵn sàng dựa trênCheckAlivequa/metricsvà/readyz
Wireproxy làm gì
wireproxylà một ứng dụng chạy trong không gian người dùng, kết nối tới peer WireGuard và cung cấp proxy SOCKS5/HTTP hoặc tunnel trên máy cục bộ- Có thể dùng khi bạn chỉ muốn truy cập một số trang web nhất định thông qua peer WireGuard nhưng không muốn tạo giao diện mạng mới
- Nó hoạt động hoàn toàn tách biệt với giao diện mạng và không cần quyền root để cấu hình
- Người dùng cần mục đích sử dụng tương tự Amnezia VPN có thể dùng bản fork wireproxy-awg
Tính năng được hỗ trợ và những gì chưa có
- Tính năng được hỗ trợ
- Định tuyến tĩnh TCP cho client và server
- Proxy SOCKS5/HTTP
- HTTP hiện chỉ hỗ trợ CONNECT
- Proxy TLS trong suốt sử dụng Server Name Indication
- Các tính năng còn trong TODO
- Hỗ trợ UDP cho SOCKS5
- Định tuyến tĩnh UDP
Chạy và cài đặt
- Cú pháp chạy cơ bản là
./wireproxy [-c path to config] - Các tùy chọn chính
-c,--config: chỉ định đường dẫn tệp cấu hình- Đường dẫn mặc định là
/etc/wireproxy/wireproxy.conf,$HOME/.config/wireproxy.conf
- Đường dẫn mặc định là
-s,--silent: chế độ silent-d,--daemon: chạy nền-i,--info: chỉ định địa chỉ và cổng để công bố health status-v,--version: in ra phiên bản-n,--configtest: chỉ kiểm tra tính hợp lệ của tệp cấu hình
- Có thể build bằng cách clone kho mã rồi chạy
make - Ví dụ cài đặt dùng
go install github.com/windtf/wireproxy/cmd/wireproxy@v1.1.2hoặc@latest
Mô hình cấu hình
- Cấu hình
[Interface]và[Peer]có cùng ý nghĩa như trong cấu hìnhwg-quick Addressphải dùng subnet/32với IPv4 và/128với IPv6PrivateKeycũng có thể tham chiếu từ biến môi trường- Nếu đã có cấu hình WireGuard sẵn, có thể nhập bằng
WGConfig = <path to the wireguard config>
Cấu hình tunnel và proxy
TCPClientTunnel- Chuyển tiếp lưu lượng TCP nhận trên máy cục bộ tới đích được chỉ định qua WireGuard
- Luồng ví dụ là
<ứng dụng LAN> → localhost:25565 → WireGuard → play.cubecraft.net:25565
TCPServerTunnel- Chuyển tiếp lưu lượng TCP nhận từ mạng WireGuard tới đích được chỉ định trong mạng cục bộ
- Luồng ví dụ là
<ứng dụng mạng WireGuard> → WireGuard → 172.16.31.2:3422 → localhost:25545
STDIOTunnel- Kết nối đầu vào và đầu ra chuẩn của tiến trình wireproxy tới đích TCP qua WireGuard
- Hữu ích khi dùng với tham số
ProxyCommandcủaopenssh
Socks5- Tạo proxy SOCKS5 trên LAN cục bộ và định tuyến toàn bộ lưu lượng qua WireGuard
- Nếu chỉ định tên người dùng và mật khẩu thì sẽ bật xác thực proxy
http- Tạo proxy HTTP trên LAN cục bộ và định tuyến toàn bộ lưu lượng qua WireGuard
- Nếu chỉ định tên người dùng và mật khẩu thì sẽ bật xác thực
- Nếu chỉ định
CertFilevàKeyFilethì sẽ bật HTTPS
SNI- Tạo proxy TLS trong suốt trên LAN cục bộ, dùng SNI làm đích định tuyến để gửi lưu lượng qua WireGuard
Nhiều peer và định tuyến
- Có thể dùng nhiều peer WireGuard
- Khi dùng nhiều peer, cần chỉ định AllowedIPs để wireproxy biết phải chuyển tiếp qua peer nào
- Ví dụ cấu hình sử dụng nhiều
[Peer]vớiAllowedIPskhác nhau cùng nhiềuTCPServerTunnel - Cũng có ví dụ về
UDPProxyTunnelBindAddressdùng để chỉ định địa chỉ bind cục bộTargetdùng để chỉ định địa chỉ đích- Nếu
InactivityTimeoutlà0thì sẽ không timeout
[Resolve]dùng để thiết lập chiến lược phân giải DNSipv4: ưu tiên bản ghi Aipv6: ưu tiên bản ghi AAAAauto: mặc định; nếu giao diện WireGuard chỉ có địa chỉ IPv4 thì giốngipv4, ngược lại thì giốngipv6
- Có thể cho phép peer kết nối vào wireproxy bằng cấu hình
[Peer]không có Endpoint
Health endpoint
--info/-inhận địa chỉ và cổng nhưlocalhost:9080để công bố máy chủ HTTP cung cấp metric health status- Hiện có hai endpoint đã được triển khai
/metrics: công bố thông tin daemon WireGuard, cung cấp thông tin tương tựwg show/readyz: trả về thời điểm cuối cùng nhận được pong từ IP chỉ định trongCheckAlivedưới dạng JSON
- Nếu
CheckAliveđược cấu hình, công cụ sẽ gửi ping qua WireGuard tới địa chỉ được chỉ định mỗiCheckAliveIntervalgiâyCheckAliveIntervalmặc định là 5 giây- Nếu không nhận được pong trong khoảng thời gian bằng
CheckAliveIntervalgần nhất cộng thêm 2 giây dung sai độ trễ thì sẽ trả về 503 - Nếu thỏa điều kiện thì sẽ trả về 200
- Nếu
CheckAlivekhông được cấu hình thì/readyzsẽ trả về đối tượng JSON rỗng và 200 - Peer định tuyến gói ICMP ping sẽ phụ thuộc vào cấu hình AllowedIPs của từng peer
1 bình luận
Ý kiến trên Hacker News
Công cụ nhỏ nhưng rất tuyệt. Tôi đang dùng nó cùng multi-account containers của Firefox để chỉ chọn một số tab nhất định rồi proxy qua bộ định tuyến gia đình có hỗ trợ WireGuard nhưng không có proxy ở tầng ứng dụng hay SSH
Tôi cứ tưởng để cấu hình cái này thì cần một tiện ích mở rộng riêng như https://addons.mozilla.org/en-GB/firefox/addon/container-pro..., nhưng hóa ra không phải, và có vẻ giờ ngay cả kiểu hiểu lầm đó cũng là lý do để bị downvote
Với công việc tôi định làm bằng WireGuard thì https://github.com/dariost/soks phù hợp hơn. Nó làm gần như cùng một việc nhưng tái sử dụng giao diện WireGuard có sẵn
Cách sử dụng được viết khá chi tiết trong bài này: https://www.nicoco.fr/blog/2023/09/10/wireguard/
Có vẻ thay vì dùng bảng định tuyến làm cơ chế điều khiển, nó quyết định có dùng proxy SOCKS5 hay không
Trước đây tôi từng làm tương tự bằng container Docker trên Raspberry Pi, nhưng một giải pháp không gian người dùng có vẻ là lựa chọn tốt hơn nhiều vì có thể chạy trên bất kỳ hệ điều hành nào và đảm bảo không vô tình phá hỏng bảng định tuyến của máy chủ
Cũng có onetun: https://github.com/aramperes/onetun
Tôi tự hỏi liệu có cả triển khai máy chủ hoàn toàn trong không gian người dùng hay không. Muốn làm mà không dùng thiết bị tun/tap thì có lẽ cần thứ gì đó như stack IP trong không gian người dùng, nhưng tôi không chắc
Nó thay thế Dialer dùng để kết nối socket trong Go, nên về cơ bản có thể bọc socket bằng WireGuard. Nó chạy trong không gian người dùng nên không cần tun/tap. Đây đều là mã nguồn mở do @dpeckett công khai
Cùng trên nền tảng đó, họ cũng tạo ra một cổng WireGuard trong không gian người dùng có cả phân giải DNS: https://github.com/noisysockets/gateway
https://news.ycombinator.com/user?id=dpeckett
Theo như tôi hiểu thì nó dùng stack TCP/IP không gian người dùng của Google
Có vẻ rất phù hợp để thay thế đường hầm SSH mà tôi vẫn dùng khi cần một IP khác
Một công cụ liên quan là pproxy, trong nhiều tính năng của nó có khả năng “chuyển đổi” giữa các giao thức tunnel khác nhau và có cả tính năng định tuyến. Tôi đã dùng nó để biến SSH SOCKS5 thành proxy HTTP: https://github.com/moreati/pproxy
Tôi đã nghĩ “cái này chắc làm bằng Go cũng khá dễ nhỉ?”, và đúng là nó được viết bằng Go
Nhiều client proxy đa giao thức hỗ trợ tính năng này. Một số ví dụ mã nguồn mở tiêu biểu là sing-box, clash-meta và các client khác dựa trên clash, cùng xray
Về phía client mã nguồn đóng thì có Surge Mac/iOS
Có rất nhiều khả năng định tuyến lưu lượng ít người biết đến, và cũng có cả triển khai trên Android. Trước đây tôi từng thử dùng chúng để bật hotspot trên SIM không hỗ trợ hotspot và Android chưa root
Tuy vậy, trong đó có rất nhiều mã lấy từ khắp nơi trên Internet và cộng đồng nhà phát triển cũng khá đặc biệt vì nhiều lý do, nên tôi luôn băn khoăn không biết mức độ đáng tin cậy đến đâu
Tôi chưa đào sâu cách nó hoạt động, nhưng tôi thích ý tưởng dùng các nhóm quy tắc để quyết định tên miền nào sẽ được proxy qua VPN
Tôi tò mò về hiệu năng. Theo tôi nhớ thì SOCKS “thuần” rất dễ cấu hình, tức là chỉ cần chạy SSH với các tùy chọn phù hợp rồi bảo ứng dụng dùng nó, nhưng lại khá chậm
Có vẻ công cụ này dành cho trường hợp không có máy chủ SOCKS/SSH thông thường, nhưng tôi cũng muốn biết liệu nó có lợi thế ở cả bên đó không
Với tôi thì SOCKS qua SSH luôn cho hiệu năng khá tốt, và không giống kiểu xếp TCP chồng lên TCP như chế độ TUN của OpenSSH
Dù vậy tôi vẫn rất quan tâm đến giải pháp này
Tôi vừa mới nghĩ giá mà có công cụ để proxy toàn bộ kết nối email của Thunderbird qua Tailscale exit node mà không phải gửi toàn bộ lưu lượng qua exit node thì tốt biết mấy
tailscalelàm proxy SOCKS: https://tailscale.com/kb/1113/aws-lambdaChỉ cần đưa nó vào image container và expose cổng SOCKS mà tailscale lắng nghe là dùng được ngay như một proxy
Nếu bạn cần kiểu này riêng cho Mullvad VPN thì tôi đã thử https://github.com/imiric/mullvad-proxy và thấy khá tốt
Đây không phải dự án của tôi, tôi chỉ fork để cập nhật. Điểm hay là nó tích hợp sẵn công cụ CLI của Mullvad nên việc chuyển máy chủ rất dễ, và mọi thứ đều được cách ly với máy chủ. Ngoài ra nó cũng “chỉ” là nginx cùng vài script nên có lẽ hỗ trợ SOCKS5 cũng ổn
https://mullvad.net/en/blog/wireguard-configuration-tool-has...