git: 66277d2e719a - main - net/tun2socks: New port: Tunnel TCP/UDP traffic through a SOCKS5/HTTP proxy via TUN interface

From: Tiago Gasiba <tiga_at_FreeBSD.org>
Date: Tue, 30 Jun 2026 21:15:58 UTC
The branch main has been updated by tiga:

URL: https://cgit.FreeBSD.org/ports/commit/?id=66277d2e719a210080b23b797cf2a08cd3c6c0b8

commit 66277d2e719a210080b23b797cf2a08cd3c6c0b8
Author:     Dasun Nimantha Perera <dasun4@pm.me>
AuthorDate: 2026-06-30 21:05:56 +0000
Commit:     Tiago Gasiba <tiga@FreeBSD.org>
CommitDate: 2026-06-30 21:14:44 +0000

    net/tun2socks: New port: Tunnel TCP/UDP traffic through a SOCKS5/HTTP proxy via TUN interface
    
    tun2socks creates a TUN network interface that tunnels TCP and UDP
    traffic through a SOCKS5, HTTP, Shadowsocks, or Relay proxy.  It is
    powered by gVisor's userspace TCP/IP stack and supports gateway mode
    for transparent proxying of other devices on the network.
    
    Features include IPv4/IPv6 support, multiple proxy protocols with
    authentication, a REST API for runtime statistics, and cross-platform
    compatibility with Linux, macOS, FreeBSD, OpenBSD, and Windows.
    
    WWW:            https://github.com/xjasonlyu/tun2socks
    Submitted by:   Dasun Nimantha Perera <dasun4@pm.me>
    PR:             294135
    MFH:            2026Q2
---
 net/Makefile                    |   1 +
 net/tun2socks/Makefile          |  52 ++++++++++++++
 net/tun2socks/distinfo          |  53 ++++++++++++++
 net/tun2socks/files/modules.txt | 154 ++++++++++++++++++++++++++++++++++++++++
 net/tun2socks/pkg-descr         |   8 +++
 5 files changed, 268 insertions(+)

diff --git a/net/Makefile b/net/Makefile
index 62d8d6a60d8c..3f1cde3d5f7d 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -1646,6 +1646,7 @@
     SUBDIR += tsctp
     SUBDIR += tsocks
     SUBDIR += ttl
+    SUBDIR += tun2socks
     SUBDIR += tunneller
     SUBDIR += turnserver
     SUBDIR += u6rd
diff --git a/net/tun2socks/Makefile b/net/tun2socks/Makefile
new file mode 100644
index 000000000000..672045db4772
--- /dev/null
+++ b/net/tun2socks/Makefile
@@ -0,0 +1,52 @@
+PORTNAME=	tun2socks
+DISTVERSIONPREFIX=	v
+DISTVERSION=	2.6.0
+CATEGORIES=	net
+
+MAINTAINER=	dasun4@pm.me
+COMMENT=	Tunnel TCP/UDP traffic through a SOCKS5/HTTP proxy via TUN interface
+WWW=		https://github.com/${GH_ACCOUNT}/${PORTNAME}
+
+LICENSE=	MIT
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+USES=		go:modules
+
+USE_GITHUB=	yes
+GH_ACCOUNT=	xjasonlyu
+GH_TUPLE=	ajg:form:v1.5.1:ajg_form/vendor/github.com/ajg/form \
+		davecgh:go-spew:v1.1.1:davecgh_go_spew/vendor/github.com/davecgh/go-spew \
+		docker:go-units:v0.5.0:docker_go_units/vendor/github.com/docker/go-units \
+		go-chi:chi:v5.2.1:go_chi_chi_v5/vendor/github.com/go-chi/chi/v5 \
+		go-chi:cors:v1.2.1:go_chi_cors/vendor/github.com/go-chi/cors \
+		go-chi:render:v1.0.3:go_chi_render/vendor/github.com/go-chi/render \
+		go-gost:relay:v0.5.0:go_gost_relay/vendor/github.com/go-gost/relay \
+		go-yaml:yaml:v3.0.1:go_yaml_yaml/vendor/gopkg.in/yaml.v3 \
+		golang:crypto:v0.38.0:golang_crypto/vendor/golang.org/x/crypto \
+		golang:net:v0.40.0:golang_net/vendor/golang.org/x/net \
+		golang:sys:v0.33.0:golang_sys/vendor/golang.org/x/sys \
+		golang:time:v0.11.0:golang_time/vendor/golang.org/x/time \
+		google:btree:v1.1.3:google_btree/vendor/github.com/google/btree \
+		google:gvisor:eede7a881b20:google_gvisor/vendor/gvisor.dev/gvisor \
+		google:shlex:e7afc7fbc510:google_shlex/vendor/github.com/google/shlex \
+		google:uuid:v1.6.0:google_uuid/vendor/github.com/google/uuid \
+		gorilla:schema:v1.4.1:gorilla_schema/vendor/github.com/gorilla/schema \
+		gorilla:websocket:v1.5.3:gorilla_websocket/vendor/github.com/gorilla/websocket \
+		pmezard:go-difflib:v1.0.0:pmezard_go_difflib/vendor/github.com/pmezard/go-difflib \
+		stretchr:testify:v1.9.0:stretchr_testify/vendor/github.com/stretchr/testify \
+		uber-go:atomic:v1.11.0:uber_go_atomic/vendor/go.uber.org/atomic \
+		uber-go:automaxprocs:v1.6.0:uber_go_automaxprocs/vendor/go.uber.org/automaxprocs \
+		uber-go:multierr:v1.11.0:uber_go_multierr/vendor/go.uber.org/multierr \
+		uber-go:zap:v1.27.0:uber_go_zap/vendor/go.uber.org/zap \
+		wireguard:wireguard-go:f333402bd9cb:wireguard_wireguard_go/vendor/golang.zx2c4.com/wireguard
+
+GO_TARGET=	.
+GO_BUILDFLAGS=	-ldflags="-w -s \
+		-X github.com/${GH_ACCOUNT}/${PORTNAME}/v2/internal/version.Version=v${DISTVERSION}"
+
+PLIST_FILES=	bin/${PORTNAME}
+
+post-extract:
+	@${CP} ${FILESDIR}/modules.txt ${WRKSRC}/vendor
+
+.include <bsd.port.mk>
diff --git a/net/tun2socks/distinfo b/net/tun2socks/distinfo
new file mode 100644
index 000000000000..20690e80820a
--- /dev/null
+++ b/net/tun2socks/distinfo
@@ -0,0 +1,53 @@
+TIMESTAMP = 1782851820
+SHA256 (xjasonlyu-tun2socks-v2.6.0_GH0.tar.gz) = 348d13eff97beb6d08e0379727e89f9a4571bf61ed5f7327a3fcc3767e9c5942
+SIZE (xjasonlyu-tun2socks-v2.6.0_GH0.tar.gz) = 374193
+SHA256 (ajg-form-v1.5.1_GH0.tar.gz) = 085e8e98cf63d39241c6ba815b9a71d38808c3fadb6b522feb7fab6d123c44c7
+SIZE (ajg-form-v1.5.1_GH0.tar.gz) = 14946
+SHA256 (davecgh-go-spew-v1.1.1_GH0.tar.gz) = 7d82b9bb7291adbe7498fe946920ab3e7fc9e6cbfc3b2294693fad00bf0dd17e
+SIZE (davecgh-go-spew-v1.1.1_GH0.tar.gz) = 42152
+SHA256 (docker-go-units-v0.5.0_GH0.tar.gz) = db0a1d3e4deaa52401423bf76cce0a5100cf2e51db3c33cf3c70b7953c7d6234
+SIZE (docker-go-units-v0.5.0_GH0.tar.gz) = 12243
+SHA256 (go-chi-chi-v5.2.1_GH0.tar.gz) = c66789b45e00def4339a65bfe0f7d8ac6895bfa0bdc5f15e4f9d901ec64ac880
+SIZE (go-chi-chi-v5.2.1_GH0.tar.gz) = 87036
+SHA256 (go-chi-cors-v1.2.1_GH0.tar.gz) = d3fa42948b4b365db19c9a6639090c6869b968fa8c5ecb9635dce1a9bf4cf8d8
+SIZE (go-chi-cors-v1.2.1_GH0.tar.gz) = 8827
+SHA256 (go-chi-render-v1.0.3_GH0.tar.gz) = 4458232c0a5b600bd64d2b48bc90a8469fcd520e070bd390bbe5e43431999495
+SIZE (go-chi-render-v1.0.3_GH0.tar.gz) = 6165
+SHA256 (go-gost-relay-v0.5.0_GH0.tar.gz) = b8c4f37fe815f8f8767fd731976f7157a3cd565f133bd590fb494eb011d7ef54
+SIZE (go-gost-relay-v0.5.0_GH0.tar.gz) = 5077
+SHA256 (go-yaml-yaml-v3.0.1_GH0.tar.gz) = cf05411540d3e6ef8f1fd88434b34f94cedaceb540329031d80e23b74540c4e5
+SIZE (go-yaml-yaml-v3.0.1_GH0.tar.gz) = 91173
+SHA256 (golang-crypto-v0.38.0_GH0.tar.gz) = e143842797aa961fa3d62472a7b78233ac83ea3bc55d59f019daf3f559e20977
+SIZE (golang-crypto-v0.38.0_GH0.tar.gz) = 2157751
+SHA256 (golang-net-v0.40.0_GH0.tar.gz) = 1bc71dac542f6b56acda25d9833243c9221ce902193504c114676503ac0e3c51
+SIZE (golang-net-v0.40.0_GH0.tar.gz) = 1503810
+SHA256 (golang-sys-v0.33.0_GH0.tar.gz) = 16370146c98a69f76b09e7b67ec93d7e259e45d85808aeb9a453a4bbff865287
+SIZE (golang-sys-v0.33.0_GH0.tar.gz) = 1528783
+SHA256 (golang-time-v0.11.0_GH0.tar.gz) = ec26daa712b0c9660b64ea2ec5f241144b7a8c414b85938c6adbbab69c712126
+SIZE (golang-time-v0.11.0_GH0.tar.gz) = 12471
+SHA256 (google-btree-v1.1.3_GH0.tar.gz) = ecb1f97cff16ce5b18a12ed31728a82a8e0df0c0181febf2b9c39dd3ed362ffd
+SIZE (google-btree-v1.1.3_GH0.tar.gz) = 19772
+SHA256 (google-gvisor-eede7a881b20_GH0.tar.gz) = 0a3cc5b6156e5719916995a4e3f0d8e03cae30a2e0ad6d0818a7afc107762667
+SIZE (google-gvisor-eede7a881b20_GH0.tar.gz) = 3457176
+SHA256 (google-shlex-e7afc7fbc510_GH0.tar.gz) = 87f77e98720add261add169e386cbdcc894e2635dca299bc4119dc417ea321ca
+SIZE (google-shlex-e7afc7fbc510_GH0.tar.gz) = 7342
+SHA256 (google-uuid-v1.6.0_GH0.tar.gz) = ee63376b5675376c60e055ed66e5f3651ccc703bd580c022b8ad00cea309252d
+SIZE (google-uuid-v1.6.0_GH0.tar.gz) = 20896
+SHA256 (gorilla-schema-v1.4.1_GH0.tar.gz) = 5ba1ae2586add03cbbe9ca0f4669c37fd257b196f6e3d2f41dc98cc99efb802b
+SIZE (gorilla-schema-v1.4.1_GH0.tar.gz) = 28615
+SHA256 (gorilla-websocket-v1.5.3_GH0.tar.gz) = 707f217e9a46c516c289b71c45a4e51b11b5e0fcec54c1fbfecde47b8a001799
+SIZE (gorilla-websocket-v1.5.3_GH0.tar.gz) = 54884
+SHA256 (pmezard-go-difflib-v1.0.0_GH0.tar.gz) = 28f3dc1b5c0efd61203ab07233f774740d3bf08da4d8153fb5310db6cea0ebda
+SIZE (pmezard-go-difflib-v1.0.0_GH0.tar.gz) = 11398
+SHA256 (stretchr-testify-v1.9.0_GH0.tar.gz) = ee651d4d4427d55096007190398102383498e6b5cf97ea9e89ad6e72b4115fbb
+SIZE (stretchr-testify-v1.9.0_GH0.tar.gz) = 108663
+SHA256 (uber-go-atomic-v1.11.0_GH0.tar.gz) = cfe258c20d71ac4dbf0f716a23ed00c332b7f281180651e2a67ad40a8b0772cc
+SIZE (uber-go-atomic-v1.11.0_GH0.tar.gz) = 24299
+SHA256 (uber-go-automaxprocs-v1.6.0_GH0.tar.gz) = fb750295e270f668502fb139ff626bf5209033c7893b29521238cd04502e55cf
+SIZE (uber-go-automaxprocs-v1.6.0_GH0.tar.gz) = 24465
+SHA256 (uber-go-multierr-v1.11.0_GH0.tar.gz) = 8aa599cf7de733306cf8770f854f8a38e6c819b1ae4296f15e44b1e7c6698f34
+SIZE (uber-go-multierr-v1.11.0_GH0.tar.gz) = 16900
+SHA256 (uber-go-zap-v1.27.0_GH0.tar.gz) = 62860771a138097535da9053f75d1da1a9e57f98263ead698ce493e0c9670652
+SIZE (uber-go-zap-v1.27.0_GH0.tar.gz) = 271384
+SHA256 (wireguard-wireguard-go-f333402bd9cb_GH0.tar.gz) = 3b75081cff9a0dc70131487731d487b4de52d7b898ddfe4c2eba9ed6f800a4a2
+SIZE (wireguard-wireguard-go-f333402bd9cb_GH0.tar.gz) = 116148
diff --git a/net/tun2socks/files/modules.txt b/net/tun2socks/files/modules.txt
new file mode 100644
index 000000000000..10d2cbd75685
--- /dev/null
+++ b/net/tun2socks/files/modules.txt
@@ -0,0 +1,154 @@
+# github.com/ajg/form v1.5.1
+## explicit
+github.com/ajg/form
+# github.com/davecgh/go-spew v1.1.1
+## explicit
+github.com/davecgh/go-spew/spew
+# github.com/docker/go-units v0.5.0
+## explicit
+github.com/docker/go-units
+# github.com/go-chi/chi/v5 v5.2.1
+## explicit; go 1.20
+github.com/go-chi/chi/v5
+# github.com/go-chi/cors v1.2.1
+## explicit; go 1.14
+github.com/go-chi/cors
+# github.com/go-chi/render v1.0.3
+## explicit; go 1.16
+github.com/go-chi/render
+# github.com/go-gost/relay v0.5.0
+## explicit; go 1.16
+github.com/go-gost/relay
+# github.com/google/btree v1.1.3
+## explicit; go 1.18
+github.com/google/btree
+# github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
+## explicit; go 1.13
+github.com/google/shlex
+# github.com/google/uuid v1.6.0
+## explicit
+github.com/google/uuid
+# github.com/gorilla/schema v1.4.1
+## explicit; go 1.20
+github.com/gorilla/schema
+# github.com/gorilla/websocket v1.5.3
+## explicit; go 1.12
+github.com/gorilla/websocket
+# github.com/pmezard/go-difflib v1.0.0
+## explicit
+github.com/pmezard/go-difflib/difflib
+# github.com/stretchr/testify v1.9.0
+## explicit; go 1.17
+github.com/stretchr/testify/assert
+github.com/stretchr/testify/require
+# go.uber.org/atomic v1.11.0
+## explicit; go 1.18
+go.uber.org/atomic
+# go.uber.org/automaxprocs v1.6.0
+## explicit; go 1.20
+go.uber.org/automaxprocs/internal/cgroups
+go.uber.org/automaxprocs/internal/runtime
+go.uber.org/automaxprocs/maxprocs
+# go.uber.org/multierr v1.11.0
+## explicit; go 1.19
+go.uber.org/multierr
+# go.uber.org/zap v1.27.0
+## explicit; go 1.19
+go.uber.org/zap
+go.uber.org/zap/buffer
+go.uber.org/zap/internal
+go.uber.org/zap/internal/bufferpool
+go.uber.org/zap/internal/color
+go.uber.org/zap/internal/exit
+go.uber.org/zap/internal/pool
+go.uber.org/zap/internal/stacktrace
+go.uber.org/zap/zapcore
+# golang.org/x/crypto v0.38.0
+## explicit; go 1.23.0
+golang.org/x/crypto/chacha20
+golang.org/x/crypto/chacha20poly1305
+golang.org/x/crypto/hkdf
+golang.org/x/crypto/internal/alias
+golang.org/x/crypto/internal/poly1305
+# golang.org/x/net v0.40.0
+## explicit; go 1.23.0
+golang.org/x/net/bpf
+golang.org/x/net/internal/iana
+golang.org/x/net/internal/socket
+golang.org/x/net/ipv4
+golang.org/x/net/ipv6
+# golang.org/x/sys v0.33.0
+## explicit; go 1.23.0
+golang.org/x/sys/cpu
+golang.org/x/sys/unix
+golang.org/x/sys/windows
+# golang.org/x/time v0.11.0
+## explicit; go 1.23.0
+golang.org/x/time/rate
+# golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2
+## explicit; go 1.17
+golang.zx2c4.com/wintun
+# golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb
+## explicit; go 1.23.1
+golang.zx2c4.com/wireguard/conn
+golang.zx2c4.com/wireguard/conn/winrio
+golang.zx2c4.com/wireguard/rwcancel
+golang.zx2c4.com/wireguard/tun
+# gopkg.in/yaml.v3 v3.0.1
+## explicit
+gopkg.in/yaml.v3
+# gvisor.dev/gvisor v0.0.0-20250523182742-eede7a881b20
+## explicit; go 1.23.1
+gvisor.dev/gvisor/pkg/abi/linux/errno
+gvisor.dev/gvisor/pkg/atomicbitops
+gvisor.dev/gvisor/pkg/bits
+gvisor.dev/gvisor/pkg/buffer
+gvisor.dev/gvisor/pkg/context
+gvisor.dev/gvisor/pkg/cpuid
+gvisor.dev/gvisor/pkg/errors
+gvisor.dev/gvisor/pkg/errors/linuxerr
+gvisor.dev/gvisor/pkg/gohacks
+gvisor.dev/gvisor/pkg/goid
+gvisor.dev/gvisor/pkg/linewriter
+gvisor.dev/gvisor/pkg/log
+gvisor.dev/gvisor/pkg/rand
+gvisor.dev/gvisor/pkg/rawfile
+gvisor.dev/gvisor/pkg/refs
+gvisor.dev/gvisor/pkg/sleep
+gvisor.dev/gvisor/pkg/state
+gvisor.dev/gvisor/pkg/state/wire
+gvisor.dev/gvisor/pkg/sync
+gvisor.dev/gvisor/pkg/sync/locking
+gvisor.dev/gvisor/pkg/tcpip
+gvisor.dev/gvisor/pkg/tcpip/adapters/gonet
+gvisor.dev/gvisor/pkg/tcpip/checksum
+gvisor.dev/gvisor/pkg/tcpip/hash/jenkins
+gvisor.dev/gvisor/pkg/tcpip/header
+gvisor.dev/gvisor/pkg/tcpip/header/parse
+gvisor.dev/gvisor/pkg/tcpip/internal/tcp
+gvisor.dev/gvisor/pkg/tcpip/link/channel
+gvisor.dev/gvisor/pkg/tcpip/link/fdbased
+gvisor.dev/gvisor/pkg/tcpip/link/nested
+gvisor.dev/gvisor/pkg/tcpip/link/packetsocket
+gvisor.dev/gvisor/pkg/tcpip/link/stopfd
+gvisor.dev/gvisor/pkg/tcpip/link/tun
+gvisor.dev/gvisor/pkg/tcpip/network/hash
+gvisor.dev/gvisor/pkg/tcpip/network/internal/fragmentation
+gvisor.dev/gvisor/pkg/tcpip/network/internal/ip
+gvisor.dev/gvisor/pkg/tcpip/network/internal/multicast
+gvisor.dev/gvisor/pkg/tcpip/network/ipv4
+gvisor.dev/gvisor/pkg/tcpip/network/ipv6
+gvisor.dev/gvisor/pkg/tcpip/ports
+gvisor.dev/gvisor/pkg/tcpip/seqnum
+gvisor.dev/gvisor/pkg/tcpip/stack
+gvisor.dev/gvisor/pkg/tcpip/stack/gro
+gvisor.dev/gvisor/pkg/tcpip/transport
+gvisor.dev/gvisor/pkg/tcpip/transport/icmp
+gvisor.dev/gvisor/pkg/tcpip/transport/internal/network
+gvisor.dev/gvisor/pkg/tcpip/transport/internal/noop
+gvisor.dev/gvisor/pkg/tcpip/transport/packet
+gvisor.dev/gvisor/pkg/tcpip/transport/raw
+gvisor.dev/gvisor/pkg/tcpip/transport/tcp
+gvisor.dev/gvisor/pkg/tcpip/transport/tcpconntrack
+gvisor.dev/gvisor/pkg/tcpip/transport/udp
+gvisor.dev/gvisor/pkg/waiter
diff --git a/net/tun2socks/pkg-descr b/net/tun2socks/pkg-descr
new file mode 100644
index 000000000000..fd16984522cb
--- /dev/null
+++ b/net/tun2socks/pkg-descr
@@ -0,0 +1,8 @@
+tun2socks creates a TUN network interface that tunnels TCP and UDP
+traffic through a SOCKS5, HTTP, Shadowsocks, or Relay proxy.  It is
+powered by gVisor's userspace TCP/IP stack and supports gateway mode
+for transparent proxying of other devices on the network.
+
+Features include IPv4/IPv6 support, multiple proxy protocols with
+authentication, a REST API for runtime statistics, and cross-platform
+compatibility with Linux, macOS, FreeBSD, OpenBSD, and Windows.