Coder Social home page Coder Social logo

gortc / gortcd Goto Github PK

View Code? Open in Web Editor NEW
385.0 12.0 47.0 19.56 MB

Fast TURN and STUN server: cross-platform, hot reload, flexible config

License: BSD 3-Clause "New" or "Revised" License

Go 88.62% Shell 5.80% Makefile 0.31% Dockerfile 2.91% HTML 0.12% JavaScript 2.24%
gortc golang stun turn webrtc stun-server go nat-traversal nat

gortcd's People

Contributors

ernado avatar fossabot avatar renovate-bot avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gortcd's Issues

Bug fixed:Sometimes the server won't recieved a message but tupdump can catch that.

In the below function ,when c, err = reuseport.ListenPacket(serverNet, laddr) was executed,this s.conn did not execute ReadFrom method,so when message arrived ,it won't be handled,the client didn't get a response and will throw a transaction is timed out error.

func ListenUDPAndServe(log *zap.Logger, serverNet, laddr string, u *server.Updater) error {
	var (
		c   net.PacketConn
		err error
	)
	opt := u.Get()
	if reuseport.Available() && opt.ReusePort {
		c, err = reuseport.ListenPacket(serverNet, laddr)
		if err != nil {
			// Trying to listen without reuseport.
			// Sometimes reuseport.Available() can be true, but for subset
			// of interfaces it is not available.
			reusePortErr := err
			c, err = net.ListenPacket(serverNet, laddr)
			if err == nil {
				opt.ReusePort = false
				log.Warn("failed to use REUSEPORT, falling back to non-reuseport", zap.Error(reusePortErr))
			}
		}
	} else {
		c, err = net.ListenPacket(serverNet, laddr)
	}
	if err != nil {
		return err
	}
	opt.Conn = c
	s, err := server.New(opt)
	if err != nil {
		return err
	}
	u.Subscribe(s)
	return s.Serve()
}

add the below code will fixed it

func (s *Server) Serve() error {
	s.start()
	// ++++++++++++
	if s.reusePort {
		go s.worker(s.conn)
	}
	// +++++++++++++
	for i := 0; i < runtime.GOMAXPROCS(-1); i++ {
		s.wg.Add(1)
		if s.reusePort {
			s.log.Debug("reusing port for worker", zap.Int("w", i))
			laddr := s.conn.LocalAddr()
			conn, err := reuseport.ListenPacket(laddr.Network(), laddr.String())
			if err != nil {
				s.log.Warn("failed to listen for additional socket")
				conn = s.conn
			} else {
				s.conns = append(s.conns, conn)
			}
			go s.worker(conn)
		} else {
			go s.worker(s.conn)
		}
	}
	s.wg.Wait()
	return nil
}

v0.17.14 can not run on Linux

With default command options:

deploy@example:~/gortcd$ ./gortcd-pie 
{"level":"info","ts":1555665627.3852997,"msg":"config file used","path":"/home/deploy/gortcd/gortcd.yml"}
{"level":"info","ts":1555665627.3855886,"msg":"parsed credentials","n":0}
{"level":"info","ts":1555665627.3856893,"msg":"realm","k":"gortc.io"}
{"level":"info","ts":1555665627.385987,"logger":"filter.peer","msg":"default action set","action":"allow"}
{"level":"info","ts":1555665627.3861253,"logger":"filter.client","msg":"default action set","action":"allow"}
{"level":"info","ts":1555665627.386219,"msg":"will be sending SOFTWARE attribute","software":"gortcd"}
{"level":"info","ts":1555665627.386445,"msg":"got addr","addr":"0.0.0.0:3478"}
{"level":"warn","ts":1555665627.38652,"msg":"running on all interfaces"}
{"level":"warn","ts":1555665627.3866117,"msg":"picking addr from ICE"}
{"level":"warn","ts":1555665627.3869166,"msg":"got","a":"127.0.0.1 [45]"}
{"level":"warn","ts":1555665627.387017,"msg":"got","a":"10.162.58.13 [35]"}
{"level":"warn","ts":1555665627.3870754,"msg":"using","a":"10.162.58.13 [35]"}
{"level":"warn","ts":1555665627.3871744,"msg":"got","a":"218.244.128.99 [35]"}
{"level":"warn","ts":1555665627.387245,"msg":"using","a":"218.244.128.99 [35]"}
{"level":"info","ts":1555665627.3873508,"msg":"gortc/gortcd listening","addr":"218.244.128.99:3478","network":"udp"}
{"level":"fatal","ts":1555665627.387498,"msg":"failed to listen","error":"listen udp 218.244.128.99:3478: protocol not available"}

With different listened port:

deploy@binatify:~/gortcd$ ./gortcd-pie -l="0.0.0.0:3479"
{"level":"info","ts":1555665654.0974624,"msg":"config file used","path":"/home/deploy/gortcd/gortcd.yml"}
{"level":"info","ts":1555665654.0977643,"msg":"parsed credentials","n":0}
{"level":"info","ts":1555665654.0978677,"msg":"realm","k":"gortc.io"}
{"level":"info","ts":1555665654.0981438,"logger":"filter.peer","msg":"default action set","action":"allow"}
{"level":"info","ts":1555665654.0982912,"logger":"filter.client","msg":"default action set","action":"allow"}
{"level":"info","ts":1555665654.0983856,"msg":"will be sending SOFTWARE attribute","software":"gortcd"}
{"level":"info","ts":1555665654.0985594,"msg":"got addr","addr":"[0.0.0.0:3479]"}
{"level":"info","ts":1555665654.098647,"msg":"gortc/gortcd listening","addr":"[0.0.0.0:3479]","network":"udp"}
{"level":"fatal","ts":1555665654.0987477,"msg":"failed to listen","error":"listen udp: address [0.0.0.0:3479]: missing port in address"}

Is it a bug? it can work well on Mac OS.

How to find Peer Transport Address through Client related Transport Address

As we known, client create a Permission need the peer's transport address (Server-Reflexive), but I want to known the peer transport address is for which port in TURN server ?

If it is the default 3478. As code allocator.go#L130 , it should not have ability to send data to peer through the relayed transport address for Symmetric NAT.

If it is the client relayed transport address port, how can we get peer's server-reflexive transport address for this relayed port , HandlePeerData no about this logic.

Maybe there is something I misunderstand, let me known please.

hot reload

Daemon should support zero downtime hot reload, ideally persisting internal state.

meta: feature parity with coturn

TURN specs:

STUN specs:

  • RFC 3489 – "classic" STUN
  • RFC 5389 – base "new" STUN specs
  • RFC 5769 – test vectors for STUN protocol testing
  • RFC 5780 – NAT behavior discovery support
  • RFC 7443 – ALPN support for STUN & TURN
  • RFC 7635 – oAuth third-party TURN/STUN authorization

Supported ICE and related specs:

  • RFC 5245 – ICE
  • RFC 5768 – ICE–SIP
  • RFC 6336 – ICE–IANA Registry
  • RFC 6544 – ICE–TCP
  • RFC 5928 – TURN Resolution Mechanism

The implementation fully supports the following client-to-TURN-server protocols:

Supported relay protocols:

  • UDP (per RFC 5766)
  • TCP (per RFC 6062)

Supported user databases (for user repository, with passwords or keys, if authentication is required):

  • SQLite
  • MySQL
  • PostgreSQL
  • Redis
  • MongoDB

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.