net.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package common
  2. import (
  3. "github.com/coroot/coroot-node-agent/flags"
  4. "inet.af/netaddr"
  5. "k8s.io/klog/v2"
  6. "strconv"
  7. "strings"
  8. )
  9. var (
  10. ConnectionFilter = connectionFilter{
  11. whitelist: map[string]netaddr.IPPrefix{},
  12. }
  13. PortFilter *portFilter
  14. )
  15. func init() {
  16. if flags.ExternalNetworksWhitelist != nil {
  17. for _, prefix := range *flags.ExternalNetworksWhitelist {
  18. p, err := netaddr.ParseIPPrefix(prefix)
  19. if err != nil {
  20. klog.Fatalf("invalid network %s: %s", prefix, err)
  21. }
  22. ConnectionFilter.WhitelistPrefix(p)
  23. }
  24. }
  25. if r := flags.EphemeralPortRange; r != nil && *r != "" {
  26. klog.Infoln("ephemeral-port-range:", *r)
  27. parts := strings.Split(*r, "-")
  28. if len(parts) != 2 {
  29. klog.Fatalf("invalid port range: %s", *r)
  30. }
  31. from, err := strconv.ParseUint(parts[0], 10, 16)
  32. if err != nil {
  33. klog.Fatalf("invalid port range: %s", *r)
  34. }
  35. to, err := strconv.ParseUint(parts[1], 10, 16)
  36. if err != nil {
  37. klog.Fatalf("invalid port range: %s", *r)
  38. }
  39. if from > to {
  40. klog.Fatalf("invalid port range: %s", *r)
  41. }
  42. PortFilter = &portFilter{
  43. from: uint16(from),
  44. to: uint16(to),
  45. }
  46. }
  47. }
  48. func IsIpPrivate(ip netaddr.IP) bool {
  49. if ip.IsPrivate() {
  50. return true
  51. }
  52. if ip.Is4() {
  53. parts := ip.As4()
  54. return parts[0] == 100 && parts[1]&0xc0 == 64 // 100.64.0.0/10
  55. }
  56. return false
  57. }
  58. type connectionFilter struct {
  59. whitelist map[string]netaddr.IPPrefix
  60. }
  61. func (f connectionFilter) WhitelistIP(ip netaddr.IP) {
  62. var bits uint8 = 32
  63. if ip.Is6() {
  64. bits = 128
  65. }
  66. f.WhitelistPrefix(netaddr.IPPrefixFrom(ip, bits))
  67. }
  68. func (f connectionFilter) WhitelistPrefix(p netaddr.IPPrefix) {
  69. if _, ok := f.whitelist[p.String()]; ok {
  70. return
  71. }
  72. f.whitelist[p.String()] = p
  73. }
  74. func (f connectionFilter) ShouldBeSkipped(dst, actualDst netaddr.IP) bool {
  75. if IsIpPrivate(dst) || dst.IsLoopback() {
  76. return false
  77. }
  78. for _, prefix := range f.whitelist {
  79. if prefix.Contains(dst) {
  80. return false
  81. }
  82. }
  83. if IsIpPrivate(actualDst) || actualDst.IsLoopback() {
  84. f.WhitelistIP(dst)
  85. return false
  86. }
  87. for _, prefix := range f.whitelist {
  88. if prefix.Contains(actualDst) {
  89. f.WhitelistIP(dst)
  90. return false
  91. }
  92. }
  93. return true
  94. }
  95. type portFilter struct {
  96. from uint16
  97. to uint16
  98. }
  99. func (f *portFilter) ShouldBeSkipped(port uint16) bool {
  100. if f == nil {
  101. return false
  102. }
  103. return port >= f.from && port <= f.to
  104. }