net.go 2.3 KB

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