| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- package common
- import (
- "github.com/coroot/coroot-node-agent/flags"
- "inet.af/netaddr"
- "k8s.io/klog/v2"
- )
- var (
- ConnectionFilter = connectionFilter{
- whitelist: map[string]netaddr.IPPrefix{},
- }
- )
- func init() {
- if flags.ExternalNetworksWhitelist != nil {
- for _, prefix := range *flags.ExternalNetworksWhitelist {
- p, err := netaddr.ParseIPPrefix(prefix)
- if err != nil {
- klog.Fatalf("invalid network %s: %s", prefix, err)
- }
- ConnectionFilter.WhitelistPrefix(p)
- }
- }
- }
- func IsIpPrivate(ip netaddr.IP) bool {
- if ip.IsPrivate() {
- return true
- }
- if ip.Is4() {
- parts := ip.As4()
- return parts[0] == 100 && parts[1]&0xc0 == 64 // 100.64.0.0/10
- }
- return false
- }
- type connectionFilter struct {
- whitelist map[string]netaddr.IPPrefix
- }
- func (f connectionFilter) WhitelistIP(ip netaddr.IP) {
- var bits uint8 = 32
- if ip.Is6() {
- bits = 128
- }
- f.WhitelistPrefix(netaddr.IPPrefixFrom(ip, bits))
- }
- func (f connectionFilter) WhitelistPrefix(p netaddr.IPPrefix) {
- if _, ok := f.whitelist[p.String()]; ok {
- return
- }
- f.whitelist[p.String()] = p
- }
- func (f connectionFilter) ShouldBeSkipped(dst, actualDst netaddr.IP) bool {
- if IsIpPrivate(dst) || dst.IsLoopback() {
- return false
- }
- for _, prefix := range f.whitelist {
- if prefix.Contains(dst) {
- return false
- }
- }
- if IsIpPrivate(actualDst) || actualDst.IsLoopback() {
- f.WhitelistIP(dst)
- return false
- }
- for _, prefix := range f.whitelist {
- if prefix.Contains(actualDst) {
- f.WhitelistIP(dst)
- return false
- }
- }
- return true
- }
|