geo_refs.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package firewall
  2. import "strings"
  3. func geoMembers(code string) []string {
  4. code = strings.ToUpper(strings.TrimPrefix(strings.TrimPrefix(strings.TrimPrefix(strings.TrimPrefix(code, "!"), "geo:"), "geo_"), "!"))
  5. switch code {
  6. case "EU":
  7. return strings.Fields("AT BE BG HR CY CZ DK EE FI FR DE GR HU IE IT LV LT LU MT NL PL PT RO SK SI ES SE")
  8. case "BALKANS":
  9. return strings.Fields("GR CY AL BG RO RS MK ME BA HR SI TR")
  10. case "BLOCKLIST", "HIGHRISK":
  11. return strings.Fields("CN RU IR KP BY")
  12. }
  13. return []string{code}
  14. }
  15. func (m *FirewallManager) geoReferenced(code string) bool {
  16. m.mu.Lock()
  17. defer m.mu.Unlock()
  18. check := func(src, dst string) bool {
  19. for _, value := range []string{src, dst} {
  20. if value == "" {
  21. continue
  22. }
  23. for _, member := range geoMembers(value) {
  24. if member == code {
  25. return true
  26. }
  27. }
  28. }
  29. return false
  30. }
  31. for _, r := range m.filterRules {
  32. if !r.Disabled && check(r.SrcGeoIP, r.DstGeoIP) {
  33. return true
  34. }
  35. }
  36. for _, r := range m.natRules {
  37. if !r.Disabled && check(r.SrcGeoIP, r.DstGeoIP) {
  38. return true
  39. }
  40. }
  41. for _, r := range m.mangleRules {
  42. if !r.Disabled && check(r.SrcGeoIP, r.DstGeoIP) {
  43. return true
  44. }
  45. }
  46. return false
  47. }