payload.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package handler
  2. import (
  3. "github.com/bjdgyc/anylink/base"
  4. "github.com/bjdgyc/anylink/dbdata"
  5. "github.com/bjdgyc/anylink/sessdata"
  6. "github.com/songgao/water/waterutil"
  7. )
  8. func payloadIn(cSess *sessdata.ConnSession, pl *sessdata.Payload) bool {
  9. if pl.LType == sessdata.LTypeIPData && pl.PType == 0x00 {
  10. // 进行Acl规则判断
  11. check := checkLinkAcl(cSess.Group, pl)
  12. if !check {
  13. // 校验不通过直接丢弃
  14. return false
  15. }
  16. }
  17. closed := false
  18. select {
  19. case cSess.PayloadIn <- pl:
  20. case <-cSess.CloseChan:
  21. closed = true
  22. }
  23. return closed
  24. }
  25. func putPayloadInBefore(cSess *sessdata.ConnSession, pl *sessdata.Payload) {
  26. // 异步审计日志
  27. if base.Cfg.AuditInterval >= 0 {
  28. auditPayload.Add(cSess.Username, pl)
  29. return
  30. }
  31. putPayload(pl)
  32. }
  33. func payloadOut(cSess *sessdata.ConnSession, pl *sessdata.Payload) bool {
  34. dSess := cSess.GetDtlsSession()
  35. if dSess == nil {
  36. return payloadOutCstp(cSess, pl)
  37. } else {
  38. return payloadOutDtls(cSess, dSess, pl)
  39. }
  40. }
  41. func payloadOutCstp(cSess *sessdata.ConnSession, pl *sessdata.Payload) bool {
  42. closed := false
  43. select {
  44. case cSess.PayloadOutCstp <- pl:
  45. case <-cSess.CloseChan:
  46. closed = true
  47. }
  48. return closed
  49. }
  50. func payloadOutDtls(cSess *sessdata.ConnSession, dSess *sessdata.DtlsSession, pl *sessdata.Payload) bool {
  51. select {
  52. case cSess.PayloadOutDtls <- pl:
  53. case <-dSess.CloseChan:
  54. }
  55. return false
  56. }
  57. // Acl规则校验
  58. func checkLinkAcl(group *dbdata.Group, pl *sessdata.Payload) bool {
  59. if pl.LType == sessdata.LTypeIPData && pl.PType == 0x00 && len(group.LinkAcl) > 0 {
  60. } else {
  61. return true
  62. }
  63. ipDst := waterutil.IPv4Destination(pl.Data)
  64. ipPort := waterutil.IPv4DestinationPort(pl.Data)
  65. ipProto := waterutil.IPv4Protocol(pl.Data)
  66. // fmt.Println("sent:", ip_dst, ip_port)
  67. // 优先放行dns端口
  68. for _, v := range group.ClientDns {
  69. if v.Val == ipDst.String() && ipPort == 53 {
  70. return true
  71. }
  72. }
  73. for _, v := range group.LinkAcl {
  74. // 循环判断ip和端口
  75. if v.IpNet.Contains(ipDst) {
  76. // 放行允许ip的ping
  77. if v.Port == ipPort || v.Port == 0 || ipProto == waterutil.ICMP {
  78. if v.Action == dbdata.Allow {
  79. return true
  80. } else {
  81. return false
  82. }
  83. }
  84. }
  85. }
  86. return false
  87. }