device_stack.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. //go:build with_gvisor
  2. package wireguard
  3. import (
  4. "context"
  5. "net"
  6. "os"
  7. "github.com/sagernet/gvisor/pkg/buffer"
  8. "github.com/sagernet/gvisor/pkg/tcpip"
  9. "github.com/sagernet/gvisor/pkg/tcpip/adapters/gonet"
  10. "github.com/sagernet/gvisor/pkg/tcpip/header"
  11. "github.com/sagernet/gvisor/pkg/tcpip/network/ipv4"
  12. "github.com/sagernet/gvisor/pkg/tcpip/network/ipv6"
  13. "github.com/sagernet/gvisor/pkg/tcpip/stack"
  14. "github.com/sagernet/gvisor/pkg/tcpip/transport/tcp"
  15. "github.com/sagernet/gvisor/pkg/tcpip/transport/udp"
  16. "github.com/sagernet/sing-tun"
  17. E "github.com/sagernet/sing/common/exceptions"
  18. M "github.com/sagernet/sing/common/metadata"
  19. N "github.com/sagernet/sing/common/network"
  20. "github.com/sagernet/wireguard-go/device"
  21. wgTun "github.com/sagernet/wireguard-go/tun"
  22. )
  23. var _ Device = (*stackDevice)(nil)
  24. type stackDevice struct {
  25. stack *stack.Stack
  26. mtu uint32
  27. events chan wgTun.Event
  28. outbound chan *stack.PacketBuffer
  29. done chan struct{}
  30. dispatcher stack.NetworkDispatcher
  31. addr4 tcpip.Address
  32. addr6 tcpip.Address
  33. }
  34. func newStackDevice(options DeviceOptions) (*stackDevice, error) {
  35. tunDevice := &stackDevice{
  36. mtu: options.MTU,
  37. events: make(chan wgTun.Event, 1),
  38. outbound: make(chan *stack.PacketBuffer, 256),
  39. done: make(chan struct{}),
  40. }
  41. ipStack, err := tun.NewGVisorStack((*wireEndpoint)(tunDevice))
  42. if err != nil {
  43. return nil, err
  44. }
  45. for _, prefix := range options.Address {
  46. addr := tun.AddressFromAddr(prefix.Addr())
  47. protoAddr := tcpip.ProtocolAddress{
  48. AddressWithPrefix: tcpip.AddressWithPrefix{
  49. Address: addr,
  50. PrefixLen: prefix.Bits(),
  51. },
  52. }
  53. if prefix.Addr().Is4() {
  54. tunDevice.addr4 = addr
  55. protoAddr.Protocol = ipv4.ProtocolNumber
  56. } else {
  57. tunDevice.addr6 = addr
  58. protoAddr.Protocol = ipv6.ProtocolNumber
  59. }
  60. gErr := ipStack.AddProtocolAddress(tun.DefaultNIC, protoAddr, stack.AddressProperties{})
  61. if gErr != nil {
  62. return nil, E.New("parse local address ", protoAddr.AddressWithPrefix, ": ", gErr.String())
  63. }
  64. }
  65. tunDevice.stack = ipStack
  66. if options.Handler != nil {
  67. ipStack.SetTransportProtocolHandler(tcp.ProtocolNumber, tun.NewTCPForwarder(options.Context, ipStack, options.Handler).HandlePacket)
  68. ipStack.SetTransportProtocolHandler(udp.ProtocolNumber, tun.NewUDPForwarder(options.Context, ipStack, options.Handler, options.UDPTimeout).HandlePacket)
  69. }
  70. return tunDevice, nil
  71. }
  72. func (w *stackDevice) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
  73. addr := tcpip.FullAddress{
  74. NIC: tun.DefaultNIC,
  75. Port: destination.Port,
  76. Addr: tun.AddressFromAddr(destination.Addr),
  77. }
  78. bind := tcpip.FullAddress{
  79. NIC: tun.DefaultNIC,
  80. }
  81. var networkProtocol tcpip.NetworkProtocolNumber
  82. if destination.IsIPv4() {
  83. networkProtocol = header.IPv4ProtocolNumber
  84. bind.Addr = w.addr4
  85. } else {
  86. networkProtocol = header.IPv6ProtocolNumber
  87. bind.Addr = w.addr6
  88. }
  89. switch N.NetworkName(network) {
  90. case N.NetworkTCP:
  91. tcpConn, err := DialTCPWithBind(ctx, w.stack, bind, addr, networkProtocol)
  92. if err != nil {
  93. return nil, err
  94. }
  95. return tcpConn, nil
  96. case N.NetworkUDP:
  97. udpConn, err := gonet.DialUDP(w.stack, &bind, &addr, networkProtocol)
  98. if err != nil {
  99. return nil, err
  100. }
  101. return udpConn, nil
  102. default:
  103. return nil, E.Extend(N.ErrUnknownNetwork, network)
  104. }
  105. }
  106. func (w *stackDevice) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
  107. bind := tcpip.FullAddress{
  108. NIC: tun.DefaultNIC,
  109. }
  110. var networkProtocol tcpip.NetworkProtocolNumber
  111. if destination.IsIPv4() {
  112. networkProtocol = header.IPv4ProtocolNumber
  113. bind.Addr = w.addr4
  114. } else {
  115. networkProtocol = header.IPv6ProtocolNumber
  116. bind.Addr = w.addr6
  117. }
  118. udpConn, err := gonet.DialUDP(w.stack, &bind, nil, networkProtocol)
  119. if err != nil {
  120. return nil, err
  121. }
  122. return udpConn, nil
  123. }
  124. func (w *stackDevice) SetDevice(device *device.Device) {
  125. }
  126. func (w *stackDevice) Start() error {
  127. w.events <- wgTun.EventUp
  128. return nil
  129. }
  130. func (w *stackDevice) File() *os.File {
  131. return nil
  132. }
  133. func (w *stackDevice) Read(bufs [][]byte, sizes []int, offset int) (count int, err error) {
  134. select {
  135. case packetBuffer, ok := <-w.outbound:
  136. if !ok {
  137. return 0, os.ErrClosed
  138. }
  139. defer packetBuffer.DecRef()
  140. p := bufs[0]
  141. p = p[offset:]
  142. n := 0
  143. for _, slice := range packetBuffer.AsSlices() {
  144. n += copy(p[n:], slice)
  145. }
  146. sizes[0] = n
  147. count = 1
  148. return
  149. case <-w.done:
  150. return 0, os.ErrClosed
  151. }
  152. }
  153. func (w *stackDevice) Write(bufs [][]byte, offset int) (count int, err error) {
  154. for _, b := range bufs {
  155. b = b[offset:]
  156. if len(b) == 0 {
  157. continue
  158. }
  159. var networkProtocol tcpip.NetworkProtocolNumber
  160. switch header.IPVersion(b) {
  161. case header.IPv4Version:
  162. networkProtocol = header.IPv4ProtocolNumber
  163. case header.IPv6Version:
  164. networkProtocol = header.IPv6ProtocolNumber
  165. }
  166. packetBuffer := stack.NewPacketBuffer(stack.PacketBufferOptions{
  167. Payload: buffer.MakeWithData(b),
  168. })
  169. w.dispatcher.DeliverNetworkPacket(networkProtocol, packetBuffer)
  170. packetBuffer.DecRef()
  171. count++
  172. }
  173. return
  174. }
  175. func (w *stackDevice) Flush() error {
  176. return nil
  177. }
  178. func (w *stackDevice) MTU() (int, error) {
  179. return int(w.mtu), nil
  180. }
  181. func (w *stackDevice) Name() (string, error) {
  182. return "sing-box", nil
  183. }
  184. func (w *stackDevice) Events() <-chan wgTun.Event {
  185. return w.events
  186. }
  187. func (w *stackDevice) Close() error {
  188. close(w.done)
  189. close(w.events)
  190. w.stack.Close()
  191. for _, endpoint := range w.stack.CleanupEndpoints() {
  192. endpoint.Abort()
  193. }
  194. w.stack.Wait()
  195. return nil
  196. }
  197. func (w *stackDevice) BatchSize() int {
  198. return 1
  199. }
  200. var _ stack.LinkEndpoint = (*wireEndpoint)(nil)
  201. type wireEndpoint stackDevice
  202. func (ep *wireEndpoint) MTU() uint32 {
  203. return ep.mtu
  204. }
  205. func (ep *wireEndpoint) SetMTU(mtu uint32) {
  206. }
  207. func (ep *wireEndpoint) MaxHeaderLength() uint16 {
  208. return 0
  209. }
  210. func (ep *wireEndpoint) LinkAddress() tcpip.LinkAddress {
  211. return ""
  212. }
  213. func (ep *wireEndpoint) SetLinkAddress(addr tcpip.LinkAddress) {
  214. }
  215. func (ep *wireEndpoint) Capabilities() stack.LinkEndpointCapabilities {
  216. return stack.CapabilityRXChecksumOffload
  217. }
  218. func (ep *wireEndpoint) Attach(dispatcher stack.NetworkDispatcher) {
  219. ep.dispatcher = dispatcher
  220. }
  221. func (ep *wireEndpoint) IsAttached() bool {
  222. return ep.dispatcher != nil
  223. }
  224. func (ep *wireEndpoint) Wait() {
  225. }
  226. func (ep *wireEndpoint) ARPHardwareType() header.ARPHardwareType {
  227. return header.ARPHardwareNone
  228. }
  229. func (ep *wireEndpoint) AddHeader(buffer *stack.PacketBuffer) {
  230. }
  231. func (ep *wireEndpoint) ParseHeader(ptr *stack.PacketBuffer) bool {
  232. return true
  233. }
  234. func (ep *wireEndpoint) WritePackets(list stack.PacketBufferList) (int, tcpip.Error) {
  235. for _, packetBuffer := range list.AsSlice() {
  236. packetBuffer.IncRef()
  237. select {
  238. case <-ep.done:
  239. return 0, &tcpip.ErrClosedForSend{}
  240. case ep.outbound <- packetBuffer:
  241. }
  242. }
  243. return list.Len(), nil
  244. }
  245. func (ep *wireEndpoint) Close() {
  246. }
  247. func (ep *wireEndpoint) SetOnCloseAction(f func()) {
  248. }