ユーザランドTCP/IP実装によるtun2socksが割といっぱい有る
MiniSockのテスト環境を作るにあたって、任意のデバイスのネットワークをSocks5に変換する必要がある。例えば、 Google ChromeのSocks5はUDPをサポートしていない という問題があるので、ShadowsocksなVPN経由で変換するのが良いんじゃないかという気がしている。
ただしShadowsocksのようなVPNを経由するソリューションを採る場合、ポートのlistenを表現できない問題はある。まぁそもそもモバイル端末でサーバを動かすケース自体が割とレアケースな気はするが。。
... というかGitHubのタグ https://github.com/topics/tun2socks だとtop2がArchivedになってるトピックって凄いな。。
TCP/IPスタックの必要性
ShadowsocksやSocks5は今製作しているMiniSockと同様にTCPやUDPのレベルでしか転送を実施できない。このため、AndroidやiOS上のVPNソリューションとしてこれらのproxyを実装するためには、カーネルが生成してくるTCP/UDP接続を一旦デバイス上で終端してやる必要がある。
qemuで Slirp ベースのネットワークエミュレーションをやるのに似ている。
xjasonlyu/tun2socks
Go製。TCP/IPスタックは gVisor 。つまりTCP/IPスタックもgo製って事かな。
gVisorを使ったTAP実装として gvisor-tap-vsock
がある。
go-tun2socks
↑のtun2socksとは別もの。TCP/IPスタックは lwIP 。
本家はArchiveされているが、iOS等で展開されている Outline ( https://getoutline.org/ja/ ) がこれを採用していて、現状メンテナンスされているforkを持っている。
Leaf
本体はRust製だがTCP/IPスタックはgo-tun2socks同様lwIP。
WindowsストアアプリとしてのVPNアプリが存在する。
ipio
自前っぽい。ただしTCPのアセンブリ等はgoogle/gopacketに外注しているようだ。
BadVPN
tun2socksの名称 https://github.com/ambrop72/badvpn/wiki/Tun2socks を最初に使ったのがコレなんじゃないかという気がしている。TCP/IPスタックはlwIP。
作者はC++ で TCP/IPスタックも書いているが、それは採用しなかったようだ。
blechschmidt/tun2proxy
Rust製。Rust製のTCPスタックである smoltcp を使用しているようだ。