freedom.go 16 KB

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