|
|
@@ -1,9 +1,29 @@
|
|
|
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
|
|
|
@@ -14,3 +34,44 @@ func IsIpPrivate(ip netaddr.IP) bool {
|
|
|
}
|
|
|
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
|
|
|
+}
|