diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 0000000..9a1fbb7 --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,54 @@ +name: Go + +on: + push: + branches: + - master + tags: + - '*' + +jobs: + + build: + name: Build + runs-on: ubuntu-latest + steps: + - name: Setup Go + uses: actions/setup-go@v2 + with: + go-version: 1.15.x + + - name: Check out code into the Go module directory + uses: actions/checkout@v2 + + - name: Cache go module + uses: actions/cache@v2 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + + - name: Get dependencies, run test and static check + run: | + go test ./... + go vet ./... + go get -u honnef.co/go/tools/cmd/staticcheck + staticcheck -- $(go list ./...) + + - name: Build + if: startsWith(github.ref, 'refs/tags/') + env: + DIR: bin + NAME: tun2socks + run: make -j releases + + - name: Upload Release + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + files: bin/* + draft: true + prerelease: true diff --git a/README.md b/README.md index c8779d7..c8a22eb 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,74 @@ # tun2socks +![build](https://img.shields.io/github/workflow/status/xjasonlyu/tun2socks/Go?style=flat-square) +![go report](https://goreportcard.com/badge/github.com/xjasonlyu/tun2socks?style=flat-square) +![license](https://img.shields.io/github/license/xjasonlyu/tun2socks?style=flat-square) +![release](https://img.shields.io/github/v/release/xjasonlyu/tun2socks.svg?include_prereleases&style=flat-square) + A tun2socks implementation written in Go. + +## Features + +- External RESTful API support +- Fake DNS with manual hosts support +- IPv4/IPv6 support +- Optimized UDP transmission for game acceleration +- Pure Go implementation, no CGO required +- 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)) + +### Requirements + +| Target | Minimum | Recommended | +| --- | --- | --- | +| System | linux darwin | linux | +| Memory | >20MB | +∞ | +| CPU | ANY | amd64 arm64 | + +## QuickStart + +Download from precompiled [Releases](https://github.com/xjasonlyu/tun2socks/releases). + +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 +``` + +run + +```shell script +./tun2socks --loglevel WARN --device tun://tun0 --proxy socks5://server:port --interface eth0 +``` + +or just + +```shell script +PROXY=socks5://server:port LOGLEVEL=WARN sh ./scripts/entrypoint.sh +``` + +## Build from source + +```text +$ git clone https://github.com/xjasonlyu/tun2socks.git +$ cd tun2socks +$ make +``` + +## Issues + +Due to the implementation of pure Go, the memory usage is higher than the previous version. +If you are memory sensitive, please go back to [v1](https://github.com/xjasonlyu/tun2socks/tree/v1). + +## TODO + +- [ ] Windows support + +## Credits + +- [Dreamacro/clash](https://github.com/Dreamacro/clash) +- [google/gvisor](https://github.com/google/gvisor) +- [majek/slirpnetstack](https://github.com/majek/slirpnetstack) diff --git a/internal/dev/tun/tun_linux.go b/internal/dev/tun/tun_linux.go index 126593f..1f76963 100644 --- a/internal/dev/tun/tun_linux.go +++ b/internal/dev/tun/tun_linux.go @@ -19,6 +19,9 @@ func (f closeFunc) Close() error { func Open(name string) (ep stack.LinkEndpoint, c io.Closer, err error) { var fd int fd, err = tun.Open(name) + if err != nil { + return + } var mtu uint32 mtu, err = rawfile.GetMTU(name)