freedom.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. package freedom
  2. //go:generate go run github.com/xtls/xray-core/common/errors/errorgen
  3. import (
  4. "context"
  5. "crypto/rand"
  6. "io"
  7. "math/big"
  8. "time"
  9. "github.com/pires/go-proxyproto"
  10. "github.com/xtls/xray-core/common"
  11. "github.com/xtls/xray-core/common/buf"
  12. "github.com/xtls/xray-core/common/dice"
  13. "github.com/xtls/xray-core/common/errors"
  14. "github.com/xtls/xray-core/common/net"
  15. "github.com/xtls/xray-core/common/platform"
  16. "github.com/xtls/xray-core/common/retry"
  17. "github.com/xtls/xray-core/common/session"
  18. "github.com/xtls/xray-core/common/signal"
  19. "github.com/xtls/xray-core/common/task"
  20. "github.com/xtls/xray-core/core"
  21. "github.com/xtls/xray-core/features/dns"
  22. "github.com/xtls/xray-core/features/policy"
  23. "github.com/xtls/xray-core/features/stats"
  24. "github.com/xtls/xray-core/proxy"
  25. "github.com/xtls/xray-core/transport"
  26. "github.com/xtls/xray-core/transport/internet"
  27. "github.com/xtls/xray-core/transport/internet/stat"
  28. "github.com/xtls/xray-core/transport/internet/tls"
  29. )
  30. var useSplice bool
  31. func init() {
  32. common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
  33. h := new(Handler)
  34. if err := core.RequireFeatures(ctx, func(pm policy.Manager, d dns.Client) error {
  35. return h.Init(config.(*Config), pm, d)
  36. }); err != nil {
  37. return nil, err
  38. }
  39. return h, nil
  40. }))
  41. const defaultFlagValue = "NOT_DEFINED_AT_ALL"
  42. value := platform.NewEnvFlag(platform.UseFreedomSplice).GetValue(func() string { return defaultFlagValue })
  43. switch value {
  44. case defaultFlagValue, "auto", "enable":
  45. useSplice = true
  46. }
  47. }
  48. // Handler handles Freedom connections.
  49. type Handler struct {
  50. policyManager policy.Manager
  51. dns dns.Client
  52. config *Config
  53. }
  54. // Init initializes the Handler with necessary parameters.
  55. func (h *Handler) Init(config *Config, pm policy.Manager, d dns.Client) error {
  56. h.config = config
  57. h.policyManager = pm
  58. h.dns = d
  59. return nil
  60. }
  61. func (h *Handler) policy() policy.Session {
  62. p := h.policyManager.ForLevel(h.config.UserLevel)
  63. return p
  64. }
  65. func (h *Handler) resolveIP(ctx context.Context, domain string, localAddr net.Address) net.Address {
  66. ips, err := h.dns.LookupIP(domain, dns.IPOption{
  67. IPv4Enable: (localAddr == nil || localAddr.Family().IsIPv4()) && h.config.preferIP4(),
  68. IPv6Enable: (localAddr == nil || localAddr.Family().IsIPv6()) && h.config.preferIP6(),
  69. })
  70. { // Resolve fallback
  71. if (len(ips) == 0 || err != nil) && h.config.hasFallback() && localAddr == nil {
  72. ips, err = h.dns.LookupIP(domain, dns.IPOption{
  73. IPv4Enable: h.config.fallbackIP4(),
  74. IPv6Enable: h.config.fallbackIP6(),
  75. })
  76. }
  77. }
  78. if err != nil {
  79. errors.LogInfoInner(ctx, err, "failed to get IP address for domain ", domain)
  80. }
  81. if len(ips) == 0 {
  82. return nil
  83. }
  84. return net.IPAddress(ips[dice.Roll(len(ips))])
  85. }
  86. func isValidAddress(addr *net.IPOrDomain) bool {
  87. if addr == nil {
  88. return false
  89. }
  90. a := addr.AsAddress()
  91. return a != net.AnyIP
  92. }
  93. // Process implements proxy.Outbound.
  94. func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer internet.Dialer) error {
  95. outbounds := session.OutboundsFromContext(ctx)
  96. ob := outbounds[len(outbounds)-1]
  97. if !ob.Target.IsValid() {
  98. return errors.New("target not specified.")
  99. }
  100. ob.Name = "freedom"
  101. ob.CanSpliceCopy = 1
  102. inbound := session.InboundFromContext(ctx)
  103. destination := ob.Target
  104. UDPOverride := net.UDPDestination(nil, 0)
  105. if h.config.DestinationOverride != nil {
  106. server := h.config.DestinationOverride.Server
  107. if isValidAddress(server.Address) {
  108. destination.Address = server.Address.AsAddress()
  109. UDPOverride.Address = destination.Address
  110. }
  111. if server.Port != 0 {
  112. destination.Port = net.Port(server.Port)
  113. UDPOverride.Port = destination.Port
  114. }
  115. }
  116. input := link.Reader
  117. output := link.Writer
  118. var conn stat.Connection
  119. err := retry.ExponentialBackoff(5, 100).On(func() error {
  120. dialDest := destination
  121. if h.config.hasStrategy() && dialDest.Address.Family().IsDomain() {
  122. ip := h.resolveIP(ctx, dialDest.Address.Domain(), dialer.Address())
  123. if ip != nil {
  124. dialDest = net.Destination{
  125. Network: dialDest.Network,
  126. Address: ip,
  127. Port: dialDest.Port,
  128. }
  129. errors.LogInfo(ctx, "dialing to ", dialDest)
  130. } else if h.config.forceIP() {
  131. return dns.ErrEmptyResponse
  132. }
  133. }
  134. rawConn, err := dialer.Dial(ctx, dialDest)
  135. if err != nil {
  136. return err
  137. }
  138. if h.config.ProxyProtocol > 0 && h.config.ProxyProtocol <= 2 {
  139. version := byte(h.config.ProxyProtocol)
  140. srcAddr := inbound.Source.RawNetAddr()
  141. dstAddr := rawConn.RemoteAddr()
  142. header := proxyproto.HeaderProxyFromAddrs(version, srcAddr, dstAddr)
  143. if _, err = header.WriteTo(rawConn); err != nil {
  144. rawConn.Close()
  145. return err
  146. }
  147. }
  148. conn = rawConn
  149. return nil
  150. })
  151. if err != nil {
  152. return errors.New("failed to open connection to ", destination).Base(err)
  153. }
  154. defer conn.Close()
  155. errors.LogInfo(ctx, "connection opened to ", destination, ", local endpoint ", conn.LocalAddr(), ", remote endpoint ", conn.RemoteAddr())
  156. var newCtx context.Context
  157. var newCancel context.CancelFunc
  158. if session.TimeoutOnlyFromContext(ctx) {
  159. newCtx, newCancel = context.WithCancel(context.Background())
  160. }
  161. plcy := h.policy()
  162. ctx, cancel := context.WithCancel(ctx)
  163. timer := signal.CancelAfterInactivity(ctx, func() {
  164. cancel()
  165. if newCancel != nil {
  166. newCancel()
  167. }
  168. }, plcy.Timeouts.ConnectionIdle)
  169. requestDone := func() error {
  170. defer timer.SetTimeout(plcy.Timeouts.DownlinkOnly)
  171. var writer buf.Writer
  172. if destination.Network == net.Network_TCP {
  173. if h.config.Fragment != nil {
  174. errors.LogDebug(ctx, "FRAGMENT", h.config.Fragment.PacketsFrom, h.config.Fragment.PacketsTo, h.config.Fragment.LengthMin, h.config.Fragment.LengthMax,
  175. h.config.Fragment.IntervalMin, h.config.Fragment.IntervalMax)
  176. writer = buf.NewWriter(&FragmentWriter{
  177. fragment: h.config.Fragment,
  178. writer: conn,
  179. })
  180. } else {
  181. writer = buf.NewWriter(conn)
  182. }
  183. } else {
  184. writer = NewPacketWriter(conn, h, ctx, UDPOverride)
  185. if h.config.Noises != nil {
  186. errors.LogDebug(ctx, "NOISE", h.config.Noises)
  187. writer = &NoisePacketWriter{
  188. Writer: writer,
  189. noises: h.config.Noises,
  190. firstWrite: true,
  191. UDPOverride: UDPOverride,
  192. }
  193. }
  194. }
  195. if err := buf.Copy(input, writer, buf.UpdateActivity(timer)); err != nil {
  196. return errors.New("failed to process request").Base(err)
  197. }
  198. return nil
  199. }
  200. responseDone := func() error {
  201. defer timer.SetTimeout(plcy.Timeouts.UplinkOnly)
  202. if destination.Network == net.Network_TCP {
  203. var writeConn net.Conn
  204. var inTimer *signal.ActivityTimer
  205. if inbound := session.InboundFromContext(ctx); inbound != nil && inbound.Conn != nil && useSplice {
  206. writeConn = inbound.Conn
  207. inTimer = inbound.Timer
  208. }
  209. if !isTLSConn(conn) { // it would be tls conn in special use case of MITM, we need to let link handle traffic
  210. return proxy.CopyRawConnIfExist(ctx, conn, writeConn, link.Writer, timer, inTimer)
  211. }
  212. }
  213. var reader buf.Reader
  214. if destination.Network == net.Network_TCP {
  215. reader = buf.NewReader(conn)
  216. } else {
  217. reader = NewPacketReader(conn, UDPOverride)
  218. }
  219. if err := buf.Copy(reader, output, buf.UpdateActivity(timer)); err != nil {
  220. return errors.New("failed to process response").Base(err)
  221. }
  222. return nil
  223. }
  224. if newCtx != nil {
  225. ctx = newCtx
  226. }
  227. if err := task.Run(ctx, requestDone, task.OnSuccess(responseDone, task.Close(output))); err != nil {
  228. return errors.New("connection ends").Base(err)
  229. }
  230. return nil
  231. }
  232. func isTLSConn(conn stat.Connection) bool {
  233. if conn != nil {
  234. statConn, ok := conn.(*stat.CounterConnection)
  235. if ok {
  236. conn = statConn.Connection
  237. }
  238. if _, ok := conn.(*tls.Conn); ok {
  239. return true
  240. }
  241. }
  242. return false
  243. }
  244. func NewPacketReader(conn net.Conn, UDPOverride net.Destination) buf.Reader {
  245. iConn := conn
  246. statConn, ok := iConn.(*stat.CounterConnection)
  247. if ok {
  248. iConn = statConn.Connection
  249. }
  250. var counter stats.Counter
  251. if statConn != nil {
  252. counter = statConn.ReadCounter
  253. }
  254. if c, ok := iConn.(*internet.PacketConnWrapper); ok && UDPOverride.Address == nil && UDPOverride.Port == 0 {
  255. return &PacketReader{
  256. PacketConnWrapper: c,
  257. Counter: counter,
  258. }
  259. }
  260. return &buf.PacketReader{Reader: conn}
  261. }
  262. type PacketReader struct {
  263. *internet.PacketConnWrapper
  264. stats.Counter
  265. }
  266. func (r *PacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
  267. b := buf.New()
  268. b.Resize(0, buf.Size)
  269. n, d, err := r.PacketConnWrapper.ReadFrom(b.Bytes())
  270. if err != nil {
  271. b.Release()
  272. return nil, err
  273. }
  274. b.Resize(0, int32(n))
  275. b.UDP = &net.Destination{
  276. Address: net.IPAddress(d.(*net.UDPAddr).IP),
  277. Port: net.Port(d.(*net.UDPAddr).Port),
  278. Network: net.Network_UDP,
  279. }
  280. if r.Counter != nil {
  281. r.Counter.Add(int64(n))
  282. }
  283. return buf.MultiBuffer{b}, nil
  284. }
  285. func NewPacketWriter(conn net.Conn, h *Handler, ctx context.Context, UDPOverride net.Destination) buf.Writer {
  286. iConn := conn
  287. statConn, ok := iConn.(*stat.CounterConnection)
  288. if ok {
  289. iConn = statConn.Connection
  290. }
  291. var counter stats.Counter
  292. if statConn != nil {
  293. counter = statConn.WriteCounter
  294. }
  295. if c, ok := iConn.(*internet.PacketConnWrapper); ok {
  296. return &PacketWriter{
  297. PacketConnWrapper: c,
  298. Counter: counter,
  299. Handler: h,
  300. Context: ctx,
  301. UDPOverride: UDPOverride,
  302. }
  303. }
  304. return &buf.SequentialWriter{Writer: conn}
  305. }
  306. type PacketWriter struct {
  307. *internet.PacketConnWrapper
  308. stats.Counter
  309. *Handler
  310. context.Context
  311. UDPOverride net.Destination
  312. }
  313. func (w *PacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
  314. for {
  315. mb2, b := buf.SplitFirst(mb)
  316. mb = mb2
  317. if b == nil {
  318. break
  319. }
  320. var n int
  321. var err error
  322. if b.UDP != nil {
  323. if w.UDPOverride.Address != nil {
  324. b.UDP.Address = w.UDPOverride.Address
  325. }
  326. if w.UDPOverride.Port != 0 {
  327. b.UDP.Port = w.UDPOverride.Port
  328. }
  329. if w.Handler.config.hasStrategy() && b.UDP.Address.Family().IsDomain() {
  330. ip := w.Handler.resolveIP(w.Context, b.UDP.Address.Domain(), nil)
  331. if ip != nil {
  332. b.UDP.Address = ip
  333. }
  334. }
  335. destAddr, _ := net.ResolveUDPAddr("udp", b.UDP.NetAddr())
  336. if destAddr == nil {
  337. b.Release()
  338. continue
  339. }
  340. n, err = w.PacketConnWrapper.WriteTo(b.Bytes(), destAddr)
  341. } else {
  342. n, err = w.PacketConnWrapper.Write(b.Bytes())
  343. }
  344. b.Release()
  345. if err != nil {
  346. buf.ReleaseMulti(mb)
  347. return err
  348. }
  349. if w.Counter != nil {
  350. w.Counter.Add(int64(n))
  351. }
  352. }
  353. return nil
  354. }
  355. type NoisePacketWriter struct {
  356. buf.Writer
  357. noises []*Noise
  358. firstWrite bool
  359. UDPOverride net.Destination
  360. }
  361. // MultiBuffer writer with Noise before first packet
  362. func (w *NoisePacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
  363. if w.firstWrite {
  364. w.firstWrite = false
  365. //Do not send Noise for dns requests(just to be safe)
  366. if w.UDPOverride.Port == 53 {
  367. return w.Writer.WriteMultiBuffer(mb)
  368. }
  369. var noise []byte
  370. var err error
  371. for _, n := range w.noises {
  372. //User input string or base64 encoded string
  373. if n.StrNoise != nil {
  374. noise = n.StrNoise
  375. } else {
  376. //Random noise
  377. noise, err = GenerateRandomBytes(randBetween(int64(n.LengthMin),
  378. int64(n.LengthMax)))
  379. }
  380. if err != nil {
  381. return err
  382. }
  383. w.Writer.WriteMultiBuffer(buf.MultiBuffer{buf.FromBytes(noise)})
  384. if n.DelayMin != 0 {
  385. time.Sleep(time.Duration(randBetween(int64(n.DelayMin), int64(n.DelayMax))) * time.Millisecond)
  386. }
  387. }
  388. }
  389. return w.Writer.WriteMultiBuffer(mb)
  390. }
  391. type FragmentWriter struct {
  392. fragment *Fragment
  393. writer io.Writer
  394. count uint64
  395. }
  396. func (f *FragmentWriter) Write(b []byte) (int, error) {
  397. f.count++
  398. if f.fragment.PacketsFrom == 0 && f.fragment.PacketsTo == 1 {
  399. if f.count != 1 || len(b) <= 5 || b[0] != 22 {
  400. return f.writer.Write(b)
  401. }
  402. recordLen := 5 + ((int(b[3]) << 8) | int(b[4]))
  403. if len(b) < recordLen { // maybe already fragmented somehow
  404. return f.writer.Write(b)
  405. }
  406. data := b[5:recordLen]
  407. buf := make([]byte, 1024)
  408. var hello []byte
  409. for from := 0; ; {
  410. to := from + int(randBetween(int64(f.fragment.LengthMin), int64(f.fragment.LengthMax)))
  411. if to > len(data) {
  412. to = len(data)
  413. }
  414. copy(buf[:3], b)
  415. copy(buf[5:], data[from:to])
  416. l := to - from
  417. from = to
  418. buf[3] = byte(l >> 8)
  419. buf[4] = byte(l)
  420. if f.fragment.IntervalMax == 0 { // combine fragmented tlshello if interval is 0
  421. hello = append(hello, buf[:5+l]...)
  422. } else {
  423. _, err := f.writer.Write(buf[:5+l])
  424. time.Sleep(time.Duration(randBetween(int64(f.fragment.IntervalMin), int64(f.fragment.IntervalMax))) * time.Millisecond)
  425. if err != nil {
  426. return 0, err
  427. }
  428. }
  429. if from == len(data) {
  430. if len(hello) > 0 {
  431. _, err := f.writer.Write(hello)
  432. if err != nil {
  433. return 0, err
  434. }
  435. }
  436. if len(b) > recordLen {
  437. n, err := f.writer.Write(b[recordLen:])
  438. if err != nil {
  439. return recordLen + n, err
  440. }
  441. }
  442. return len(b), nil
  443. }
  444. }
  445. }
  446. if f.fragment.PacketsFrom != 0 && (f.count < f.fragment.PacketsFrom || f.count > f.fragment.PacketsTo) {
  447. return f.writer.Write(b)
  448. }
  449. for from := 0; ; {
  450. to := from + int(randBetween(int64(f.fragment.LengthMin), int64(f.fragment.LengthMax)))
  451. if to > len(b) {
  452. to = len(b)
  453. }
  454. n, err := f.writer.Write(b[from:to])
  455. from += n
  456. time.Sleep(time.Duration(randBetween(int64(f.fragment.IntervalMin), int64(f.fragment.IntervalMax))) * time.Millisecond)
  457. if err != nil {
  458. return from, err
  459. }
  460. if from >= len(b) {
  461. return from, nil
  462. }
  463. }
  464. }
  465. // stolen from github.com/xtls/xray-core/transport/internet/reality
  466. func randBetween(left int64, right int64) int64 {
  467. if left == right {
  468. return left
  469. }
  470. bigInt, _ := rand.Int(rand.Reader, big.NewInt(right-left))
  471. return left + bigInt.Int64()
  472. }
  473. func GenerateRandomBytes(n int64) ([]byte, error) {
  474. b := make([]byte, n)
  475. _, err := rand.Read(b)
  476. // Note that err == nil only if we read len(b) bytes.
  477. if err != nil {
  478. return nil, err
  479. }
  480. return b, nil
  481. }