device_stack.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. //go:build with_gvisor
  2. package wireguard
  3. import (
  4. "context"
  5. "net"
  6. "net/netip"
  7. "os"
  8. "github.com/sagernet/sing-tun"
  9. "github.com/sagernet/sing/common/buf"
  10. E "github.com/sagernet/sing/common/exceptions"
  11. M "github.com/sagernet/sing/common/metadata"
  12. N "github.com/sagernet/sing/common/network"
  13. wgTun "github.com/sagernet/wireguard-go/tun"
  14. "gvisor.dev/gvisor/pkg/bufferv2"
  15. "gvisor.dev/gvisor/pkg/tcpip"
  16. "gvisor.dev/gvisor/pkg/tcpip/adapters/gonet"
  17. "gvisor.dev/gvisor/pkg/tcpip/header"
  18. "gvisor.dev/gvisor/pkg/tcpip/network/ipv4"
  19. "gvisor.dev/gvisor/pkg/tcpip/network/ipv6"
  20. "gvisor.dev/gvisor/pkg/tcpip/stack"
  21. "gvisor.dev/gvisor/pkg/tcpip/transport/icmp"
  22. "gvisor.dev/gvisor/pkg/tcpip/transport/tcp"
  23. "gvisor.dev/gvisor/pkg/tcpip/transport/udp"
  24. )
  25. var _ NatDevice = (*StackDevice)(nil)
  26. const defaultNIC tcpip.NICID = 1
  27. type StackDevice struct {
  28. stack *stack.Stack
  29. mtu uint32
  30. events chan wgTun.Event
  31. outbound chan *stack.PacketBuffer
  32. packetOutbound chan *buf.Buffer
  33. done chan struct{}
  34. dispatcher stack.NetworkDispatcher
  35. addr4 tcpip.Address
  36. addr6 tcpip.Address
  37. mapping *tun.NatMapping
  38. writer *tun.NatWriter
  39. }
  40. func NewStackDevice(localAddresses []netip.Prefix, mtu uint32, ipRewrite bool) (*StackDevice, error) {
  41. ipStack := stack.New(stack.Options{
  42. NetworkProtocols: []stack.NetworkProtocolFactory{ipv4.NewProtocol, ipv6.NewProtocol},
  43. TransportProtocols: []stack.TransportProtocolFactory{tcp.NewProtocol, udp.NewProtocol, icmp.NewProtocol4, icmp.NewProtocol6},
  44. HandleLocal: true,
  45. })
  46. tunDevice := &StackDevice{
  47. stack: ipStack,
  48. mtu: mtu,
  49. events: make(chan wgTun.Event, 1),
  50. outbound: make(chan *stack.PacketBuffer, 256),
  51. packetOutbound: make(chan *buf.Buffer, 256),
  52. done: make(chan struct{}),
  53. mapping: tun.NewNatMapping(ipRewrite),
  54. }
  55. err := ipStack.CreateNIC(defaultNIC, (*wireEndpoint)(tunDevice))
  56. if err != nil {
  57. return nil, E.New(err.String())
  58. }
  59. for _, prefix := range localAddresses {
  60. addr := tcpip.Address(prefix.Addr().AsSlice())
  61. protoAddr := tcpip.ProtocolAddress{
  62. AddressWithPrefix: tcpip.AddressWithPrefix{
  63. Address: addr,
  64. PrefixLen: prefix.Bits(),
  65. },
  66. }
  67. if prefix.Addr().Is4() {
  68. tunDevice.addr4 = addr
  69. protoAddr.Protocol = ipv4.ProtocolNumber
  70. } else {
  71. tunDevice.addr6 = addr
  72. protoAddr.Protocol = ipv6.ProtocolNumber
  73. }
  74. err = ipStack.AddProtocolAddress(defaultNIC, protoAddr, stack.AddressProperties{})
  75. if err != nil {
  76. return nil, E.New("parse local address ", protoAddr.AddressWithPrefix, ": ", err.String())
  77. }
  78. }
  79. if ipRewrite {
  80. tunDevice.writer = tun.NewNatWriter(tunDevice.Inet4Address(), tunDevice.Inet6Address())
  81. }
  82. sOpt := tcpip.TCPSACKEnabled(true)
  83. ipStack.SetTransportProtocolOption(tcp.ProtocolNumber, &sOpt)
  84. cOpt := tcpip.CongestionControlOption("cubic")
  85. ipStack.SetTransportProtocolOption(tcp.ProtocolNumber, &cOpt)
  86. ipStack.AddRoute(tcpip.Route{Destination: header.IPv4EmptySubnet, NIC: defaultNIC})
  87. ipStack.AddRoute(tcpip.Route{Destination: header.IPv6EmptySubnet, NIC: defaultNIC})
  88. return tunDevice, nil
  89. }
  90. func (w *StackDevice) NewEndpoint() (stack.LinkEndpoint, error) {
  91. return (*wireEndpoint)(w), nil
  92. }
  93. func (w *StackDevice) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
  94. addr := tcpip.FullAddress{
  95. NIC: defaultNIC,
  96. Port: destination.Port,
  97. Addr: tcpip.Address(destination.Addr.AsSlice()),
  98. }
  99. bind := tcpip.FullAddress{
  100. NIC: defaultNIC,
  101. }
  102. var networkProtocol tcpip.NetworkProtocolNumber
  103. if destination.IsIPv4() {
  104. networkProtocol = header.IPv4ProtocolNumber
  105. bind.Addr = w.addr4
  106. } else {
  107. networkProtocol = header.IPv6ProtocolNumber
  108. bind.Addr = w.addr6
  109. }
  110. switch N.NetworkName(network) {
  111. case N.NetworkTCP:
  112. tcpConn, err := gonet.DialTCPWithBind(ctx, w.stack, bind, addr, networkProtocol)
  113. if err != nil {
  114. return nil, err
  115. }
  116. return tcpConn, nil
  117. case N.NetworkUDP:
  118. udpConn, err := gonet.DialUDP(w.stack, &bind, &addr, networkProtocol)
  119. if err != nil {
  120. return nil, err
  121. }
  122. return udpConn, nil
  123. default:
  124. return nil, E.Extend(N.ErrUnknownNetwork, network)
  125. }
  126. }
  127. func (w *StackDevice) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
  128. bind := tcpip.FullAddress{
  129. NIC: defaultNIC,
  130. }
  131. var networkProtocol tcpip.NetworkProtocolNumber
  132. if destination.IsIPv4() || w.addr6 == "" {
  133. networkProtocol = header.IPv4ProtocolNumber
  134. bind.Addr = w.addr4
  135. } else {
  136. networkProtocol = header.IPv6ProtocolNumber
  137. bind.Addr = w.addr6
  138. }
  139. udpConn, err := gonet.DialUDP(w.stack, &bind, nil, networkProtocol)
  140. if err != nil {
  141. return nil, err
  142. }
  143. return udpConn, nil
  144. }
  145. func (w *StackDevice) Inet4Address() netip.Addr {
  146. return M.AddrFromIP(net.IP(w.addr4))
  147. }
  148. func (w *StackDevice) Inet6Address() netip.Addr {
  149. return M.AddrFromIP(net.IP(w.addr6))
  150. }
  151. func (w *StackDevice) Start() error {
  152. w.events <- wgTun.EventUp
  153. return nil
  154. }
  155. func (w *StackDevice) File() *os.File {
  156. return nil
  157. }
  158. func (w *StackDevice) Read(p []byte, offset int) (n int, err error) {
  159. select {
  160. case packetBuffer, ok := <-w.outbound:
  161. if !ok {
  162. return 0, os.ErrClosed
  163. }
  164. defer packetBuffer.DecRef()
  165. p = p[offset:]
  166. for _, slice := range packetBuffer.AsSlices() {
  167. n += copy(p[n:], slice)
  168. }
  169. return
  170. case packet := <-w.packetOutbound:
  171. defer packet.Release()
  172. n = copy(p[offset:], packet.Bytes())
  173. return
  174. case <-w.done:
  175. return 0, os.ErrClosed
  176. }
  177. }
  178. func (w *StackDevice) Write(p []byte, offset int) (n int, err error) {
  179. p = p[offset:]
  180. if len(p) == 0 {
  181. return
  182. }
  183. handled, err := w.mapping.WritePacket(p)
  184. if handled {
  185. return len(p), err
  186. }
  187. var networkProtocol tcpip.NetworkProtocolNumber
  188. switch header.IPVersion(p) {
  189. case header.IPv4Version:
  190. networkProtocol = header.IPv4ProtocolNumber
  191. case header.IPv6Version:
  192. networkProtocol = header.IPv6ProtocolNumber
  193. }
  194. packetBuffer := stack.NewPacketBuffer(stack.PacketBufferOptions{
  195. Payload: bufferv2.MakeWithData(p),
  196. })
  197. defer packetBuffer.DecRef()
  198. w.dispatcher.DeliverNetworkPacket(networkProtocol, packetBuffer)
  199. n = len(p)
  200. return
  201. }
  202. func (w *StackDevice) Flush() error {
  203. return nil
  204. }
  205. func (w *StackDevice) MTU() (int, error) {
  206. return int(w.mtu), nil
  207. }
  208. func (w *StackDevice) Name() (string, error) {
  209. return "sing-box", nil
  210. }
  211. func (w *StackDevice) Events() chan wgTun.Event {
  212. return w.events
  213. }
  214. func (w *StackDevice) Close() error {
  215. select {
  216. case <-w.done:
  217. return os.ErrClosed
  218. default:
  219. }
  220. w.stack.Close()
  221. for _, endpoint := range w.stack.CleanupEndpoints() {
  222. endpoint.Abort()
  223. }
  224. w.stack.Wait()
  225. close(w.done)
  226. return nil
  227. }
  228. func (w *StackDevice) CreateDestination(session tun.RouteSession, conn tun.RouteContext) tun.DirectDestination {
  229. w.mapping.CreateSession(session, conn)
  230. return &stackNatDestination{
  231. device: w,
  232. session: session,
  233. }
  234. }
  235. type stackNatDestination struct {
  236. device *StackDevice
  237. session tun.RouteSession
  238. }
  239. func (d *stackNatDestination) WritePacket(buffer *buf.Buffer) error {
  240. if d.device.writer != nil {
  241. d.device.writer.RewritePacket(buffer.Bytes())
  242. }
  243. d.device.packetOutbound <- buffer
  244. return nil
  245. }
  246. func (d *stackNatDestination) WritePacketBuffer(buffer *stack.PacketBuffer) error {
  247. if d.device.writer != nil {
  248. d.device.writer.RewritePacketBuffer(buffer)
  249. }
  250. d.device.outbound <- buffer
  251. return nil
  252. }
  253. func (d *stackNatDestination) Close() error {
  254. d.device.mapping.DeleteSession(d.session)
  255. return nil
  256. }
  257. func (d *stackNatDestination) Timeout() bool {
  258. return false
  259. }
  260. var _ stack.LinkEndpoint = (*wireEndpoint)(nil)
  261. type wireEndpoint StackDevice
  262. func (ep *wireEndpoint) MTU() uint32 {
  263. return ep.mtu
  264. }
  265. func (ep *wireEndpoint) MaxHeaderLength() uint16 {
  266. return 0
  267. }
  268. func (ep *wireEndpoint) LinkAddress() tcpip.LinkAddress {
  269. return ""
  270. }
  271. func (ep *wireEndpoint) Capabilities() stack.LinkEndpointCapabilities {
  272. return stack.CapabilityNone
  273. }
  274. func (ep *wireEndpoint) Attach(dispatcher stack.NetworkDispatcher) {
  275. ep.dispatcher = dispatcher
  276. }
  277. func (ep *wireEndpoint) IsAttached() bool {
  278. return ep.dispatcher != nil
  279. }
  280. func (ep *wireEndpoint) Wait() {
  281. }
  282. func (ep *wireEndpoint) ARPHardwareType() header.ARPHardwareType {
  283. return header.ARPHardwareNone
  284. }
  285. func (ep *wireEndpoint) AddHeader(buffer *stack.PacketBuffer) {
  286. }
  287. func (ep *wireEndpoint) WritePackets(list stack.PacketBufferList) (int, tcpip.Error) {
  288. for _, packetBuffer := range list.AsSlice() {
  289. packetBuffer.IncRef()
  290. select {
  291. case <-ep.done:
  292. return 0, &tcpip.ErrClosedForSend{}
  293. case ep.outbound <- packetBuffer:
  294. }
  295. }
  296. return list.Len(), nil
  297. }