From ab59724d87de8b0f7432afb68337cb9fb8501a92 Mon Sep 17 00:00:00 2001 From: xjasonlyu Date: Mon, 8 Feb 2021 14:55:09 +0800 Subject: [PATCH] Chore: rewrite README --- README.md | 293 +++++++------------------------------------------- README_ZH.md | 80 ++++++++++++++ docs/logo.png | Bin 0 -> 31582 bytes 3 files changed, 121 insertions(+), 252 deletions(-) create mode 100644 README_ZH.md create mode 100644 docs/logo.png diff --git a/README.md b/README.md index 9d98257..714e5ae 100644 --- a/README.md +++ b/README.md @@ -1,291 +1,80 @@ -

tun2socks

-

A tun2socks powered by gVisor TCP/IP stack.

+![tun2socks](docs/logo.png) -

- - GitHub Workflow - - - Docker Pulls - - - Go Version - - - Go Report - - - GitHub License - - - Total Lines - - - Release - -

+[![GitHub Workflow][1]](https://github.com/xjasonlyu/tun2socks/actions) +[![Go Version][2]](https://github.com/xjasonlyu/tun2socks/blob/main/go.mod) +[![Go Report][3]](https://goreportcard.com/badge/github.com/xjasonlyu/tun2socks) +[![GitHub License][4]](https://github.com/xjasonlyu/tun2socks/blob/main/LICENSE) +[![Releases][5]](https://github.com/xjasonlyu/tun2socks/releases) + +[1]: https://img.shields.io/github/workflow/status/xjasonlyu/tun2socks/Go/master?style=flat-square +[2]: https://img.shields.io/github/go-mod/go-version/xjasonlyu/tun2socks?style=flat-square +[3]: https://goreportcard.com/badge/github.com/xjasonlyu/tun2socks?style=flat-square +[4]: https://img.shields.io/github/license/xjasonlyu/tun2socks?style=flat-square +[5]: https://img.shields.io/github/v/release/xjasonlyu/tun2socks?include_prereleases&style=flat-square + +[简体中文](README_ZH.md) ## Features -- ICMP echoing -- IPv6 support +- ICMP echoing / IPv6 support / Socks5 & SS proxy - Optimized UDP transmission for game acceleration - Pure Go implementation, no more CGO required - Router mode, routing all the traffic in LAN -- Socks5, Shadowsocks protocol support for remote connections - TCP/IP stack powered by [gVisor](https://github.com/google/gvisor) -- Up to 2.5Gbps throughput (10x faster than [v1](https://github.com/xjasonlyu/tun2socks/tree/v1)) +- More than 2.5Gbps throughput (10x faster than [v1](https://github.com/xjasonlyu/tun2socks/tree/v1)) ## Requirements | Target | Minimum | Recommended | | :----- | :-----: | :---------: | -| System | linux darwin freebsd openbsd | linux | +| System | Linux MacOS Freebsd OpenBSD Windows | Linux MacOS | | Memory | >20MB | >128MB | -| CPU | amd64 arm64 | amd64 | +| CPU | AMD64(x86_64) ARM64 | AMD64 with AES-NI & AVX2 | -## Performance +## Documentation -> iPerf3 tested on Debian 10 with i5-10500, 8G RAM +Documentations and quick start guides can be found at [Github Wiki](https://github.com/xjasonlyu/tun2socks/wiki). -## How to Build +## Building from source -### build from source code +Due to tun2socks based on gVisor, so only x86_64 and ARM64 was supported for now. Other architectures may become available in the future. -Go compiler version >= 1.15 is required +### Dependencies -```text -$ git clone https://github.com/xjasonlyu/tun2socks.git -$ cd tun2socks -$ make +Make sure the following dependencies are installed: + +- Go 1.15+ + +### Building + +Build and install the `tun2socks` binary: + +```shell +make tun2socks +sudo cp ./bin/tun2socks /usr/local/bin ``` -### build docker image +Build for all architectures: -```text -$ docker build -t tun2socks . +```shell +make all-arch ``` -or - -```text -$ docker build -t tun2socks -f .Dockerfile.aarch64 . -``` - -## QuickStart - -Download from precompiled [Releases](https://github.com/xjasonlyu/tun2socks/releases). - -
- With Docker - -> Since Go 1.12, the runtime now uses MADV_FREE to release unused memory on **linux**. This is more efficient but may result in higher reported RSS. The kernel will reclaim the unused data when it is needed. To revert to the Go 1.11 behavior (MADV_DONTNEED), set the environment variable GODEBUG=madvdontneed=1. - -### create docker network (macvlan mode) - -```shell script -docker network create -d macvlan \ - --subnet=172.20.1.0/25 \ - --gateway=172.20.1.1 \ - -o parent=eth0 \ - switch -``` - -### pull `tun2socks` docker image - -```shell script -docker pull xjasonlyu/tun2socks:latest -``` - -### run as gateway - -> DNS configuration is required. - -```shell script -docker run -d \ - --network switch \ - --name tun2socks \ - --ip 172.20.1.2 \ - --privileged \ - --restart always \ - --sysctl net.ipv4.ip_forward=1 \ - -e PROXY=socks5://server:port \ - -e KEY=VALUE... \ - xjasonlyu/tun2socks:latest -``` - -### use docker-compose (recommended) - -```yaml -version: '2.4' - -services: - tun2socks: - image: xjasonlyu/tun2socks:latest - cap_add: - - NET_ADMIN - devices: - - '/dev/net/tun:/dev/net/tun' - environment: - # - GODEBUG=madvdontneed=1 - - PROXY=socks5://server:port - - LOGLEVEL=INFO - - API=api://:8080 - - DNS=dns://:53 - - HOSTS=localhost=127.0.0.1,router.local=172.20.1.1 - - EXCLUDED=1.1.1.1,1.0.0.1 - - EXTRACMD= - networks: - switch: - ipv4_address: 172.20.1.2 - restart: always - container_name: tun2socks - -networks: - switch: - name: switch - ipam: - driver: default - config: - - subnet: '172.20.1.0/25' - gateway: 172.20.1.1 - driver: macvlan - driver_opts: - parent: eth0 -``` -
- -
- With Linux - -### create tun - -```shell script -ip tuntap add mode tun dev tun0 -ip addr add 198.18.0.1/15 dev tun0 -ip link set dev tun0 up -``` - -### config policy routing - -```shell script -echo "100 tun2socks" >> /etc/iproute2/rt_tables - -ip route add default via 198.18.0.1 dev tun0 table tun2socks -ip route add 172.17.0.0/16 dev eth0 src 172.17.0.3 table tun2socks -ip route add 198.18.0.0/15 dev tun0 src 198.18.0.1 table tun2socks - -ip rule add from 172.20.0.3 to 198.18.0.0/15 priority 1000 prohibit -ip rule add from 172.20.0.3 priority 2000 table main -ip rule add from all priority 3000 table tun2socks -``` - -### run - -> bind to a specific interface to prevent traffic looping. - -```shell script -./tun2socks --loglevel info --device tun://tun0 --proxy socks5://server:port --interface eth0 -``` -
- -
- With MacOS - -### start tun2socks -```shell script -./tun2socks --loglevel info --device tun://utun123 --proxy socks5://server:port --interface eth0 -``` - -### config interface - -```shell script -sudo ifconfig utun123 198.18.0.1 netmask 255.255.255.255 198.18.0.1 up -``` - -### config route - -```shell script -sudo route del default -sudo route add default 198.18.0.1 -sudo route add ${proxy_server_ip} ${your_gateway} -``` - -### check route table - -```shell script -netstat -nr -``` -
- -
- With Script - -> entrypoint.sh would take care of tun & routes. - -```shell script -PROXY=socks5://server:port LOGLEVEL=INFO sh ./scripts/entrypoint.sh -``` -
- -## Details - -
- API Reference - -| Path | Methods | Parameters | Description | -| :--- | :------ | :--------: | :---------- | -| `/logs` | GET | `level` | Get real-time logs | -| `/traffic` | GET | / | Get real-time traffic data | -| `/version` | GET | / | Get current version | -| `/connections` | GET | `interval` | Get all connections | -| `/connections` | DELETE | / | Close all connections | -| `/connections/{id}` | DELETE | / | Close connection by `id` | - -
- -
- Help Text - -```text -Usage of tun2socks: - -d, --device string Use this device [driver://]name - -i, --interface string Use network INTERFACE (Darwin/Linux only) - -l, --loglevel string Log level [debug|info|warn|error|silent] (default "info") - -m, --mtu int Maximum transmission unit - -p, --proxy string Use this proxy [protocol://]host[:port] - --stats string HTTP statistic server listen address - --token string HTTP statistic server auth token - -v, --version Show version information and quit -``` - -
- -
- Proxy URL - -| Protocol | Scheme | Examples | -| :------- | :----- | :------- | -| direct | `direct` | `direct://` | -| socks5 | `socks5` | `socks5://username:password@server:port` | -| shadowsocks | `ss`, `shadowsocks` | `ss://method:password@server:port` | - -
- ## Credits - [Dreamacro/clash](https://github.com/Dreamacro/clash) - [google/gvisor](https://github.com/google/gvisor) - [majek/slirpnetstack](https://github.com/majek/slirpnetstack) -- [WireGuard/wireguard-go](https://github.com/WireGuard/wireguard-go) +- [WireGuard/wireguard-go](https://git.zx2c4.com/wireguard-go) ## Known Issues -Due to the implementation of pure Go, the memory usage is higher than the previous version. -If you are sensitive to memory, please go back to [v1](https://github.com/xjasonlyu/tun2socks/tree/v1). +Due to the implementation of pure Go, the memory consumption is higher than the previous version. +If you are sensitive to it, please go back to [v1](https://github.com/xjasonlyu/tun2socks/tree/v1). ## TODO - [x] Windows support - [x] FreeBSD support - [x] OpenBSD support +- [ ] Auto route mode diff --git a/README_ZH.md b/README_ZH.md new file mode 100644 index 0000000..f2bfdf1 --- /dev/null +++ b/README_ZH.md @@ -0,0 +1,80 @@ +![tun2socks](docs/logo.png) + +[![GitHub Workflow][1]](https://github.com/xjasonlyu/tun2socks/actions) +[![Go Version][2]](https://github.com/xjasonlyu/tun2socks/blob/main/go.mod) +[![Go Report][3]](https://goreportcard.com/badge/github.com/xjasonlyu/tun2socks) +[![GitHub License][4]](https://github.com/xjasonlyu/tun2socks/blob/main/LICENSE) +[![Releases][5]](https://github.com/xjasonlyu/tun2socks/releases) + +[1]: https://img.shields.io/github/workflow/status/xjasonlyu/tun2socks/Go/master?style=flat-square +[2]: https://img.shields.io/github/go-mod/go-version/xjasonlyu/tun2socks?style=flat-square +[3]: https://goreportcard.com/badge/github.com/xjasonlyu/tun2socks?style=flat-square +[4]: https://img.shields.io/github/license/xjasonlyu/tun2socks?style=flat-square +[5]: https://img.shields.io/github/v/release/xjasonlyu/tun2socks?include_prereleases&style=flat-square + +[English](README.md) + +## 特性 + +- ICMP 回应 / IPv6 支持 / Socks5 和 SS 代理 +- 适用于游戏加速,由专门优化过UDP流量的传输 +- 纯 Go 实现,编译不再需要 CGO 的加持 +- 路由模式,可以用来转发代理局域网内所有流量 +- 由 [gVisor](https://github.com/google/gvisor) 强力驱动的 TCP/IP 网络栈 +- 实测超过 2.5Gbps 的带宽吞吐量( [v1](https://github.com/xjasonlyu/tun2socks/tree/v1) 版本的10x倍以上) + +## 硬件需求 + +| 目标 | 最小 | 建议 | +| :----- | :-----: | :---------: | +| 系统 | Linux MacOS Freebsd OpenBSD Windows | Linux MacOS | +| 内存 | >20MB | >128MB | +| 架构 | AMD64(x86_64) ARM64 | AMD64 with AES-NI & AVX2 | + +## 文档 + +文档以及使用方式,请看 [Github Wiki](https://github.com/xjasonlyu/tun2socks/wiki) 。 + +## 从源码编译 + +由于 tun2socks 是基于 gVisor的,所以目前只支持 x86_64 和 ARM64 架构。以后可能会支持其他的架构(取决于gVisor)。 + +### 环境依赖 + +确保安装了以下环境: + +- Go 1.15+ + +### 开始编译 + +编译以及安装 `tun2socks` 二进制文件: + +```shell +make tun2socks +sudo cp ./bin/tun2socks /usr/local/bin +``` + +编译所有架构的二进制文件: + +```shell +make all-arch +``` + +## 感谢 + +- [Dreamacro/clash](https://github.com/Dreamacro/clash) +- [google/gvisor](https://github.com/google/gvisor) +- [majek/slirpnetstack](https://github.com/majek/slirpnetstack) +- [WireGuard/wireguard-go](https://git.zx2c4.com/wireguard-go) + +## 已知问题 + +由于采用了纯Go实现,所以这一版本的内存消耗通常会高于上一个版本(在有大量连接时更为明显)。 +如果您的需求对内存消耗极为敏感,请继续使用 [v1](https://github.com/xjasonlyu/tun2socks/tree/v1) 版本。 + +## TODO + +- [x] Windows 支持 +- [x] FreeBSD 支持 +- [x] OpenBSD 支持 +- [ ] 自动路由模式 diff --git a/docs/logo.png b/docs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5ec7101c6c4865cbcbb661c66e23df5ff8684f24 GIT binary patch literal 31582 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 RaWZo#hI+=A%XIA@{vXcI5M=-W literal 0 HcmV?d00001