net.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package common
  2. import (
  3. "github.com/coroot/coroot-node-agent/flags"
  4. "inet.af/netaddr"
  5. "k8s.io/klog/v2"
  6. )
  7. var (
  8. ConnectionFilter = connectionFilter{
  9. whitelist: map[string]netaddr.IPPrefix{},
  10. }
  11. )
  12. func init() {
  13. if flags.ExternalNetworksWhitelist != nil {
  14. for _, prefix := range *flags.ExternalNetworksWhitelist {
  15. p, err := netaddr.ParseIPPrefix(prefix)
  16. if err != nil {
  17. klog.Fatalf("invalid network %s: %s", prefix, err)
  18. }
  19. ConnectionFilter.WhitelistPrefix(p)
  20. }
  21. }
  22. }
  23. func IsIpPrivate(ip netaddr.IP) bool {
  24. if ip.IsPrivate() {
  25. return true
  26. }
  27. if ip.Is4() {
  28. parts := ip.As4()
  29. return parts[0] == 100 && parts[1]&0xc0 == 64 // 100.64.0.0/10
  30. }
  31. return false
  32. }
  33. type connectionFilter struct {
  34. whitelist map[string]netaddr.IPPrefix
  35. }
  36. func (f connectionFilter) WhitelistIP(ip netaddr.IP) {
  37. var bits uint8 = 32
  38. if ip.Is6() {
  39. bits = 128
  40. }
  41. f.WhitelistPrefix(netaddr.IPPrefixFrom(ip, bits))
  42. }
  43. func (f connectionFilter) WhitelistPrefix(p netaddr.IPPrefix) {
  44. if _, ok := f.whitelist[p.String()]; ok {
  45. return
  46. }
  47. f.whitelist[p.String()] = p
  48. }
  49. func (f connectionFilter) ShouldBeSkipped(dst, actualDst netaddr.IP) bool {
  50. if IsIpPrivate(dst) || dst.IsLoopback() {
  51. return false
  52. }
  53. for _, prefix := range f.whitelist {
  54. if prefix.Contains(dst) {
  55. return false
  56. }
  57. }
  58. if IsIpPrivate(actualDst) || actualDst.IsLoopback() {
  59. f.WhitelistIP(dst)
  60. return false
  61. }
  62. for _, prefix := range f.whitelist {
  63. if prefix.Contains(actualDst) {
  64. f.WhitelistIP(dst)
  65. return false
  66. }
  67. }
  68. return true
  69. }